Skip to content

Commit b81157d

Browse files
agd5fairlied
authored andcommitted
drm/radeon/kms: use helper functions for fence read/write
The existing code assumed scratch registers in a number of places while in most cases we are be using writeback and events rather than scratch registers. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent 11b0a5b commit b81157d

File tree

1 file changed

+36
-15
lines changed

1 file changed

+36
-15
lines changed

drivers/gpu/drm/radeon/radeon_fence.c

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,35 @@
4040
#include "radeon.h"
4141
#include "radeon_trace.h"
4242

43+
static void radeon_fence_write(struct radeon_device *rdev, u32 seq)
44+
{
45+
if (rdev->wb.enabled) {
46+
u32 scratch_index;
47+
if (rdev->wb.use_event)
48+
scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
49+
else
50+
scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
51+
rdev->wb.wb[scratch_index/4] = cpu_to_le32(seq);;
52+
} else
53+
WREG32(rdev->fence_drv.scratch_reg, seq);
54+
}
55+
56+
static u32 radeon_fence_read(struct radeon_device *rdev)
57+
{
58+
u32 seq;
59+
60+
if (rdev->wb.enabled) {
61+
u32 scratch_index;
62+
if (rdev->wb.use_event)
63+
scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
64+
else
65+
scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
66+
seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]);
67+
} else
68+
seq = RREG32(rdev->fence_drv.scratch_reg);
69+
return seq;
70+
}
71+
4372
int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
4473
{
4574
unsigned long irq_flags;
@@ -50,12 +79,12 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
5079
return 0;
5180
}
5281
fence->seq = atomic_add_return(1, &rdev->fence_drv.seq);
53-
if (!rdev->cp.ready) {
82+
if (!rdev->cp.ready)
5483
/* FIXME: cp is not running assume everythings is done right
5584
* away
5685
*/
57-
WREG32(rdev->fence_drv.scratch_reg, fence->seq);
58-
} else
86+
radeon_fence_write(rdev, fence->seq);
87+
else
5988
radeon_fence_ring_emit(rdev, fence);
6089

6190
trace_radeon_fence_emit(rdev->ddev, fence->seq);
@@ -73,15 +102,7 @@ static bool radeon_fence_poll_locked(struct radeon_device *rdev)
73102
bool wake = false;
74103
unsigned long cjiffies;
75104

76-
if (rdev->wb.enabled) {
77-
u32 scratch_index;
78-
if (rdev->wb.use_event)
79-
scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
80-
else
81-
scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
82-
seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]);
83-
} else
84-
seq = RREG32(rdev->fence_drv.scratch_reg);
105+
seq = radeon_fence_read(rdev);
85106
if (seq != rdev->fence_drv.last_seq) {
86107
rdev->fence_drv.last_seq = seq;
87108
rdev->fence_drv.last_jiffies = jiffies;
@@ -251,7 +272,7 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
251272
r = radeon_gpu_reset(rdev);
252273
if (r)
253274
return r;
254-
WREG32(rdev->fence_drv.scratch_reg, fence->seq);
275+
radeon_fence_write(rdev, fence->seq);
255276
rdev->gpu_lockup = false;
256277
}
257278
timeout = RADEON_FENCE_JIFFIES_TIMEOUT;
@@ -351,7 +372,7 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
351372
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
352373
return r;
353374
}
354-
WREG32(rdev->fence_drv.scratch_reg, 0);
375+
radeon_fence_write(rdev, 0);
355376
atomic_set(&rdev->fence_drv.seq, 0);
356377
INIT_LIST_HEAD(&rdev->fence_drv.created);
357378
INIT_LIST_HEAD(&rdev->fence_drv.emited);
@@ -391,7 +412,7 @@ static int radeon_debugfs_fence_info(struct seq_file *m, void *data)
391412
struct radeon_fence *fence;
392413

393414
seq_printf(m, "Last signaled fence 0x%08X\n",
394-
RREG32(rdev->fence_drv.scratch_reg));
415+
radeon_fence_read(rdev));
395416
if (!list_empty(&rdev->fence_drv.emited)) {
396417
fence = list_entry(rdev->fence_drv.emited.prev,
397418
struct radeon_fence, list);

0 commit comments

Comments
 (0)