[openwrt/openwrt] qualcommbe: ipq95xx: fix PCIe operation
LEDE Commits
lede-commits at lists.infradead.org
Sat Apr 12 01:39:03 PDT 2025
ansuel pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/7450f993e8d566d60904f2d30e6835593fa335ca
commit 7450f993e8d566d60904f2d30e6835593fa335ca
Author: Mantas Pucka <mantas at 8devices.com>
AuthorDate: Thu Mar 27 12:02:51 2025 +0200
qualcommbe: ipq95xx: fix PCIe operation
Add patches that fix:
* Wrong MSI interrups for PCIe3
* Hang during reboot due to stopped clocks
Signed-off-by: Mantas Pucka <mantas at 8devices.com>
Link: https://github.com/openwrt/openwrt/pull/18459
Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
...d-ICC-bandwidth-vote-for-CPU-to-PCIe-path.patch | 131 +++++++++++++++++++++
...com-ipq9574-fix-the-msi-interrupt-numbers.patch | 44 +++++++
2 files changed, 175 insertions(+)
diff --git a/target/linux/qualcommbe/patches-6.6/024-v6.11-PCI-qcom-Add-ICC-bandwidth-vote-for-CPU-to-PCIe-path.patch b/target/linux/qualcommbe/patches-6.6/024-v6.11-PCI-qcom-Add-ICC-bandwidth-vote-for-CPU-to-PCIe-path.patch
new file mode 100644
index 0000000000..65bc0bfce3
--- /dev/null
+++ b/target/linux/qualcommbe/patches-6.6/024-v6.11-PCI-qcom-Add-ICC-bandwidth-vote-for-CPU-to-PCIe-path.patch
@@ -0,0 +1,131 @@
+From 980136d1c2b95644b96df6c7ec00ca5d7c87f37f Mon Sep 17 00:00:00 2001
+From: Krishna chaitanya chundru <quic_krichai at quicinc.com>
+Date: Wed, 19 Jun 2024 20:41:10 +0530
+Subject: [PATCH] PCI: qcom: Add ICC bandwidth vote for CPU to PCIe path
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+To access the host controller registers of the host controller and the
+endpoint BAR/config space, the CPU-PCIe ICC (interconnect) path should
+be voted otherwise it may lead to NoC (Network on chip) timeout.
+We are surviving because of other driver voting for this path.
+
+As there is less access on this path compared to PCIe to mem path
+add minimum vote i.e 1KBps bandwidth always which is sufficient enough
+to keep the path active and is recommended by HW team.
+
+During S2RAM (Suspend-to-RAM), the DBI access can happen very late (while
+disabling the boot CPU). So do not disable the CPU-PCIe interconnect path
+during S2RAM as that may lead to NoC error.
+
+Link: https://lore.kernel.org/linux-pci/20240619-opp_support-v15-1-aa769a2173a3@quicinc.com
+Signed-off-by: Krishna chaitanya chundru <quic_krichai at quicinc.com>
+Signed-off-by: Krzysztof Wilczyński <kwilczynski at kernel.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
+Reviewed-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
+---
+ drivers/pci/controller/dwc/pcie-qcom.c | 45 +++++++++++++++++++++++++++++++---
+ 1 file changed, 41 insertions(+), 4 deletions(-)
+
+--- a/drivers/pci/controller/dwc/pcie-qcom.c
++++ b/drivers/pci/controller/dwc/pcie-qcom.c
+@@ -245,6 +245,7 @@ struct qcom_pcie {
+ struct phy *phy;
+ struct gpio_desc *reset;
+ struct icc_path *icc_mem;
++ struct icc_path *icc_cpu;
+ const struct qcom_pcie_cfg *cfg;
+ struct dentry *debugfs;
+ bool suspended;
+@@ -1357,6 +1358,9 @@ static int qcom_pcie_icc_init(struct qco
+ if (IS_ERR(pcie->icc_mem))
+ return PTR_ERR(pcie->icc_mem);
+
++ pcie->icc_cpu = devm_of_icc_get(pci->dev, "cpu-pcie");
++ if (IS_ERR(pcie->icc_cpu))
++ return PTR_ERR(pcie->icc_cpu);
+ /*
+ * Some Qualcomm platforms require interconnect bandwidth constraints
+ * to be set before enabling interconnect clocks.
+@@ -1366,11 +1370,25 @@ static int qcom_pcie_icc_init(struct qco
+ */
+ ret = icc_set_bw(pcie->icc_mem, 0, MBps_to_icc(250));
+ if (ret) {
+- dev_err(pci->dev, "failed to set interconnect bandwidth: %d\n",
++ dev_err(pci->dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n",
+ ret);
+ return ret;
+ }
+
++ /*
++ * Since the CPU-PCIe path is only used for activities like register
++ * access of the host controller and endpoint Config/BAR space access,
++ * HW team has recommended to use a minimal bandwidth of 1KBps just to
++ * keep the path active.
++ */
++ ret = icc_set_bw(pcie->icc_cpu, 0, kBps_to_icc(1));
++ if (ret) {
++ dev_err(pci->dev, "Failed to set bandwidth for CPU-PCIe interconnect path: %d\n",
++ ret);
++ icc_set_bw(pcie->icc_mem, 0, 0);
++ return ret;
++ }
++
+ return 0;
+ }
+
+@@ -1411,7 +1429,7 @@ static void qcom_pcie_icc_update(struct
+
+ ret = icc_set_bw(pcie->icc_mem, 0, width * bw);
+ if (ret) {
+- dev_err(pci->dev, "failed to set interconnect bandwidth: %d\n",
++ dev_err(pci->dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n",
+ ret);
+ }
+ }
+@@ -1573,7 +1591,7 @@ static int qcom_pcie_suspend_noirq(struc
+ */
+ ret = icc_set_bw(pcie->icc_mem, 0, kBps_to_icc(1));
+ if (ret) {
+- dev_err(dev, "Failed to set interconnect bandwidth: %d\n", ret);
++ dev_err(dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n", ret);
+ return ret;
+ }
+
+@@ -1597,7 +1615,18 @@ static int qcom_pcie_suspend_noirq(struc
+ pcie->suspended = true;
+ }
+
+- return 0;
++ /*
++ * Only disable CPU-PCIe interconnect path if the suspend is non-S2RAM.
++ * Because on some platforms, DBI access can happen very late during the
++ * S2RAM and a non-active CPU-PCIe interconnect path may lead to NoC
++ * error.
++ */
++ if (pm_suspend_target_state != PM_SUSPEND_MEM) {
++ ret = icc_disable(pcie->icc_cpu);
++ if (ret)
++ dev_err(dev, "Failed to disable CPU-PCIe interconnect path: %d\n", ret);
++ }
++ return ret;
+ }
+
+ static int qcom_pcie_resume_noirq(struct device *dev)
+@@ -1605,6 +1634,14 @@ static int qcom_pcie_resume_noirq(struct
+ struct qcom_pcie *pcie = dev_get_drvdata(dev);
+ int ret;
+
++ if (pm_suspend_target_state != PM_SUSPEND_MEM) {
++ ret = icc_enable(pcie->icc_cpu);
++ if (ret) {
++ dev_err(dev, "Failed to enable CPU-PCIe interconnect path: %d\n", ret);
++ return ret;
++ }
++ }
++
+ if (pcie->suspended) {
+ ret = qcom_pcie_host_init(&pcie->pci->pp);
+ if (ret)
diff --git a/target/linux/qualcommbe/patches-6.6/025-v6.15-arm64-dts-qcom-ipq9574-fix-the-msi-interrupt-numbers.patch b/target/linux/qualcommbe/patches-6.6/025-v6.15-arm64-dts-qcom-ipq9574-fix-the-msi-interrupt-numbers.patch
new file mode 100644
index 0000000000..2407301d9e
--- /dev/null
+++ b/target/linux/qualcommbe/patches-6.6/025-v6.15-arm64-dts-qcom-ipq9574-fix-the-msi-interrupt-numbers.patch
@@ -0,0 +1,44 @@
+From c87d58bc7f831bf3d887e6ec846246cb673c2e50 Mon Sep 17 00:00:00 2001
+From: Manikanta Mylavarapu <quic_mmanikan at quicinc.com>
+Date: Thu, 13 Mar 2025 12:44:22 +0530
+Subject: [PATCH] arm64: dts: qcom: ipq9574: fix the msi interrupt numbers of
+ pcie3
+
+The MSI interrupt numbers of the PCIe3 controller are incorrect. Due
+to this, the functional bring up of the QDSP6 processor on the PCIe
+endpoint has failed. Correct the MSI interrupt numbers to properly
+bring up the QDSP6 processor on the PCIe endpoint.
+
+Fixes: d80c7fbfa908 ("arm64: dts: qcom: ipq9574: Add PCIe PHYs and controller nodes")
+Signed-off-by: Manikanta Mylavarapu <quic_mmanikan at quicinc.com>
+Link: https://lore.kernel.org/r/20250313071422.510-1-quic_mmanikan@quicinc.com
+Signed-off-by: Bjorn Andersson <andersson at kernel.org>
+---
+ arch/arm64/boot/dts/qcom/ipq9574.dtsi | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
+@@ -968,14 +968,14 @@
+ ranges = <0x01000000 0x0 0x00000000 0x18200000 0x0 0x100000>,
+ <0x02000000 0x0 0x18300000 0x18300000 0x0 0x7d00000>;
+
+- interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+- <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
++ interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 222 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 312 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 326 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 415 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 494 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 495 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "msi0",
+ "msi1",
+ "msi2",
More information about the lede-commits
mailing list