[PATCH v3 9/9] PCI/PM: Set power.strict_midlayer in pci_pm_init()

From: Rafael J. Wysocki
Date: Fri Jun 27 2025 - 15:30:07 EST


From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>

The PCI bus type does not expect its runtime PM suspend callback
function, pci_pm_runtime_suspend(), to be invoked at all during system-
wide suspend and resume, and it does not expect its runtime resume
callback function, pci_pm_runtime_resume(), to be invoked at any point
when runtime PM is disabled for the given device during system-wide
suspend and resume, so make it express that expectation by setting
power.strict_midlayer for all PCI devices in pci_pm_prepare() and
clear it in pci_pm_complete().

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
---

v2 -> v3:
* Update subject prefix (Bjorn).
* Update the changelog to be more precise.
* Add Acked-by from Bjorn.

v1 -> v2:
* Set and clear the new flag in "prepare" and "complete" to allow
pm_runtime_force_suspend() invoked from driver remove callbacks to
work.
* Update subject and changelog.

---
drivers/pci/pci-driver.c | 4 ++++
1 file changed, 4 insertions(+)

--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -708,6 +708,8 @@
struct pci_dev *pci_dev = to_pci_dev(dev);
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;

+ dev_pm_set_strict_midlayer(dev, true);
+
if (pm && pm->prepare) {
int error = pm->prepare(dev);
if (error < 0)
@@ -749,6 +751,8 @@
if (pci_dev->current_state < pre_sleep_state)
pm_request_resume(dev);
}
+
+ dev_pm_set_strict_midlayer(dev, false);
}

#else /* !CONFIG_PM_SLEEP */