diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index e92fb372bc99..91cf95a8c39c 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -238,31 +238,27 @@ static uint64_t sdma_v4_0_ring_get_rptr(struct amdgpu_ring *ring) | |||
238 | static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring) | 238 | static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring) |
239 | { | 239 | { |
240 | struct amdgpu_device *adev = ring->adev; | 240 | struct amdgpu_device *adev = ring->adev; |
241 | u64 *wptr = NULL; | 241 | u64 wptr; |
242 | uint64_t local_wptr = 0; | ||
243 | 242 | ||
244 | if (ring->use_doorbell) { | 243 | if (ring->use_doorbell) { |
245 | /* XXX check if swapping is necessary on BE */ | 244 | /* XXX check if swapping is necessary on BE */ |
246 | wptr = ((u64 *)&adev->wb.wb[ring->wptr_offs]); | 245 | wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs])); |
247 | DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", *wptr); | 246 | DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); |
248 | *wptr = (*wptr) >> 2; | ||
249 | DRM_DEBUG("wptr/doorbell after shift == 0x%016llx\n", *wptr); | ||
250 | } else { | 247 | } else { |
251 | u32 lowbit, highbit; | 248 | u32 lowbit, highbit; |
252 | int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; | 249 | int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; |
253 | 250 | ||
254 | wptr = &local_wptr; | ||
255 | lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR)) >> 2; | 251 | lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR)) >> 2; |
256 | highbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; | 252 | highbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; |
257 | 253 | ||
258 | DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", | 254 | DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", |
259 | me, highbit, lowbit); | 255 | me, highbit, lowbit); |
260 | *wptr = highbit; | 256 | wptr = highbit; |
261 | *wptr = (*wptr) << 32; | 257 | wptr = wptr << 32; |
262 | *wptr |= lowbit; | 258 | wptr |= lowbit; |
263 | } | 259 | } |
264 | 260 | ||
265 | return *wptr; | 261 | return wptr >> 2; |
266 | } | 262 | } |
267 | 263 | ||
268 | /** | 264 | /** |