aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
diff options
context:
space:
mode:
authorKen Wang <Qingqing.Wang@amd.com>2016-03-11 20:32:30 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:53:35 -0400
commit536fbf946cf84ff60cdef471c23ab96058e62f39 (patch)
treec0bfe185e68c9dfb00c3ac9ade96b9e5f1541c31 /drivers/gpu/drm/amd/amdgpu/cik_sdma.c
parent8fe733289bc00914e9ace101088857cda20a1c51 (diff)
drm/amdgpu: change wptr to 64 bits (v2)
Newer asics need 64 bit wptrs. If the wptr is now smaller than the rptr that doesn't indicate a wrap-around anymore. v2: integrate Christian's comments. Signed-off-by: Ken Wang <Qingqing.Wang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index c33bc1bb4655..131f69b3f70e 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -158,7 +158,7 @@ out:
158 * 158 *
159 * Get the current rptr from the hardware (CIK+). 159 * Get the current rptr from the hardware (CIK+).
160 */ 160 */
161static uint32_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring) 161static uint64_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring)
162{ 162{
163 u32 rptr; 163 u32 rptr;
164 164
@@ -174,7 +174,7 @@ static uint32_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring)
174 * 174 *
175 * Get the current wptr from the hardware (CIK+). 175 * Get the current wptr from the hardware (CIK+).
176 */ 176 */
177static uint32_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring) 177static uint64_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring)
178{ 178{
179 struct amdgpu_device *adev = ring->adev; 179 struct amdgpu_device *adev = ring->adev;
180 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 180 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
@@ -194,7 +194,8 @@ static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring)
194 struct amdgpu_device *adev = ring->adev; 194 struct amdgpu_device *adev = ring->adev;
195 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 195 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
196 196
197 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc); 197 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me],
198 (lower_32_bits(ring->wptr) << 2) & 0x3fffc);
198} 199}
199 200
200static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 201static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
@@ -225,7 +226,7 @@ static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,
225 u32 extra_bits = vm_id & 0xf; 226 u32 extra_bits = vm_id & 0xf;
226 227
227 /* IB packet must end on a 8 DW boundary */ 228 /* IB packet must end on a 8 DW boundary */
228 cik_sdma_ring_insert_nop(ring, (12 - (ring->wptr & 7)) % 8); 229 cik_sdma_ring_insert_nop(ring, (12 - (lower_32_bits(ring->wptr) & 7)) % 8);
229 230
230 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits)); 231 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits));
231 amdgpu_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */ 232 amdgpu_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */
@@ -432,7 +433,7 @@ static int cik_sdma_gfx_resume(struct amdgpu_device *adev)
432 WREG32(mmSDMA0_GFX_RB_BASE_HI + sdma_offsets[i], ring->gpu_addr >> 40); 433 WREG32(mmSDMA0_GFX_RB_BASE_HI + sdma_offsets[i], ring->gpu_addr >> 40);
433 434
434 ring->wptr = 0; 435 ring->wptr = 0;
435 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[i], ring->wptr << 2); 436 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[i], lower_32_bits(ring->wptr) << 2);
436 437
437 /* enable DMA RB */ 438 /* enable DMA RB */
438 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], 439 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i],
@@ -1209,6 +1210,7 @@ static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
1209 .type = AMDGPU_RING_TYPE_SDMA, 1210 .type = AMDGPU_RING_TYPE_SDMA,
1210 .align_mask = 0xf, 1211 .align_mask = 0xf,
1211 .nop = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 1212 .nop = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0),
1213 .support_64bit_ptrs = false,
1212 .get_rptr = cik_sdma_ring_get_rptr, 1214 .get_rptr = cik_sdma_ring_get_rptr,
1213 .get_wptr = cik_sdma_ring_get_wptr, 1215 .get_wptr = cik_sdma_ring_get_wptr,
1214 .set_wptr = cik_sdma_ring_set_wptr, 1216 .set_wptr = cik_sdma_ring_set_wptr,