[PATCH v6 0/3] PCI: qcom: Implement shutdown() to avoid SMMU/NoC errors on reboot

Krishna Chaitanya Chundru posted 3 patches 2 weeks, 2 days ago
drivers/pci/controller/dwc/pci-imx6.c             |  2 +-
drivers/pci/controller/dwc/pci-layerscape.c       |  2 +-
drivers/pci/controller/dwc/pcie-designware-host.c |  7 +++--
drivers/pci/controller/dwc/pcie-designware.h      |  4 +--
drivers/pci/controller/dwc/pcie-eswin.c           |  2 +-
drivers/pci/controller/dwc/pcie-nxp-s32g.c        |  2 +-
drivers/pci/controller/dwc/pcie-qcom.c            | 37 ++++++++++++++++++++++-
drivers/pci/controller/dwc/pcie-stm32.c           |  2 +-
drivers/pci/controller/dwc/pcie-ultrarisc.c       |  2 +-
drivers/pci/controller/pci-host-common.c          | 13 +++-----
10 files changed, 52 insertions(+), 21 deletions(-)
[PATCH v6 0/3] PCI: qcom: Implement shutdown() to avoid SMMU/NoC errors on reboot
Posted by Krishna Chaitanya Chundru 2 weeks, 2 days ago
During system shutdown/reboot, power/clocks to the PCIe controller get
removed regardless of link state. If the link is still up when that
happens, it can trigger SMMU or NoC errors.

This series adds a shutdown() callback to the Qualcomm PCIe host driver
that forces the link into L2/D3cold before shutdown proceeds, reusing
the existing suspend_noirq() path.

Patch 1 fixes pci_host_common_d3cold_possible()'s underlying bus walk,
which aborts as soon as it finds a device outside D3hot and can
therefore miss a later PME-capable device -- something that becomes
common once patch 3 starts forcing D3cold entry during shutdown while
endpoints may still be in D0.

Patch 2 adds a force parameter to  dw_pcie_suspend_noirq() so that callers can
set to make dw_pcie_suspend_noirq() force L2 entry during shutdown/
reboot, skipping the D3cold capability check that can otherwise leave
the link up if any endpoint hasn't suspended yet.

Patch 3 adds qcom_pcie_shutdown() and wires it up as .shutdown.

Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
---
Changes in v6:
- remove return 0 in d3cold_possible() (konrad)
- use force as a paramter instead of the element (Mani)
- couple of nits (Konrad)
- call pm_runtime calls for firmware managed one also as we are enabling
  pm_runtime_enable and get for that also.
- Link to v5: https://patch.msgid.link/20260905-shutdown-v5-0-f0c6bafa1d4f@oss.qualcomm.com

Changes in v5:
- use a flag/parameter Instead of poking the system states (Mani)
- Fix pme_wakeup issue by walking through entire bus (Sashiko)
- Fix Irq free issue by using dwc free msi API (Sashiko)
- Link to v4: https://patch.msgid.link/20260826-shutdown-v4-0-eb5fe9d454ae@oss.qualcomm.com

Changes in v4:
- removed goto d3cold, (Konrad & Sashiko for PME error)
- Disabling MSI IRQ's (Sashiko)
- Link to v3: https://patch.msgid.link/20260824-shutdown-v3-0-81c14bb7a1af@oss.qualcomm.com

Changes in v3:
- Added null point check and use pm_runtime_put_sync (Sashiko).
- Link to v2: https://patch.msgid.link/20260822-shutdown-v2-0-520a68f1b4a5@oss.qualcomm.com

Changes in v2:
1) don't remove the endpoint pci dev's only keep link in D3cold.
Link to v1: https://lore.kernel.org/all/20250401-shutdown-v1-1-f699859403ae@oss.qualcomm.com/

---
Krishna Chaitanya Chundru (2):
      PCI: host-common: Fix early bus-walk exit in d3cold_possible()
      PCI: dwc: Force L2 link entry on shutdown/reboot without D3cold check

Manivannan Sadhasivam (1):
      PCI: qcom: Implement shutdown() callback

 drivers/pci/controller/dwc/pci-imx6.c             |  2 +-
 drivers/pci/controller/dwc/pci-layerscape.c       |  2 +-
 drivers/pci/controller/dwc/pcie-designware-host.c |  7 +++--
 drivers/pci/controller/dwc/pcie-designware.h      |  4 +--
 drivers/pci/controller/dwc/pcie-eswin.c           |  2 +-
 drivers/pci/controller/dwc/pcie-nxp-s32g.c        |  2 +-
 drivers/pci/controller/dwc/pcie-qcom.c            | 37 ++++++++++++++++++++++-
 drivers/pci/controller/dwc/pcie-stm32.c           |  2 +-
 drivers/pci/controller/dwc/pcie-ultrarisc.c       |  2 +-
 drivers/pci/controller/pci-host-common.c          | 13 +++-----
 10 files changed, 52 insertions(+), 21 deletions(-)
---
base-commit: 12f8e3e3eef4a662b622cf12f00981f64c276307
change-id: 20260822-shutdown-fe8139dff2b7

Best regards,
--  
Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
Re: [PATCH v6 0/3] PCI: qcom: Implement shutdown() to avoid SMMU/NoC errors on reboot
Posted by Konrad Dybcio 2 weeks, 2 days ago
On 9/9/26 2:24 PM, Krishna Chaitanya Chundru wrote:
> During system shutdown/reboot, power/clocks to the PCIe controller get
> removed regardless of link state. If the link is still up when that
> happens, it can trigger SMMU or NoC errors.
> 
> This series adds a shutdown() callback to the Qualcomm PCIe host driver
> that forces the link into L2/D3cold before shutdown proceeds, reusing
> the existing suspend_noirq() path.
> 
> Patch 1 fixes pci_host_common_d3cold_possible()'s underlying bus walk,
> which aborts as soon as it finds a device outside D3hot and can
> therefore miss a later PME-capable device -- something that becomes
> common once patch 3 starts forcing D3cold entry during shutdown while
> endpoints may still be in D0.
> 
> Patch 2 adds a force parameter to  dw_pcie_suspend_noirq() so that callers can
> set to make dw_pcie_suspend_noirq() force L2 entry during shutdown/
> reboot, skipping the D3cold capability check that can otherwise leave
> the link up if any endpoint hasn't suspended yet.
> 
> Patch 3 adds qcom_pcie_shutdown() and wires it up as .shutdown.
> 
> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
> ---
> Changes in v6:
> - remove return 0 in d3cold_possible() (konrad)

I re-read it once again and I'm not sure my comment was right..

Konrad
Re: [PATCH v6 0/3] PCI: qcom: Implement shutdown() to avoid SMMU/NoC errors on reboot
Posted by Krishna Chaitanya Chundru 2 weeks, 2 days ago

On 9/9/2026 6:08 PM, Konrad Dybcio wrote:
> On 9/9/26 2:24 PM, Krishna Chaitanya Chundru wrote:
>> During system shutdown/reboot, power/clocks to the PCIe controller get
>> removed regardless of link state. If the link is still up when that
>> happens, it can trigger SMMU or NoC errors.
>>
>> This series adds a shutdown() callback to the Qualcomm PCIe host driver
>> that forces the link into L2/D3cold before shutdown proceeds, reusing
>> the existing suspend_noirq() path.
>>
>> Patch 1 fixes pci_host_common_d3cold_possible()'s underlying bus walk,
>> which aborts as soon as it finds a device outside D3hot and can
>> therefore miss a later PME-capable device -- something that becomes
>> common once patch 3 starts forcing D3cold entry during shutdown while
>> endpoints may still be in D0.
>>
>> Patch 2 adds a force parameter to  dw_pcie_suspend_noirq() so that callers can
>> set to make dw_pcie_suspend_noirq() force L2 entry during shutdown/
>> reboot, skipping the D3cold capability check that can otherwise leave
>> the link up if any endpoint hasn't suspended yet.
>>
>> Patch 3 adds qcom_pcie_shutdown() and wires it up as .shutdown.
>>
>> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
>> ---
>> Changes in v6:
>> - remove return 0 in d3cold_possible() (konrad)
> I re-read it once again and I'm not sure my comment was right..
If we return directly without checking the pme capability we might disable
power to the endpoint and wake up may be broken.
I taught you pointed that mistake only. we need to check pme capability even
when device is not in d3hot.

- Krishna Chaitanya.
>
> Konrad