| From 87a5801026d24daaccd7e3530901c50f5a3082ae Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 15 Feb 2025 00:57:24 +0800 |
| Subject: PCI: cadence-ep: Fix the driver to send MSG TLP for INTx without data |
| payload |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Hans Zhang <18255117159@163.com> |
| |
| [ Upstream commit 3ac47fbf4f6e8c3a7c3855fac68cc3246f90f850 ] |
| |
| Per the Cadence's "PCIe Controller IP for AX14" user guide, Version |
| 1.04, Section 9.1.7.1, "AXI Subordinate to PCIe Address Translation |
| Registers", Table 9.4, the bit 16 of the AXI Subordinate Address |
| (axi_s_awaddr) when set corresponds to MSG with data, and when not set, |
| to MSG without data. |
| |
| However, the driver is currently doing the opposite and due to this, |
| the INTx is never received on the host. |
| |
| So, fix the driver to reflect the documentation and also make INTx work. |
| |
| Fixes: 37dddf14f1ae ("PCI: cadence: Add EndPoint Controller driver for Cadence PCIe controller") |
| Signed-off-by: Hans Zhang <18255117159@163.com> |
| Signed-off-by: Hans Zhang <hans.zhang@cixtech.com> |
| Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> |
| Link: https://lore.kernel.org/r/20250214165724.184599-1-18255117159@163.com |
| [kwilczynski: commit log] |
| Signed-off-by: Krzysztof WilczyĆski <kwilczynski@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pci/controller/cadence/pcie-cadence-ep.c | 3 +-- |
| drivers/pci/controller/cadence/pcie-cadence.h | 2 +- |
| 2 files changed, 2 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c |
| index e0cc4560dfde7..0bf4cde34f517 100644 |
| --- a/drivers/pci/controller/cadence/pcie-cadence-ep.c |
| +++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c |
| @@ -352,8 +352,7 @@ static void cdns_pcie_ep_assert_intx(struct cdns_pcie_ep *ep, u8 fn, u8 intx, |
| spin_unlock_irqrestore(&ep->lock, flags); |
| |
| offset = CDNS_PCIE_NORMAL_MSG_ROUTING(MSG_ROUTING_LOCAL) | |
| - CDNS_PCIE_NORMAL_MSG_CODE(msg_code) | |
| - CDNS_PCIE_MSG_NO_DATA; |
| + CDNS_PCIE_NORMAL_MSG_CODE(msg_code); |
| writel(0, ep->irq_cpu_addr + offset); |
| } |
| |
| diff --git a/drivers/pci/controller/cadence/pcie-cadence.h b/drivers/pci/controller/cadence/pcie-cadence.h |
| index f5eeff834ec19..39ee9945c903e 100644 |
| --- a/drivers/pci/controller/cadence/pcie-cadence.h |
| +++ b/drivers/pci/controller/cadence/pcie-cadence.h |
| @@ -246,7 +246,7 @@ struct cdns_pcie_rp_ib_bar { |
| #define CDNS_PCIE_NORMAL_MSG_CODE_MASK GENMASK(15, 8) |
| #define CDNS_PCIE_NORMAL_MSG_CODE(code) \ |
| (((code) << 8) & CDNS_PCIE_NORMAL_MSG_CODE_MASK) |
| -#define CDNS_PCIE_MSG_NO_DATA BIT(16) |
| +#define CDNS_PCIE_MSG_DATA BIT(16) |
| |
| struct cdns_pcie; |
| |
| -- |
| 2.39.5 |
| |