Commit bf66625e authored by Christian König's avatar Christian König

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: default avatarChristian König <deathsimple@vodafone.de>
Reviewed-by: default avatarJerome Glisse <jglisse@redhat.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 07a71330
...@@ -42,21 +42,23 @@ ...@@ -42,21 +42,23 @@
static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring) static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring)
{ {
if (rdev->wb.enabled) { struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
*rdev->fence_drv[ring].cpu_addr = cpu_to_le32(seq); if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
*drv->cpu_addr = cpu_to_le32(seq);
} else { } 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) static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
{ {
struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
u32 seq = 0; u32 seq = 0;
if (rdev->wb.enabled) { if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
seq = le32_to_cpu(*rdev->fence_drv[ring].cpu_addr); seq = le32_to_cpu(*drv->cpu_addr);
} else { } else {
seq = RREG32(rdev->fence_drv[ring].scratch_reg); seq = RREG32(drv->scratch_reg);
} }
return seq; return seq;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment