Re: [PATCH 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM

From: Rafael J. Wysocki
Date: Fri Mar 11 2022 - 13:38:32 EST


On 2/24/2022 9:29 PM, Rajvi Jingar wrote:
For the PCIe devices (like nvme) that do not go into D3 state still need to
disable PTM on PCIe root ports to allow the port to enter a lower-power PM
state and the SoC to reach a lower-power idle state as a whole. Move the
pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is not
followed for devices that do not go into D3. This patch fixes the issue
seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with Coffee
Lake CPU platforms to get improved residency in low power idle states.

Signed-off-by: Rajvi Jingar <rajvi.jingar@xxxxxxxxx>
Suggested-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx>

I would add a Fixes tag pointing to the commit that introduced pci_disable_ptm().

Otherwise I agree with this change:

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>


---
drivers/pci/pci-driver.c | 11 +++++++++++
drivers/pci/pci.c | 10 ----------
2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index ac3f7e1676a9..8be3f81afdf6 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -836,6 +836,17 @@ static int pci_pm_suspend_noirq(struct device *dev)
if (!pci_dev->state_saved) {
pci_save_state(pci_dev);
+
+ /*
+ * There are systems (for example, Intel mobile chips since Coffee
+ * Lake) where the power drawn while suspended can be significantly
+ * reduced by disabling PTM on PCIe root ports as this allows the
+ * port to enter a lower-power PM state and the SoC to reach a
+ * lower-power idle state as a whole.
+ */
+ if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
+ pci_disable_ptm(pci_dev);
+
if (!pci_dev->skip_bus_pm && pci_power_manageable(pci_dev))
pci_prepare_to_sleep(pci_dev);
}
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 9ecce435fb3f..f8768672c064 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2660,16 +2660,6 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
if (target_state == PCI_POWER_ERROR)
return -EIO;
- /*
- * There are systems (for example, Intel mobile chips since Coffee
- * Lake) where the power drawn while suspended can be significantly
- * reduced by disabling PTM on PCIe root ports as this allows the
- * port to enter a lower-power PM state and the SoC to reach a
- * lower-power idle state as a whole.
- */
- if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
- pci_disable_ptm(dev);
-
pci_enable_wake(dev, target_state, wakeup);
error = pci_set_power_state(dev, target_state);