aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-03-28 05:48:49 -0400
committerLuis Henriques <luis.henriques@canonical.com>2012-04-05 11:17:32 -0400
commitc66a891c5ad8bcc7eb440863facebe09ba9b8875 (patch)
tree321fcfbbf360e0cbd0e134729639aecef45683d2
parent2c915d9f068f33906b742807806a3a19f70df3c1 (diff)
drm/i915: suspend fbdev device around suspend/hibernate
BugLink: http://bugs.launchpad.net/bugs/971808 commit 3fa016a0b5c5237e9c387fc3249592b2cb5391c6 upstream. Looking at hibernate overwriting I though it looked like a cursor, so I tracked down this missing piece to stop the cursor blink timer. I've no idea if this is sufficient to fix the hibernate problems people are seeing, but please test it. Both radeon and nouveau have done this for a long time. I've run this personally all night hib/resume cycles with no fails. Reviewed-by: Keith Packard <keithp@keithp.com> Reported-by: Petr Tesarik <kernel@tesarici.cz> Reported-by: Stanislaw Gruszka <sgruszka@redhat.com> Reported-by: Lots of misc segfaults after hibernate across the world. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=37142 Tested-by: Dave Airlie <airlied@redhat.com> Tested-by: Bojan Smojver <bojan@rexursive.com> Tested-by: Andreas Hartmann <andihartmann@01019freenet.de> Signed-off-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c7
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_fb.c10
3 files changed, 18 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index f6e54b14746..0ad5737338f 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -404,6 +404,10 @@ static int i915_drm_freeze(struct drm_device *dev)
404 /* Modeset on resume, not lid events */ 404 /* Modeset on resume, not lid events */
405 dev_priv->modeset_on_lid = 0; 405 dev_priv->modeset_on_lid = 0;
406 406
407 console_lock();
408 intel_fbdev_set_suspend(dev, 1);
409 console_unlock();
410
407 return 0; 411 return 0;
408} 412}
409 413
@@ -476,6 +480,9 @@ static int i915_drm_thaw(struct drm_device *dev)
476 480
477 dev_priv->modeset_on_lid = 0; 481 dev_priv->modeset_on_lid = 0;
478 482
483 console_lock();
484 intel_fbdev_set_suspend(dev, 0);
485 console_unlock();
479 return error; 486 return error;
480} 487}
481 488
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index f7d942d0bfa..26a10676bea 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -331,7 +331,7 @@ extern int intel_framebuffer_init(struct drm_device *dev,
331 struct drm_i915_gem_object *obj); 331 struct drm_i915_gem_object *obj);
332extern int intel_fbdev_init(struct drm_device *dev); 332extern int intel_fbdev_init(struct drm_device *dev);
333extern void intel_fbdev_fini(struct drm_device *dev); 333extern void intel_fbdev_fini(struct drm_device *dev);
334 334extern void intel_fbdev_set_suspend(struct drm_device *dev, int state);
335extern void intel_prepare_page_flip(struct drm_device *dev, int plane); 335extern void intel_prepare_page_flip(struct drm_device *dev, int plane);
336extern void intel_finish_page_flip(struct drm_device *dev, int pipe); 336extern void intel_finish_page_flip(struct drm_device *dev, int pipe);
337extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); 337extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index ec49bae7338..d0ce34b78cc 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -257,6 +257,16 @@ void intel_fbdev_fini(struct drm_device *dev)
257 kfree(dev_priv->fbdev); 257 kfree(dev_priv->fbdev);
258 dev_priv->fbdev = NULL; 258 dev_priv->fbdev = NULL;
259} 259}
260
261void intel_fbdev_set_suspend(struct drm_device *dev, int state)
262{
263 drm_i915_private_t *dev_priv = dev->dev_private;
264 if (!dev_priv->fbdev)
265 return;
266
267 fb_set_suspend(dev_priv->fbdev->helper.fbdev, state);
268}
269
260MODULE_LICENSE("GPL and additional rights"); 270MODULE_LICENSE("GPL and additional rights");
261 271
262void intel_fb_output_poll_changed(struct drm_device *dev) 272void intel_fb_output_poll_changed(struct drm_device *dev)