[PATCH 2/2] drm/i915: Do manual runtime-pm calls for S0 (s2idle)

Chris Wilson chris at chris-wilson.co.uk
Sun Oct 13 17:37:00 UTC 2019


Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_drv.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index f02a34722217..74ce71f053fd 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -36,6 +36,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/pnp.h>
 #include <linux/slab.h>
+#include <linux/suspend.h>
 #include <linux/vga_switcheroo.h>
 #include <linux/vt.h>
 #include <acpi/video.h>
@@ -142,6 +143,9 @@ struct vlv_s0ix_state {
 	u32 clock_gate_dis2;
 };
 
+static int intel_runtime_resume(struct device *kdev);
+static int intel_runtime_suspend(struct device *kdev);
+
 static int i915_get_bridge_dev(struct drm_i915_private *dev_priv)
 {
 	int domain = pci_domain_nr(dev_priv->drm.pdev->bus);
@@ -1986,6 +1990,7 @@ static int i915_pm_suspend(struct device *kdev)
 static int i915_pm_suspend_late(struct device *kdev)
 {
 	struct drm_i915_private *i915 = kdev_to_i915(kdev);
+	int err;
 
 	/*
 	 * We have a suspend ordering issue with the snd-hda driver also
@@ -1999,7 +2004,18 @@ static int i915_pm_suspend_late(struct device *kdev)
 	if (i915->drm.switch_power_state == DRM_SWITCH_POWER_OFF)
 		return 0;
 
-	return i915_drm_suspend_late(&i915->drm, false);
+	err = i915_drm_suspend_late(&i915->drm, false);
+	if (err)
+		return err;
+
+	if (pm_suspend_target_state == PM_SUSPEND_TO_IDLE &&
+	    HAS_RUNTIME_PM(i915)) {
+		err = intel_runtime_suspend(kdev);
+		if (err)
+			i915_drm_resume_early(&i915->drm);
+	}
+
+	return err;
 }
 
 static int i915_pm_poweroff_late(struct device *kdev)
@@ -2019,6 +2035,10 @@ static int i915_pm_resume_early(struct device *kdev)
 	if (i915->drm.switch_power_state == DRM_SWITCH_POWER_OFF)
 		return 0;
 
+	if (pm_suspend_target_state == PM_SUSPEND_TO_IDLE &&
+	    HAS_RUNTIME_PM(i915))
+		intel_runtime_resume(kdev);
+
 	return i915_drm_resume_early(&i915->drm);
 }
 
-- 
2.23.0



More information about the Intel-gfx-trybot mailing list