[kernel/f17] Fix i915 fbdev cursor blink around suspend/hibernate from Dave Airlied

Josh Boyer jwboyer at fedoraproject.org
Fri Mar 30 16:57:46 UTC 2012


commit 9abfa161363163e3c0f8c5b92e18b3f9a5f0e570
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Fri Mar 30 12:54:23 2012 -0400

    Fix i915 fbdev cursor blink around suspend/hibernate from Dave Airlied

 ...spend-fbdev-device-around-suspend-hiberna.patch |   92 ++++++++++++++++++++
 kernel.spec                                        |    4 +
 2 files changed, 96 insertions(+), 0 deletions(-)
---
diff --git a/drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch b/drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch
new file mode 100644
index 0000000..826e4c5
--- /dev/null
+++ b/drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch
@@ -0,0 +1,92 @@
+From 3fa016a0b5c5237e9c387fc3249592b2cb5391c6 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied at redhat.com>
+Date: Wed, 28 Mar 2012 10:48:49 +0100
+Subject: [PATCH] drm/i915: suspend fbdev device around suspend/hibernate
+
+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 at keithp.com>
+Reported-by: Petr Tesarik <kernel at tesarici.cz>
+Reported-by: Stanislaw Gruszka <sgruszka at 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 at redhat.com>
+Tested-by: Bojan Smojver <bojan at rexursive.com>
+Tested-by: Andreas Hartmann <andihartmann at 01019freenet.de>
+Cc: stable at vger.kernel.org
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+---
+ 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 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
+index 0694e17..1a7559b 100644
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -467,6 +467,10 @@ static int i915_drm_freeze(struct drm_device *dev)
+ 	/* Modeset on resume, not lid events */
+ 	dev_priv->modeset_on_lid = 0;
+ 
++	console_lock();
++	intel_fbdev_set_suspend(dev, 1);
++	console_unlock();
++
+ 	return 0;
+ }
+ 
+@@ -539,6 +543,9 @@ static int i915_drm_thaw(struct drm_device *dev)
+ 
+ 	dev_priv->modeset_on_lid = 0;
+ 
++	console_lock();
++	intel_fbdev_set_suspend(dev, 0);
++	console_unlock();
+ 	return error;
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
+index 9cec6c3..5a14149 100644
+--- a/drivers/gpu/drm/i915/intel_drv.h
++++ b/drivers/gpu/drm/i915/intel_drv.h
+@@ -382,7 +382,7 @@ extern int intel_framebuffer_init(struct drm_device *dev,
+ 				  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);
+diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
+index 2d87669..19ecd78 100644
+--- a/drivers/gpu/drm/i915/intel_fb.c
++++ b/drivers/gpu/drm/i915/intel_fb.c
+@@ -254,6 +254,16 @@ void intel_fbdev_fini(struct drm_device *dev)
+ 	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)
+-- 
+1.7.7.6
+
diff --git a/kernel.spec b/kernel.spec
index 711a858..f08079e 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -684,6 +684,7 @@ Patch1800: drm-vgem.patch
 # intel drm is all merged upstream
 Patch1824: drm-intel-next.patch
 Patch1825: drm-i915-dp-stfu.patch
+Patch1827: drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch
 
 Patch1900: linux-2.6-intel-iommu-igfx.patch
 
@@ -1439,6 +1440,8 @@ ApplyPatch drm-i915-dp-stfu.patch
 
 ApplyPatch linux-2.6-intel-iommu-igfx.patch
 
+ApplyPatch drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch
+
 # silence the ACPI blacklist code
 ApplyPatch linux-2.6-silence-acpi-blacklist.patch
 ApplyPatch quite-apm.patch
@@ -2372,6 +2375,7 @@ fi
 #              '-'
 %changelog
 * Fri Mar 30 2012 Josh Boyer <jwboyer at redhat.com>
+- Fix i915 fbdev cursor blink around suspend/hibernate from Dave Airlied
 - CVE-2012-1601: kvm: NULL dereference from irqchip_in_kernel and
   vcpu->arch.apic inconsistency (rhbz 808207)
 - Add patch to fix incorrect buffer length in __nfs4_get_acl_uncached


More information about the scm-commits mailing list