From: Dave Airlie <[email protected]>

Before we use any of VRAM, we need to disable the VGA rendering
engine, this render text mode into a graphical framebuffer
for scanout, however it does this on vblank, and can end up
overwriting the GART table and r600 shader objects.

Signed-off-by: Dave Airlie <[email protected]>
---
 drivers/gpu/drm/radeon/avivod.h |    9 +++++++++
 drivers/gpu/drm/radeon/r600.c   |    4 ++++
 drivers/gpu/drm/radeon/rs600.c  |    3 +++
 drivers/gpu/drm/radeon/rv770.c  |    4 ++++
 4 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/radeon/avivod.h b/drivers/gpu/drm/radeon/avivod.h
index d4e6e6e..e2b92c4 100644
--- a/drivers/gpu/drm/radeon/avivod.h
+++ b/drivers/gpu/drm/radeon/avivod.h
@@ -57,4 +57,13 @@
 #define        VGA_RENDER_CONTROL                              0x0300
 #define                VGA_VSTATUS_CNTL_MASK                           
0x00030000
 
+/* AVIVO disable VGA rendering */
+static inline void radeon_avivo_vga_render_disable(struct radeon_device *rdev)
+{
+       u32 vga_render;
+       vga_render = RREG32(VGA_RENDER_CONTROL);
+       vga_render &= ~VGA_VSTATUS_CNTL_MASK;
+       WREG32(VGA_RENDER_CONTROL, vga_render);
+}
+
 #endif
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 65699e9..6951c10 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -340,6 +340,10 @@ static void r600_mc_resume(struct radeon_device *rdev)
        WREG32(D1VGA_CONTROL, d1vga_control);
        WREG32(D2VGA_CONTROL, d2vga_control);
        WREG32(VGA_RENDER_CONTROL, vga_render_control);
+
+       /* we need to own VRAM, so turn off the VGA renderer here
+        * to stop it overwriting our objects */
+       radeon_avivo_vga_render_disable(rdev);
 }
 
 int r600_mc_init(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index c31bd84..1d134ff 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -28,6 +28,7 @@
 #include "drmP.h"
 #include "radeon_reg.h"
 #include "radeon.h"
+#include "avivod.h"
 
 #include "rs600_reg_safe.h"
 
@@ -197,6 +198,8 @@ void rs600_mc_disable_clients(struct radeon_device *rdev)
                       "programming pipes. Bad things might happen.\n");
        }
 
+       radeon_avivo_vga_render_disable(rdev);
+
        tmp = RREG32(AVIVO_D1VGA_CONTROL);
        WREG32(AVIVO_D1VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
        tmp = RREG32(AVIVO_D2VGA_CONTROL);
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 4f2098b..036066d 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -229,6 +229,10 @@ static void rv770_mc_resume(struct radeon_device *rdev)
        WREG32(D1VGA_CONTROL, d1vga_control);
        WREG32(D2VGA_CONTROL, d2vga_control);
        WREG32(VGA_RENDER_CONTROL, vga_render_control);
+
+       /* we need to own VRAM, so turn off the VGA renderer here
+        * to stop it overwriting our objects */
+       radeon_avivo_vga_render_disable(rdev);
 }
 
 
-- 
1.6.4.2


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to