diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2018-06-25 13:24:10 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-07-05 17:39:52 -0400 |
commit | 1cf0abb6c983d90ec541ebba79934a9c4786df1d (patch) | |
tree | 8f4c1b4dcbe6ca895832abde19129536dac9a2ac | |
parent | ed54d954e5c1d8bad453fb86109075b3577152b7 (diff) |
drm/amdgpu/sdma: simplify sdma instance setup
Set the me instance in early init and use that rather than
calculating the instance based on the ring pointer.
Reviewed-by: James Zhu <James.Zhu@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 23 |
4 files changed, 29 insertions, 32 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index a7576255cc30..dbd553a8d584 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |||
@@ -177,9 +177,8 @@ static uint64_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring) | |||
177 | static uint64_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; | ||
181 | 180 | ||
182 | return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) & 0x3fffc) >> 2; | 181 | return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) & 0x3fffc) >> 2; |
183 | } | 182 | } |
184 | 183 | ||
185 | /** | 184 | /** |
@@ -192,9 +191,8 @@ static uint64_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring) | |||
192 | static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring) | 191 | static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring) |
193 | { | 192 | { |
194 | struct amdgpu_device *adev = ring->adev; | 193 | struct amdgpu_device *adev = ring->adev; |
195 | u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; | ||
196 | 194 | ||
197 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], | 195 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], |
198 | (lower_32_bits(ring->wptr) << 2) & 0x3fffc); | 196 | (lower_32_bits(ring->wptr) << 2) & 0x3fffc); |
199 | } | 197 | } |
200 | 198 | ||
@@ -248,7 +246,7 @@ static void cik_sdma_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
248 | SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ | 246 | SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ |
249 | u32 ref_and_mask; | 247 | u32 ref_and_mask; |
250 | 248 | ||
251 | if (ring == &ring->adev->sdma.instance[0].ring) | 249 | if (ring->me == 0) |
252 | ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA0_MASK; | 250 | ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA0_MASK; |
253 | else | 251 | else |
254 | ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA1_MASK; | 252 | ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA1_MASK; |
@@ -1290,8 +1288,10 @@ static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) | |||
1290 | { | 1288 | { |
1291 | int i; | 1289 | int i; |
1292 | 1290 | ||
1293 | for (i = 0; i < adev->sdma.num_instances; i++) | 1291 | for (i = 0; i < adev->sdma.num_instances; i++) { |
1294 | adev->sdma.instance[i].ring.funcs = &cik_sdma_ring_funcs; | 1292 | adev->sdma.instance[i].ring.funcs = &cik_sdma_ring_funcs; |
1293 | adev->sdma.instance[i].ring.me = i; | ||
1294 | } | ||
1295 | } | 1295 | } |
1296 | 1296 | ||
1297 | static const struct amdgpu_irq_src_funcs cik_sdma_trap_irq_funcs = { | 1297 | static const struct amdgpu_irq_src_funcs cik_sdma_trap_irq_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index c7190c39c4f5..cee4fae76d20 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | |||
@@ -202,8 +202,7 @@ static uint64_t sdma_v2_4_ring_get_rptr(struct amdgpu_ring *ring) | |||
202 | static uint64_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring) | 202 | static uint64_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring) |
203 | { | 203 | { |
204 | struct amdgpu_device *adev = ring->adev; | 204 | struct amdgpu_device *adev = ring->adev; |
205 | int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; | 205 | u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) >> 2; |
206 | u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; | ||
207 | 206 | ||
208 | return wptr; | 207 | return wptr; |
209 | } | 208 | } |
@@ -218,9 +217,8 @@ static uint64_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring) | |||
218 | static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring) | 217 | static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring) |
219 | { | 218 | { |
220 | struct amdgpu_device *adev = ring->adev; | 219 | struct amdgpu_device *adev = ring->adev; |
221 | int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; | ||
222 | 220 | ||
223 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], lower_32_bits(ring->wptr) << 2); | 221 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], lower_32_bits(ring->wptr) << 2); |
224 | } | 222 | } |
225 | 223 | ||
226 | static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | 224 | static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) |
@@ -273,7 +271,7 @@ static void sdma_v2_4_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
273 | { | 271 | { |
274 | u32 ref_and_mask = 0; | 272 | u32 ref_and_mask = 0; |
275 | 273 | ||
276 | if (ring == &ring->adev->sdma.instance[0].ring) | 274 | if (ring->me == 0) |
277 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); | 275 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); |
278 | else | 276 | else |
279 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); | 277 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); |
@@ -1213,8 +1211,10 @@ static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev) | |||
1213 | { | 1211 | { |
1214 | int i; | 1212 | int i; |
1215 | 1213 | ||
1216 | for (i = 0; i < adev->sdma.num_instances; i++) | 1214 | for (i = 0; i < adev->sdma.num_instances; i++) { |
1217 | adev->sdma.instance[i].ring.funcs = &sdma_v2_4_ring_funcs; | 1215 | adev->sdma.instance[i].ring.funcs = &sdma_v2_4_ring_funcs; |
1216 | adev->sdma.instance[i].ring.me = i; | ||
1217 | } | ||
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | static const struct amdgpu_irq_src_funcs sdma_v2_4_trap_irq_funcs = { | 1220 | static const struct amdgpu_irq_src_funcs sdma_v2_4_trap_irq_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index aa9ab299fd32..99616dd9594f 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | |||
@@ -365,9 +365,7 @@ static uint64_t sdma_v3_0_ring_get_wptr(struct amdgpu_ring *ring) | |||
365 | /* XXX check if swapping is necessary on BE */ | 365 | /* XXX check if swapping is necessary on BE */ |
366 | wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2; | 366 | wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2; |
367 | } else { | 367 | } else { |
368 | int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; | 368 | wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) >> 2; |
369 | |||
370 | wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; | ||
371 | } | 369 | } |
372 | 370 | ||
373 | return wptr; | 371 | return wptr; |
@@ -394,9 +392,7 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring) | |||
394 | 392 | ||
395 | WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2)); | 393 | WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2)); |
396 | } else { | 394 | } else { |
397 | int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; | 395 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], lower_32_bits(ring->wptr) << 2); |
398 | |||
399 | WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], lower_32_bits(ring->wptr) << 2); | ||
400 | } | 396 | } |
401 | } | 397 | } |
402 | 398 | ||
@@ -450,7 +446,7 @@ static void sdma_v3_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
450 | { | 446 | { |
451 | u32 ref_and_mask = 0; | 447 | u32 ref_and_mask = 0; |
452 | 448 | ||
453 | if (ring == &ring->adev->sdma.instance[0].ring) | 449 | if (ring->me == 0) |
454 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); | 450 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); |
455 | else | 451 | else |
456 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); | 452 | ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); |
@@ -1655,8 +1651,10 @@ static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev) | |||
1655 | { | 1651 | { |
1656 | int i; | 1652 | int i; |
1657 | 1653 | ||
1658 | for (i = 0; i < adev->sdma.num_instances; i++) | 1654 | for (i = 0; i < adev->sdma.num_instances; i++) { |
1659 | adev->sdma.instance[i].ring.funcs = &sdma_v3_0_ring_funcs; | 1655 | adev->sdma.instance[i].ring.funcs = &sdma_v3_0_ring_funcs; |
1656 | adev->sdma.instance[i].ring.me = i; | ||
1657 | } | ||
1660 | } | 1658 | } |
1661 | 1659 | ||
1662 | static const struct amdgpu_irq_src_funcs sdma_v3_0_trap_irq_funcs = { | 1660 | static const struct amdgpu_irq_src_funcs sdma_v3_0_trap_irq_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index ca53b3fba422..572ca63cf676 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -296,13 +296,12 @@ static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring) | |||
296 | DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); | 296 | DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); |
297 | } else { | 297 | } else { |
298 | u32 lowbit, highbit; | 298 | u32 lowbit, highbit; |
299 | int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; | ||
300 | 299 | ||
301 | lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR)) >> 2; | 300 | lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)) >> 2; |
302 | highbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; | 301 | highbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; |
303 | 302 | ||
304 | DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", | 303 | DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", |
305 | me, highbit, lowbit); | 304 | ring->me, highbit, lowbit); |
306 | wptr = highbit; | 305 | wptr = highbit; |
307 | wptr = wptr << 32; | 306 | wptr = wptr << 32; |
308 | wptr |= lowbit; | 307 | wptr |= lowbit; |
@@ -339,17 +338,15 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring) | |||
339 | ring->doorbell_index, ring->wptr << 2); | 338 | ring->doorbell_index, ring->wptr << 2); |
340 | WDOORBELL64(ring->doorbell_index, ring->wptr << 2); | 339 | WDOORBELL64(ring->doorbell_index, ring->wptr << 2); |
341 | } else { | 340 | } else { |
342 | int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; | ||
343 | |||
344 | DRM_DEBUG("Not using doorbell -- " | 341 | DRM_DEBUG("Not using doorbell -- " |
345 | "mmSDMA%i_GFX_RB_WPTR == 0x%08x " | 342 | "mmSDMA%i_GFX_RB_WPTR == 0x%08x " |
346 | "mmSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n", | 343 | "mmSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n", |
347 | me, | 344 | ring->me, |
348 | lower_32_bits(ring->wptr << 2), | 345 | lower_32_bits(ring->wptr << 2), |
349 | me, | 346 | ring->me, |
350 | upper_32_bits(ring->wptr << 2)); | 347 | upper_32_bits(ring->wptr << 2)); |
351 | WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); | 348 | WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); |
352 | WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); | 349 | WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); |
353 | } | 350 | } |
354 | } | 351 | } |
355 | 352 | ||
@@ -430,7 +427,7 @@ static void sdma_v4_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
430 | u32 ref_and_mask = 0; | 427 | u32 ref_and_mask = 0; |
431 | const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio_funcs->hdp_flush_reg; | 428 | const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio_funcs->hdp_flush_reg; |
432 | 429 | ||
433 | if (ring == &ring->adev->sdma.instance[0].ring) | 430 | if (ring->me == 0) |
434 | ref_and_mask = nbio_hf_reg->ref_and_mask_sdma0; | 431 | ref_and_mask = nbio_hf_reg->ref_and_mask_sdma0; |
435 | else | 432 | else |
436 | ref_and_mask = nbio_hf_reg->ref_and_mask_sdma1; | 433 | ref_and_mask = nbio_hf_reg->ref_and_mask_sdma1; |
@@ -1651,8 +1648,10 @@ static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev) | |||
1651 | { | 1648 | { |
1652 | int i; | 1649 | int i; |
1653 | 1650 | ||
1654 | for (i = 0; i < adev->sdma.num_instances; i++) | 1651 | for (i = 0; i < adev->sdma.num_instances; i++) { |
1655 | adev->sdma.instance[i].ring.funcs = &sdma_v4_0_ring_funcs; | 1652 | adev->sdma.instance[i].ring.funcs = &sdma_v4_0_ring_funcs; |
1653 | adev->sdma.instance[i].ring.me = i; | ||
1654 | } | ||
1656 | } | 1655 | } |
1657 | 1656 | ||
1658 | static const struct amdgpu_irq_src_funcs sdma_v4_0_trap_irq_funcs = { | 1657 | static const struct amdgpu_irq_src_funcs sdma_v4_0_trap_irq_funcs = { |