* [PATCH 0/2] PCI: qcom: Add support for firmware-managed PCIe controller recovery
@ 2026-10-16 12:57 Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 1/2] PCI: qcom: Implement .reset_root_port() for firmware-managed controllers Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 2/2] PCI: qcom: Reinitialize MSI on resume " Mrinmay Sarkar
0 siblings, 2 replies; 3+ messages in thread
From: Mrinmay Sarkar @ 2026-10-16 12:57 UTC (permalink / raw)
To: Manivannan Sadhasivam, Lorenzo Pieralisi,
Krzysztof Wilczyński, Bjorn Helgaas
Cc: linux-pci, linux-arm-msm, linux-kernel, Rama Krishna,
Nitesh Gupta, Ayiluri Naga Rashmi, Krishna Chaitanya Chundru,
Shazad Hussain, Mrinmay Sarkar
This series adds recovery support for firmware-managed Qualcomm PCIe
controllers.
For these controllers, firmware manages resources such as PHY, clocks,
resets and LTSSM through the power-domain framework.
Patch 1 adds Root Port reset support by power-cycling the controller
through Runtime PM, allowing firmware to reset and reinitialize the
hardware.
Patch 2 restores the DesignWare MSI configuration after resume, as MSI
register contents are lost across the controller power cycle.
Signed-off-by: Mrinmay Sarkar <mrinmay.sarkar@oss.qualcomm.com>
---
Mrinmay Sarkar (2):
PCI: qcom: Implement .reset_root_port() for firmware-managed controllers
PCI: qcom: Reinitialize MSI on resume for firmware-managed controllers
drivers/pci/controller/dwc/pcie-qcom.c | 41 +++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
---
base-commit: b810335a0699d1810683796b0e3ffe8827ddfe6c
change-id: 20261016-pcie-controller-reset-8938e4bac060
Best regards,
--
Mrinmay Sarkar <mrinmay.sarkar@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH 1/2] PCI: qcom: Implement .reset_root_port() for firmware-managed controllers
2026-10-16 12:57 [PATCH 0/2] PCI: qcom: Add support for firmware-managed PCIe controller recovery Mrinmay Sarkar
@ 2026-10-16 12:57 ` Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 2/2] PCI: qcom: Reinitialize MSI on resume " Mrinmay Sarkar
1 sibling, 0 replies; 3+ messages in thread
From: Mrinmay Sarkar @ 2026-10-16 12:57 UTC (permalink / raw)
To: Manivannan Sadhasivam, Lorenzo Pieralisi,
Krzysztof Wilczyński, Bjorn Helgaas
Cc: linux-pci, linux-arm-msm, linux-kernel, Rama Krishna,
Nitesh Gupta, Ayiluri Naga Rashmi, Krishna Chaitanya Chundru,
Shazad Hussain, Mrinmay Sarkar
During PCIe recovery events, such as a fatal AER event or other
platform-specific PCIe failures, the controller may enter a state that
requires a full reset before normal link operation can be restored.
On firmware-managed PCIe controllers, Linux does not control the PHY,
clocks, resets, or LTSSM state directly. Instead, these resources are
managed by firmware through the power-domain framework.
Implement the reset_root_port() callback by performing a Runtime PM
power cycle of the controller. This allows firmware to reset and
reinitialize the hardware before bringing the controller back online.
Since controller state is lost across the power cycle, reinitialize the
DWC MSI configuration after resume.
This enables Root Port reset and recovery support for firmware-managed
controllers.
Signed-off-by: Mrinmay Sarkar <mrinmay.sarkar@oss.qualcomm.com>
---
drivers/pci/controller/dwc/pcie-qcom.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index d903f10211c2..744455ae90d4 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -1855,6 +1855,35 @@ static int qcom_pcie_set_max_opp(struct device *dev)
return ret;
}
+/*
+ * Reset for firmware-managed controllers: power-cycle via runtime PM and
+ * reprogram DWC MSI registers on resume.
+ */
+static int qcom_pcie_fw_reset_root_port(struct pci_host_bridge *bridge,
+ struct pci_dev *pdev)
+{
+ struct pci_config_window *cfg = bridge->sysdata;
+ struct device *dev = bridge->dev.parent;
+ struct dw_pcie_rp *pp = cfg->priv;
+ int ret;
+
+ ret = pm_runtime_force_suspend(dev);
+ if (ret) {
+ dev_err(dev, "Failed to force runtime suspend for reset: %d\n", ret);
+ return ret;
+ }
+
+ ret = pm_runtime_force_resume(dev);
+ if (ret) {
+ dev_err(dev, "Failed to force runtime resume after reset: %d\n", ret);
+ return ret;
+ }
+
+ dw_pcie_msi_init(pp);
+
+ return 0;
+}
+
/*
* Qcom PCIe controllers only support one Root Port per controller instance. So
* this function ignores the 'pci_dev' associated with the Root Port and just
@@ -2031,6 +2060,8 @@ static int qcom_pcie_ecam_host_init(struct pci_config_window *cfg)
dw_pcie_msi_init(pp);
+ cfg->priv = pp;
+
return devm_add_action_or_reset(dev, qcom_pci_free_msi, pp);
}
@@ -2292,6 +2323,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
bridge->sysdata = cfg;
bridge->ops = (struct pci_ops *)&pci_qcom_ecam_ops.pci_ops;
bridge->msi_domain = true;
+ bridge->reset_root_port = qcom_pcie_fw_reset_root_port;
ret = pci_host_probe(bridge);
if (ret)
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH 2/2] PCI: qcom: Reinitialize MSI on resume for firmware-managed controllers
2026-10-16 12:57 [PATCH 0/2] PCI: qcom: Add support for firmware-managed PCIe controller recovery Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 1/2] PCI: qcom: Implement .reset_root_port() for firmware-managed controllers Mrinmay Sarkar
@ 2026-10-16 12:57 ` Mrinmay Sarkar
1 sibling, 0 replies; 3+ messages in thread
From: Mrinmay Sarkar @ 2026-10-16 12:57 UTC (permalink / raw)
To: Manivannan Sadhasivam, Lorenzo Pieralisi,
Krzysztof Wilczyński, Bjorn Helgaas
Cc: linux-pci, linux-arm-msm, linux-kernel, Rama Krishna,
Nitesh Gupta, Ayiluri Naga Rashmi, Krishna Chaitanya Chundru,
Shazad Hussain, Mrinmay Sarkar
On firmware-managed PCIe controllers, hardware context is lost across
system suspend. While firmware reinitializes the controller through the
power domain framework during resume, the DesignWare MSI registers are
not preserved across the power cycle and must be reprogrammed by the
driver.
Retrieve the DesignWare PCIe context and reinitialize MSI state during
the resume path for firmware-managed controllers to restore MSI
functionality after resume.
Signed-off-by: Mrinmay Sarkar <mrinmay.sarkar@oss.qualcomm.com>
---
drivers/pci/controller/dwc/pcie-qcom.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 744455ae90d4..116622843d2a 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -2324,6 +2324,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
bridge->ops = (struct pci_ops *)&pci_qcom_ecam_ops.pci_ops;
bridge->msi_domain = true;
bridge->reset_root_port = qcom_pcie_fw_reset_root_port;
+ dev_set_drvdata(dev, cfg);
ret = pci_host_probe(bridge);
if (ret)
@@ -2551,8 +2552,14 @@ static int qcom_pcie_resume_noirq(struct device *dev)
int ret;
const struct qcom_pcie_cfg *pcie_cfg = of_device_get_match_data(dev);
- if (pcie_cfg && pcie_cfg->firmware_managed)
+ if (pcie_cfg && pcie_cfg->firmware_managed) {
+ struct pci_config_window *cfg = dev_get_drvdata(dev);
+
+ if (cfg && cfg->priv)
+ dw_pcie_msi_init(cfg->priv);
+
return 0;
+ }
pcie = dev_get_drvdata(dev);
if (!pcie)
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-16 12:57 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-16 12:57 [PATCH 0/2] PCI: qcom: Add support for firmware-managed PCIe controller recovery Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 1/2] PCI: qcom: Implement .reset_root_port() for firmware-managed controllers Mrinmay Sarkar
2026-10-16 12:57 ` [PATCH 2/2] PCI: qcom: Reinitialize MSI on resume " Mrinmay Sarkar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®