summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Ebbert <cebbert@redhat.com>2010-08-10 11:10:03 -0400
committerChuck Ebbert <cebbert@redhat.com>2010-08-10 11:10:03 -0400
commitf2a8acbfe3a5627565ac88f4ff1c3cbe2c4e7358 (patch)
treed05320d3a447deee907ea46e2e1cc2ccc10dba88
parent60c14ff8249ad0b775410ea8d5fc962876c6328e (diff)
downloaddom0-kernel-f2a8acbfe3a5627565ac88f4ff1c3cbe2c4e7358.tar.gz
dom0-kernel-f2a8acbfe3a5627565ac88f4ff1c3cbe2c4e7358.tar.xz
dom0-kernel-f2a8acbfe3a5627565ac88f4ff1c3cbe2c4e7358.zip
- Bring back drm-upgrayed-fixes.patch, dropped in the
2.6.32.16 update. (#620955) - Revert upstream DRM stable fix we already have: drm-i915-give-up-on-8xx-lid-status.patch
-rw-r--r--drm-upgrayed-fixes.patch1092
-rw-r--r--drm-upgrayedd.patch4
-rw-r--r--kernel.spec8
-rw-r--r--linux-2.6-upstream-reverts.patch39
4 files changed, 1141 insertions, 2 deletions
diff --git a/drm-upgrayed-fixes.patch b/drm-upgrayed-fixes.patch
new file mode 100644
index 0000000..e437dc2
--- /dev/null
+++ b/drm-upgrayed-fixes.patch
@@ -0,0 +1,1092 @@
+commit 9b86cec953ee8ae21be2183f34b8c8d2fcf14ecb
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Thu Feb 11 10:47:52 2010 -0500
+
+ drm/radeon/kms: remove HDP flushes from fence emit (v2)
+
+ r600_ioctl_wait_idle() now handles this.
+
+ v2: update blit fence counts
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 817dbb17e5e8fcdfb7bb3d18f3ceb15078dd6050
+Author: Dave Airlie <airlied@redhat.com>
+Date: Wed Mar 3 13:22:20 2010 +1000
+
+ drm/radeon: Add asic hook for dma copy to r200 cards.
+
+ r200 cards have dma engine which can be used to tranfer data
+ between vram and system memory.
+
+ r300 dma engine registers match r200 dma engine. Enabling
+ dma copy for r200 is simple as hooking r200 asic to already
+ existing function r300_copy_dma.
+
+ Rename r300_dma_copy to r200_dma_copyto reflect that supports
+ starts from r200 cards.
+
+ v2: Created a new asic object for r200 cards.
+
+ Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+ Conflicts:
+
+ drivers/gpu/drm/radeon/r300.c
+ drivers/gpu/drm/radeon/radeon_asic.h
+
+commit 30988e41d355e2011d1a340d6b889deeceeb447d
+Author: Pauli Nieminen <suokkos@gmail.com>
+Date: Thu Feb 11 17:55:35 2010 +0000
+
+ drm/radeon/kms: Create asic structure for r300 pcie cards.
+
+ Setting global asic structure to point to different function
+ would cause problem in system where is multiple r300 cards
+ with different bus type.
+
+ r300_asic_pcie is just copy from r300_asic with gart tlb
+ functions replaced with pcie versions.
+
+ Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 0faed138b285ef54c27a6c17016d8ff718c40113
+Author: Jesse Barnes <jbarnes@virtuousgeek.org>
+Date: Fri Feb 12 09:30:00 2010 -0800
+
+ drm/i915: give up on 8xx lid status
+
+ These old machines more often than not lie about their lid state. So
+ don't use it to detect LVDS presence, but leave the event handler to
+ deal with lid open/close, when we might need to reset the mode.
+
+ Fixes kernel bug #15248
+
+ Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+ Cc: stable@kernel.org
+ Signed-off-by: Eric Anholt <eric@anholt.net>
+
+commit 19d2051901dc28cf96d2b29e5f5c5f6725e90105
+Author: Jerome Glisse <jglisse@redhat.com>
+Date: Fri Feb 26 19:14:12 2010 +0000
+
+ drm/radeon/kms: initialize set_surface_reg reg for rs600 asic
+
+ rs600 asic was missing set_surface_reg callback leading to
+ oops.
+
+ Signed-off-by: Jerome Glisse <jglisse@redhat.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 884d6cda747259e5ba56c00cdc8a5406a45209c9
+Author: Dave Airlie <airlied@redhat.com>
+Date: Thu Feb 11 14:28:58 2010 +1000
+
+ drm/kms: fix fb_changed = true else statement
+
+ a patch from Roel was wrong, fix this properly, really
+ if the fb ptrs are different fb changed shuold be true.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit b6428034e4bc7c9d57d1a7394a4d77fc80737cf4
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Feb 23 21:56:12 2010 -0500
+
+ drm/radeon/kms/atom: fix shr/shl ops
+
+ The whole attribute table is valid for
+ shr/shl ops.
+
+ Fixes fdo bug 26668
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 93e49a04b1118c8036ccba855c1b8b095fd6b51b
+Author: Maarten Maathuis <madman2003@gmail.com>
+Date: Sat Feb 20 03:22:21 2010 +0100
+
+ drm/ttm: handle OOM in ttm_tt_swapout
+
+ - Without this change I get a general protection fault.
+ - Also use PTR_ERR where applicable.
+
+ Signed-off-by: Maarten Maathuis <madman2003@gmail.com>
+ Reviewed-by: Dave Airlie <airlied@redhat.com>
+ Acked-by: Thomas Hellstrom <thellstrom@vmware.com>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 36e437d37c849da2ad35d4ba3c0662d8a06f9f9f
+Author: Zhang Rui <rui.zhang@intel.com>
+Date: Tue Feb 16 04:16:55 2010 -0500
+
+ ACPI, i915: blacklist Clevo M5x0N bad_lid state
+
+ Wrong Lid state reported.
+ Need to blacklist this machine for LVDS detection.
+
+ Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+ Signed-off-by: Len Brown <len.brown@intel.com>
+
+commit 5bf1252153707877ae62bef73fe00731972ef18b
+Author: Adam Jackson <ajax@redhat.com>
+Date: Mon Feb 15 22:15:39 2010 +0000
+
+ drm/edid: Fix interlaced detailed timings to be frame size, not field.
+
+ cf. https://bugzilla.redhat.com/show_bug.cgi?id=533561
+
+ Signed-off-by: Adam Jackson <ajax@redhat.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 268d51cd56bcf861bd668163c1b618c96d8b3701
+Author: Rafael J. Wysocki <rjw@sisk.pl>
+Date: Thu Feb 18 23:06:27 2010 +0100
+
+ i915 / PM: Fix hibernate regression caused by suspend/resume splitting
+
+ Commit 84b79f8d2882b0a84330c04839ed4d3cefd2ff77 (drm/i915: Fix crash
+ while aborting hibernation) attempted to fix a regression introduced
+ by commit cbda12d77ea590082edb6d30bd342a67ebc459e0 (drm/i915:
+ implement new pm ops for i915), but it went too far trying to split
+ the freeze/suspend and resume/thaw parts of the code. As a result,
+ it introduced another regression, which only is visible on some systems.
+
+ Fix the problem by merging i915_drm_suspend() with
+ i915_drm_freeze() and moving some code from i915_resume()
+ into i915_drm_thaw(), so that intel_opregion_free() and
+ intel_opregion_init() are also executed in the freeze and thaw code
+ paths, respectively.
+
+ Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
+ Reported-and-tested-by: Pedro Ribeiro <pedrib@gmail.com>
+ Tested-by: Tino Keitel <tino.keitel@tikei.de>
+ Acked-by: Eric Anholt <eric@anholt.net>
+ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 8d205562d42d397086d829ba4b8f3911c3dca682
+Author: Francisco Jerez <currojerez@riseup.net>
+Date: Sat Feb 20 07:30:15 2010 +1000
+
+ drm/ttm: fix caching problem on non-PAT systems.
+
+ http://bugzilla.kernel.org/show_bug.cgi?id=15328
+
+ This fixes a serious regression on AGP/non-PAT systems, where
+ pages were ending up in the wrong state and slowing down the
+ whole system.
+
+ [airlied: taken this from the bug as the other option is to revert
+ the change which caused it].
+
+ Tested-by: John W. Linville (in bug).
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 7a2bb26f41ceb9b17805dcae93311004e03bd1d0
+Author: Dave Airlie <airlied@redhat.com>
+Date: Sat Feb 20 09:17:18 2010 +1000
+
+ drm/radeon: bump the UMS driver version number to indicate rv740 fix
+
+ This lets UMS userspace know the rv740 fix is in. For KMS we can
+ consider the kernel release to be the v2.0.0 release so we don't need the
+ bump there.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 211dc7044003e3ed8c7a2e2b646bf6937b921960
+Author: Jerome Glisse <jglisse@redhat.com>
+Date: Thu Feb 18 13:13:29 2010 +0000
+
+ drm/radeon/kms: free fence IB if it wasn't emited at IB free time
+
+ If at IB free time fence wasn't emited that means the IB wasn't
+ scheduled because an error occured somewhere, thus we can free
+ then fence and mark the IB as free.
+
+ Signed-off-by: Jerome Glisse <jglisse@redhat.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit b2449d6d4de19459d616011fbed87aaa485f5e71
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Fri Feb 19 16:07:02 2010 -0500
+
+ drm/radeon/rv740: fix backend setup
+
+ This patch fixes occlusion queries and rendering errors
+ on rv740 boards. Hardcoding the backend map is not an optimal
+ solution, but a better fix is being worked on.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 79b5531abdad5c266e87a5c35975e5a92f4aba20
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Fri Feb 19 02:13:56 2010 -0500
+
+ drm/radeon/kms: fix shared ddc detection
+
+ Just compare the i2c id since the i2c structs
+ may be slighly different.
+
+ Fixes fdo bug 26616.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit d2ffb93351a506acdfede450778964eb862e63b7
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Thu Feb 18 14:14:58 2010 -0500
+
+ drm/radeon/kms/rs600: add connector quirk
+
+ rs600 board lists DVI port as HDMI.
+
+ Fixes fdo bug 26605
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
+index 7d0f00a..f2aaf39 100644
+--- a/drivers/gpu/drm/drm_crtc_helper.c
++++ b/drivers/gpu/drm/drm_crtc_helper.c
+@@ -836,11 +836,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
+ mode_changed = true;
+ } else if (set->fb == NULL) {
+ mode_changed = true;
+- } else if ((set->fb->bits_per_pixel !=
+- set->crtc->fb->bits_per_pixel) ||
+- set->fb->depth != set->crtc->fb->depth)
+- fb_changed = true;
+- else
++ } else
+ fb_changed = true;
+ }
+
+diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
+index f41e91c..f97e7c4 100644
+--- a/drivers/gpu/drm/drm_edid.c
++++ b/drivers/gpu/drm/drm_edid.c
+@@ -598,6 +598,50 @@ struct drm_display_mode *drm_mode_std(struct drm_device *dev,
+ return mode;
+ }
+
++/*
++ * EDID is delightfully ambiguous about how interlaced modes are to be
++ * encoded. Our internal representation is of frame height, but some
++ * HDTV detailed timings are encoded as field height.
++ *
++ * The format list here is from CEA, in frame size. Technically we
++ * should be checking refresh rate too. Whatever.
++ */
++static void
++drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
++ struct detailed_pixel_timing *pt)
++{
++ int i;
++ static const struct {
++ int w, h;
++ } cea_interlaced[] = {
++ { 1920, 1080 },
++ { 720, 480 },
++ { 1440, 480 },
++ { 2880, 480 },
++ { 720, 576 },
++ { 1440, 576 },
++ { 2880, 576 },
++ };
++ static const int n_sizes =
++ sizeof(cea_interlaced)/sizeof(cea_interlaced[0]);
++
++ if (!(pt->misc & DRM_EDID_PT_INTERLACED))
++ return;
++
++ for (i = 0; i < n_sizes; i++) {
++ if ((mode->hdisplay == cea_interlaced[i].w) &&
++ (mode->vdisplay == cea_interlaced[i].h / 2)) {
++ mode->vdisplay *= 2;
++ mode->vsync_start *= 2;
++ mode->vsync_end *= 2;
++ mode->vtotal *= 2;
++ mode->vtotal |= 1;
++ }
++ }
++
++ mode->flags |= DRM_MODE_FLAG_INTERLACE;
++}
++
+ /**
+ * drm_mode_detailed - create a new mode from an EDID detailed timing section
+ * @dev: DRM device (needed to create new mode)
+@@ -680,8 +724,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
+
+ drm_mode_set_name(mode);
+
+- if (pt->misc & DRM_EDID_PT_INTERLACED)
+- mode->flags |= DRM_MODE_FLAG_INTERLACE;
++ drm_mode_do_interlace_quirk(mode, pt);
+
+ if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
+ pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE;
+diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
+index 79beffc..cf4cb3e 100644
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -176,6 +176,8 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
+
+ static int i915_drm_freeze(struct drm_device *dev)
+ {
++ struct drm_i915_private *dev_priv = dev->dev_private;
++
+ pci_save_state(dev->pdev);
+
+ /* If KMS is active, we do the leavevt stuff here */
+@@ -191,17 +193,12 @@ static int i915_drm_freeze(struct drm_device *dev)
+
+ i915_save_state(dev);
+
+- return 0;
+-}
+-
+-static void i915_drm_suspend(struct drm_device *dev)
+-{
+- struct drm_i915_private *dev_priv = dev->dev_private;
+-
+ intel_opregion_free(dev, 1);
+
+ /* Modeset on resume, not lid events */
+ dev_priv->modeset_on_lid = 0;
++
++ return 0;
+ }
+
+ static int i915_suspend(struct drm_device *dev, pm_message_t state)
+@@ -221,8 +218,6 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
+ if (error)
+ return error;
+
+- i915_drm_suspend(dev);
+-
+ if (state.event == PM_EVENT_SUSPEND) {
+ /* Shut down the device */
+ pci_disable_device(dev->pdev);
+@@ -237,6 +232,10 @@ static int i915_drm_thaw(struct drm_device *dev)
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ int error = 0;
+
++ i915_restore_state(dev);
++
++ intel_opregion_init(dev, 1);
++
+ /* KMS EnterVT equivalent */
+ if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+ mutex_lock(&dev->struct_mutex);
+@@ -263,10 +262,6 @@ static int i915_resume(struct drm_device *dev)
+
+ pci_set_master(dev->pdev);
+
+- i915_restore_state(dev);
+-
+- intel_opregion_init(dev, 1);
+-
+ return i915_drm_thaw(dev);
+ }
+
+@@ -423,8 +418,6 @@ static int i915_pm_suspend(struct device *dev)
+ if (error)
+ return error;
+
+- i915_drm_suspend(drm_dev);
+-
+ pci_disable_device(pdev);
+ pci_set_power_state(pdev, PCI_D3hot);
+
+@@ -464,13 +457,8 @@ static int i915_pm_poweroff(struct device *dev)
+ {
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct drm_device *drm_dev = pci_get_drvdata(pdev);
+- int error;
+-
+- error = i915_drm_freeze(drm_dev);
+- if (!error)
+- i915_drm_suspend(drm_dev);
+
+- return error;
++ return i915_drm_freeze(drm_dev);
+ }
+
+ const struct dev_pm_ops i915_pm_ops = {
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index b1d0acb..93031a7 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -636,6 +636,13 @@ static const struct dmi_system_id bad_lid_status[] = {
+ DMI_MATCH(DMI_PRODUCT_NAME, "PC-81005"),
+ },
+ },
++ {
++ .ident = "Clevo M5x0N",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
++ DMI_MATCH(DMI_BOARD_NAME, "M5x0N"),
++ },
++ },
+ { }
+ };
+
+@@ -648,8 +655,15 @@ static const struct dmi_system_id bad_lid_status[] = {
+ */
+ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
+ {
++ struct drm_device *dev = connector->dev;
+ enum drm_connector_status status = connector_status_connected;
+
++ /* ACPI lid methods were generally unreliable in this generation, so
++ * don't even bother.
++ */
++ if (IS_I8XX(dev))
++ return connector_status_connected;
++
+ if (!dmi_check_system(bad_lid_status) && !acpi_lid_open())
+ status = connector_status_disconnected;
+
+diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
+index 592ce91..4362f82 100644
+--- a/drivers/gpu/drm/radeon/atom.c
++++ b/drivers/gpu/drm/radeon/atom.c
+@@ -882,8 +882,6 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
+ uint8_t attr = U8((*ptr)++), shift;
+ uint32_t saved, dst;
+ int dptr = *ptr;
+- attr &= 0x38;
+- attr |= atom_def_dst[attr >> 3] << 6;
+ SDEBUG(" dst: ");
+ dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
+ shift = atom_get_src(ctx, attr, ptr);
+@@ -898,8 +896,6 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
+ uint8_t attr = U8((*ptr)++), shift;
+ uint32_t saved, dst;
+ int dptr = *ptr;
+- attr &= 0x38;
+- attr |= atom_def_dst[attr >> 3] << 6;
+ SDEBUG(" dst: ");
+ dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
+ shift = atom_get_src(ctx, attr, ptr);
+diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
+index ff1e0cd..1146c99 100644
+--- a/drivers/gpu/drm/radeon/r200.c
++++ b/drivers/gpu/drm/radeon/r200.c
+@@ -31,6 +31,7 @@
+ #include "radeon_reg.h"
+ #include "radeon.h"
+
++#include "r100d.h"
+ #include "r200_reg_safe.h"
+
+ #include "r100_track.h"
+@@ -79,6 +80,51 @@ static int r200_get_vtx_size_0(uint32_t vtx_fmt_0)
+ return vtx_size;
+ }
+
++int r200_copy_dma(struct radeon_device *rdev,
++ uint64_t src_offset,
++ uint64_t dst_offset,
++ unsigned num_pages,
++ struct radeon_fence *fence)
++{
++ uint32_t size;
++ uint32_t cur_size;
++ int i, num_loops;
++ int r = 0;
++
++ /* radeon pitch is /64 */
++ size = num_pages << PAGE_SHIFT;
++ num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
++ r = radeon_ring_lock(rdev, num_loops * 4 + 64);
++ if (r) {
++ DRM_ERROR("radeon: moving bo (%d).\n", r);
++ return r;
++ }
++ /* Must wait for 2D idle & clean before DMA or hangs might happen */
++ radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
++ radeon_ring_write(rdev, (1 << 16));
++ for (i = 0; i < num_loops; i++) {
++ cur_size = size;
++ if (cur_size > 0x1FFFFF) {
++ cur_size = 0x1FFFFF;
++ }
++ size -= cur_size;
++ radeon_ring_write(rdev, PACKET0(0x720, 2));
++ radeon_ring_write(rdev, src_offset);
++ radeon_ring_write(rdev, dst_offset);
++ radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
++ src_offset += cur_size;
++ dst_offset += cur_size;
++ }
++ radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
++ radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
++ if (fence) {
++ r = radeon_fence_emit(rdev, fence);
++ }
++ radeon_ring_unlock_commit(rdev);
++ return r;
++}
++
++
+ static int r200_get_vtx_size_1(uint32_t vtx_fmt_1)
+ {
+ int vtx_size, i, tex_size;
+diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
+index 43b55a0..6516cd6 100644
+--- a/drivers/gpu/drm/radeon/r300.c
++++ b/drivers/gpu/drm/radeon/r300.c
+@@ -198,50 +198,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev,
+ radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
+ }
+
+-int r300_copy_dma(struct radeon_device *rdev,
+- uint64_t src_offset,
+- uint64_t dst_offset,
+- unsigned num_pages,
+- struct radeon_fence *fence)
+-{
+- uint32_t size;
+- uint32_t cur_size;
+- int i, num_loops;
+- int r = 0;
+-
+- /* radeon pitch is /64 */
+- size = num_pages << PAGE_SHIFT;
+- num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
+- r = radeon_ring_lock(rdev, num_loops * 4 + 64);
+- if (r) {
+- DRM_ERROR("radeon: moving bo (%d).\n", r);
+- return r;
+- }
+- /* Must wait for 2D idle & clean before DMA or hangs might happen */
+- radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 ));
+- radeon_ring_write(rdev, (1 << 16));
+- for (i = 0; i < num_loops; i++) {
+- cur_size = size;
+- if (cur_size > 0x1FFFFF) {
+- cur_size = 0x1FFFFF;
+- }
+- size -= cur_size;
+- radeon_ring_write(rdev, PACKET0(0x720, 2));
+- radeon_ring_write(rdev, src_offset);
+- radeon_ring_write(rdev, dst_offset);
+- radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
+- src_offset += cur_size;
+- dst_offset += cur_size;
+- }
+- radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
+- radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
+- if (fence) {
+- r = radeon_fence_emit(rdev, fence);
+- }
+- radeon_ring_unlock_commit(rdev);
+- return r;
+-}
+-
+ void r300_ring_start(struct radeon_device *rdev)
+ {
+ unsigned gb_tile_config;
+diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
+index 91f5af9..526b3ec 100644
+--- a/drivers/gpu/drm/radeon/r600.c
++++ b/drivers/gpu/drm/radeon/r600.c
+@@ -1797,8 +1797,6 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
+ radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
+ radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
+ radeon_ring_write(rdev, fence->seq);
+- radeon_ring_write(rdev, PACKET0(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
+- radeon_ring_write(rdev, 1);
+ /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */
+ radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0));
+ radeon_ring_write(rdev, RB_INT_STAT);
+diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
+index ec49dad..de8bbbc 100644
+--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
++++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
+@@ -576,9 +576,9 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
+ ring_size = num_loops * dwords_per_loop;
+ /* set default + shaders */
+ ring_size += 40; /* shaders + def state */
+- ring_size += 12; /* fence emit for VB IB */
++ ring_size += 10; /* fence emit for VB IB */
+ ring_size += 5; /* done copy */
+- ring_size += 12; /* fence emit for done copy */
++ ring_size += 10; /* fence emit for done copy */
+ r = radeon_ring_lock(rdev, ring_size);
+ if (r)
+ return r;
+diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
+index 6d5a711..75bcf35 100644
+--- a/drivers/gpu/drm/radeon/r600_cp.c
++++ b/drivers/gpu/drm/radeon/r600_cp.c
+@@ -1428,9 +1428,12 @@ static void r700_gfx_init(struct drm_device *dev,
+
+ gb_tiling_config |= R600_BANK_SWAPS(1);
+
+- backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
+- dev_priv->r600_max_backends,
+- (0xff << dev_priv->r600_max_backends) & 0xff);
++ if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
++ backend_map = 0x28;
++ else
++ backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
++ dev_priv->r600_max_backends,
++ (0xff << dev_priv->r600_max_backends) & 0xff);
+ gb_tiling_config |= R600_BACKEND_MAP(backend_map);
+
+ cc_gc_shader_pipe_config =
+diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
+index 05ee1ae..afb3ddb 100644
+--- a/drivers/gpu/drm/radeon/radeon_asic.h
++++ b/drivers/gpu/drm/radeon/radeon_asic.h
+@@ -43,7 +43,7 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock
+ void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
+
+ /*
+- * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
++ * r100,rv100,rs100,rv200,rs200
+ */
+ extern int r100_init(struct radeon_device *rdev);
+ extern void r100_fini(struct radeon_device *rdev);
+@@ -120,6 +120,51 @@ static struct radeon_asic r100_asic = {
+ .ioctl_wait_idle = NULL,
+ };
+
++/*
++ * r200,rv250,rs300,rv280
++ */
++extern int r200_copy_dma(struct radeon_device *rdev,
++ uint64_t src_offset,
++ uint64_t dst_offset,
++ unsigned num_pages,
++ struct radeon_fence *fence);
++static struct radeon_asic r200_asic = {
++ .init = &r100_init,
++ .fini = &r100_fini,
++ .suspend = &r100_suspend,
++ .resume = &r100_resume,
++ .vga_set_state = &r100_vga_set_state,
++ .gpu_reset = &r100_gpu_reset,
++ .gart_tlb_flush = &r100_pci_gart_tlb_flush,
++ .gart_set_page = &r100_pci_gart_set_page,
++ .cp_commit = &r100_cp_commit,
++ .ring_start = &r100_ring_start,
++ .ring_test = &r100_ring_test,
++ .ring_ib_execute = &r100_ring_ib_execute,
++ .irq_set = &r100_irq_set,
++ .irq_process = &r100_irq_process,
++ .get_vblank_counter = &r100_get_vblank_counter,
++ .fence_ring_emit = &r100_fence_ring_emit,
++ .cs_parse = &r100_cs_parse,
++ .copy_blit = &r100_copy_blit,
++ .copy_dma = &r200_copy_dma,
++ .copy = &r100_copy_blit,
++ .get_engine_clock = &radeon_legacy_get_engine_clock,
++ .set_engine_clock = &radeon_legacy_set_engine_clock,
++ .get_memory_clock = &radeon_legacy_get_memory_clock,
++ .set_memory_clock = NULL,
++ .set_pcie_lanes = NULL,
++ .set_clock_gating = &radeon_legacy_set_clock_gating,
++ .set_surface_reg = r100_set_surface_reg,
++ .clear_surface_reg = r100_clear_surface_reg,
++ .bandwidth_update = &r100_bandwidth_update,
++ .hpd_init = &r100_hpd_init,
++ .hpd_fini = &r100_hpd_fini,
++ .hpd_sense = &r100_hpd_sense,
++ .hpd_set_polarity = &r100_hpd_set_polarity,
++ .ioctl_wait_idle = NULL,
++};
++
+
+ /*
+ * r300,r350,rv350,rv380
+@@ -138,11 +183,6 @@ extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t
+ extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
+ extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
+ extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
+-extern int r300_copy_dma(struct radeon_device *rdev,
+- uint64_t src_offset,
+- uint64_t dst_offset,
+- unsigned num_pages,
+- struct radeon_fence *fence);
+ static struct radeon_asic r300_asic = {
+ .init = &r300_init,
+ .fini = &r300_fini,
+@@ -162,7 +202,45 @@ static struct radeon_asic r300_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
++ .copy = &r100_copy_blit,
++ .get_engine_clock = &radeon_legacy_get_engine_clock,
++ .set_engine_clock = &radeon_legacy_set_engine_clock,
++ .get_memory_clock = &radeon_legacy_get_memory_clock,
++ .set_memory_clock = NULL,
++ .set_pcie_lanes = &rv370_set_pcie_lanes,
++ .set_clock_gating = &radeon_legacy_set_clock_gating,
++ .set_surface_reg = r100_set_surface_reg,
++ .clear_surface_reg = r100_clear_surface_reg,
++ .bandwidth_update = &r100_bandwidth_update,
++ .hpd_init = &r100_hpd_init,
++ .hpd_fini = &r100_hpd_fini,
++ .hpd_sense = &r100_hpd_sense,
++ .hpd_set_polarity = &r100_hpd_set_polarity,
++ .ioctl_wait_idle = NULL,
++};
++
++
++static struct radeon_asic r300_asic_pcie = {
++ .init = &r300_init,
++ .fini = &r300_fini,
++ .suspend = &r300_suspend,
++ .resume = &r300_resume,
++ .vga_set_state = &r100_vga_set_state,
++ .gpu_reset = &r300_gpu_reset,
++ .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
++ .gart_set_page = &rv370_pcie_gart_set_page,
++ .cp_commit = &r100_cp_commit,
++ .ring_start = &r300_ring_start,
++ .ring_test = &r100_ring_test,
++ .ring_ib_execute = &r100_ring_ib_execute,
++ .irq_set = &r100_irq_set,
++ .irq_process = &r100_irq_process,
++ .get_vblank_counter = &r100_get_vblank_counter,
++ .fence_ring_emit = &r300_fence_ring_emit,
++ .cs_parse = &r300_cs_parse,
++ .copy_blit = &r100_copy_blit,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_legacy_get_engine_clock,
+ .set_engine_clock = &radeon_legacy_set_engine_clock,
+@@ -206,7 +284,7 @@ static struct radeon_asic r420_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_atom_get_engine_clock,
+ .set_engine_clock = &radeon_atom_set_engine_clock,
+@@ -255,7 +333,7 @@ static struct radeon_asic rs400_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_legacy_get_engine_clock,
+ .set_engine_clock = &radeon_legacy_set_engine_clock,
+@@ -314,7 +392,7 @@ static struct radeon_asic rs600_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_atom_get_engine_clock,
+ .set_engine_clock = &radeon_atom_set_engine_clock,
+@@ -322,6 +400,8 @@ static struct radeon_asic rs600_asic = {
+ .set_memory_clock = &radeon_atom_set_memory_clock,
+ .set_pcie_lanes = NULL,
+ .set_clock_gating = &radeon_atom_set_clock_gating,
++ .set_surface_reg = r100_set_surface_reg,
++ .clear_surface_reg = r100_clear_surface_reg,
+ .bandwidth_update = &rs600_bandwidth_update,
+ .hpd_init = &rs600_hpd_init,
+ .hpd_fini = &rs600_hpd_fini,
+@@ -360,8 +440,8 @@ static struct radeon_asic rs690_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
+- .copy = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
++ .copy = &r200_copy_dma,
+ .get_engine_clock = &radeon_atom_get_engine_clock,
+ .set_engine_clock = &radeon_atom_set_engine_clock,
+ .get_memory_clock = &radeon_atom_get_memory_clock,
+@@ -412,7 +492,7 @@ static struct radeon_asic rv515_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_atom_get_engine_clock,
+ .set_engine_clock = &radeon_atom_set_engine_clock,
+@@ -455,7 +535,7 @@ static struct radeon_asic r520_asic = {
+ .fence_ring_emit = &r300_fence_ring_emit,
+ .cs_parse = &r300_cs_parse,
+ .copy_blit = &r100_copy_blit,
+- .copy_dma = &r300_copy_dma,
++ .copy_dma = &r200_copy_dma,
+ .copy = &r100_copy_blit,
+ .get_engine_clock = &radeon_atom_get_engine_clock,
+ .set_engine_clock = &radeon_atom_set_engine_clock,
+diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
+index 2dcda61..4d88315 100644
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -206,6 +206,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
+ *connector_type = DRM_MODE_CONNECTOR_DVID;
+ }
+
++ /* Asrock RS600 board lists the DVI port as HDMI */
++ if ((dev->pdev->device == 0x7941) &&
++ (dev->pdev->subsystem_vendor == 0x1849) &&
++ (dev->pdev->subsystem_device == 0x7941)) {
++ if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
++ (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
++ *connector_type = DRM_MODE_CONNECTOR_DVID;
++ }
++
+ /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
+ if ((dev->pdev->device == 0x7941) &&
+ (dev->pdev->subsystem_vendor == 0x147b) &&
+diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
+index 2381885..65f8194 100644
+--- a/drivers/gpu/drm/radeon/radeon_connectors.c
++++ b/drivers/gpu/drm/radeon/radeon_connectors.c
+@@ -780,7 +780,7 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
+ * connected and the DVI port disconnected. If the edid doesn't
+ * say HDMI, vice versa.
+ */
+- if (radeon_connector->shared_ddc && connector_status_connected) {
++ if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
+ struct drm_device *dev = connector->dev;
+ struct drm_connector *list_connector;
+ struct radeon_connector *list_radeon_connector;
+@@ -1060,8 +1060,7 @@ radeon_add_atom_connector(struct drm_device *dev,
+ return;
+ }
+ if (radeon_connector->ddc_bus && i2c_bus->valid) {
+- if (memcmp(&radeon_connector->ddc_bus->rec, i2c_bus,
+- sizeof(struct radeon_i2c_bus_rec)) == 0) {
++ if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
+ radeon_connector->shared_ddc = true;
+ shared_ddc = true;
+ }
+diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
+index 768b150..767aed8 100644
+--- a/drivers/gpu/drm/radeon/radeon_device.c
++++ b/drivers/gpu/drm/radeon/radeon_device.c
+@@ -329,21 +329,22 @@ int radeon_asic_init(struct radeon_device *rdev)
+ case CHIP_RS100:
+ case CHIP_RV200:
+ case CHIP_RS200:
++ rdev->asic = &r100_asic;
++ break;
+ case CHIP_R200:
+ case CHIP_RV250:
+ case CHIP_RS300:
+ case CHIP_RV280:
+- rdev->asic = &r100_asic;
++ rdev->asic = &r200_asic;
+ break;
+ case CHIP_R300:
+ case CHIP_R350:
+ case CHIP_RV350:
+ case CHIP_RV380:
+- rdev->asic = &r300_asic;
+- if (rdev->flags & RADEON_IS_PCIE) {
+- rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
+- rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
+- }
++ if (rdev->flags & RADEON_IS_PCIE)
++ rdev->asic = &r300_asic_pcie;
++ else
++ rdev->asic = &r300_asic;
+ break;
+ case CHIP_R420:
+ case CHIP_R423:
+diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h
+index e137852..c57ad60 100644
+--- a/drivers/gpu/drm/radeon/radeon_drv.h
++++ b/drivers/gpu/drm/radeon/radeon_drv.h
+@@ -106,9 +106,10 @@
+ * 1.29- R500 3D cmd buffer support
+ * 1.30- Add support for occlusion queries
+ * 1.31- Add support for num Z pipes from GET_PARAM
++ * 1.32- fixes for rv740 setup
+ */
+ #define DRIVER_MAJOR 1
+-#define DRIVER_MINOR 31
++#define DRIVER_MINOR 32
+ #define DRIVER_PATCHLEVEL 0
+
+ enum radeon_cp_microcode_version {
+diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
+index 694799f..6579eb4 100644
+--- a/drivers/gpu/drm/radeon/radeon_ring.c
++++ b/drivers/gpu/drm/radeon/radeon_ring.c
+@@ -100,6 +100,8 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib)
+ if (tmp == NULL) {
+ return;
+ }
++ if (!tmp->fence->emited)
++ radeon_fence_unref(&tmp->fence);
+ mutex_lock(&rdev->ib_pool.mutex);
+ tmp->free = true;
+ mutex_unlock(&rdev->ib_pool.mutex);
+diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
+index 5943d56..0302167 100644
+--- a/drivers/gpu/drm/radeon/rv770.c
++++ b/drivers/gpu/drm/radeon/rv770.c
+@@ -549,9 +549,12 @@ static void rv770_gpu_init(struct radeon_device *rdev)
+
+ gb_tiling_config |= BANK_SWAPS(1);
+
+- backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
+- rdev->config.rv770.max_backends,
+- (0xff << rdev->config.rv770.max_backends) & 0xff);
++ if (rdev->family == CHIP_RV740)
++ backend_map = 0x28;
++ else
++ backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
++ rdev->config.rv770.max_backends,
++ (0xff << rdev->config.rv770.max_backends) & 0xff);
+ gb_tiling_config |= BACKEND_MAP(backend_map);
+
+ cc_gc_shader_pipe_config =
+diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
+index e2123af..a759170 100644
+--- a/drivers/gpu/drm/ttm/ttm_tt.c
++++ b/drivers/gpu/drm/ttm/ttm_tt.c
+@@ -196,14 +196,15 @@ EXPORT_SYMBOL(ttm_tt_populate);
+
+ #ifdef CONFIG_X86
+ static inline int ttm_tt_set_page_caching(struct page *p,
+- enum ttm_caching_state c_state)
++ enum ttm_caching_state c_old,
++ enum ttm_caching_state c_new)
+ {
+ int ret = 0;
+
+ if (PageHighMem(p))
+ return 0;
+
+- if (get_page_memtype(p) != -1) {
++ if (c_old != tt_cached) {
+ /* p isn't in the default caching state, set it to
+ * writeback first to free its current memtype. */
+
+@@ -212,16 +213,17 @@ static inline int ttm_tt_set_page_caching(struct page *p,
+ return ret;
+ }
+
+- if (c_state == tt_wc)
++ if (c_new == tt_wc)
+ ret = set_memory_wc((unsigned long) page_address(p), 1);
+- else if (c_state == tt_uncached)
++ else if (c_new == tt_uncached)
+ ret = set_pages_uc(p, 1);
+
+ return ret;
+ }
+ #else /* CONFIG_X86 */
+ static inline int ttm_tt_set_page_caching(struct page *p,
+- enum ttm_caching_state c_state)
++ enum ttm_caching_state c_old,
++ enum ttm_caching_state c_new)
+ {
+ return 0;
+ }
+@@ -254,7 +256,9 @@ static int ttm_tt_set_caching(struct ttm_tt *ttm,
+ for (i = 0; i < ttm->num_pages; ++i) {
+ cur_page = ttm->pages[i];
+ if (likely(cur_page != NULL)) {
+- ret = ttm_tt_set_page_caching(cur_page, c_state);
++ ret = ttm_tt_set_page_caching(cur_page,
++ ttm->caching_state,
++ c_state);
+ if (unlikely(ret != 0))
+ goto out_err;
+ }
+@@ -268,7 +272,7 @@ out_err:
+ for (j = 0; j < i; ++j) {
+ cur_page = ttm->pages[j];
+ if (likely(cur_page != NULL)) {
+- (void)ttm_tt_set_page_caching(cur_page,
++ (void)ttm_tt_set_page_caching(cur_page, c_state,
+ ttm->caching_state);
+ }
+ }
+@@ -476,7 +480,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
+ void *from_virtual;
+ void *to_virtual;
+ int i;
+- int ret;
++ int ret = -ENOMEM;
+
+ if (ttm->page_flags & TTM_PAGE_FLAG_USER) {
+ ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start,
+@@ -495,8 +499,10 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
+
+ for (i = 0; i < ttm->num_pages; ++i) {
+ from_page = read_mapping_page(swap_space, i, NULL);
+- if (IS_ERR(from_page))
++ if (IS_ERR(from_page)) {
++ ret = PTR_ERR(from_page);
+ goto out_err;
++ }
+ to_page = __ttm_tt_get_page(ttm, i);
+ if (unlikely(to_page == NULL))
+ goto out_err;
+@@ -519,7 +525,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
+ return 0;
+ out_err:
+ ttm_tt_free_alloced_pages(ttm);
+- return -ENOMEM;
++ return ret;
+ }
+
+ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
+@@ -531,6 +537,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
+ void *from_virtual;
+ void *to_virtual;
+ int i;
++ int ret = -ENOMEM;
+
+ BUG_ON(ttm->state != tt_unbound && ttm->state != tt_unpopulated);
+ BUG_ON(ttm->caching_state != tt_cached);
+@@ -553,7 +560,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
+ 0);
+ if (unlikely(IS_ERR(swap_storage))) {
+ printk(KERN_ERR "Failed allocating swap storage.\n");
+- return -ENOMEM;
++ return PTR_ERR(swap_storage);
+ }
+ } else
+ swap_storage = persistant_swap_storage;
+@@ -565,9 +572,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
+ if (unlikely(from_page == NULL))
+ continue;
+ to_page = read_mapping_page(swap_space, i, NULL);
+- if (unlikely(to_page == NULL))
++ if (unlikely(IS_ERR(to_page))) {
++ ret = PTR_ERR(to_page);
+ goto out_err;
+-
++ }
+ preempt_disable();
+ from_virtual = kmap_atomic(from_page, KM_USER0);
+ to_virtual = kmap_atomic(to_page, KM_USER1);
+@@ -591,5 +599,5 @@ out_err:
+ if (!persistant_swap_storage)
+ fput(swap_storage);
+
+- return -ENOMEM;
++ return ret;
+ }
diff --git a/drm-upgrayedd.patch b/drm-upgrayedd.patch
index b6bb414..752567b 100644
--- a/drm-upgrayedd.patch
+++ b/drm-upgrayedd.patch
@@ -11499,8 +11499,8 @@ index 0e0e4b4..b1d0acb 100644
};
@@ -622,7 +650,7 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect
- if (IS_I8XX(dev))
- return connector_status_connected;
+ {
+ enum drm_connector_status status = connector_status_connected;
- if (!acpi_lid_open() && !dmi_check_system(bad_lid_status))
+ if (!dmi_check_system(bad_lid_status) && !acpi_lid_open())
diff --git a/kernel.spec b/kernel.spec
index dbce286..8a13775 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -716,6 +716,7 @@ Patch1700: linux-2.6-x86-64-fbdev-primary.patch
# nouveau + drm fixes
Patch1810: drm-upgrayedd.patch
+Patch1811: drm-upgrayed-fixes.patch
Patch1813: drm-radeon-pm.patch
#Patch1814: drm-nouveau.patch
Patch1818: drm-i915-resume-force-mode.patch
@@ -1461,6 +1462,7 @@ ApplyPatch linux-2.6-phylib-autoload.patch
ApplyPatch linux-2.6-x86-64-fbdev-primary.patch
# Nouveau DRM + drm fixes
ApplyPatch drm-upgrayedd.patch
+ApplyPatch drm-upgrayed-fixes.patch
#ApplyPatch drm-intel-big-hammer.patch
#ApplyPatch drm-intel-no-tv-hotplug.patch
ApplyOptionalPatch drm-intel-next.patch
@@ -2219,6 +2221,12 @@ fi
%kernel_variant_files -k vmlinux %{with_kdump} kdump
%changelog
+* Sat Aug 07 2010 Chuck Ebbert <cebbert@redhat.com> 2.6.32.18-158.rc1
+- Bring back drm-upgrayed-fixes.patch, dropped in the
+ 2.6.32.16 update. (#620955)
+- Revert upstream DRM stable fix we already have:
+ drm-i915-give-up-on-8xx-lid-status.patch
+
* Sat Aug 07 2010 Chuck Ebbert <cebbert@redhat.com>
- Linux 2.6.32.18-rc1
- Revert DRM patches from -stable we already have:
diff --git a/linux-2.6-upstream-reverts.patch b/linux-2.6-upstream-reverts.patch
index 83d0418..81f7983 100644
--- a/linux-2.6-upstream-reverts.patch
+++ b/linux-2.6-upstream-reverts.patch
@@ -1,3 +1,42 @@
+From 7b9c5abee98c54f85bcc04bd4d7ec8d5094c73f4 Mon Sep 17 00:00:00 2001
+From: Jesse Barnes <jbarnes@virtuousgeek.org>
+Date: Fri, 12 Feb 2010 09:30:00 -0800
+Subject: drm/i915: give up on 8xx lid status
+
+From: Jesse Barnes <jbarnes@virtuousgeek.org>
+
+commit 7b9c5abee98c54f85bcc04bd4d7ec8d5094c73f4 upstream.
+
+These old machines more often than not lie about their lid state. So
+don't use it to detect LVDS presence, but leave the event handler to
+deal with lid open/close, when we might need to reset the mode.
+
+Fixes kernel bug #15248
+
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Cc: Ben Hutchings <ben@decadent.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/gpu/drm/i915/intel_lvds.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -648,8 +648,12 @@ static const struct dmi_system_id bad_li
+ */
+ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
+ {
++ struct drm_device *dev = connector->dev;
+ enum drm_connector_status status = connector_status_connected;
+
++ if (IS_I8XX(dev))
++ return connector_status_connected;
++
+ if (!acpi_lid_open() && !dmi_check_system(bad_lid_status))
+ status = connector_status_disconnected;
+
From 6363ee6f496eb7e3b3f78dc105e522c7b496089b Mon Sep 17 00:00:00 2001
From: Zhao Yakui <yakui.zhao@intel.com>
Date: Tue, 24 Nov 2009 09:48:44 +0800