[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