| From 3fa016a0b5c5237e9c387fc3249592b2cb5391c6 Mon Sep 17 00:00:00 2001 |
| From: Dave Airlie <airlied@redhat.com> |
| Date: Wed, 28 Mar 2012 10:48:49 +0100 |
| Subject: drm/i915: suspend fbdev device around suspend/hibernate |
| |
| From: Dave Airlie <airlied@redhat.com> |
| |
| 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> |
| |
| --- |
| drivers/gpu/drm/i915/i915_drv.c | 7 +++++++ |
| drivers/gpu/drm/i915/intel_drv.h | 2 +- |
| drivers/gpu/drm/i915/intel_fb.c | 10 ++++++++++ |
| 3 files changed, 18 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_drv.c |
| +++ b/drivers/gpu/drm/i915/i915_drv.c |
| @@ -442,6 +442,10 @@ static int i915_drm_freeze(struct drm_de |
| /* Modeset on resume, not lid events */ |
| dev_priv->modeset_on_lid = 0; |
| |
| + console_lock(); |
| + intel_fbdev_set_suspend(dev, 1); |
| + console_unlock(); |
| + |
| return 0; |
| } |
| |
| @@ -514,6 +518,9 @@ static int i915_drm_thaw(struct drm_devi |
| |
| dev_priv->modeset_on_lid = 0; |
| |
| + console_lock(); |
| + intel_fbdev_set_suspend(dev, 0); |
| + console_unlock(); |
| return error; |
| } |
| |
| --- a/drivers/gpu/drm/i915/intel_drv.h |
| +++ b/drivers/gpu/drm/i915/intel_drv.h |
| @@ -364,7 +364,7 @@ extern int intel_framebuffer_init(struct |
| struct drm_i915_gem_object *obj); |
| extern int intel_fbdev_init(struct drm_device *dev); |
| extern void intel_fbdev_fini(struct drm_device *dev); |
| - |
| +extern void intel_fbdev_set_suspend(struct drm_device *dev, int state); |
| extern void intel_prepare_page_flip(struct drm_device *dev, int plane); |
| extern void intel_finish_page_flip(struct drm_device *dev, int pipe); |
| extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); |
| --- 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 |
| kfree(dev_priv->fbdev); |
| dev_priv->fbdev = NULL; |
| } |
| + |
| +void intel_fbdev_set_suspend(struct drm_device *dev, int state) |
| +{ |
| + drm_i915_private_t *dev_priv = dev->dev_private; |
| + if (!dev_priv->fbdev) |
| + return; |
| + |
| + fb_set_suspend(dev_priv->fbdev->helper.fbdev, state); |
| +} |
| + |
| MODULE_LICENSE("GPL and additional rights"); |
| |
| void intel_fb_output_poll_changed(struct drm_device *dev) |