Commit 7b9ef16b authored by Christian König's avatar Christian König Committed by Dave Airlie

drm/radeon: make forcing ring activity a common function

Nothing chipset or ring specific with it,
so also move it to radon_ring.
Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
Reviewed-by: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 67e3c787
...@@ -2424,7 +2424,6 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin ...@@ -2424,7 +2424,6 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
u32 srbm_status; u32 srbm_status;
u32 grbm_status; u32 grbm_status;
u32 grbm_status_se0, grbm_status_se1; u32 grbm_status_se0, grbm_status_se1;
int r;
srbm_status = RREG32(SRBM_STATUS); srbm_status = RREG32(SRBM_STATUS);
grbm_status = RREG32(GRBM_STATUS); grbm_status = RREG32(GRBM_STATUS);
...@@ -2435,14 +2434,7 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin ...@@ -2435,14 +2434,7 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
ring->rptr = RREG32(CP_RB_RPTR);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
...@@ -1397,7 +1397,6 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -1397,7 +1397,6 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
u32 srbm_status; u32 srbm_status;
u32 grbm_status; u32 grbm_status;
u32 grbm_status_se0, grbm_status_se1; u32 grbm_status_se0, grbm_status_se1;
int r;
srbm_status = RREG32(SRBM_STATUS); srbm_status = RREG32(SRBM_STATUS);
grbm_status = RREG32(GRBM_STATUS); grbm_status = RREG32(GRBM_STATUS);
...@@ -1408,15 +1407,7 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -1408,15 +1407,7 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
/* XXX deal with CP0,1,2 */
ring->rptr = RREG32(ring->rptr_reg);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
...@@ -2162,7 +2162,6 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev) ...@@ -2162,7 +2162,6 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev)
bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
{ {
u32 rbbm_status; u32 rbbm_status;
int r;
rbbm_status = RREG32(R_000E40_RBBM_STATUS); rbbm_status = RREG32(R_000E40_RBBM_STATUS);
if (!G_000E40_GUI_ACTIVE(rbbm_status)) { if (!G_000E40_GUI_ACTIVE(rbbm_status)) {
...@@ -2170,14 +2169,7 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -2170,14 +2169,7 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
ring->rptr = RREG32(ring->rptr_reg);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
...@@ -380,7 +380,6 @@ void r300_gpu_init(struct radeon_device *rdev) ...@@ -380,7 +380,6 @@ void r300_gpu_init(struct radeon_device *rdev)
bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
{ {
u32 rbbm_status; u32 rbbm_status;
int r;
rbbm_status = RREG32(R_000E40_RBBM_STATUS); rbbm_status = RREG32(R_000E40_RBBM_STATUS);
if (!G_000E40_GUI_ACTIVE(rbbm_status)) { if (!G_000E40_GUI_ACTIVE(rbbm_status)) {
...@@ -388,14 +387,7 @@ bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -388,14 +387,7 @@ bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
ring->rptr = RREG32(RADEON_CP_RB_RPTR);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
...@@ -1350,7 +1350,6 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -1350,7 +1350,6 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
u32 srbm_status; u32 srbm_status;
u32 grbm_status; u32 grbm_status;
u32 grbm_status2; u32 grbm_status2;
int r;
srbm_status = RREG32(R_000E50_SRBM_STATUS); srbm_status = RREG32(R_000E50_SRBM_STATUS);
grbm_status = RREG32(R_008010_GRBM_STATUS); grbm_status = RREG32(R_008010_GRBM_STATUS);
...@@ -1360,14 +1359,7 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -1360,14 +1359,7 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
ring->rptr = RREG32(ring->rptr_reg);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
...@@ -817,6 +817,7 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *cp); ...@@ -817,6 +817,7 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *cp);
void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp); void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp);
void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp);
int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring);
void radeon_ring_lockup_update(struct radeon_ring *ring); void radeon_ring_lockup_update(struct radeon_ring *ring);
bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size,
......
...@@ -398,6 +398,22 @@ void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *rin ...@@ -398,6 +398,22 @@ void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *rin
mutex_unlock(&ring->mutex); mutex_unlock(&ring->mutex);
} }
void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring)
{
int r;
mutex_lock(&ring->mutex);
radeon_ring_free_size(rdev, ring);
if (ring->rptr == ring->wptr) {
r = radeon_ring_alloc(rdev, ring, 1);
if (!r) {
radeon_ring_write(ring, ring->nop);
radeon_ring_commit(rdev, ring);
}
}
mutex_unlock(&ring->mutex);
}
void radeon_ring_lockup_update(struct radeon_ring *ring) void radeon_ring_lockup_update(struct radeon_ring *ring)
{ {
ring->last_rptr = ring->rptr; ring->last_rptr = ring->rptr;
......
...@@ -2217,7 +2217,6 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -2217,7 +2217,6 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
u32 srbm_status; u32 srbm_status;
u32 grbm_status, grbm_status2; u32 grbm_status, grbm_status2;
u32 grbm_status_se0, grbm_status_se1; u32 grbm_status_se0, grbm_status_se1;
int r;
srbm_status = RREG32(SRBM_STATUS); srbm_status = RREG32(SRBM_STATUS);
grbm_status = RREG32(GRBM_STATUS); grbm_status = RREG32(GRBM_STATUS);
...@@ -2229,15 +2228,7 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) ...@@ -2229,15 +2228,7 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, ring, 2); radeon_ring_force_activity(rdev, ring);
if (!r) {
/* PACKET2 NOP */
radeon_ring_write(ring, 0x80000000);
radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev, ring);
}
/* XXX deal with CP0,1,2 */
ring->rptr = RREG32(ring->rptr_reg);
return radeon_ring_test_lockup(rdev, ring); return radeon_ring_test_lockup(rdev, ring);
} }
......
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