Thread (15 messages) 15 messages, 2 authors, 2025-08-21

RE: [RESEND v3 4/5] PCI: dwc: Skip PME_Turn_Off message if there is no endpoint connected

From: Hongxing Zhu <hongxing.zhu@nxp.com>
Date: 2025-08-21 05:44:05
Also in: imx, linux-pci, lkml

-----Original Message-----
From: Bjorn Helgaas <helgaas@kernel.org>
Sent: 2025年8月20日 3:07
To: Hongxing Zhu <hongxing.zhu@nxp.com>
Cc: Frank Li <frank.li@nxp.com>; jingoohan1@gmail.com;
l.stach@pengutronix.de; lpieralisi@kernel.org; kwilczynski@kernel.org;
mani@kernel.org; robh@kernel.org; bhelgaas@google.com;
shawnguo@kernel.org; s.hauer@pengutronix.de; kernel@pengutronix.de;
festevam@gmail.com; linux-pci@vger.kernel.org;
linux-arm-kernel@lists.infradead.org; imx@lists.linux.dev;
linux-kernel@vger.kernel.org
Subject: Re: [RESEND v3 4/5] PCI: dwc: Skip PME_Turn_Off message if there is
no endpoint connected

On Mon, Aug 18, 2025 at 03:32:04PM +0800, Richard Zhu wrote:
quoted
Skip PME_Turn_Off message if there is no endpoint connected.
What's the value of doing this?  Is this to make something faster?  If so,
what and by how much?

Or does it fix something that's currently broken?

Seems like the discussion at
https://lore.kern/
el.org%2Flinux-pci%2F20241107084455.3623576-1-hongxing.zhu%40nxp.com%
2Ft%2F%23u&data=05%7C02%7Chongxing.zhu%40nxp.com%7Ced46fe10aeb74
21c88a508dddf53a24f%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7
C638912272493755203%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOn
RydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%
3D%3D%7C0%7C%7C%7C&sdata=lIE7%2FlS5jiGxGPGVm5Hr5efpMbT19CLqrwu
YNvAEdLY%3D&reserved=0
might be relevant.

This commit log only restates what the code does.  In my opinion we need
actual justification for making this change.
Hi Bjorn:
Thanks for your comments.
This commit is mainly used to fix suspend/resume broken on i.MX7D PCIe.
A chip freeze is observed on i.MX7D when PCIe RC kicks off the PM_PME message
and no any devices are connected on the port.

Because i.MX7D is a very old design, and out of IP design technical support.
 I don't know what's going on inside the PCIe IP design when kick off the
 PM_PME message.

From SW perspective view, what I can do is to find out a quirk method to
 workaround this broken. Hope this can clear up your confusions.

Best Regards
Richard Zhu
quoted
Signed-off-by: Richard Zhu <hongxing.zhu@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/pci/controller/dwc/pcie-designware-host.c | 15
+++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c
b/drivers/pci/controller/dwc/pcie-designware-host.c
index 20a7f827babbf..868e7db4e3381 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -1016,12 +1016,15 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
    if (dw_pcie_readw_dbi(pci, offset + PCI_EXP_LNKCTL) &
PCI_EXP_LNKCTL_ASPM_L1)
quoted
            return 0;

-   if (pci->pp.ops->pme_turn_off) {
-           pci->pp.ops->pme_turn_off(&pci->pp);
-   } else {
-           ret = dw_pcie_pme_turn_off(pci);
-           if (ret)
-                   return ret;
+   /* Skip PME_Turn_Off message if there is no endpoint connected */
+   if (dw_pcie_get_ltssm(pci) > DW_PCIE_LTSSM_DETECT_WAIT) {
+           if (pci->pp.ops->pme_turn_off) {
+                   pci->pp.ops->pme_turn_off(&pci->pp);
+           } else {
+                   ret = dw_pcie_pme_turn_off(pci);
+                   if (ret)
+                           return ret;
+           }
    }

    if (dwc_quirk(pci, QUIRK_NOL2POLL_IN_PM)) {
--
2.37.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help