Skip to contentSkip to conversation

PCI / PM: Add needs_resume flag to avoid suspend complete optimization

PATCH Imre Deak 1 participant 1 message May 16, 2017 PCI

lore
Share & tools
lore

Imre Deak

author
#0 lore raw

Hi Bjorn,

Quoted 9 lines · Imre Deak

Some drivers - like i915 - may not support the system suspend direct complete optimization due to differences in their runtime and system suspend sequence. Add a flag that when set resumes the device before calling the driver's system suspend handlers which effectively disables the optimization.

Needed by the next patch fixing suspend/resume on i915.

Suggested by Rafael.

Are you planning to merge this one patch via the pci tree? It's a dependency for fixing a regression in the i915 driver.

Thanks,
Imre

Quoted 59 lines

v2-v3:
- unchanged

v4:
- Move the flag to dev_flags instead of using a bit field. (Rafael)

v5:
- Rebase on pci/next branch using the free next enum number available.

Cc Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
Cc Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
Cc linux-pci@xxxxxxxxxxxxxxx
Cc stable@xxxxxxxxxxxxxxx

---

[ Bjorn, could you apply this one patch to the pci tree? We would merge
the second patch via the drm-tip tree once this one shows up in Linus' tree. ]

---
 drivers/pci/pci.c   | 3 ++-
 include/linux/pci.h | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)
drivers/pci/pci.c +2 -1
index b01bd5b..563901c 100644
@@ -2144,7 +2144,8 @@ bool pci_dev_keep_suspended(struct pci_dev *pci_dev)
 
 	if (!pm_runtime_suspended(dev)
 	    || pci_target_state(pci_dev) != pci_dev->current_state
-	    || platform_pci_need_resume(pci_dev))
+	    || platform_pci_need_resume(pci_dev)
+	    || (pci_dev->dev_flags & PCI_DEV_FLAGS_NEEDS_RESUME))
 		return false;
 
 	/*
include/linux/pci.h +5 -0
index 88185ff..ce82b60 100644
@@ -183,6 +183,11 @@ enum pci_dev_flags {
 	PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = (__force pci_dev_flags_t) (1 << 9),
 	/* Do not use FLR even if device advertises PCI_AF_CAP */
 	PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
+	/*
+	 * Resume before calling the driver's system suspend hooks, disabling
+	 * the direct_complete optimization.
+	 */
+	PCI_DEV_FLAGS_NEEDS_RESUME = (__force pci_dev_flags_t) (1 << 11),
 };
 
 enum pci_irq_reroute_variant {
Signature · 1 line
2.7.4