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

From: Rafael J. Wysocki
Date: Thu Apr 14 2022 - 13:54:21 EST


On 3/25/2022 8:50 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.

Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
Signed-off-by: Rajvi Jingar <rajvi.jingar@xxxxxxxxx>
Suggested-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx>

Sorry for the delay here.

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


---
v1 -> v2: add Fixes tag in commit message
v2 -> v3: move changelog after "---" marker
v3 -> v4: add "---" marker after changelog
---
drivers/pci/pci-driver.c | 10 ++++++++++
drivers/pci/pci.c | 10 ----------
2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 8b55a90126a2..ab733374a260 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -847,6 +847,16 @@ 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 the device is a bridge with a child in D0 below it, it needs to
* stay in D0, so check skip_bus_pm to avoid putting it into a
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);