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.cb/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