aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r100.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-07-14 22:13:50 -0400
committerDave Airlie <airlied@redhat.com>2010-08-01 20:00:09 -0400
commit4c712e6c7ef19e7e8e1f38b27bb65290def39b40 (patch)
treec2f5d3663f849f445ff1154762188904e0633c2d /drivers/gpu/drm/radeon/r100.c
parente376573f7267390f4e1bdc552564b6fb913bce76 (diff)
drm/radeon/kms: check/restore sanity before doing anything else with GPU.
On systems using kexec, the new kernel is booted straight from the old kernel, without any warning to the graphics driver. So the GPU is basically left as-is in a running state, however the CPU side is completly reset. Without stating the saneness of anyone using kexec on live systems, we should at least try not to crash the GPU. This patch resets 3 registers to 0 that could cause bad things to happen to the running system. This allows kexec to work on a Power6/RN50 system. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r--drivers/gpu/drm/radeon/r100.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 5aa299527317..5d14732dc284 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -3809,6 +3809,31 @@ void r100_fini(struct radeon_device *rdev)
3809 rdev->bios = NULL; 3809 rdev->bios = NULL;
3810} 3810}
3811 3811
3812/*
3813 * Due to how kexec works, it can leave the hw fully initialised when it
3814 * boots the new kernel. However doing our init sequence with the CP and
3815 * WB stuff setup causes GPU hangs on the RN50 at least. So at startup
3816 * do some quick sanity checks and restore sane values to avoid this
3817 * problem.
3818 */
3819void r100_restore_sanity(struct radeon_device *rdev)
3820{
3821 u32 tmp;
3822
3823 tmp = RREG32(RADEON_CP_CSQ_CNTL);
3824 if (tmp) {
3825 WREG32(RADEON_CP_CSQ_CNTL, 0);
3826 }
3827 tmp = RREG32(RADEON_CP_RB_CNTL);
3828 if (tmp) {
3829 WREG32(RADEON_CP_RB_CNTL, 0);
3830 }
3831 tmp = RREG32(RADEON_SCRATCH_UMSK);
3832 if (tmp) {
3833 WREG32(RADEON_SCRATCH_UMSK, 0);
3834 }
3835}
3836
3812int r100_init(struct radeon_device *rdev) 3837int r100_init(struct radeon_device *rdev)
3813{ 3838{
3814 int r; 3839 int r;
@@ -3821,6 +3846,8 @@ int r100_init(struct radeon_device *rdev)
3821 radeon_scratch_init(rdev); 3846 radeon_scratch_init(rdev);
3822 /* Initialize surface registers */ 3847 /* Initialize surface registers */
3823 radeon_surface_init(rdev); 3848 radeon_surface_init(rdev);
3849 /* sanity check some register to avoid hangs like after kexec */
3850 r100_restore_sanity(rdev);
3824 /* TODO: disable VGA need to use VGA request */ 3851 /* TODO: disable VGA need to use VGA request */
3825 /* BIOS*/ 3852 /* BIOS*/
3826 if (!radeon_get_bios(rdev)) { 3853 if (!radeon_get_bios(rdev)) {