diff options
author | Christian König <deathsimple@vodafone.de> | 2012-07-09 04:52:39 -0400 |
---|---|---|
committer | Christian König <deathsimple@vodafone.de> | 2012-07-17 04:32:15 -0400 |
commit | bf66625e02ac8e4535627394bcfb237bbf8a157f (patch) | |
tree | e1d10c50e0a3c803a3e00af4c7f99d8ed454a80a /drivers/gpu/drm/radeon | |
parent | 07a713305a2b55d6ec424000f2c5bed1268ac56b (diff) |
drm/radeon: fix fence value access
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>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index be4e4f390e89..a194a142f898 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -42,21 +42,23 @@ | |||
42 | 42 | ||
43 | static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring) | 43 | static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring) |
44 | { | 44 | { |
45 | if (rdev->wb.enabled) { | 45 | struct radeon_fence_driver *drv = &rdev->fence_drv[ring]; |
46 | *rdev->fence_drv[ring].cpu_addr = cpu_to_le32(seq); | 46 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { |
47 | *drv->cpu_addr = cpu_to_le32(seq); | ||
47 | } else { | 48 | } else { |
48 | WREG32(rdev->fence_drv[ring].scratch_reg, seq); | 49 | WREG32(drv->scratch_reg, seq); |
49 | } | 50 | } |
50 | } | 51 | } |
51 | 52 | ||
52 | static u32 radeon_fence_read(struct radeon_device *rdev, int ring) | 53 | static u32 radeon_fence_read(struct radeon_device *rdev, int ring) |
53 | { | 54 | { |
55 | struct radeon_fence_driver *drv = &rdev->fence_drv[ring]; | ||
54 | u32 seq = 0; | 56 | u32 seq = 0; |
55 | 57 | ||
56 | if (rdev->wb.enabled) { | 58 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { |
57 | seq = le32_to_cpu(*rdev->fence_drv[ring].cpu_addr); | 59 | seq = le32_to_cpu(*drv->cpu_addr); |
58 | } else { | 60 | } else { |
59 | seq = RREG32(rdev->fence_drv[ring].scratch_reg); | 61 | seq = RREG32(drv->scratch_reg); |
60 | } | 62 | } |
61 | return seq; | 63 | return seq; |
62 | } | 64 | } |