* [PATCH 0/3] PCI: dwc: Replace Link up check with device presence in suspend path
@ 2025-11-06 6:13 Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 6:13 UTC (permalink / raw)
To: lpieralisi, kwilczynski, mani, bhelgaas
Cc: will, linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan,
Manivannan Sadhasivam
Hi,
This series aims to fix the usage of dw_pcie_link_up() API to check for Link up
during system suspend. The motivation for this series comes from recent
discussions [1] [2], where developers wanted to skip PME_Turn_Off broadcast in
dw_pcie_suspend_noirq() API when devices are not attached to the bus. They ended
up using dw_pcie_link_up() to check for the device presence due to the bad
example in the pcie-qcom driver which does the same. The usage of
dw_pcie_link_up() API here would be racy as the link can go down at any time
after the check.
So to properly check for the device presence, this series introduces an API,
pci_root_ports_have_device(), that accepts the Root bus pointer and checks for
the presence of a device under any of the Root Ports. This API is used to
replace the dw_pcie_link_up() check in suspend path of pcie-qcom driver and also
used to skip the PME_Turn_Off brodcast message in dwc_pcie_suspend_noirq() API.
Testing
=======
This series is tested on Qualcomm Lenovo Thinkpad T14s and observed no
functional change during the system suspend path.
- Mani
[1] https://lore.kernel.org/linux-pci/CAKfTPtCtHquxtK=Zx2WSNm15MmqeUXO8XXi8FkS4EpuP80PP7g@mail.gmail.com/
[2] https://lore.kernel.org/linux-pci/27516921.17f2.1997bb2a498.Coremail.zhangsenchuan@eswincomputing.com/
Manivannan Sadhasivam (3):
PCI: host-common: Add an API to check for any device under the Root
Ports
PCI: qcom: Check for the presence of a device instead of Link up
during suspend
PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is
available
.../pci/controller/dwc/pcie-designware-host.c | 5 +++++
drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
drivers/pci/controller/pci-host-common.c | 21 +++++++++++++++++++
drivers/pci/controller/pci-host-common.h | 2 ++
4 files changed, 32 insertions(+), 2 deletions(-)
--
2.48.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports
2025-11-06 6:13 [PATCH 0/3] PCI: dwc: Replace Link up check with device presence in suspend path Manivannan Sadhasivam
@ 2025-11-06 6:13 ` Manivannan Sadhasivam
2025-11-06 9:47 ` Konrad Dybcio
2025-11-07 0:12 ` kernel test robot
2025-11-06 6:13 ` [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available Manivannan Sadhasivam
2 siblings, 2 replies; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 6:13 UTC (permalink / raw)
To: lpieralisi, kwilczynski, mani, bhelgaas
Cc: will, linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan,
Manivannan Sadhasivam
Some controller drivers need to check if there is any device available
under the Root Ports. So add an API that returns 'true' if a device is
found under any of the Root Ports, 'false' otherwise.
Controller drivers can use this API for usecases like turning off the
controller resources only if there are no devices under the Root Ports,
skipping PME_Turn_Off broadcast etc...
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
---
drivers/pci/controller/pci-host-common.c | 21 +++++++++++++++++++++
drivers/pci/controller/pci-host-common.h | 2 ++
2 files changed, 23 insertions(+)
diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
index 810d1c8de24e..6b4f90903dc6 100644
--- a/drivers/pci/controller/pci-host-common.c
+++ b/drivers/pci/controller/pci-host-common.c
@@ -17,6 +17,27 @@
#include "pci-host-common.h"
+/**
+ * pci_root_ports_have_device - Check if the Root Ports under the Root bus have
+ * any device underneath
+ * @dev: Root bus
+ *
+ * Return: true if a device is found, false otherwise
+ */
+bool pci_root_ports_have_device(struct pci_bus *root_bus)
+{
+ struct pci_bus *child;
+
+ /* Iterate over the Root Port busses and look for any device */
+ list_for_each_entry(child, &root_bus->children, node) {
+ if (list_count_nodes(&child->devices))
+ return true;
+ }
+
+ return false;
+}
+EXPORT_SYMBOL_GPL(pci_root_ports_have_device);
+
static void gen_pci_unmap_cfg(void *ptr)
{
pci_ecam_free((struct pci_config_window *)ptr);
diff --git a/drivers/pci/controller/pci-host-common.h b/drivers/pci/controller/pci-host-common.h
index 51c35ec0cf37..ff1c2ff98043 100644
--- a/drivers/pci/controller/pci-host-common.h
+++ b/drivers/pci/controller/pci-host-common.h
@@ -19,4 +19,6 @@ void pci_host_common_remove(struct platform_device *pdev);
struct pci_config_window *pci_host_common_ecam_create(struct device *dev,
struct pci_host_bridge *bridge, const struct pci_ecam_ops *ops);
+
+bool pci_root_ports_have_device(struct pci_bus *root_bus);
#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-06 6:13 [PATCH 0/3] PCI: dwc: Replace Link up check with device presence in suspend path Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
@ 2025-11-06 6:13 ` Manivannan Sadhasivam
2025-11-06 10:13 ` zhangsenchuan
2025-11-06 6:13 ` [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available Manivannan Sadhasivam
2 siblings, 1 reply; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 6:13 UTC (permalink / raw)
To: lpieralisi, kwilczynski, mani, bhelgaas
Cc: will, linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan,
Manivannan Sadhasivam
The suspend handler checks for the PCIe Link up to decide when to turn off
the controller resources. But this check is racy as the PCIe Link can go
down just after this check.
So use the newly introduced API, pci_root_ports_have_device() that checks
for the presence of a device under any of the Root Ports to replace the
Link up check.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
---
drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 805edbbfe7eb..b2b89e2e4916 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
static int qcom_pcie_suspend_noirq(struct device *dev)
{
struct qcom_pcie *pcie;
+ struct dw_pcie_rp *pp;
int ret = 0;
pcie = dev_get_drvdata(dev);
@@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
* powerdown state. This will affect the lifetime of the storage devices
* like NVMe.
*/
- if (!dw_pcie_link_up(pcie->pci)) {
- qcom_pcie_host_deinit(&pcie->pci->pp);
+ pp = &pcie->pci->pp;
+ if (!pci_root_ports_have_device(pp->bridge->bus)) {
+ qcom_pcie_host_deinit(pp);
pcie->suspended = true;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
2025-11-06 6:13 [PATCH 0/3] PCI: dwc: Replace Link up check with device presence in suspend path Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend Manivannan Sadhasivam
@ 2025-11-06 6:13 ` Manivannan Sadhasivam
2025-11-06 10:02 ` zhangsenchuan
2025-11-07 3:28 ` kernel test robot
2 siblings, 2 replies; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 6:13 UTC (permalink / raw)
To: lpieralisi, kwilczynski, mani, bhelgaas
Cc: will, linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan,
Manivannan Sadhasivam
If there is no device available under the Root Ports, there is no point in
sending PME_Turn_Off and waiting for L2/L3 transition, it will result in a
timeout.
Hence, skip those steps if no device is available during suspend. The
resume flow remains unchanged.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
---
drivers/pci/controller/dwc/pcie-designware-host.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index 20c9333bcb1c..b6b8139e91e3 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -20,6 +20,7 @@
#include <linux/platform_device.h>
#include "../../pci.h"
+#include "../pci-host-common.h"
#include "pcie-designware.h"
static struct pci_ops dw_pcie_ops;
@@ -1129,6 +1130,9 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
u32 val;
int ret;
+ if (!pci_root_ports_have_device(pci->pp.bridge->bus))
+ goto stop_link;
+
/*
* If L1SS is supported, then do not put the link into L2 as some
* devices such as NVMe expect low resume latency.
@@ -1162,6 +1166,7 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
*/
udelay(1);
+stop_link:
dw_pcie_stop_link(pci);
if (pci->pp.ops->deinit)
pci->pp.ops->deinit(&pci->pp);
--
2.48.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
@ 2025-11-06 9:47 ` Konrad Dybcio
2025-11-06 11:52 ` Manivannan Sadhasivam
2025-11-07 0:12 ` kernel test robot
1 sibling, 1 reply; 15+ messages in thread
From: Konrad Dybcio @ 2025-11-06 9:47 UTC (permalink / raw)
To: Manivannan Sadhasivam, lpieralisi, kwilczynski, mani, bhelgaas
Cc: will, linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan
On 11/6/25 7:13 AM, Manivannan Sadhasivam wrote:
> Some controller drivers need to check if there is any device available
> under the Root Ports. So add an API that returns 'true' if a device is
> found under any of the Root Ports, 'false' otherwise.
>
> Controller drivers can use this API for usecases like turning off the
> controller resources only if there are no devices under the Root Ports,
> skipping PME_Turn_Off broadcast etc...
>
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> ---
> drivers/pci/controller/pci-host-common.c | 21 +++++++++++++++++++++
> drivers/pci/controller/pci-host-common.h | 2 ++
> 2 files changed, 23 insertions(+)
>
> diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> index 810d1c8de24e..6b4f90903dc6 100644
> --- a/drivers/pci/controller/pci-host-common.c
> +++ b/drivers/pci/controller/pci-host-common.c
> @@ -17,6 +17,27 @@
>
> #include "pci-host-common.h"
>
> +/**
> + * pci_root_ports_have_device - Check if the Root Ports under the Root bus have
> + * any device underneath
> + * @dev: Root bus
> + *
> + * Return: true if a device is found, false otherwise
> + */
> +bool pci_root_ports_have_device(struct pci_bus *root_bus)
> +{
> + struct pci_bus *child;
> +
> + /* Iterate over the Root Port busses and look for any device */
> + list_for_each_entry(child, &root_bus->children, node) {
> + if (list_count_nodes(&child->devices))
Is this list ever shrunk? I grepped around and couldn't find where
that happens
Konrad
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
2025-11-06 6:13 ` [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available Manivannan Sadhasivam
@ 2025-11-06 10:02 ` zhangsenchuan
2025-11-06 12:09 ` Manivannan Sadhasivam
2025-11-07 3:28 ` kernel test robot
1 sibling, 1 reply; 15+ messages in thread
From: zhangsenchuan @ 2025-11-06 10:02 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: lpieralisi, kwilczynski, mani, bhelgaas, will, linux-pci,
linux-kernel, robh, linux-arm-msm
> -----Original Messages-----
> From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> Send time:Thursday, 06/11/2025 14:13:26
> To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> Subject: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
>
> If there is no device available under the Root Ports, there is no point in
> sending PME_Turn_Off and waiting for L2/L3 transition, it will result in a
> timeout.
>
> Hence, skip those steps if no device is available during suspend. The
> resume flow remains unchanged.
>
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> ---
> drivers/pci/controller/dwc/pcie-designware-host.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index 20c9333bcb1c..b6b8139e91e3 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -20,6 +20,7 @@
> #include <linux/platform_device.h>
>
> #include "../../pci.h"
> +#include "../pci-host-common.h"
> #include "pcie-designware.h"
>
> static struct pci_ops dw_pcie_ops;
> @@ -1129,6 +1130,9 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
> u32 val;
> int ret;
>
> + if (!pci_root_ports_have_device(pci->pp.bridge->bus))
> + goto stop_link;
> +
> /*
> * If L1SS is supported, then do not put the link into L2 as some
> * devices such as NVMe expect low resume latency.
> @@ -1162,6 +1166,7 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
> */
> udelay(1);
>
> +stop_link:
> dw_pcie_stop_link(pci);
> if (pci->pp.ops->deinit)
> pci->pp.ops->deinit(&pci->pp);
> --
> 2.48.1
hi, Manivannan
I'd like your advice on a few things.
If there is no device available under the Root Ports, the dw_pcie_wait_for_link
function in dw_pcie_resume_noirq still need to wait for the link_up? Otherwise
linkup will TIMEDOUT. At this time, when the resume function return, -ETIMEDOUT
returned which will raise "PM: failed to resume noirq: error -110".
Currently, in the pci-imx6.c/pci-layerscape.c/pcie-stm32.c file, the
dw_pcie_resume_noirq function is directly returned after use.
Does the pci_root_ports_have_device function help vendor avoid
this problem?
Best Regards,
Senchuan Zhang
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-06 6:13 ` [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend Manivannan Sadhasivam
@ 2025-11-06 10:13 ` zhangsenchuan
2025-11-06 11:57 ` Manivannan Sadhasivam
0 siblings, 1 reply; 15+ messages in thread
From: zhangsenchuan @ 2025-11-06 10:13 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: lpieralisi, kwilczynski, mani, bhelgaas, will, linux-pci,
linux-kernel, robh, linux-arm-msm
> -----Original Messages-----
> From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> Send time:Thursday, 06/11/2025 14:13:25
> To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> Subject: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
>
> The suspend handler checks for the PCIe Link up to decide when to turn off
> the controller resources. But this check is racy as the PCIe Link can go
> down just after this check.
>
> So use the newly introduced API, pci_root_ports_have_device() that checks
> for the presence of a device under any of the Root Ports to replace the
> Link up check.
>
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> ---
> drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> index 805edbbfe7eb..b2b89e2e4916 100644
> --- a/drivers/pci/controller/dwc/pcie-qcom.c
> +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> @@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
> static int qcom_pcie_suspend_noirq(struct device *dev)
> {
> struct qcom_pcie *pcie;
> + struct dw_pcie_rp *pp;
> int ret = 0;
>
> pcie = dev_get_drvdata(dev);
> @@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
> * powerdown state. This will affect the lifetime of the storage devices
> * like NVMe.
> */
> - if (!dw_pcie_link_up(pcie->pci)) {
> - qcom_pcie_host_deinit(&pcie->pci->pp);
> + pp = &pcie->pci->pp;
> + if (!pci_root_ports_have_device(pp->bridge->bus)) {
I'm a little confused.
The pci_root_ports_have_device function can help check if there is any device
available under the Root Ports, if there is a device available, the resource
cannot be released, is it also necessary to release resources when entering
the L2/L3 state?
> + qcom_pcie_host_deinit(pp);
> pcie->suspended = true;
> }
>
> --
> 2.48.1
Best Regards
Senchuan Zhang
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports
2025-11-06 9:47 ` Konrad Dybcio
@ 2025-11-06 11:52 ` Manivannan Sadhasivam
0 siblings, 0 replies; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 11:52 UTC (permalink / raw)
To: Konrad Dybcio
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm, zhangsenchuan
On Thu, Nov 06, 2025 at 10:47:48AM +0100, Konrad Dybcio wrote:
> On 11/6/25 7:13 AM, Manivannan Sadhasivam wrote:
> > Some controller drivers need to check if there is any device available
> > under the Root Ports. So add an API that returns 'true' if a device is
> > found under any of the Root Ports, 'false' otherwise.
> >
> > Controller drivers can use this API for usecases like turning off the
> > controller resources only if there are no devices under the Root Ports,
> > skipping PME_Turn_Off broadcast etc...
> >
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > ---
> > drivers/pci/controller/pci-host-common.c | 21 +++++++++++++++++++++
> > drivers/pci/controller/pci-host-common.h | 2 ++
> > 2 files changed, 23 insertions(+)
> >
> > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > index 810d1c8de24e..6b4f90903dc6 100644
> > --- a/drivers/pci/controller/pci-host-common.c
> > +++ b/drivers/pci/controller/pci-host-common.c
> > @@ -17,6 +17,27 @@
> >
> > #include "pci-host-common.h"
> >
> > +/**
> > + * pci_root_ports_have_device - Check if the Root Ports under the Root bus have
> > + * any device underneath
> > + * @dev: Root bus
> > + *
> > + * Return: true if a device is found, false otherwise
> > + */
> > +bool pci_root_ports_have_device(struct pci_bus *root_bus)
> > +{
> > + struct pci_bus *child;
> > +
> > + /* Iterate over the Root Port busses and look for any device */
> > + list_for_each_entry(child, &root_bus->children, node) {
> > + if (list_count_nodes(&child->devices))
>
> Is this list ever shrunk? I grepped around and couldn't find where
> that happens
>
So I digged into this and other 'pci_bus' lists, to my shock, none of list
entries were getting dropped. I'll send out fixes for all of them.
Thanks for catching this historical issue that no one noticed before :)
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-06 10:13 ` zhangsenchuan
@ 2025-11-06 11:57 ` Manivannan Sadhasivam
2025-11-07 6:27 ` zhangsenchuan
0 siblings, 1 reply; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 11:57 UTC (permalink / raw)
To: zhangsenchuan
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm
On Thu, Nov 06, 2025 at 06:13:05PM +0800, zhangsenchuan wrote:
>
>
>
> > -----Original Messages-----
> > From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > Send time:Thursday, 06/11/2025 14:13:25
> > To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> > Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > Subject: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> >
> > The suspend handler checks for the PCIe Link up to decide when to turn off
> > the controller resources. But this check is racy as the PCIe Link can go
> > down just after this check.
> >
> > So use the newly introduced API, pci_root_ports_have_device() that checks
> > for the presence of a device under any of the Root Ports to replace the
> > Link up check.
> >
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > ---
> > drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
> > 1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> > index 805edbbfe7eb..b2b89e2e4916 100644
> > --- a/drivers/pci/controller/dwc/pcie-qcom.c
> > +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> > @@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
> > static int qcom_pcie_suspend_noirq(struct device *dev)
> > {
> > struct qcom_pcie *pcie;
> > + struct dw_pcie_rp *pp;
> > int ret = 0;
> >
> > pcie = dev_get_drvdata(dev);
> > @@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
> > * powerdown state. This will affect the lifetime of the storage devices
> > * like NVMe.
> > */
> > - if (!dw_pcie_link_up(pcie->pci)) {
> > - qcom_pcie_host_deinit(&pcie->pci->pp);
> > + pp = &pcie->pci->pp;
> > + if (!pci_root_ports_have_device(pp->bridge->bus)) {
>
> I'm a little confused.
> The pci_root_ports_have_device function can help check if there is any device
> available under the Root Ports, if there is a device available, the resource
> cannot be released, is it also necessary to release resources when entering
> the L2/L3 state?
>
It is upto the controller driver to decide. Once the link enters L2/L3, the
device will be in D3Cold state. So the controller can just disable all PCIe
resources to save power.
But it is not possible to transition all PCIe devices to D3Cold during suspend,
for instance NVMe. I'm hoping to fix it too in the coming days.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
2025-11-06 10:02 ` zhangsenchuan
@ 2025-11-06 12:09 ` Manivannan Sadhasivam
0 siblings, 0 replies; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-06 12:09 UTC (permalink / raw)
To: zhangsenchuan
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm
On Thu, Nov 06, 2025 at 06:02:55PM +0800, zhangsenchuan wrote:
>
>
>
> > -----Original Messages-----
> > From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > Send time:Thursday, 06/11/2025 14:13:26
> > To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> > Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > Subject: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
> >
> > If there is no device available under the Root Ports, there is no point in
> > sending PME_Turn_Off and waiting for L2/L3 transition, it will result in a
> > timeout.
> >
> > Hence, skip those steps if no device is available during suspend. The
> > resume flow remains unchanged.
> >
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > ---
> > drivers/pci/controller/dwc/pcie-designware-host.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > index 20c9333bcb1c..b6b8139e91e3 100644
> > --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> > @@ -20,6 +20,7 @@
> > #include <linux/platform_device.h>
> >
> > #include "../../pci.h"
> > +#include "../pci-host-common.h"
> > #include "pcie-designware.h"
> >
> > static struct pci_ops dw_pcie_ops;
> > @@ -1129,6 +1130,9 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
> > u32 val;
> > int ret;
> >
> > + if (!pci_root_ports_have_device(pci->pp.bridge->bus))
> > + goto stop_link;
> > +
> > /*
> > * If L1SS is supported, then do not put the link into L2 as some
> > * devices such as NVMe expect low resume latency.
> > @@ -1162,6 +1166,7 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
> > */
> > udelay(1);
> >
> > +stop_link:
> > dw_pcie_stop_link(pci);
> > if (pci->pp.ops->deinit)
> > pci->pp.ops->deinit(&pci->pp);
> > --
> > 2.48.1
>
> hi, Manivannan
>
> I'd like your advice on a few things.
>
> If there is no device available under the Root Ports, the dw_pcie_wait_for_link
> function in dw_pcie_resume_noirq still need to wait for the link_up? Otherwise
> linkup will TIMEDOUT. At this time, when the resume function return, -ETIMEDOUT
> returned which will raise "PM: failed to resume noirq: error -110".
>
I thought about it, but was worried that if there was no device inserted before
suspend, but if one gets inserted during suspend (before resume), then the link
up failure will get un-noticed if the link doesn't come up for the new device
and we skip the timeout.
But thinking more, it occurs to me that it will be a very rare case. So I'll
skip returning timeout from dw_pcie_wait_for_link() if there were no devices
before suspend. However, I do think that the dw_pcie_wait_for_link() should not
be skipped even if there were no devices earlier.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
2025-11-06 9:47 ` Konrad Dybcio
@ 2025-11-07 0:12 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2025-11-07 0:12 UTC (permalink / raw)
To: Manivannan Sadhasivam, lpieralisi, kwilczynski, mani, bhelgaas
Cc: llvm, oe-kbuild-all, will, linux-pci, linux-kernel, robh,
linux-arm-msm, zhangsenchuan, Manivannan Sadhasivam
Hi Manivannan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on pci/next]
[also build test WARNING on pci/for-linus linus/master v6.18-rc4 next-20251106]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Manivannan-Sadhasivam/PCI-host-common-Add-an-API-to-check-for-any-device-under-the-Root-Ports/20251106-141822
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/20251106061326.8241-2-manivannan.sadhasivam%40oss.qualcomm.com
patch subject: [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports
config: arm-randconfig-001-20251107 (https://download.01.org/0day-ci/archive/20251107/202511070717.PZBzRyQO-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251107/202511070717.PZBzRyQO-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511070717.PZBzRyQO-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/pci/controller/pci-host-common.c:27 function parameter 'root_bus' not described in 'pci_root_ports_have_device'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
2025-11-06 6:13 ` [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available Manivannan Sadhasivam
2025-11-06 10:02 ` zhangsenchuan
@ 2025-11-07 3:28 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2025-11-07 3:28 UTC (permalink / raw)
To: Manivannan Sadhasivam, lpieralisi, kwilczynski, mani, bhelgaas
Cc: llvm, oe-kbuild-all, will, linux-pci, linux-kernel, robh,
linux-arm-msm, zhangsenchuan, Manivannan Sadhasivam
Hi Manivannan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on pci/next]
[also build test WARNING on pci/for-linus linus/master v6.18-rc4 next-20251106]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Manivannan-Sadhasivam/PCI-host-common-Add-an-API-to-check-for-any-device-under-the-Root-Ports/20251106-141822
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/20251106061326.8241-4-manivannan.sadhasivam%40oss.qualcomm.com
patch subject: [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available
config: arm-randconfig-001-20251107 (https://download.01.org/0day-ci/archive/20251107/202511071025.JM5nTGnO-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251107/202511071025.JM5nTGnO-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511071025.JM5nTGnO-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/pci/controller/dwc/pcie-designware-host.c:1133:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1133 | if (!pci_root_ports_have_device(pci->pp.bridge->bus))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/pci/controller/dwc/pcie-designware-host.c:1176:9: note: uninitialized use occurs here
1176 | return ret;
| ^~~
drivers/pci/controller/dwc/pcie-designware-host.c:1133:2: note: remove the 'if' if its condition is always false
1133 | if (!pci_root_ports_have_device(pci->pp.bridge->bus))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1134 | goto stop_link;
| ~~~~~~~~~~~~~~
drivers/pci/controller/dwc/pcie-designware-host.c:1131:9: note: initialize the variable 'ret' to silence this warning
1131 | int ret;
| ^
| = 0
1 warning generated.
vim +1133 drivers/pci/controller/dwc/pcie-designware-host.c
1126
1127 int dw_pcie_suspend_noirq(struct dw_pcie *pci)
1128 {
1129 u8 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
1130 u32 val;
1131 int ret;
1132
> 1133 if (!pci_root_ports_have_device(pci->pp.bridge->bus))
1134 goto stop_link;
1135
1136 /*
1137 * If L1SS is supported, then do not put the link into L2 as some
1138 * devices such as NVMe expect low resume latency.
1139 */
1140 if (dw_pcie_readw_dbi(pci, offset + PCI_EXP_LNKCTL) & PCI_EXP_LNKCTL_ASPM_L1)
1141 return 0;
1142
1143 if (pci->pp.ops->pme_turn_off) {
1144 pci->pp.ops->pme_turn_off(&pci->pp);
1145 } else {
1146 ret = dw_pcie_pme_turn_off(pci);
1147 if (ret)
1148 return ret;
1149 }
1150
1151 ret = read_poll_timeout(dw_pcie_get_ltssm, val,
1152 val == DW_PCIE_LTSSM_L2_IDLE ||
1153 val <= DW_PCIE_LTSSM_DETECT_WAIT,
1154 PCIE_PME_TO_L2_TIMEOUT_US/10,
1155 PCIE_PME_TO_L2_TIMEOUT_US, false, pci);
1156 if (ret) {
1157 /* Only log message when LTSSM isn't in DETECT or POLL */
1158 dev_err(pci->dev, "Timeout waiting for L2 entry! LTSSM: 0x%x\n", val);
1159 return ret;
1160 }
1161
1162 /*
1163 * Per PCIe r6.0, sec 5.3.3.2.1, software should wait at least
1164 * 100ns after L2/L3 Ready before turning off refclock and
1165 * main power. This is harmless when no endpoint is connected.
1166 */
1167 udelay(1);
1168
1169 stop_link:
1170 dw_pcie_stop_link(pci);
1171 if (pci->pp.ops->deinit)
1172 pci->pp.ops->deinit(&pci->pp);
1173
1174 pci->suspended = true;
1175
1176 return ret;
1177 }
1178 EXPORT_SYMBOL_GPL(dw_pcie_suspend_noirq);
1179
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-06 11:57 ` Manivannan Sadhasivam
@ 2025-11-07 6:27 ` zhangsenchuan
2025-11-08 10:25 ` Manivannan Sadhasivam
0 siblings, 1 reply; 15+ messages in thread
From: zhangsenchuan @ 2025-11-07 6:27 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm
> -----Original Messages-----
> From: "Manivannan Sadhasivam" <mani@kernel.org>
> Send time:Thursday, 06/11/2025 19:57:16
> To: zhangsenchuan <zhangsenchuan@eswincomputing.com>
> Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>, lpieralisi@kernel.org, kwilczynski@kernel.org, bhelgaas@google.com, will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org
> Subject: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
>
> On Thu, Nov 06, 2025 at 06:13:05PM +0800, zhangsenchuan wrote:
> >
> >
> >
> > > -----Original Messages-----
> > > From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > Send time:Thursday, 06/11/2025 14:13:25
> > > To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> > > Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > Subject: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> > >
> > > The suspend handler checks for the PCIe Link up to decide when to turn off
> > > the controller resources. But this check is racy as the PCIe Link can go
> > > down just after this check.
> > >
> > > So use the newly introduced API, pci_root_ports_have_device() that checks
> > > for the presence of a device under any of the Root Ports to replace the
> > > Link up check.
> > >
> > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > > ---
> > > drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
> > > 1 file changed, 4 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> > > index 805edbbfe7eb..b2b89e2e4916 100644
> > > --- a/drivers/pci/controller/dwc/pcie-qcom.c
> > > +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> > > @@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
> > > static int qcom_pcie_suspend_noirq(struct device *dev)
> > > {
> > > struct qcom_pcie *pcie;
> > > + struct dw_pcie_rp *pp;
> > > int ret = 0;
> > >
> > > pcie = dev_get_drvdata(dev);
> > > @@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
> > > * powerdown state. This will affect the lifetime of the storage devices
> > > * like NVMe.
> > > */
> > > - if (!dw_pcie_link_up(pcie->pci)) {
> > > - qcom_pcie_host_deinit(&pcie->pci->pp);
> > > + pp = &pcie->pci->pp;
> > > + if (!pci_root_ports_have_device(pp->bridge->bus)) {
> >
> > I'm a little confused.
> > The pci_root_ports_have_device function can help check if there is any device
> > available under the Root Ports, if there is a device available, the resource
> > cannot be released, is it also necessary to release resources when entering
> > the L2/L3 state?
> >
>
> It is upto the controller driver to decide. Once the link enters L2/L3, the
> device will be in D3Cold state. So the controller can just disable all PCIe
> resources to save power.
>
> But it is not possible to transition all PCIe devices to D3Cold during suspend,
> for instance NVMe. I'm hoping to fix it too in the coming days.
>
Hi, Manivannan
Thank you for your explanation.
By the way, in v5 patch, I removed the dw_pcie_link_up judgment, and currently
resources are directly released.
At present, i have completed the pcie v5 patch without adding the
pci_root_ports_have_device function. Do I need to wait for you to merge it
before sending the V5 patch?
Kind regards,
Senchuan Zhang
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-07 6:27 ` zhangsenchuan
@ 2025-11-08 10:25 ` Manivannan Sadhasivam
2025-11-10 9:12 ` zhangsenchuan
0 siblings, 1 reply; 15+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-08 10:25 UTC (permalink / raw)
To: zhangsenchuan
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm
On Fri, Nov 07, 2025 at 02:27:15PM +0800, zhangsenchuan wrote:
>
>
>
> > -----Original Messages-----
> > From: "Manivannan Sadhasivam" <mani@kernel.org>
> > Send time:Thursday, 06/11/2025 19:57:16
> > To: zhangsenchuan <zhangsenchuan@eswincomputing.com>
> > Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>, lpieralisi@kernel.org, kwilczynski@kernel.org, bhelgaas@google.com, will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org
> > Subject: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> >
> > On Thu, Nov 06, 2025 at 06:13:05PM +0800, zhangsenchuan wrote:
> > >
> > >
> > >
> > > > -----Original Messages-----
> > > > From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > > Send time:Thursday, 06/11/2025 14:13:25
> > > > To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> > > > Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > > Subject: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> > > >
> > > > The suspend handler checks for the PCIe Link up to decide when to turn off
> > > > the controller resources. But this check is racy as the PCIe Link can go
> > > > down just after this check.
> > > >
> > > > So use the newly introduced API, pci_root_ports_have_device() that checks
> > > > for the presence of a device under any of the Root Ports to replace the
> > > > Link up check.
> > > >
> > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > > > ---
> > > > drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
> > > > 1 file changed, 4 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> > > > index 805edbbfe7eb..b2b89e2e4916 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-qcom.c
> > > > +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> > > > @@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
> > > > static int qcom_pcie_suspend_noirq(struct device *dev)
> > > > {
> > > > struct qcom_pcie *pcie;
> > > > + struct dw_pcie_rp *pp;
> > > > int ret = 0;
> > > >
> > > > pcie = dev_get_drvdata(dev);
> > > > @@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
> > > > * powerdown state. This will affect the lifetime of the storage devices
> > > > * like NVMe.
> > > > */
> > > > - if (!dw_pcie_link_up(pcie->pci)) {
> > > > - qcom_pcie_host_deinit(&pcie->pci->pp);
> > > > + pp = &pcie->pci->pp;
> > > > + if (!pci_root_ports_have_device(pp->bridge->bus)) {
> > >
> > > I'm a little confused.
> > > The pci_root_ports_have_device function can help check if there is any device
> > > available under the Root Ports, if there is a device available, the resource
> > > cannot be released, is it also necessary to release resources when entering
> > > the L2/L3 state?
> > >
> >
> > It is upto the controller driver to decide. Once the link enters L2/L3, the
> > device will be in D3Cold state. So the controller can just disable all PCIe
> > resources to save power.
> >
> > But it is not possible to transition all PCIe devices to D3Cold during suspend,
> > for instance NVMe. I'm hoping to fix it too in the coming days.
> >
> Hi, Manivannan
>
> Thank you for your explanation.
>
> By the way, in v5 patch, I removed the dw_pcie_link_up judgment, and currently
> resources are directly released.
> At present, i have completed the pcie v5 patch without adding the
> pci_root_ports_have_device function. Do I need to wait for you to merge it
> before sending the V5 patch?
>
I've merged my series to pci/controller/dwc branch. You can use this branch as a
base for your v5.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
2025-11-08 10:25 ` Manivannan Sadhasivam
@ 2025-11-10 9:12 ` zhangsenchuan
0 siblings, 0 replies; 15+ messages in thread
From: zhangsenchuan @ 2025-11-10 9:12 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Manivannan Sadhasivam, lpieralisi, kwilczynski, bhelgaas, will,
linux-pci, linux-kernel, robh, linux-arm-msm
> -----Original Messages-----
> From: "Manivannan Sadhasivam" <mani@kernel.org>
> Send time:Saturday, 08/11/2025 18:25:36
> To: zhangsenchuan <zhangsenchuan@eswincomputing.com>
> Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>, lpieralisi@kernel.org, kwilczynski@kernel.org, bhelgaas@google.com, will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org
> Subject: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
>
> On Fri, Nov 07, 2025 at 02:27:15PM +0800, zhangsenchuan wrote:
> >
> >
> >
> > > -----Original Messages-----
> > > From: "Manivannan Sadhasivam" <mani@kernel.org>
> > > Send time:Thursday, 06/11/2025 19:57:16
> > > To: zhangsenchuan <zhangsenchuan@eswincomputing.com>
> > > Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>, lpieralisi@kernel.org, kwilczynski@kernel.org, bhelgaas@google.com, will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org
> > > Subject: Re: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> > >
> > > On Thu, Nov 06, 2025 at 06:13:05PM +0800, zhangsenchuan wrote:
> > > >
> > > >
> > > >
> > > > > -----Original Messages-----
> > > > > From: "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > > > Send time:Thursday, 06/11/2025 14:13:25
> > > > > To: lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, bhelgaas@google.com
> > > > > Cc: will@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, robh@kernel.org, linux-arm-msm@vger.kernel.org, zhangsenchuan@eswincomputing.com, "Manivannan Sadhasivam" <manivannan.sadhasivam@oss.qualcomm.com>
> > > > > Subject: [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend
> > > > >
> > > > > The suspend handler checks for the PCIe Link up to decide when to turn off
> > > > > the controller resources. But this check is racy as the PCIe Link can go
> > > > > down just after this check.
> > > > >
> > > > > So use the newly introduced API, pci_root_ports_have_device() that checks
> > > > > for the presence of a device under any of the Root Ports to replace the
> > > > > Link up check.
> > > > >
> > > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
> > > > > ---
> > > > > drivers/pci/controller/dwc/pcie-qcom.c | 6 ++++--
> > > > > 1 file changed, 4 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> > > > > index 805edbbfe7eb..b2b89e2e4916 100644
> > > > > --- a/drivers/pci/controller/dwc/pcie-qcom.c
> > > > > +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> > > > > @@ -2018,6 +2018,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
> > > > > static int qcom_pcie_suspend_noirq(struct device *dev)
> > > > > {
> > > > > struct qcom_pcie *pcie;
> > > > > + struct dw_pcie_rp *pp;
> > > > > int ret = 0;
> > > > >
> > > > > pcie = dev_get_drvdata(dev);
> > > > > @@ -2053,8 +2054,9 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
> > > > > * powerdown state. This will affect the lifetime of the storage devices
> > > > > * like NVMe.
> > > > > */
> > > > > - if (!dw_pcie_link_up(pcie->pci)) {
> > > > > - qcom_pcie_host_deinit(&pcie->pci->pp);
> > > > > + pp = &pcie->pci->pp;
> > > > > + if (!pci_root_ports_have_device(pp->bridge->bus)) {
> > > >
> > > > I'm a little confused.
> > > > The pci_root_ports_have_device function can help check if there is any device
> > > > available under the Root Ports, if there is a device available, the resource
> > > > cannot be released, is it also necessary to release resources when entering
> > > > the L2/L3 state?
> > > >
> > >
> > > It is upto the controller driver to decide. Once the link enters L2/L3, the
> > > device will be in D3Cold state. So the controller can just disable all PCIe
> > > resources to save power.
> > >
> > > But it is not possible to transition all PCIe devices to D3Cold during suspend,
> > > for instance NVMe. I'm hoping to fix it too in the coming days.
> > >
> > Hi, Manivannan
> >
> > Thank you for your explanation.
> >
> > By the way, in v5 patch, I removed the dw_pcie_link_up judgment, and currently
> > resources are directly released.
> > At present, i have completed the pcie v5 patch without adding the
> > pci_root_ports_have_device function. Do I need to wait for you to merge it
> > before sending the V5 patch?
> >
>
> I've merged my series to pci/controller/dwc branch. You can use this branch as a
> base for your v5.
>
Hi, Manivannan
Thank you very much for the newly created branch. I have already submitted a v5
patch based on this branch.
Kind regards,
Senchuan Zhang
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-11-10 9:13 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-06 6:13 [PATCH 0/3] PCI: dwc: Replace Link up check with device presence in suspend path Manivannan Sadhasivam
2025-11-06 6:13 ` [PATCH 1/3] PCI: host-common: Add an API to check for any device under the Root Ports Manivannan Sadhasivam
2025-11-06 9:47 ` Konrad Dybcio
2025-11-06 11:52 ` Manivannan Sadhasivam
2025-11-07 0:12 ` kernel test robot
2025-11-06 6:13 ` [PATCH 2/3] PCI: qcom: Check for the presence of a device instead of Link up during suspend Manivannan Sadhasivam
2025-11-06 10:13 ` zhangsenchuan
2025-11-06 11:57 ` Manivannan Sadhasivam
2025-11-07 6:27 ` zhangsenchuan
2025-11-08 10:25 ` Manivannan Sadhasivam
2025-11-10 9:12 ` zhangsenchuan
2025-11-06 6:13 ` [PATCH 3/3] PCI: dwc: Skip PME_Turn_Off and L2/L3 transition if no device is available Manivannan Sadhasivam
2025-11-06 10:02 ` zhangsenchuan
2025-11-06 12:09 ` Manivannan Sadhasivam
2025-11-07 3:28 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).