[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#681632: GPU driver changes from

Source: linux-2.6
Version: 2.6.32-45

- drm/i915: Fix TV Out refresh rate.

Fixes flicker in NTSC/PAL/1080i output due to refresh rates off by a
factor of two (from 2.6.32-longterm).

- drm/i915: no lvds quirk for AOpen MP45

Overrides a buggy BIOS that makes a mini-desktop claim to have an
laptop display (from 2.6.32-longterm).  See also the description at

- drm/radeon/kms: fix MSI re-arm on rv370+

Meant to fix https://bugs.freedesktop.org/41668 but it doesn't.
I am guessing this is a no-op in practice (from 2.6.32-longterm).

- drm/i915: Remove BUG_ON from i915_gem_evict_something
- drm/i915: Hold a reference to the object whilst unbinding the eviction list
- drm/i915: Fix refleak during eviction

Followups for the fair eviction series.  We presumably won't take
these yet.

- drm: radeon: fix sign bug
- drm/radeon/kms: prefer high post dividers in legacy pll algo

Fixes unwanted flicker, especially on avivo (r5xx+) hardware (aka

- drm: mm: fix range restricted allocations

Fixes bus error in X and pixman [regression introduced in 2.6.32-36].
The patch depends textually on the fair eviction series so I'm
attaching a fresh backport based against the squeeze branch for
convenience (untested).

There are a few more changes queued in smb's drm-next that are not
part of a 2.6.32.y+drm.z release yet:

- drm/i915: Attempt to fix watermark setup on 85x (v2)

Prevents a crash launching the X server crash with 85x cards
(aka #661696, also in 2.6.32-longterm queue).

- drm/i915: Move Pineview CxSR and watermark code into update_wm hook
- drm/i915: Add CxSR support on Pineview DDR3

For certain cards the driver would set up self-refresh for power
saving but did so incorrectly in external monitor only mode, producing
From: Daniel Vetter <daniel.vetter@ffwll.ch>
Date: Thu, 26 Aug 2010 21:44:17 +0200
Subject: drm: mm: fix range restricted allocations

commit 7521473305f1379403b893a30ac09a2132dc1e25 upstream.

With the code cleanup in

7a6b2896f261894dde287d3faefa4b432cddca53 is the first bad commit
commit 7a6b2896f261894dde287d3faefa4b432cddca53
Author: Daniel Vetter <daniel.vetter@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@everymail.net>
Acked-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
 drivers/gpu/drm/drm_mm.c |   24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 4935e918b14d..c2c23e561d04 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -328,21 +328,21 @@ void drm_mm_put_block(struct drm_mm_node *cur)
-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;
@@ -365,7 +365,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))
 		if (!best_match)
@@ -398,12 +399,15 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
 	best_size = ~0UL;
 	list_for_each(list, free_stack) {
+		unsigned long adj_start, adj_end;
 		entry = list_entry(list, struct drm_mm_node, fl_entry);
+		adj_start = entry->start < start ?
+			start : entry->start;
+		adj_end = entry->start + entry->size > end ?
+			end : entry->start + entry->size;
-		if (entry->start > end || (entry->start+entry->size) < start)
-			continue;
-		if (!check_free_mm_node(entry, size, alignment))
+		if (!check_free_hole(adj_start, adj_end, size, alignment))
 		if (!best_match)

Reply to: