Skip to content

Commit 166e89d

Browse files
rwk-gitLorenzo Pieralisi
authored andcommitted
PCI: rockchip: Fix legacy IRQ generation for RK3399 PCIe endpoint core
Fix legacy IRQ generation for RK3399 PCIe endpoint core according to the technical reference manual (TRM). Assert and deassert legacy interrupt (INTx) through the legacy interrupt control register ("PCIE_CLIENT_LEGACY_INT_CTRL") instead of manually generating a PCIe message. The generation of the legacy interrupt was tested and validated with the PCIe endpoint test driver. Link: https://lore.kernel.org/r/20230418074700.1083505-8-rick.wertenbroek@gmail.com Fixes: cf590b0 ("PCI: rockchip: Add EP driver for Rockchip PCIe controller") Tested-by: Damien Le Moal <dlemoal@kernel.org> Signed-off-by: Rick Wertenbroek <rick.wertenbroek@gmail.com> Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Cc: stable@vger.kernel.org
1 parent 21a2960 commit 166e89d

File tree

2 files changed

+16
-35
lines changed

2 files changed

+16
-35
lines changed

drivers/pci/controller/pcie-rockchip-ep.c

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -337,48 +337,25 @@ static int rockchip_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
337337
}
338338

339339
static void rockchip_pcie_ep_assert_intx(struct rockchip_pcie_ep *ep, u8 fn,
340-
u8 intx, bool is_asserted)
340+
u8 intx, bool do_assert)
341341
{
342342
struct rockchip_pcie *rockchip = &ep->rockchip;
343-
u32 r = ep->max_regions - 1;
344-
u32 offset;
345-
u32 status;
346-
u8 msg_code;
347-
348-
if (unlikely(ep->irq_pci_addr != ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR ||
349-
ep->irq_pci_fn != fn)) {
350-
rockchip_pcie_prog_ep_ob_atu(rockchip, fn, r,
351-
AXI_WRAPPER_NOR_MSG,
352-
ep->irq_phys_addr, 0, 0);
353-
ep->irq_pci_addr = ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR;
354-
ep->irq_pci_fn = fn;
355-
}
356343

357344
intx &= 3;
358-
if (is_asserted) {
345+
346+
if (do_assert) {
359347
ep->irq_pending |= BIT(intx);
360-
msg_code = ROCKCHIP_PCIE_MSG_CODE_ASSERT_INTA + intx;
348+
rockchip_pcie_write(rockchip,
349+
PCIE_CLIENT_INT_IN_ASSERT |
350+
PCIE_CLIENT_INT_PEND_ST_PEND,
351+
PCIE_CLIENT_LEGACY_INT_CTRL);
361352
} else {
362353
ep->irq_pending &= ~BIT(intx);
363-
msg_code = ROCKCHIP_PCIE_MSG_CODE_DEASSERT_INTA + intx;
354+
rockchip_pcie_write(rockchip,
355+
PCIE_CLIENT_INT_IN_DEASSERT |
356+
PCIE_CLIENT_INT_PEND_ST_NORMAL,
357+
PCIE_CLIENT_LEGACY_INT_CTRL);
364358
}
365-
366-
status = rockchip_pcie_read(rockchip,
367-
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
368-
ROCKCHIP_PCIE_EP_CMD_STATUS);
369-
status &= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
370-
371-
if ((status != 0) ^ (ep->irq_pending != 0)) {
372-
status ^= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
373-
rockchip_pcie_write(rockchip, status,
374-
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
375-
ROCKCHIP_PCIE_EP_CMD_STATUS);
376-
}
377-
378-
offset =
379-
ROCKCHIP_PCIE_MSG_ROUTING(ROCKCHIP_PCIE_MSG_ROUTING_LOCAL_INTX) |
380-
ROCKCHIP_PCIE_MSG_CODE(msg_code) | ROCKCHIP_PCIE_MSG_NO_DATA;
381-
writel(0, ep->irq_cpu_addr + offset);
382359
}
383360

384361
static int rockchip_pcie_ep_send_legacy_irq(struct rockchip_pcie_ep *ep, u8 fn,

drivers/pci/controller/pcie-rockchip.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
#define PCIE_CLIENT_MODE_EP HIWORD_UPDATE(0x0040, 0)
3939
#define PCIE_CLIENT_GEN_SEL_1 HIWORD_UPDATE(0x0080, 0)
4040
#define PCIE_CLIENT_GEN_SEL_2 HIWORD_UPDATE_BIT(0x0080)
41+
#define PCIE_CLIENT_LEGACY_INT_CTRL (PCIE_CLIENT_BASE + 0x0c)
42+
#define PCIE_CLIENT_INT_IN_ASSERT HIWORD_UPDATE_BIT(0x0002)
43+
#define PCIE_CLIENT_INT_IN_DEASSERT HIWORD_UPDATE(0x0002, 0)
44+
#define PCIE_CLIENT_INT_PEND_ST_PEND HIWORD_UPDATE_BIT(0x0001)
45+
#define PCIE_CLIENT_INT_PEND_ST_NORMAL HIWORD_UPDATE(0x0001, 0)
4146
#define PCIE_CLIENT_SIDE_BAND_STATUS (PCIE_CLIENT_BASE + 0x20)
4247
#define PCIE_CLIENT_PHY_ST BIT(12)
4348
#define PCIE_CLIENT_DEBUG_OUT_0 (PCIE_CLIENT_BASE + 0x3c)
@@ -227,7 +232,6 @@
227232
#define ROCKCHIP_PCIE_EP_MSI_CTRL_ME BIT(16)
228233
#define ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP BIT(24)
229234
#define ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR 0x1
230-
#define ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR 0x3
231235
#define ROCKCHIP_PCIE_EP_FUNC_BASE(fn) (((fn) << 12) & GENMASK(19, 12))
232236
#define ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, bar) \
233237
(PCIE_RC_RP_ATS_BASE + 0x0840 + (fn) * 0x0040 + (bar) * 0x0008)

0 commit comments

Comments
 (0)