Bug#681632: GPU driver changes from 2.6.32.58+drm24
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
http://bugs.debian.org/662573
- 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
#575893).
- 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
flicker.
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)
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;
}
@@ -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))
continue;
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))
continue;
if (!best_match)
--
1.7.10.4
Reply to: