Commit 8101b276 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pci-v6.11-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci

Pull pci fixes from Bjorn Helgaas:

 - Add Manivannan Sadhasivam as PCI native host bridge and endpoint
   driver reviewer (Manivannan Sadhasivam)

 - Disable MHI RAM data parity error interrupt for qcom SA8775P SoC to
   work around hardware erratum that causes a constant stream of
   interrupts (Manivannan Sadhasivam)

 - Don't try to fall back to qcom Operating Performance Points (OPP)
   support unless the platform actually supports OPP (Manivannan
   Sadhasivam)

 - Add imx@lists.linux.dev mailing list to MAINTAINERS for NXP
   layerscape and imx6 PCI controller drivers (Frank Li)

* tag 'pci-v6.11-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci:
  MAINTAINERS: PCI: Add NXP PCI controller mailing list imx@lists.linux.dev
  PCI: qcom: Use OPP only if the platform supports it
  PCI: qcom-ep: Disable MHI RAM data parity error interrupt for SA8775P SoC
  MAINTAINERS: Add Manivannan Sadhasivam as Reviewer for PCI native host bridge and endpoint drivers
parents 216d1631 150b572a
...@@ -17439,6 +17439,7 @@ M: Roy Zang <roy.zang@nxp.com> ...@@ -17439,6 +17439,7 @@ M: Roy Zang <roy.zang@nxp.com>
L: linuxppc-dev@lists.ozlabs.org L: linuxppc-dev@lists.ozlabs.org
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: drivers/pci/controller/dwc/*layerscape* F: drivers/pci/controller/dwc/*layerscape*
...@@ -17465,6 +17466,7 @@ M: Richard Zhu <hongxing.zhu@nxp.com> ...@@ -17465,6 +17466,7 @@ M: Richard Zhu <hongxing.zhu@nxp.com>
M: Lucas Stach <l.stach@pengutronix.de> M: Lucas Stach <l.stach@pengutronix.de>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml
...@@ -17643,6 +17645,7 @@ F: drivers/pci/controller/pci-xgene-msi.c ...@@ -17643,6 +17645,7 @@ F: drivers/pci/controller/pci-xgene-msi.c
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
M: Lorenzo Pieralisi <lpieralisi@kernel.org> M: Lorenzo Pieralisi <lpieralisi@kernel.org>
M: Krzysztof Wilczyński <kw@linux.com> M: Krzysztof Wilczyński <kw@linux.com>
R: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
R: Rob Herring <robh@kernel.org> R: Rob Herring <robh@kernel.org>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
S: Supported S: Supported
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#define PARF_DEBUG_CNT_AUX_CLK_IN_L1SUB_L2 0xc88 #define PARF_DEBUG_CNT_AUX_CLK_IN_L1SUB_L2 0xc88
#define PARF_DEVICE_TYPE 0x1000 #define PARF_DEVICE_TYPE 0x1000
#define PARF_BDF_TO_SID_CFG 0x2c00 #define PARF_BDF_TO_SID_CFG 0x2c00
#define PARF_INT_ALL_5_MASK 0x2dcc
/* PARF_INT_ALL_{STATUS/CLEAR/MASK} register fields */ /* PARF_INT_ALL_{STATUS/CLEAR/MASK} register fields */
#define PARF_INT_ALL_LINK_DOWN BIT(1) #define PARF_INT_ALL_LINK_DOWN BIT(1)
...@@ -127,6 +128,9 @@ ...@@ -127,6 +128,9 @@
/* PARF_CFG_BITS register fields */ /* PARF_CFG_BITS register fields */
#define PARF_CFG_BITS_REQ_EXIT_L1SS_MSI_LTR_EN BIT(1) #define PARF_CFG_BITS_REQ_EXIT_L1SS_MSI_LTR_EN BIT(1)
/* PARF_INT_ALL_5_MASK fields */
#define PARF_INT_ALL_5_MHI_RAM_DATA_PARITY_ERR BIT(0)
/* ELBI registers */ /* ELBI registers */
#define ELBI_SYS_STTS 0x08 #define ELBI_SYS_STTS 0x08
#define ELBI_CS2_ENABLE 0xa4 #define ELBI_CS2_ENABLE 0xa4
...@@ -158,10 +162,12 @@ enum qcom_pcie_ep_link_status { ...@@ -158,10 +162,12 @@ enum qcom_pcie_ep_link_status {
* struct qcom_pcie_ep_cfg - Per SoC config struct * struct qcom_pcie_ep_cfg - Per SoC config struct
* @hdma_support: HDMA support on this SoC * @hdma_support: HDMA support on this SoC
* @override_no_snoop: Override NO_SNOOP attribute in TLP to enable cache snooping * @override_no_snoop: Override NO_SNOOP attribute in TLP to enable cache snooping
* @disable_mhi_ram_parity_check: Disable MHI RAM data parity error check
*/ */
struct qcom_pcie_ep_cfg { struct qcom_pcie_ep_cfg {
bool hdma_support; bool hdma_support;
bool override_no_snoop; bool override_no_snoop;
bool disable_mhi_ram_parity_check;
}; };
/** /**
...@@ -480,6 +486,12 @@ static int qcom_pcie_perst_deassert(struct dw_pcie *pci) ...@@ -480,6 +486,12 @@ static int qcom_pcie_perst_deassert(struct dw_pcie *pci)
PARF_INT_ALL_LINK_UP | PARF_INT_ALL_EDMA; PARF_INT_ALL_LINK_UP | PARF_INT_ALL_EDMA;
writel_relaxed(val, pcie_ep->parf + PARF_INT_ALL_MASK); writel_relaxed(val, pcie_ep->parf + PARF_INT_ALL_MASK);
if (pcie_ep->cfg && pcie_ep->cfg->disable_mhi_ram_parity_check) {
val = readl_relaxed(pcie_ep->parf + PARF_INT_ALL_5_MASK);
val &= ~PARF_INT_ALL_5_MHI_RAM_DATA_PARITY_ERR;
writel_relaxed(val, pcie_ep->parf + PARF_INT_ALL_5_MASK);
}
ret = dw_pcie_ep_init_registers(&pcie_ep->pci.ep); ret = dw_pcie_ep_init_registers(&pcie_ep->pci.ep);
if (ret) { if (ret) {
dev_err(dev, "Failed to complete initialization: %d\n", ret); dev_err(dev, "Failed to complete initialization: %d\n", ret);
...@@ -901,6 +913,7 @@ static void qcom_pcie_ep_remove(struct platform_device *pdev) ...@@ -901,6 +913,7 @@ static void qcom_pcie_ep_remove(struct platform_device *pdev)
static const struct qcom_pcie_ep_cfg cfg_1_34_0 = { static const struct qcom_pcie_ep_cfg cfg_1_34_0 = {
.hdma_support = true, .hdma_support = true,
.override_no_snoop = true, .override_no_snoop = true,
.disable_mhi_ram_parity_check = true,
}; };
static const struct of_device_id qcom_pcie_ep_match[] = { static const struct of_device_id qcom_pcie_ep_match[] = {
......
...@@ -261,6 +261,7 @@ struct qcom_pcie { ...@@ -261,6 +261,7 @@ struct qcom_pcie {
const struct qcom_pcie_cfg *cfg; const struct qcom_pcie_cfg *cfg;
struct dentry *debugfs; struct dentry *debugfs;
bool suspended; bool suspended;
bool use_pm_opp;
}; };
#define to_qcom_pcie(x) dev_get_drvdata((x)->dev) #define to_qcom_pcie(x) dev_get_drvdata((x)->dev)
...@@ -1433,7 +1434,7 @@ static void qcom_pcie_icc_opp_update(struct qcom_pcie *pcie) ...@@ -1433,7 +1434,7 @@ static void qcom_pcie_icc_opp_update(struct qcom_pcie *pcie)
dev_err(pci->dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n", dev_err(pci->dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n",
ret); ret);
} }
} else { } else if (pcie->use_pm_opp) {
freq_mbps = pcie_dev_speed_mbps(pcie_link_speed[speed]); freq_mbps = pcie_dev_speed_mbps(pcie_link_speed[speed]);
if (freq_mbps < 0) if (freq_mbps < 0)
return; return;
...@@ -1592,6 +1593,8 @@ static int qcom_pcie_probe(struct platform_device *pdev) ...@@ -1592,6 +1593,8 @@ static int qcom_pcie_probe(struct platform_device *pdev)
max_freq); max_freq);
goto err_pm_runtime_put; goto err_pm_runtime_put;
} }
pcie->use_pm_opp = true;
} else { } else {
/* Skip ICC init if OPP is supported as it is handled by OPP */ /* Skip ICC init if OPP is supported as it is handled by OPP */
ret = qcom_pcie_icc_init(pcie); ret = qcom_pcie_icc_init(pcie);
...@@ -1683,7 +1686,7 @@ static int qcom_pcie_suspend_noirq(struct device *dev) ...@@ -1683,7 +1686,7 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
if (ret) if (ret)
dev_err(dev, "Failed to disable CPU-PCIe interconnect path: %d\n", ret); dev_err(dev, "Failed to disable CPU-PCIe interconnect path: %d\n", ret);
if (!pcie->icc_mem) if (pcie->use_pm_opp)
dev_pm_opp_set_opp(pcie->pci->dev, NULL); dev_pm_opp_set_opp(pcie->pci->dev, NULL);
} }
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment