diff options
author | Imre Deak <imre.deak@intel.com> | 2014-09-10 11:16:54 -0400 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2014-11-06 11:16:55 -0500 |
commit | a024d2e6f11836493d9e1751fca7b3c50fbfd215 (patch) | |
tree | 8e3a2c209fec8334ceb8511965c6009380254baf | |
parent | d6a8b72edc92471283925ceb4ba12799b67c3ff8 (diff) |
drm/i915: vlv: fix gunit HW state corruption during S4 suspend
During S4 freeze we don't call intel_suspend_complete(), which would
save the gunit HW state, but during S4 thaw/restore events we call
intel_resume_prepare() which restores it, thus ending up in a corrupted
HW state.
Fix this by calling intel_suspend_complete() from the corresponding
freeze_late event handler.
The issue was introduced in
commit 016970beb05da6285c2f3ed2bee1c676cb75972e
Author: Sagar Kamble <sagar.a.kamble@intel.com>
Date: Wed Aug 13 23:07:06 2014 +0530
CC: Sagar Kamble <sagar.a.kamble@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 055d5e7fbf12..2318b4c7a8f8 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -986,6 +986,15 @@ static int i915_pm_freeze(struct device *dev) | |||
986 | return i915_drm_freeze(drm_dev); | 986 | return i915_drm_freeze(drm_dev); |
987 | } | 987 | } |
988 | 988 | ||
989 | static int i915_pm_freeze_late(struct device *dev) | ||
990 | { | ||
991 | struct pci_dev *pdev = to_pci_dev(dev); | ||
992 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
993 | struct drm_i915_private *dev_priv = drm_dev->dev_private; | ||
994 | |||
995 | return intel_suspend_complete(dev_priv); | ||
996 | } | ||
997 | |||
989 | static int i915_pm_thaw_early(struct device *dev) | 998 | static int i915_pm_thaw_early(struct device *dev) |
990 | { | 999 | { |
991 | struct pci_dev *pdev = to_pci_dev(dev); | 1000 | struct pci_dev *pdev = to_pci_dev(dev); |
@@ -1570,6 +1579,7 @@ static const struct dev_pm_ops i915_pm_ops = { | |||
1570 | .resume_early = i915_pm_resume_early, | 1579 | .resume_early = i915_pm_resume_early, |
1571 | .resume = i915_pm_resume, | 1580 | .resume = i915_pm_resume, |
1572 | .freeze = i915_pm_freeze, | 1581 | .freeze = i915_pm_freeze, |
1582 | .freeze_late = i915_pm_freeze_late, | ||
1573 | .thaw_early = i915_pm_thaw_early, | 1583 | .thaw_early = i915_pm_thaw_early, |
1574 | .thaw = i915_pm_thaw, | 1584 | .thaw = i915_pm_thaw, |
1575 | .poweroff = i915_pm_poweroff, | 1585 | .poweroff = i915_pm_poweroff, |