Re: [PATCH v2 1/2] PCI: dwc: Force L2 link entry on shutdown/reboot without D3cold check

From: Manivannan Sadhasivam

Date: Tue Sep 01 2026 - 11:00:13 EST


On Sat, Aug 22, 2026 at 11:04:17AM +0530, Krishna Chaitanya Chundru wrote:
> dw_pcie_suspend_noirq() normally calls pci_host_common_d3cold_possible()
> to check whether every downstream endpoint can be put into D3cold before
> bothering to move the link to L2. If no endpoint supports it, the
> function returns early and leaves the link up.
>
> Querying D3cold support during shutdown is actively harmful, not just
> slow: pci_host_common_d3cold_possible() requires every active endpoint
> to already be in PCI_D3hot, and returns false otherwise. If any endpoint
> is still in D0 -- which is common, since endpoint drivers aren't
> guaranteed to have suspended by the time the host's shutdown path runs
> the check fails and dw_pcie_suspend_noirq() returns early without ever
> moving the link to L2, leaving it up right up to the point where the
> system cuts power/clocks to the controller.
>
> Detect the shutdown/reboot case via system_state and skip straight to
> forcing the link into L2, the same sequence used for the D3cold-capable
> case.
>
> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@xxxxxxxxxxxxxxxx>
> ---
> drivers/pci/controller/dwc/pcie-designware-host.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index 06722259d2e3..98cd9dd2c7d7 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -13,6 +13,7 @@
> #include <linux/irqchip/chained_irq.h>
> #include <linux/irqchip/irq-msi-lib.h>
> #include <linux/irqdomain.h>
> +#include <linux/kernel.h>
> #include <linux/msi.h>
> #include <linux/of_address.h>
> #include <linux/of_pci.h>
> @@ -1222,16 +1223,29 @@ static int dw_pcie_pme_turn_off(struct dw_pcie *pci)
>
> int dw_pcie_suspend_noirq(struct dw_pcie *pci)
> {
> - bool pme_capable = false;
> + bool shutdown = system_state == SYSTEM_HALT ||
> + system_state == SYSTEM_POWER_OFF ||
> + system_state == SYSTEM_RESTART;

Instead of poking the system states, you should just pass a flag like
'force_suspend' and set it to true in the shutdown path.

- Mani

--
மணிவண்ணன் சதாசிவம்