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 <[email protected]> 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 <[email protected]> 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 <[email protected]> Acked-by: Alex Deucher <[email protected]> Signed-off-by: Daniel Vetter <[email protected]> Signed-off-by: Dave Airlie <[email protected]> Signed-off-by: Jonathan Nieder <[email protected]> --- 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

