diff options
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 11 |
8 files changed, 23 insertions, 56 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 66f05bba8a4..ecc29bc1cbe 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 8404b2a2386..118463503e8 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 ccf5e3b844d..42d60abf2eb 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) | |||
2162 | bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | 2162 | bool 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 e207664bbdc..04ec26916db 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) | |||
380 | bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | 380 | bool 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 45d52ccc457..87a2333c0c6 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 0784e4d57d2..82ffa6a05cc 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); | |||
817 | void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp); | 817 | void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *cp); |
818 | void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); | 818 | void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); |
819 | int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); | 819 | int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); |
820 | void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring); | ||
820 | void radeon_ring_lockup_update(struct radeon_ring *ring); | 821 | void radeon_ring_lockup_update(struct radeon_ring *ring); |
821 | bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); | 822 | bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); |
822 | int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, | 823 | int 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 407d90aaa0c..2eb4c6ed198 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 | ||
401 | void 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 | |||
401 | void radeon_ring_lockup_update(struct radeon_ring *ring) | 417 | void 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 c2422f51420..0bad5ff651d 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 | ||