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

Ben Hutchings benh at alioth.debian.org
Mon Jul 16 11:51:09 UTC 2012


Author: benh
Date: Mon Jul 16 11:51:07 2012
New Revision: 19261

Log:
Add drm changes up to 2.6.32.58+drm33.24 (Closes: #681632)

Added:
   dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-mm-fix-range-restricted-allocations.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-fix-sign-bug.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-fix-MSI-re-arm-on-rv370.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-prefer-high-post-dividers-in-legacy-p.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-TV-Out-refresh-rate.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-refleak-during-eviction.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Hold-a-reference-to-the-object-whilst-unbin.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Remove-BUG_ON-from-i915_gem_evict_something.patch
   dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-no-lvds-quirk-for-AOpen-MP45.patch
Modified:
   dists/squeeze/linux-2.6/debian/changelog
   dists/squeeze/linux-2.6/debian/patches/series/46

Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog	Mon Jul 16 11:50:42 2012	(r19260)
+++ dists/squeeze/linux-2.6/debian/changelog	Mon Jul 16 11:51:07 2012	(r19261)
@@ -15,6 +15,13 @@
     - drm/i915: Implement fair lru eviction across both rings. (v2)
     - drm/i915: Maintain LRU order of inactive objects upon access by CPU (v2)
     - drm/i915/evict: Ensure we completely cleanup on failure
+  * Add drm changes from 2.6.32.46+drm33.20, 2.6.32.48+drm33.21,
+    2.6.32.56+drm33.22, 2.6.32.57+drm33.23, 2.6.32.58+drm33.24
+    (Closes: #681632) including:
+    - drm/radeon/kms: prefer high post dividers in legacy pll algo
+      (Closes: #575893)
+    - drm: mm: fix range restricted allocations (regression in 2.6.32-36)
+    - drm/i915: no lvds quirk for AOpen MP45 (Closes: #662573)
 
   [ Jonathan Nieder ]
   * ath5k: initialize default noise floor

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-mm-fix-range-restricted-allocations.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-mm-fix-range-restricted-allocations.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,113 @@
+From 4a7ec2a70d1d11922991ff34e6f68ff2282e8a23 Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter at ffwll.ch>
+Date: Fri, 14 Oct 2011 10:05:50 -0500
+Subject: drm: mm: fix range restricted allocations
+
+With the code cleanup in
+
+7a6b2896f261894dde287d3faefa4b432cddca53 is the first bad commit
+commit 7a6b2896f261894dde287d3faefa4b432cddca53
+Author: Daniel Vetter <daniel.vetter at ffwll.ch>
+Date:   Fri Jul 2 15:02:15 2010 +0100
+
+    drm_mm: extract check_free_mm_node
+
+I've botched up the range-restriction checks. The result is usually
+an X server dying with SIGBUS in libpixman (software fallback rendering).
+Change the code to adjust the start and end for range restricted
+allocations. IMHO this even makes the code a bit clearer.
+
+Fixes regression bug: https://bugs.freedesktop.org/show_bug.cgi?id=29738
+
+Reported-by-Tested-by: Till MAtthiesen <entropy at everymail.net>
+Acked-by: Alex Deucher <alexdeucher at gmail.com>
+Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+(backported from commit 7521473305f1379403b893a30ac09a2132dc1e25 upstream)
+
+BugLink: http://bugs.launchpad.net/bugs/873130
+Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/drm_mm.c |   29 +++++++++++++++--------------
+ 1 file changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
+index f1d3314..5a23a9b 100644
+--- a/drivers/gpu/drm/drm_mm.c
++++ b/drivers/gpu/drm/drm_mm.c
+@@ -330,21 +330,21 @@ void drm_mm_put_block(struct drm_mm_node *cur)
+ 
+ EXPORT_SYMBOL(drm_mm_put_block);
+ 
+-static int check_free_mm_node(struct drm_mm_node *entry, unsigned long size,
+-			      unsigned alignment)
++static int check_free_hole(unsigned long start, unsigned long end,
++			   unsigned long size, unsigned alignment)
+ {
+ 	unsigned wasted = 0;
+ 
+-	if (entry->size < size)
++	if (end - start < size)
+ 		return 0;
+ 
+ 	if (alignment) {
+-		register unsigned tmp = entry->start % alignment;
++		unsigned tmp = start % alignment;
+ 		if (tmp)
+ 			wasted = alignment - tmp;
+ 	}
+ 
+-	if (entry->size >= size + wasted) {
++	if (end >= start + size + wasted) {
+ 		return 1;
+ 	}
+ 
+@@ -369,7 +369,8 @@ struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
+ 	list_for_each(list, free_stack) {
+ 		entry = list_entry(list, struct drm_mm_node, fl_entry);
+ 
+-		if (!check_free_mm_node(entry, size, alignment))
++		if (!check_free_hole(entry->start, entry->start + entry->size,
++				     size, alignment))
+ 			continue;
+ 
+ 		if (!best_match)
+@@ -392,7 +393,6 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
+ 						unsigned long end,
+ 						int best_match)
+ {
+-	struct list_head *list;
+ 	const struct list_head *free_stack = &mm->fl_entry;
+ 	struct drm_mm_node *entry;
+ 	struct drm_mm_node *best;
+@@ -403,13 +403,13 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
+ 	best = NULL;
+ 	best_size = ~0UL;
+ 
+-	list_for_each(list, free_stack) {
+-		entry = list_entry(list, struct drm_mm_node, fl_entry);
+-
+-		if (entry->start > end || (entry->start+entry->size) < start)
+-			continue;
++	list_for_each_entry(entry, free_stack, fl_entry) {
++		unsigned long adj_start = entry->start < start ?
++			start : entry->start;
++		unsigned long adj_end = entry->start + entry->size > end ?
++			end : entry->start + entry->size;
+ 
+-		if (!check_free_mm_node(entry, size, alignment))
++		if (!check_free_hole(adj_start, adj_end, size, alignment))
+ 			continue;
+ 
+ 		if (!best_match)
+@@ -502,7 +502,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
+ 	node->fl_entry.prev = prev_free;
+ 	node->fl_entry.next = next_free;
+ 
+-	if (check_free_mm_node(node, mm->scan_size, mm->scan_alignment)) {
++	if (check_free_hole(node->start, node->start + node->size,
++			    mm->scan_size, mm->scan_alignment)) {
+ 		mm->scan_hit_start = node->start;
+ 		mm->scan_hit_size = node->size;
+ 

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-fix-sign-bug.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-fix-sign-bug.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,47 @@
+From 0e5bf306ce8a5a7ce5b457731edd2ec1bee904fd Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <error27 at gmail.com>
+Date: Sat, 17 Jul 2010 12:28:02 +0200
+Subject: drm: radeon: fix sign bug
+
+The "error" variable is unsigned so it's never less than zero.  I
+changed it to check if (freq < current_freq) directly.
+
+"best_error" is also unsigned so "best_error - 100" could be a large
+number instead of a negative.  Since "error" is unsigned it is never
+less than a negative and so the cases where "best_error" is less than or
+equal to 100 are false.
+
+Signed-off-by: Dan Carpenter <error27 at gmail.com>
+Reviewed-by: Alex Deucher <alexdeucher at gmail.com>
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/radeon/radeon_display.c |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
+index 567bd8e..22ed217 100644
+--- a/drivers/gpu/drm/radeon/radeon_display.c
++++ b/drivers/gpu/drm/radeon/radeon_display.c
+@@ -519,15 +519,17 @@ void radeon_compute_pll(struct radeon_pll *pll,
+ 					current_freq = radeon_div(tmp, ref_div * post_div);
+ 
+ 					if (pll->flags & RADEON_PLL_PREFER_CLOSEST_LOWER) {
+-						error = freq - current_freq;
+-						error = error < 0 ? 0xffffffff : error;
++						if (freq < current_freq)
++							error = 0xffffffff;
++						else
++							error = freq - current_freq;
+ 					} else
+ 						error = abs(current_freq - freq);
+ 					vco_diff = abs(vco - best_vco);
+ 
+ 					if ((best_vco == 0 && error < best_error) ||
+ 					    (best_vco != 0 &&
+-					     (error < best_error - 100 ||
++					     ((best_error > 100 && error < best_error - 100) ||
+ 					      (abs(error - best_error) < 100 && vco_diff < best_vco_diff)))) {
+ 						best_post_div = post_div;
+ 						best_ref_div = ref_div;

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-fix-MSI-re-arm-on-rv370.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-fix-MSI-re-arm-on-rv370.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,52 @@
+From 0ddd40307b42d421c89fbff3ae36ffe47dee9760 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher at amd.com>
+Date: Mon, 13 Feb 2012 16:36:34 -0500
+Subject: drm/radeon/kms: fix MSI re-arm on rv370+
+
+commit b7f5b7dec3d539a84734f2bcb7e53fbb1532a40b upstream.
+
+MSI_REARM_EN register is a write only trigger register.
+There is no need RMW when re-arming.
+
+May fix:
+https://bugs.freedesktop.org/show_bug.cgi?id=41668
+
+Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/radeon/r100.c  |    4 +---
+ drivers/gpu/drm/radeon/rs600.c |    4 +---
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
+index 6021e91..f35fcdb 100644
+--- a/drivers/gpu/drm/radeon/r100.c
++++ b/drivers/gpu/drm/radeon/r100.c
+@@ -337,9 +337,7 @@ int r100_irq_process(struct radeon_device *rdev)
+ 			WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM);
+ 			break;
+ 		default:
+-			msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN;
+-			WREG32(RADEON_MSI_REARM_EN, msi_rearm);
+-			WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN);
++			WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN);
+ 			break;
+ 		}
+ 	}
+diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
+index d9a0187..13a09ef 100644
+--- a/drivers/gpu/drm/radeon/rs600.c
++++ b/drivers/gpu/drm/radeon/rs600.c
+@@ -431,9 +431,7 @@ int rs600_irq_process(struct radeon_device *rdev)
+ 			WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM);
+ 			break;
+ 		default:
+-			msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN;
+-			WREG32(RADEON_MSI_REARM_EN, msi_rearm);
+-			WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN);
++			WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN);
+ 			break;
+ 		}
+ 	}

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-prefer-high-post-dividers-in-legacy-p.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-radeon-kms-prefer-high-post-dividers-in-legacy-p.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,28 @@
+From 2b9d565be7deb81ab7fe0a87965191af9c1a6d41 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexdeucher at gmail.com>
+Date: Wed, 29 Sep 2010 11:37:39 -0400
+Subject: drm/radeon/kms: prefer high post dividers in legacy pll algo
+
+the hw prefers higher post dividers
+
+Signed-off-by: Alex Deucher <alexdeucher at gmail.com>
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/radeon/radeon_display.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
+index 22ed217..60a51dc 100644
+--- a/drivers/gpu/drm/radeon/radeon_display.c
++++ b/drivers/gpu/drm/radeon/radeon_display.c
+@@ -464,7 +464,7 @@ void radeon_compute_pll(struct radeon_pll *pll,
+ 		max_fractional_feed_div = pll->max_frac_feedback_div;
+ 	}
+ 
+-	for (post_div = min_post_div; post_div <= max_post_div; ++post_div) {
++	for (post_div = max_post_div; post_div >= min_post_div; --post_div) {
+ 		uint32_t ref_div;
+ 
+ 		if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-TV-Out-refresh-rate.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-TV-Out-refresh-rate.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,96 @@
+From b3fe843c9cd4c462013e4b59e37ff831ede6e5d2 Mon Sep 17 00:00:00 2001
+From: Rodrigo Vivi <rodrigo.vivi at gmail.com>
+Date: Wed, 14 Dec 2011 21:10:06 -0200
+Subject: drm/i915: Fix TV Out refresh rate.
+
+commit 23bd15ec662344dc10e9918fdd0dbc58bc71526d upstream.
+
+TV Out refresh rate was half of the specification for almost all modes.
+Due to this reason pixel clock was so low for some modes causing flickering screen.
+
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
+Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>
+Signed-off-by: Keith Packard <keithp at keithp.com>
+Signed-off-by: Eugeni Dodonov <eugeni.dodonov at intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/i915/intel_tv.c |   16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
+index 552ec11..ae64f9d 100644
+--- a/drivers/gpu/drm/i915/intel_tv.c
++++ b/drivers/gpu/drm/i915/intel_tv.c
+@@ -415,7 +415,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name		= "NTSC-M",
+ 		.clock		= 108000,
+-		.refresh	= 29970,
++		.refresh	= 59940,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
+@@ -458,7 +458,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name		= "NTSC-443",
+ 		.clock		= 108000,
+-		.refresh	= 29970,
++		.refresh	= 59940,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */
+@@ -500,7 +500,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name		= "NTSC-J",
+ 		.clock		= 108000,
+-		.refresh	= 29970,
++		.refresh	= 59940,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 
+@@ -543,7 +543,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name		= "PAL-M",
+ 		.clock		= 108000,
+-		.refresh	= 29970,
++		.refresh	= 59940,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 
+@@ -587,7 +587,7 @@ static const struct tv_mode tv_modes[] = {
+ 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
+ 		.name	    = "PAL-N",
+ 		.clock		= 108000,
+-		.refresh	= 25000,
++		.refresh	= 50000,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 
+@@ -632,7 +632,7 @@ static const struct tv_mode tv_modes[] = {
+ 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
+ 		.name	    = "PAL",
+ 		.clock		= 108000,
+-		.refresh	= 25000,
++		.refresh	= 50000,
+ 		.oversample	= TV_OVERSAMPLE_8X,
+ 		.component_only = 0,
+ 
+@@ -819,7 +819,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name       = "1080i at 50Hz",
+ 		.clock		= 148800,
+-		.refresh	= 25000,
++		.refresh	= 50000,
+ 		.oversample     = TV_OVERSAMPLE_2X,
+ 		.component_only = 1,
+ 
+@@ -845,7 +845,7 @@ static const struct tv_mode tv_modes[] = {
+ 	{
+ 		.name       = "1080i at 60Hz",
+ 		.clock		= 148800,
+-		.refresh	= 30000,
++		.refresh	= 60000,
+ 		.oversample     = TV_OVERSAMPLE_2X,
+ 		.component_only = 1,
+ 

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-refleak-during-eviction.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Fix-refleak-during-eviction.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,54 @@
+From 0ed44cff27014be0cc90e5dd6745f11371673c78 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Tue, 13 Sep 2011 08:46:49 -0500
+Subject: drm/i915: Fix refleak during eviction.
+
+Now that we hold onto a reference whilst evicting objects, we need to
+be sure that we drop all the references taken -- even on the error
+paths.
+
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+
+BugLink: http://bugs.launchpad.net/bugs/843904
+
+(backported from commit e39a01501b228e1be2037d5bddccae2a820af902 upstream)
+Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
+---
+ drivers/gpu/drm/i915/i915_gem_evict.c |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
+index c50c093..9e7f9c6 100644
+--- a/drivers/gpu/drm/i915/i915_gem_evict.c
++++ b/drivers/gpu/drm/i915/i915_gem_evict.c
+@@ -65,7 +65,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
+ {
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 	struct list_head eviction_list, unwind_list;
+-	struct drm_i915_gem_object *obj_priv, *tmp_obj_priv;
++	struct drm_i915_gem_object *obj_priv;
+ 	struct list_head *iter;
+ 	int ret = 0;
+ 
+@@ -157,8 +157,10 @@ found:
+ 	 * scanning, therefore store to be evicted objects on a
+ 	 * temporary list. */
+ 	INIT_LIST_HEAD(&eviction_list);
+-	list_for_each_entry_safe(obj_priv, tmp_obj_priv,
+-				 &unwind_list, evict_list) {
++	while (!list_empty(&unwind_list)) {
++		obj_priv = list_first_entry(&unwind_list,
++					    struct drm_i915_gem_object,
++					    evict_list);
+ 		if (drm_mm_scan_remove_block(obj_priv->gtt_space)) {
+ 			list_move(&obj_priv->evict_list, &eviction_list);
+ 			continue;
+@@ -179,7 +181,7 @@ found:
+ 		drm_gem_object_unreference(obj_priv->obj);
+ 	}
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ int

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Hold-a-reference-to-the-object-whilst-unbin.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Hold-a-reference-to-the-object-whilst-unbin.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,75 @@
+From 95a87afbd3b7521b75c7659d62ece3fdcf91181e Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Tue, 13 Sep 2011 08:46:48 -0500
+Subject: drm/i915: Hold a reference to the object whilst unbinding the
+ eviction list
+
+During heavy aperture thrashing we may be forced to wait upon several active
+objects during eviction. The active list may be the last reference to
+these objects and so the action of waiting upon one of them may cause
+another to be freed (and itself unbound). To prevent the object
+disappearing underneath us, we need to acquire and hold a reference
+whilst unbinding.
+
+This should fix the reported page refcount OOPS:
+
+kernel BUG at drivers/gpu/drm/i915/i915_gem.c:1444!
+...
+RIP: 0010:[<ffffffffa0093026>]  [<ffffffffa0093026>] i915_gem_object_put_pages+0x25/0xf5 [i915]
+Call Trace:
+ [<ffffffffa009481d>] i915_gem_object_unbind+0xc5/0x1a7 [i915]
+ [<ffffffffa0098ab2>] i915_gem_evict_something+0x3bd/0x409 [i915]
+ [<ffffffffa0027923>] ? drm_gem_object_lookup+0x27/0x57 [drm]
+ [<ffffffffa0093bc3>] i915_gem_object_bind_to_gtt+0x1d3/0x279 [i915]
+ [<ffffffffa0095b30>] i915_gem_object_pin+0xa3/0x146 [i915]
+ [<ffffffffa0027948>] ? drm_gem_object_lookup+0x4c/0x57 [drm]
+ [<ffffffffa00961bc>] i915_gem_do_execbuffer+0x50d/0xe32 [i915]
+
+Reported-by: Shawn Starr <shawn.starr at rogers.com>
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=18902
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+
+BugLink: http://bugs.launchpad.net/bugs/843904
+
+(backported from commit af6261031317f646d22f994c0b467521e47aa49f upstream)
+Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
+---
+ drivers/gpu/drm/i915/i915_gem_evict.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
+index c4c6b6f..c50c093 100644
+--- a/drivers/gpu/drm/i915/i915_gem_evict.c
++++ b/drivers/gpu/drm/i915/i915_gem_evict.c
+@@ -52,6 +52,7 @@ mark_free(struct drm_i915_gem_object *obj_priv,
+ 	   struct list_head *unwind)
+ {
+ 	list_add(&obj_priv->evict_list, unwind);
++	drm_gem_object_reference(obj_priv->obj);
+ 	return drm_mm_scan_add_block(obj_priv->gtt_space);
+ }
+ 
+@@ -143,6 +144,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
+ 		BUG_ON(ret);
+ 
+ 		list_del_init(&obj_priv->evict_list);
++		drm_gem_object_unreference(obj_priv->obj);
+ 	}
+ 
+ 	/* We expect the caller to unpin, evict all and try again, or give up.
+@@ -162,6 +164,7 @@ found:
+ 			continue;
+ 		}
+ 		list_del_init(&obj_priv->evict_list);
++		drm_gem_object_unreference(obj_priv->obj);
+ 	}
+ 
+ 	/* Unbinding will emit any required flushes */
+@@ -173,6 +176,7 @@ found:
+ 			ret = i915_gem_object_unbind(obj_priv->obj);
+ 
+ 		list_del_init(&obj_priv->evict_list);
++		drm_gem_object_unreference(obj_priv->obj);
+ 	}
+ 
+ 	return 0;

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Remove-BUG_ON-from-i915_gem_evict_something.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-Remove-BUG_ON-from-i915_gem_evict_something.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,36 @@
+From 25d62725f31ee2f2c9f51d34dda5bcbe467f544e Mon Sep 17 00:00:00 2001
+From: Seth Forshee <seth.forshee at canonical.com>
+Date: Tue, 23 Aug 2011 13:38:34 -0500
+Subject: drm/i915: Remove BUG_ON from i915_gem_evict_something
+
+BugLink: https://bugs.launcpad.net/bugs/828550
+
+According to Chris Wilson this BUG_ON was just paranoia and never
+something the kernel should explode on. He later removed it in
+upstream commit e39a01501b228e1be2037d5bddccae2a820af902. So let's
+just remove it.
+
+Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/i915/i915_gem_evict.c |    7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
+index 9c1ec78..c4c6b6f 100644
+--- a/drivers/gpu/drm/i915/i915_gem_evict.c
++++ b/drivers/gpu/drm/i915/i915_gem_evict.c
+@@ -175,13 +175,6 @@ found:
+ 		list_del_init(&obj_priv->evict_list);
+ 	}
+ 
+-	/* The just created free hole should be on the top of the free stack
+-	 * maintained by drm_mm, so this BUG_ON actually executes in O(1).
+-	 * Furthermore all accessed data has just recently been used, so it
+-	 * should be really fast, too. */
+-	BUG_ON(!drm_mm_search_free(&dev_priv->mm.gtt_space, min_size,
+-				   alignment, 0));
+-
+ 	return 0;
+ }
+ 

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-no-lvds-quirk-for-AOpen-MP45.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/x86/drm-i915-no-lvds-quirk-for-AOpen-MP45.patch	Mon Jul 16 11:51:07 2012	(r19261)
@@ -0,0 +1,38 @@
+From 6e327bd1ffb8f8614103bd33257cd42e6a7e8ad8 Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter at ffwll.ch>
+Date: Wed, 8 Feb 2012 16:42:52 +0100
+Subject: drm/i915: no lvds quirk for AOpen MP45
+
+commit e57b6886f555ab57f40a01713304e2053efe51ec upstream.
+
+According to a bug report, it doesn't have one.
+
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44263
+Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
+Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
+Signed-off-by: Keith Packard <keithp at keithp.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
+---
+ drivers/gpu/drm/i915/intel_lvds.c |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index 7cfc814..2f6f9fa 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -852,6 +852,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
+ 	},
+ 	{
+ 		.callback = intel_no_lvds_dmi_callback,
++                .ident = "AOpen i45GMx-I",
++                .matches = {
++                        DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
++                        DMI_MATCH(DMI_BOARD_NAME, "i45GMx-I"),
++                },
++        },
++	{
++		.callback = intel_no_lvds_dmi_callback,
+ 		.ident = "Aopen i945GTt-VFA",
+ 		.matches = {
+ 			DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),

Modified: dists/squeeze/linux-2.6/debian/patches/series/46
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/46	Mon Jul 16 11:50:42 2012	(r19260)
+++ dists/squeeze/linux-2.6/debian/patches/series/46	Mon Jul 16 11:51:07 2012	(r19261)
@@ -9,3 +9,12 @@
 + bugfix/all/drm-i915-Maintain-LRU-order-of-inactive-objects-upon.patch
 + bugfix/all/drm-i915-evict-Ensure-we-completely-cleanup-on-failu.patch
 + bugfix/all/drm-i915-Periodically-flush-the-active-lists-and-req.patch
++ bugfix/x86/drm-i915-Remove-BUG_ON-from-i915_gem_evict_something.patch
++ bugfix/x86/drm-i915-Hold-a-reference-to-the-object-whilst-unbin.patch
++ bugfix/x86/drm-i915-Fix-refleak-during-eviction.patch
++ bugfix/all/drm-radeon-fix-sign-bug.patch
++ bugfix/all/drm-radeon-kms-prefer-high-post-dividers-in-legacy-p.patch
++ bugfix/all/drm-mm-fix-range-restricted-allocations.patch
++ bugfix/x86/drm-i915-Fix-TV-Out-refresh-rate.patch
++ bugfix/x86/drm-i915-no-lvds-quirk-for-AOpen-MP45.patch
++ bugfix/all/drm-radeon-kms-fix-MSI-re-arm-on-rv370.patch



More information about the Kernel-svn-changes mailing list