diff options
author | Ken Wang <Qingqing.Wang@amd.com> | 2016-03-11 20:32:30 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-03-29 23:53:35 -0400 |
commit | 536fbf946cf84ff60cdef471c23ab96058e62f39 (patch) | |
tree | c0bfe185e68c9dfb00c3ac9ade96b9e5f1541c31 /drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |
parent | 8fe733289bc00914e9ace101088857cda20a1c51 (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.c | 12 |
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 | */ |
161 | static uint32_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring) | 161 | static 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 | */ |
177 | static uint32_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring) | 177 | static 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 | ||
200 | static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | 201 | static 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, |