drm/radeon: fix fence value access
authorChristian König <deathsimple@vodafone.de>
Mon, 9 Jul 2012 08:52:39 +0000 (10:52 +0200)
committerChristian König <deathsimple@vodafone.de>
Tue, 17 Jul 2012 08:32:15 +0000 (10:32 +0200)
It is possible that radeon_fence_process is called
after writeback is disabled for suspend, leading
to an invalid read of register 0x0.

This fixes a problem for me where the fence value
is temporary incremented by 0x100000000 on
suspend/resume.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon_fence.c

index be4e4f3..a194a14 100644 (file)
 
 static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring)
 {
-       if (rdev->wb.enabled) {
-               *rdev->fence_drv[ring].cpu_addr = cpu_to_le32(seq);
+       struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
+       if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
+               *drv->cpu_addr = cpu_to_le32(seq);
        } else {
-               WREG32(rdev->fence_drv[ring].scratch_reg, seq);
+               WREG32(drv->scratch_reg, seq);
        }
 }
 
 static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
 {
+       struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
        u32 seq = 0;
 
-       if (rdev->wb.enabled) {
-               seq = le32_to_cpu(*rdev->fence_drv[ring].cpu_addr);
+       if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
+               seq = le32_to_cpu(*drv->cpu_addr);
        } else {
-               seq = RREG32(rdev->fence_drv[ring].scratch_reg);
+               seq = RREG32(drv->scratch_reg);
        }
        return seq;
 }