Skip to content

Commit dd9f31c

Browse files
committed
drm/i915/gen9+: Set same power state before hibernation image save/restore
Atm, on GEN9 big core platforms before saving the hibernation image we uninitialize the display, disabling power wells manually, while before restoring the image we keep things powered (letting HW/DMC power down things as needed). The state mismatch will trigger the following error: DC state mismatch (0x0 -> 0x2) While the restore handler knows how to initialize the display from an unknown state (due to a different loader kernel or not having i915 loaded in the loader kernel) we should still use the same state for consistency before image saving and restoring. Do this by uniniting the display before restoring the image too. Bugzilla: https://bugs.freedesktop.org/attachment.cgi?id=133376 Reported-and-tested-by: Wang Wendy <wendy.wang@intel.com> Reported-and-tested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Wang Wendy <wendy.wang@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Ville Syrjala <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20170816144607.9935-1-imre.deak@intel.com
1 parent 097a948 commit dd9f31c

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,7 +1580,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
15801580

15811581
intel_display_set_init_power(dev_priv, false);
15821582

1583-
fw_csr = !IS_GEN9_LP(dev_priv) &&
1583+
fw_csr = !IS_GEN9_LP(dev_priv) && !hibernation &&
15841584
suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
15851585
/*
15861586
* In case of firmware assisted context save/restore don't manually
@@ -2070,11 +2070,14 @@ static int i915_pm_resume(struct device *kdev)
20702070
/* freeze: before creating the hibernation_image */
20712071
static int i915_pm_freeze(struct device *kdev)
20722072
{
2073+
struct drm_device *dev = &kdev_to_i915(kdev)->drm;
20732074
int ret;
20742075

2075-
ret = i915_pm_suspend(kdev);
2076-
if (ret)
2077-
return ret;
2076+
if (dev->switch_power_state != DRM_SWITCH_POWER_OFF) {
2077+
ret = i915_drm_suspend(dev);
2078+
if (ret)
2079+
return ret;
2080+
}
20782081

20792082
ret = i915_gem_freeze(kdev_to_i915(kdev));
20802083
if (ret)
@@ -2085,11 +2088,14 @@ static int i915_pm_freeze(struct device *kdev)
20852088

20862089
static int i915_pm_freeze_late(struct device *kdev)
20872090
{
2091+
struct drm_device *dev = &kdev_to_i915(kdev)->drm;
20882092
int ret;
20892093

2090-
ret = i915_pm_suspend_late(kdev);
2091-
if (ret)
2092-
return ret;
2094+
if (dev->switch_power_state != DRM_SWITCH_POWER_OFF) {
2095+
ret = i915_drm_suspend_late(dev, true);
2096+
if (ret)
2097+
return ret;
2098+
}
20932099

20942100
ret = i915_gem_freeze_late(kdev_to_i915(kdev));
20952101
if (ret)

0 commit comments

Comments
 (0)