aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-02-18 08:52:33 -0500
committerChristian König <christian.koenig@amd.com>2014-02-18 11:49:19 -0500
commitff212f25feb44a915ce9c0144faef7fae27a6e61 (patch)
tree4cfdebae7d47c5504d087ef8950e068a426f1270
parenta1d6f97c8cfa7c3554d0391c0b16505d1d97f380 (diff)
drm/radeon: drop drivers copy of the rptr
In all cases where it really matters we are using the read functions anyway. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/cik.c7
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c4
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c4
-rw-r--r--drivers/gpu/drm/radeon/evergreen_dma.c2
-rw-r--r--drivers/gpu/drm/radeon/ni.c6
-rw-r--r--drivers/gpu/drm/radeon/ni_dma.c4
-rw-r--r--drivers/gpu/drm/radeon/r100.c3
-rw-r--r--drivers/gpu/drm/radeon/r600.c4
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c27
-rw-r--r--drivers/gpu/drm/radeon/si.c8
-rw-r--r--drivers/gpu/drm/radeon/si_dma.c2
-rw-r--r--drivers/gpu/drm/radeon/uvd_v1_0.c2
-rw-r--r--drivers/gpu/drm/radeon/vce_v1_0.c4
15 files changed, 32 insertions, 53 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 2b31c3233a5e..835dcfb78916 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -4031,8 +4031,6 @@ static int cik_cp_gfx_resume(struct radeon_device *rdev)
4031 WREG32(CP_RB0_BASE, rb_addr); 4031 WREG32(CP_RB0_BASE, rb_addr);
4032 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr)); 4032 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
4033 4033
4034 ring->rptr = RREG32(CP_RB0_RPTR);
4035
4036 /* start the ring */ 4034 /* start the ring */
4037 cik_cp_gfx_start(rdev); 4035 cik_cp_gfx_start(rdev);
4038 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true; 4036 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
@@ -4587,8 +4585,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
4587 rdev->ring[idx].wptr = 0; 4585 rdev->ring[idx].wptr = 0;
4588 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr; 4586 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
4589 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr); 4587 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4590 rdev->ring[idx].rptr = RREG32(CP_HQD_PQ_RPTR); 4588 mqd->queue_state.cp_hqd_pq_rptr = RREG32(CP_HQD_PQ_RPTR);
4591 mqd->queue_state.cp_hqd_pq_rptr = rdev->ring[idx].rptr;
4592 4589
4593 /* set the vmid for the queue */ 4590 /* set the vmid for the queue */
4594 mqd->queue_state.cp_hqd_vmid = 0; 4591 mqd->queue_state.cp_hqd_vmid = 0;
@@ -5118,7 +5115,7 @@ bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
5118 if (!(reset_mask & (RADEON_RESET_GFX | 5115 if (!(reset_mask & (RADEON_RESET_GFX |
5119 RADEON_RESET_COMPUTE | 5116 RADEON_RESET_COMPUTE |
5120 RADEON_RESET_CP))) { 5117 RADEON_RESET_CP))) {
5121 radeon_ring_lockup_update(ring); 5118 radeon_ring_lockup_update(rdev, ring);
5122 return false; 5119 return false;
5123 } 5120 }
5124 /* force CP activities */ 5121 /* force CP activities */
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index 1ecb3f1070e3..e474760d714c 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -362,8 +362,6 @@ static int cik_sdma_gfx_resume(struct radeon_device *rdev)
362 ring->wptr = 0; 362 ring->wptr = 0;
363 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, ring->wptr << 2); 363 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, ring->wptr << 2);
364 364
365 ring->rptr = RREG32(SDMA0_GFX_RB_RPTR + reg_offset) >> 2;
366
367 /* enable DMA RB */ 365 /* enable DMA RB */
368 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl | SDMA_RB_ENABLE); 366 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl | SDMA_RB_ENABLE);
369 367
@@ -713,7 +711,7 @@ bool cik_sdma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
713 mask = RADEON_RESET_DMA1; 711 mask = RADEON_RESET_DMA1;
714 712
715 if (!(reset_mask & mask)) { 713 if (!(reset_mask & mask)) {
716 radeon_ring_lockup_update(ring); 714 radeon_ring_lockup_update(rdev, ring);
717 return false; 715 return false;
718 } 716 }
719 /* force ring activities */ 717 /* force ring activities */
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index f2b9e21ce4da..d9156be5b9a6 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2990,8 +2990,6 @@ static int evergreen_cp_resume(struct radeon_device *rdev)
2990 WREG32(CP_RB_BASE, ring->gpu_addr >> 8); 2990 WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
2991 WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); 2991 WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
2992 2992
2993 ring->rptr = RREG32(CP_RB_RPTR);
2994
2995 evergreen_cp_start(rdev); 2993 evergreen_cp_start(rdev);
2996 ring->ready = true; 2994 ring->ready = true;
2997 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); 2995 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
@@ -3952,7 +3950,7 @@ bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
3952 if (!(reset_mask & (RADEON_RESET_GFX | 3950 if (!(reset_mask & (RADEON_RESET_GFX |
3953 RADEON_RESET_COMPUTE | 3951 RADEON_RESET_COMPUTE |
3954 RADEON_RESET_CP))) { 3952 RADEON_RESET_CP))) {
3955 radeon_ring_lockup_update(ring); 3953 radeon_ring_lockup_update(rdev, ring);
3956 return false; 3954 return false;
3957 } 3955 }
3958 /* force CP activities */ 3956 /* force CP activities */
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
index a37b54436382..d448961e9ab2 100644
--- a/drivers/gpu/drm/radeon/evergreen_dma.c
+++ b/drivers/gpu/drm/radeon/evergreen_dma.c
@@ -174,7 +174,7 @@ bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
174 u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); 174 u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
175 175
176 if (!(reset_mask & RADEON_RESET_DMA)) { 176 if (!(reset_mask & RADEON_RESET_DMA)) {
177 radeon_ring_lockup_update(ring); 177 radeon_ring_lockup_update(rdev, ring);
178 return false; 178 return false;
179 } 179 }
180 /* force ring activities */ 180 /* force ring activities */
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index ea932ac66fc6..7601532b7372 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1642,8 +1642,8 @@ static int cayman_cp_resume(struct radeon_device *rdev)
1642 ring = &rdev->ring[ridx[i]]; 1642 ring = &rdev->ring[ridx[i]];
1643 WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); 1643 WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1644 1644
1645 ring->rptr = ring->wptr = 0; 1645 ring->wptr = 0;
1646 WREG32(cp_rb_rptr[i], ring->rptr); 1646 WREG32(cp_rb_rptr[i], 0);
1647 WREG32(cp_rb_wptr[i], ring->wptr); 1647 WREG32(cp_rb_wptr[i], ring->wptr);
1648 1648
1649 mdelay(1); 1649 mdelay(1);
@@ -1917,7 +1917,7 @@ bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1917 if (!(reset_mask & (RADEON_RESET_GFX | 1917 if (!(reset_mask & (RADEON_RESET_GFX |
1918 RADEON_RESET_COMPUTE | 1918 RADEON_RESET_COMPUTE |
1919 RADEON_RESET_CP))) { 1919 RADEON_RESET_CP))) {
1920 radeon_ring_lockup_update(ring); 1920 radeon_ring_lockup_update(rdev, ring);
1921 return false; 1921 return false;
1922 } 1922 }
1923 /* force CP activities */ 1923 /* force CP activities */
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c
index 7cf96b15377f..95e533c61f83 100644
--- a/drivers/gpu/drm/radeon/ni_dma.c
+++ b/drivers/gpu/drm/radeon/ni_dma.c
@@ -248,8 +248,6 @@ int cayman_dma_resume(struct radeon_device *rdev)
248 ring->wptr = 0; 248 ring->wptr = 0;
249 WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2); 249 WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2);
250 250
251 ring->rptr = RREG32(DMA_RB_RPTR + reg_offset) >> 2;
252
253 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE); 251 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE);
254 252
255 ring->ready = true; 253 ring->ready = true;
@@ -302,7 +300,7 @@ bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
302 mask = RADEON_RESET_DMA1; 300 mask = RADEON_RESET_DMA1;
303 301
304 if (!(reset_mask & mask)) { 302 if (!(reset_mask & mask)) {
305 radeon_ring_lockup_update(ring); 303 radeon_ring_lockup_update(rdev, ring);
306 return false; 304 return false;
307 } 305 }
308 /* force ring activities */ 306 /* force ring activities */
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index ef024ce3f7cc..3a7438163d06 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -1193,7 +1193,6 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1193 1193
1194 WREG32(RADEON_CP_RB_CNTL, tmp); 1194 WREG32(RADEON_CP_RB_CNTL, tmp);
1195 udelay(10); 1195 udelay(10);
1196 ring->rptr = RREG32(RADEON_CP_RB_RPTR);
1197 /* Set cp mode to bus mastering & enable cp*/ 1196 /* Set cp mode to bus mastering & enable cp*/
1198 WREG32(RADEON_CP_CSQ_MODE, 1197 WREG32(RADEON_CP_CSQ_MODE,
1199 REG_SET(RADEON_INDIRECT2_START, indirect2_start) | 1198 REG_SET(RADEON_INDIRECT2_START, indirect2_start) |
@@ -2523,7 +2522,7 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2523 2522
2524 rbbm_status = RREG32(R_000E40_RBBM_STATUS); 2523 rbbm_status = RREG32(R_000E40_RBBM_STATUS);
2525 if (!G_000E40_GUI_ACTIVE(rbbm_status)) { 2524 if (!G_000E40_GUI_ACTIVE(rbbm_status)) {
2526 radeon_ring_lockup_update(ring); 2525 radeon_ring_lockup_update(rdev, ring);
2527 return false; 2526 return false;
2528 } 2527 }
2529 /* force CP activities */ 2528 /* force CP activities */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index cdbc4171fe73..085e02590dcf 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1748,7 +1748,7 @@ bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1748 if (!(reset_mask & (RADEON_RESET_GFX | 1748 if (!(reset_mask & (RADEON_RESET_GFX |
1749 RADEON_RESET_COMPUTE | 1749 RADEON_RESET_COMPUTE |
1750 RADEON_RESET_CP))) { 1750 RADEON_RESET_CP))) {
1751 radeon_ring_lockup_update(ring); 1751 radeon_ring_lockup_update(rdev, ring);
1752 return false; 1752 return false;
1753 } 1753 }
1754 /* force CP activities */ 1754 /* force CP activities */
@@ -2604,8 +2604,6 @@ int r600_cp_resume(struct radeon_device *rdev)
2604 WREG32(CP_RB_BASE, ring->gpu_addr >> 8); 2604 WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
2605 WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); 2605 WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
2606 2606
2607 ring->rptr = RREG32(CP_RB_RPTR);
2608
2609 r600_cp_start(rdev); 2607 r600_cp_start(rdev);
2610 ring->ready = true; 2608 ring->ready = true;
2611 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); 2609 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index b2d4c91e6272..6944e1988426 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -176,8 +176,6 @@ int r600_dma_resume(struct radeon_device *rdev)
176 ring->wptr = 0; 176 ring->wptr = 0;
177 WREG32(DMA_RB_WPTR, ring->wptr << 2); 177 WREG32(DMA_RB_WPTR, ring->wptr << 2);
178 178
179 ring->rptr = RREG32(DMA_RB_RPTR) >> 2;
180
181 WREG32(DMA_RB_CNTL, rb_cntl | DMA_RB_ENABLE); 179 WREG32(DMA_RB_CNTL, rb_cntl | DMA_RB_ENABLE);
182 180
183 ring->ready = true; 181 ring->ready = true;
@@ -221,7 +219,7 @@ bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
221 u32 reset_mask = r600_gpu_check_soft_reset(rdev); 219 u32 reset_mask = r600_gpu_check_soft_reset(rdev);
222 220
223 if (!(reset_mask & RADEON_RESET_DMA)) { 221 if (!(reset_mask & RADEON_RESET_DMA)) {
224 radeon_ring_lockup_update(ring); 222 radeon_ring_lockup_update(rdev, ring);
225 return false; 223 return false;
226 } 224 }
227 /* force ring activities */ 225 /* force ring activities */
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 540624e7491c..e1c4f9c6772b 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -793,7 +793,6 @@ struct radeon_ib {
793struct radeon_ring { 793struct radeon_ring {
794 struct radeon_bo *ring_obj; 794 struct radeon_bo *ring_obj;
795 volatile uint32_t *ring; 795 volatile uint32_t *ring;
796 unsigned rptr;
797 unsigned rptr_offs; 796 unsigned rptr_offs;
798 unsigned rptr_save_reg; 797 unsigned rptr_save_reg;
799 u64 next_rptr_gpu_addr; 798 u64 next_rptr_gpu_addr;
@@ -958,7 +957,8 @@ void radeon_ring_undo(struct radeon_ring *ring);
958void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); 957void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp);
959int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); 958int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
960void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring); 959void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring);
961void radeon_ring_lockup_update(struct radeon_ring *ring); 960void radeon_ring_lockup_update(struct radeon_device *rdev,
961 struct radeon_ring *ring);
962bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 962bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
963unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring, 963unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring,
964 uint32_t **data); 964 uint32_t **data);
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index d2980b03d1ad..0f78789d085a 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -342,9 +342,10 @@ bool radeon_ring_supports_scratch_reg(struct radeon_device *rdev,
342 */ 342 */
343void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_ring *ring) 343void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_ring *ring)
344{ 344{
345 ring->rptr = radeon_ring_get_rptr(rdev, ring); 345 uint32_t rptr = radeon_ring_get_rptr(rdev, ring);
346
346 /* This works because ring_size is a power of 2 */ 347 /* This works because ring_size is a power of 2 */
347 ring->ring_free_dw = (ring->rptr + (ring->ring_size / 4)); 348 ring->ring_free_dw = rptr + (ring->ring_size / 4);
348 ring->ring_free_dw -= ring->wptr; 349 ring->ring_free_dw -= ring->wptr;
349 ring->ring_free_dw &= ring->ptr_mask; 350 ring->ring_free_dw &= ring->ptr_mask;
350 if (!ring->ring_free_dw) { 351 if (!ring->ring_free_dw) {
@@ -376,7 +377,7 @@ int radeon_ring_alloc(struct radeon_device *rdev, struct radeon_ring *ring, unsi
376 /* This is an empty ring update lockup info to avoid 377 /* This is an empty ring update lockup info to avoid
377 * false positive. 378 * false positive.
378 */ 379 */
379 radeon_ring_lockup_update(ring); 380 radeon_ring_lockup_update(rdev, ring);
380 } 381 }
381 ndw = (ndw + ring->align_mask) & ~ring->align_mask; 382 ndw = (ndw + ring->align_mask) & ~ring->align_mask;
382 while (ndw > (ring->ring_free_dw - 1)) { 383 while (ndw > (ring->ring_free_dw - 1)) {
@@ -490,8 +491,7 @@ void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *
490{ 491{
491 int r; 492 int r;
492 493
493 radeon_ring_free_size(rdev, ring); 494 if (radeon_ring_get_rptr(rdev, ring) == ring->wptr) {
494 if (ring->rptr == ring->wptr) {
495 r = radeon_ring_alloc(rdev, ring, 1); 495 r = radeon_ring_alloc(rdev, ring, 1);
496 if (!r) { 496 if (!r) {
497 radeon_ring_write(ring, ring->nop); 497 radeon_ring_write(ring, ring->nop);
@@ -507,9 +507,10 @@ void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *
507 * 507 *
508 * Update the last rptr value and timestamp (all asics). 508 * Update the last rptr value and timestamp (all asics).
509 */ 509 */
510void radeon_ring_lockup_update(struct radeon_ring *ring) 510void radeon_ring_lockup_update(struct radeon_device *rdev,
511 struct radeon_ring *ring)
511{ 512{
512 ring->last_rptr = ring->rptr; 513 ring->last_rptr = radeon_ring_get_rptr(rdev, ring);
513 ring->last_activity = jiffies; 514 ring->last_activity = jiffies;
514} 515}
515 516
@@ -535,18 +536,18 @@ void radeon_ring_lockup_update(struct radeon_ring *ring)
535 **/ 536 **/
536bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 537bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
537{ 538{
539 uint32_t rptr = radeon_ring_get_rptr(rdev, ring);
538 unsigned long cjiffies, elapsed; 540 unsigned long cjiffies, elapsed;
539 541
540 cjiffies = jiffies; 542 cjiffies = jiffies;
541 if (!time_after(cjiffies, ring->last_activity)) { 543 if (!time_after(cjiffies, ring->last_activity)) {
542 /* likely a wrap around */ 544 /* likely a wrap around */
543 radeon_ring_lockup_update(ring); 545 radeon_ring_lockup_update(rdev, ring);
544 return false; 546 return false;
545 } 547 }
546 ring->rptr = radeon_ring_get_rptr(rdev, ring); 548 if (rptr != ring->last_rptr) {
547 if (ring->rptr != ring->last_rptr) {
548 /* CP is still working no lockup */ 549 /* CP is still working no lockup */
549 radeon_ring_lockup_update(ring); 550 radeon_ring_lockup_update(rdev, ring);
550 return false; 551 return false;
551 } 552 }
552 elapsed = jiffies_to_msecs(cjiffies - ring->last_activity); 553 elapsed = jiffies_to_msecs(cjiffies - ring->last_activity);
@@ -709,7 +710,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
709 if (radeon_debugfs_ring_init(rdev, ring)) { 710 if (radeon_debugfs_ring_init(rdev, ring)) {
710 DRM_ERROR("Failed to register debugfs file for rings !\n"); 711 DRM_ERROR("Failed to register debugfs file for rings !\n");
711 } 712 }
712 radeon_ring_lockup_update(ring); 713 radeon_ring_lockup_update(rdev, ring);
713 return 0; 714 return 0;
714} 715}
715 716
@@ -780,8 +781,6 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
780 781
781 seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", 782 seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n",
782 ring->wptr, ring->wptr); 783 ring->wptr, ring->wptr);
783 seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n",
784 ring->rptr, ring->rptr);
785 seq_printf(m, "last semaphore signal addr : 0x%016llx\n", 784 seq_printf(m, "last semaphore signal addr : 0x%016llx\n",
786 ring->last_semaphore_signal_addr); 785 ring->last_semaphore_signal_addr);
787 seq_printf(m, "last semaphore wait addr : 0x%016llx\n", 786 seq_printf(m, "last semaphore wait addr : 0x%016llx\n",
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 83578324e5d1..b406a48ef202 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -3434,8 +3434,6 @@ static int si_cp_resume(struct radeon_device *rdev)
3434 3434
3435 WREG32(CP_RB0_BASE, ring->gpu_addr >> 8); 3435 WREG32(CP_RB0_BASE, ring->gpu_addr >> 8);
3436 3436
3437 ring->rptr = RREG32(CP_RB0_RPTR);
3438
3439 /* ring1 - compute only */ 3437 /* ring1 - compute only */
3440 /* Set ring buffer size */ 3438 /* Set ring buffer size */
3441 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; 3439 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
@@ -3460,8 +3458,6 @@ static int si_cp_resume(struct radeon_device *rdev)
3460 3458
3461 WREG32(CP_RB1_BASE, ring->gpu_addr >> 8); 3459 WREG32(CP_RB1_BASE, ring->gpu_addr >> 8);
3462 3460
3463 ring->rptr = RREG32(CP_RB1_RPTR);
3464
3465 /* ring2 - compute only */ 3461 /* ring2 - compute only */
3466 /* Set ring buffer size */ 3462 /* Set ring buffer size */
3467 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; 3463 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
@@ -3486,8 +3482,6 @@ static int si_cp_resume(struct radeon_device *rdev)
3486 3482
3487 WREG32(CP_RB2_BASE, ring->gpu_addr >> 8); 3483 WREG32(CP_RB2_BASE, ring->gpu_addr >> 8);
3488 3484
3489 ring->rptr = RREG32(CP_RB2_RPTR);
3490
3491 /* start the rings */ 3485 /* start the rings */
3492 si_cp_start(rdev); 3486 si_cp_start(rdev);
3493 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true; 3487 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
@@ -3872,7 +3866,7 @@ bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3872 if (!(reset_mask & (RADEON_RESET_GFX | 3866 if (!(reset_mask & (RADEON_RESET_GFX |
3873 RADEON_RESET_COMPUTE | 3867 RADEON_RESET_COMPUTE |
3874 RADEON_RESET_CP))) { 3868 RADEON_RESET_CP))) {
3875 radeon_ring_lockup_update(ring); 3869 radeon_ring_lockup_update(rdev, ring);
3876 return false; 3870 return false;
3877 } 3871 }
3878 /* force CP activities */ 3872 /* force CP activities */
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
index 59be2cfcbb47..c75f5337f462 100644
--- a/drivers/gpu/drm/radeon/si_dma.c
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -49,7 +49,7 @@ bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
49 mask = RADEON_RESET_DMA1; 49 mask = RADEON_RESET_DMA1;
50 50
51 if (!(reset_mask & mask)) { 51 if (!(reset_mask & mask)) {
52 radeon_ring_lockup_update(ring); 52 radeon_ring_lockup_update(rdev, ring);
53 return false; 53 return false;
54 } 54 }
55 /* force ring activities */ 55 /* force ring activities */
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c
index d4a68af1a279..0a243f0e5d68 100644
--- a/drivers/gpu/drm/radeon/uvd_v1_0.c
+++ b/drivers/gpu/drm/radeon/uvd_v1_0.c
@@ -262,7 +262,7 @@ int uvd_v1_0_start(struct radeon_device *rdev)
262 /* Initialize the ring buffer's read and write pointers */ 262 /* Initialize the ring buffer's read and write pointers */
263 WREG32(UVD_RBC_RB_RPTR, 0x0); 263 WREG32(UVD_RBC_RB_RPTR, 0x0);
264 264
265 ring->wptr = ring->rptr = RREG32(UVD_RBC_RB_RPTR); 265 ring->wptr = RREG32(UVD_RBC_RB_RPTR);
266 WREG32(UVD_RBC_RB_WPTR, ring->wptr); 266 WREG32(UVD_RBC_RB_WPTR, ring->wptr);
267 267
268 /* set the ring address */ 268 /* set the ring address */
diff --git a/drivers/gpu/drm/radeon/vce_v1_0.c b/drivers/gpu/drm/radeon/vce_v1_0.c
index e0c3534356a1..b44d9c842f7b 100644
--- a/drivers/gpu/drm/radeon/vce_v1_0.c
+++ b/drivers/gpu/drm/radeon/vce_v1_0.c
@@ -98,14 +98,14 @@ int vce_v1_0_start(struct radeon_device *rdev)
98 WREG32_P(VCE_STATUS, 1, ~1); 98 WREG32_P(VCE_STATUS, 1, ~1);
99 99
100 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; 100 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
101 WREG32(VCE_RB_RPTR, ring->rptr); 101 WREG32(VCE_RB_RPTR, ring->wptr);
102 WREG32(VCE_RB_WPTR, ring->wptr); 102 WREG32(VCE_RB_WPTR, ring->wptr);
103 WREG32(VCE_RB_BASE_LO, ring->gpu_addr); 103 WREG32(VCE_RB_BASE_LO, ring->gpu_addr);
104 WREG32(VCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); 104 WREG32(VCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
105 WREG32(VCE_RB_SIZE, ring->ring_size / 4); 105 WREG32(VCE_RB_SIZE, ring->ring_size / 4);
106 106
107 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; 107 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
108 WREG32(VCE_RB_RPTR2, ring->rptr); 108 WREG32(VCE_RB_RPTR2, ring->wptr);
109 WREG32(VCE_RB_WPTR2, ring->wptr); 109 WREG32(VCE_RB_WPTR2, ring->wptr);
110 WREG32(VCE_RB_BASE_LO2, ring->gpu_addr); 110 WREG32(VCE_RB_BASE_LO2, ring->gpu_addr);
111 WREG32(VCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 111 WREG32(VCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));