[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:36:45 UTC 2019
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_drv.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index f02a34722217..e54ff78c7873 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -142,6 +142,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 +1989,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 +2003,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 +2034,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