diff options
author | Christian König <christian.koenig@amd.com> | 2014-02-18 08:52:33 -0500 |
---|---|---|
committer | Christian König <christian.koenig@amd.com> | 2014-02-18 11:49:19 -0500 |
commit | ff212f25feb44a915ce9c0144faef7fae27a6e61 (patch) | |
tree | 4cfdebae7d47c5504d087ef8950e068a426f1270 | |
parent | a1d6f97c8cfa7c3554d0391c0b16505d1d97f380 (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.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_dma.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni_dma.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dma.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si_dma.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v1_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/vce_v1_0.c | 4 |
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 { | |||
793 | struct radeon_ring { | 793 | struct 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); | |||
958 | void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); | 957 | void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *cp); |
959 | int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); | 958 | int radeon_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); |
960 | void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring); | 959 | void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring); |
961 | void radeon_ring_lockup_update(struct radeon_ring *ring); | 960 | void radeon_ring_lockup_update(struct radeon_device *rdev, |
961 | struct radeon_ring *ring); | ||
962 | bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); | 962 | bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring); |
963 | unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring, | 963 | unsigned 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 | */ |
343 | void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_ring *ring) | 343 | void 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 | */ |
510 | void radeon_ring_lockup_update(struct radeon_ring *ring) | 510 | void 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 | **/ |
536 | bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | 537 | bool 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)); |