aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-05-02 09:11:23 -0400
committerDave Airlie <airlied@redhat.com>2012-05-03 04:16:38 -0400
commit7b9ef16bd187b7e7f43887afb393d1f89e5bee71 (patch)
treef36f2bcd3207f49361ffdf10ed7a630580da788d
parent67e3c7876878264a81afe0dceb8ac653af8387be (diff)
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: Christian König <deathsimple@vodafone.de> Reviewed-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c10
-rw-r--r--drivers/gpu/drm/radeon/ni.c11
-rw-r--r--drivers/gpu/drm/radeon/r100.c10
-rw-r--r--drivers/gpu/drm/radeon/r300.c10
-rw-r--r--drivers/gpu/drm/radeon/r600.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c16
-rw-r--r--drivers/gpu/drm/radeon/si.c11
8 files changed, 23 insertions, 56 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 66f05bba8a42..ecc29bc1cbe3 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2424,7 +2424,6 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
2424 u32 srbm_status; 2424 u32 srbm_status;
2425 u32 grbm_status; 2425 u32 grbm_status;
2426 u32 grbm_status_se0, grbm_status_se1; 2426 u32 grbm_status_se0, grbm_status_se1;
2427 int r;
2428 2427
2429 srbm_status = RREG32(SRBM_STATUS); 2428 srbm_status = RREG32(SRBM_STATUS);
2430 grbm_status = RREG32(GRBM_STATUS); 2429 grbm_status = RREG32(GRBM_STATUS);
@@ -2435,14 +2434,7 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
2435 return false; 2434 return false;
2436 } 2435 }
2437 /* force CP activities */ 2436 /* force CP activities */
2438 r = radeon_ring_lock(rdev, ring, 2); 2437 radeon_ring_force_activity(rdev, ring);
2439 if (!r) {
2440 /* PACKET2 NOP */
2441 radeon_ring_write(ring, 0x80000000);
2442 radeon_ring_write(ring, 0x80000000);
2443 radeon_ring_unlock_commit(rdev, ring);
2444 }
2445 ring->rptr = RREG32(CP_RB_RPTR);
2446 return radeon_ring_test_lockup(rdev, ring); 2438 return radeon_ring_test_lockup(rdev, ring);
2447} 2439}
2448 2440
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 8404b2a2386d..118463503e80 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1397,7 +1397,6 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1397 u32 srbm_status; 1397 u32 srbm_status;
1398 u32 grbm_status; 1398 u32 grbm_status;
1399 u32 grbm_status_se0, grbm_status_se1; 1399 u32 grbm_status_se0, grbm_status_se1;
1400 int r;
1401 1400
1402 srbm_status = RREG32(SRBM_STATUS); 1401 srbm_status = RREG32(SRBM_STATUS);
1403 grbm_status = RREG32(GRBM_STATUS); 1402 grbm_status = RREG32(GRBM_STATUS);
@@ -1408,15 +1407,7 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1408 return false; 1407 return false;
1409 } 1408 }
1410 /* force CP activities */ 1409 /* force CP activities */
1411 r = radeon_ring_lock(rdev, ring, 2); 1410 radeon_ring_force_activity(rdev, ring);
1412 if (!r) {
1413 /* PACKET2 NOP */
1414 radeon_ring_write(ring, 0x80000000);
1415 radeon_ring_write(ring, 0x80000000);
1416 radeon_ring_unlock_commit(rdev, ring);
1417 }
1418 /* XXX deal with CP0,1,2 */
1419 ring->rptr = RREG32(ring->rptr_reg);
1420 return radeon_ring_test_lockup(rdev, ring); 1411 return radeon_ring_test_lockup(rdev, ring);
1421} 1412}
1422 1413
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index ccf5e3b844d3..42d60abf2ebe 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -2162,7 +2162,6 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev)
2162bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2162bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2163{ 2163{
2164 u32 rbbm_status; 2164 u32 rbbm_status;
2165 int r;
2166 2165
2167 rbbm_status = RREG32(R_000E40_RBBM_STATUS); 2166 rbbm_status = RREG32(R_000E40_RBBM_STATUS);
2168 if (!G_000E40_GUI_ACTIVE(rbbm_status)) { 2167 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 return false; 2169 return false;
2171 } 2170 }
2172 /* force CP activities */ 2171 /* force CP activities */
2173 r = radeon_ring_lock(rdev, ring, 2); 2172 radeon_ring_force_activity(rdev, ring);
2174 if (!r) {
2175 /* PACKET2 NOP */
2176 radeon_ring_write(ring, 0x80000000);
2177 radeon_ring_write(ring, 0x80000000);
2178 radeon_ring_unlock_commit(rdev, ring);
2179 }
2180 ring->rptr = RREG32(ring->rptr_reg);
2181 return radeon_ring_test_lockup(rdev, ring); 2173 return radeon_ring_test_lockup(rdev, ring);
2182} 2174}
2183 2175
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index e207664bbdc7..04ec26916db4 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -380,7 +380,6 @@ void r300_gpu_init(struct radeon_device *rdev)
380bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 380bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
381{ 381{
382 u32 rbbm_status; 382 u32 rbbm_status;
383 int r;
384 383
385 rbbm_status = RREG32(R_000E40_RBBM_STATUS); 384 rbbm_status = RREG32(R_000E40_RBBM_STATUS);
386 if (!G_000E40_GUI_ACTIVE(rbbm_status)) { 385 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 return false; 387 return false;
389 } 388 }
390 /* force CP activities */ 389 /* force CP activities */
391 r = radeon_ring_lock(rdev, ring, 2); 390 radeon_ring_force_activity(rdev, ring);
392 if (!r) {
393 /* PACKET2 NOP */
394 radeon_ring_write(ring, 0x80000000);
395 radeon_ring_write(ring, 0x80000000);
396 radeon_ring_unlock_commit(rdev, ring);
397 }
398 ring->rptr = RREG32(RADEON_CP_RB_RPTR);
399 return radeon_ring_test_lockup(rdev, ring); 391 return radeon_ring_test_lockup(rdev, ring);
400} 392}
401 393
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 45d52ccc457a..87a2333c0c6b 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1350,7 +1350,6 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1350 u32 srbm_status; 1350 u32 srbm_status;
1351 u32 grbm_status; 1351 u32 grbm_status;
1352 u32 grbm_status2; 1352 u32 grbm_status2;
1353 int r;
1354 1353
1355 srbm_status = RREG32(R_000E50_SRBM_STATUS); 1354 srbm_status = RREG32(R_000E50_SRBM_STATUS);
1356 grbm_status = RREG32(R_008010_GRBM_STATUS); 1355 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 return false; 1359 return false;
1361 } 1360 }
1362 /* force CP activities */ 1361 /* force CP activities */
1363 r = radeon_ring_lock(rdev, ring, 2); 1362 radeon_ring_force_activity(rdev, ring);
1364 if (!r) {
1365 /* PACKET2 NOP */
1366 radeon_ring_write(ring, 0x80000000);
1367 radeon_ring_write(ring, 0x80000000);
1368 radeon_ring_unlock_commit(rdev, ring);
1369 }
1370 ring->rptr = RREG32(ring->rptr_reg);
1371 return radeon_ring_test_lockup(rdev, ring); 1363 return radeon_ring_test_lockup(rdev, ring);
1372} 1364}
1373 1365
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 0784e4d57d28..82ffa6a05cc6 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -817,6 +817,7 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *cp);
817void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp); 817void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp);
818void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); 818void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp);
819int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); 819int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
820void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring);
820void radeon_ring_lockup_update(struct radeon_ring *ring); 821void radeon_ring_lockup_update(struct radeon_ring *ring);
821bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 822bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
822int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, 823int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size,
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 407d90aaa0c3..2eb4c6ed198a 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -398,6 +398,22 @@ void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *rin
398 mutex_unlock(&ring->mutex); 398 mutex_unlock(&ring->mutex);
399} 399}
400 400
401void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring)
402{
403 int r;
404
405 mutex_lock(&ring->mutex);
406 radeon_ring_free_size(rdev, ring);
407 if (ring->rptr == ring->wptr) {
408 r = radeon_ring_alloc(rdev, ring, 1);
409 if (!r) {
410 radeon_ring_write(ring, ring->nop);
411 radeon_ring_commit(rdev, ring);
412 }
413 }
414 mutex_unlock(&ring->mutex);
415}
416
401void radeon_ring_lockup_update(struct radeon_ring *ring) 417void radeon_ring_lockup_update(struct radeon_ring *ring)
402{ 418{
403 ring->last_rptr = ring->rptr; 419 ring->last_rptr = ring->rptr;
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index c2422f514202..0bad5ff651d5 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -2217,7 +2217,6 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2217 u32 srbm_status; 2217 u32 srbm_status;
2218 u32 grbm_status, grbm_status2; 2218 u32 grbm_status, grbm_status2;
2219 u32 grbm_status_se0, grbm_status_se1; 2219 u32 grbm_status_se0, grbm_status_se1;
2220 int r;
2221 2220
2222 srbm_status = RREG32(SRBM_STATUS); 2221 srbm_status = RREG32(SRBM_STATUS);
2223 grbm_status = RREG32(GRBM_STATUS); 2222 grbm_status = RREG32(GRBM_STATUS);
@@ -2229,15 +2228,7 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2229 return false; 2228 return false;
2230 } 2229 }
2231 /* force CP activities */ 2230 /* force CP activities */
2232 r = radeon_ring_lock(rdev, ring, 2); 2231 radeon_ring_force_activity(rdev, ring);
2233 if (!r) {
2234 /* PACKET2 NOP */
2235 radeon_ring_write(ring, 0x80000000);
2236 radeon_ring_write(ring, 0x80000000);
2237 radeon_ring_unlock_commit(rdev, ring);
2238 }
2239 /* XXX deal with CP0,1,2 */
2240 ring->rptr = RREG32(ring->rptr_reg);
2241 return radeon_ring_test_lockup(rdev, ring); 2232 return radeon_ring_test_lockup(rdev, ring);
2242} 2233}
2243 2234