[kernel] r17017 - in dists/squeeze/linux-2.6/debian: . patches/bugfix/x86 patches/series

Ben Hutchings benh at alioth.debian.org
Mon Mar 7 01:26:52 UTC 2011


Author: benh
Date: Mon Mar  7 01:26:50 2011
New Revision: 17017

Log:
drm/i915: Add pipe A force quirk for some laptops (Closes: #608148)

Added:
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-add-pipe-A-force-quirks-to-i915-driver.patch
Modified:
   dists/squeeze/linux-2.6/debian/changelog
   dists/squeeze/linux-2.6/debian/patches/series/31

Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog	Mon Mar  7 01:25:12 2011	(r17016)
+++ dists/squeeze/linux-2.6/debian/changelog	Mon Mar  7 01:26:50 2011	(r17017)
@@ -45,6 +45,7 @@
   * [x86] Enable VT6656, loading firmware from a separate file (requires
     firmware-linux-nonfree 0.28+squeeze1) (Closes: #568454)
   * usbfs: Show correct speed for SuperSpeed USB devices (Closes: #613531)
+  * drm/i915: Add pipe A force quirk for some laptops (Closes: #608148)
 
   [ dann frazier ]
   * xfs: Fix information leak using stale NFS handle (CVE-2010-2943)

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-add-pipe-A-force-quirks-to-i915-driver.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-add-pipe-A-force-quirks-to-i915-driver.patch	Mon Mar  7 01:26:50 2011	(r17017)
@@ -0,0 +1,147 @@
+From: Jesse Barnes <jbarnes at virtuousgeek.org>
+Date: Mon, 19 Jul 2010 13:53:12 -0700
+Subject: [PATCH] drm/i915: add pipe A force quirks to i915 driver
+
+commit b690e96cf9e6a6cde6f0393de47bdd6317ddb5de upstream.
+
+Ported over from the old UMS list.  Unfortunately they're still
+necessary especially on older laptop platforms.
+
+Fixes https://bugs.freedesktop.org/show_bug.cgi?id=22126.
+
+Tested-by: Xavier <shiningxc at gmail.com>
+Tested-by: Diego Escalante Urrelo <diegoe at gnome.org>
+Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
+Signed-off-by: Eric Anholt <eric at anholt.net>
+[bwh: Adjust context for 2.6.33]
+---
+ drivers/gpu/drm/i915/i915_drv.h      |    4 ++
+ drivers/gpu/drm/i915/intel_display.c |   69 +++++++++++++++++++++++++++++++++-
+ 2 files changed, 72 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
+index ecc4fbe..5852429 100644
+--- a/drivers/gpu/drm/i915/i915_drv.h
++++ b/drivers/gpu/drm/i915/i915_drv.h
+@@ -193,6 +193,8 @@ struct intel_device_info {
+ 	u8 cursor_needs_physical : 1;
+ };
+ 
++#define QUIRK_PIPEA_FORCE (1<<0)
++
+ typedef struct drm_i915_private {
+ 	struct drm_device *dev;
+ 
+@@ -306,6 +308,8 @@ typedef struct drm_i915_private {
+ 	/* Display functions */
+ 	struct drm_i915_display_funcs display;
+ 
++	unsigned long quirks;
++
+ 	/* Register state */
+ 	bool modeset_on_lid;
+ 	u8 saveLBB;
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 4899596..6a94a8e 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -2031,6 +2031,11 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
+ 			intel_wait_for_vblank(dev);
+ 		}
+ 
++		/* Don't disable pipe A or pipe A PLLs if needed */
++		if (pipeconf_reg == PIPEACONF &&
++		    (dev_priv->quirks & QUIRK_PIPEA_FORCE))
++			goto skip_pipe_off;
++
+ 		/* Next, disable display pipes */
+ 		temp = I915_READ(pipeconf_reg);
+ 		if ((temp & PIPEACONF_ENABLE) != 0) {
+@@ -2046,7 +2051,7 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
+ 			I915_WRITE(dpll_reg, temp & ~DPLL_VCO_ENABLE);
+ 			I915_READ(dpll_reg);
+ 		}
+-
++	skip_pipe_off:
+ 		/* Wait for the clocks to turn off. */
+ 		udelay(150);
+ 		break;
+@@ -4840,6 +4845,66 @@ static void intel_init_display(struct drm_device *dev)
+ 	}
+ }
+ 
++/*
++ * Some BIOSes insist on assuming the GPU's pipe A is enabled at suspend,
++ * resume, or other times.  This quirk makes sure that's the case for
++ * affected systems.
++ */
++static void quirk_pipea_force (struct drm_device *dev)
++{
++	struct drm_i915_private *dev_priv = dev->dev_private;
++
++	dev_priv->quirks |= QUIRK_PIPEA_FORCE;
++	DRM_DEBUG_DRIVER("applying pipe a force quirk\n");
++}
++
++struct intel_quirk {
++	int device;
++	int subsystem_vendor;
++	int subsystem_device;
++	void (*hook)(struct drm_device *dev);
++};
++
++struct intel_quirk intel_quirks[] = {
++	/* HP Compaq 2730p needs pipe A force quirk (LP: #291555) */
++	{ 0x2a42, 0x103c, 0x30eb, quirk_pipea_force },
++	/* HP Mini needs pipe A force quirk (LP: #322104) */
++	{ 0x27ae,0x103c, 0x361a, quirk_pipea_force },
++
++	/* Thinkpad R31 needs pipe A force quirk */
++	{ 0x3577, 0x1014, 0x0505, quirk_pipea_force },
++	/* Toshiba Protege R-205, S-209 needs pipe A force quirk */
++	{ 0x2592, 0x1179, 0x0001, quirk_pipea_force },
++
++	/* ThinkPad X30 needs pipe A force quirk (LP: #304614) */
++	{ 0x3577,  0x1014, 0x0513, quirk_pipea_force },
++	/* ThinkPad X40 needs pipe A force quirk */
++
++	/* ThinkPad T60 needs pipe A force quirk (bug #16494) */
++	{ 0x2782, 0x17aa, 0x201a, quirk_pipea_force },
++
++	/* 855 & before need to leave pipe A & dpll A up */
++	{ 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
++	{ 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
++};
++
++static void intel_init_quirks(struct drm_device *dev)
++{
++	struct pci_dev *d = dev->pdev;
++	int i;
++
++	for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
++		struct intel_quirk *q = &intel_quirks[i];
++
++		if (d->device == q->device &&
++		    (d->subsystem_vendor == q->subsystem_vendor ||
++		     q->subsystem_vendor == PCI_ANY_ID) &&
++		    (d->subsystem_device == q->subsystem_device ||
++		     q->subsystem_device == PCI_ANY_ID))
++			q->hook(dev);
++	}
++}
++
+ void intel_modeset_init(struct drm_device *dev)
+ {
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
+@@ -4853,6 +4918,8 @@ void intel_modeset_init(struct drm_device *dev)
+ 
+ 	dev->mode_config.funcs = (void *)&intel_mode_funcs;
+ 
++	intel_init_quirks(dev);
++
+ 	intel_init_display(dev);
+ 
+ 	if (IS_I965G(dev)) {
+-- 
+1.7.4.1
+

Modified: dists/squeeze/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/31	Mon Mar  7 01:25:12 2011	(r17016)
+++ dists/squeeze/linux-2.6/debian/patches/series/31	Mon Mar  7 01:26:50 2011	(r17017)
@@ -56,3 +56,4 @@
 + bugfix/all/ipv6-Silence-privacy-extensions-initialization.patch
 + features/all/vt6656-Use-request_firmware-to-load-firmware.patch
 + bugfix/all/usb_superspeed_devices_spd.patch
++ bugfix/x86/drm-i915-add-pipe-A-force-quirks-to-i915-driver.patch



More information about the Kernel-svn-changes mailing list