aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c47
1 files changed, 37 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 3920c1e346f8..9ea9de457da3 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -188,6 +188,19 @@ static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring)
188 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc); 188 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc);
189} 189}
190 190
191static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
192{
193 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ring);
194 int i;
195
196 for (i = 0; i < count; i++)
197 if (sdma && sdma->burst_nop && (i == 0))
198 amdgpu_ring_write(ring, ring->nop |
199 SDMA_NOP_COUNT(count - 1));
200 else
201 amdgpu_ring_write(ring, ring->nop);
202}
203
191/** 204/**
192 * cik_sdma_ring_emit_ib - Schedule an IB on the DMA engine 205 * cik_sdma_ring_emit_ib - Schedule an IB on the DMA engine
193 * 206 *
@@ -213,8 +226,8 @@ static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,
213 amdgpu_ring_write(ring, next_rptr); 226 amdgpu_ring_write(ring, next_rptr);
214 227
215 /* IB packet must end on a 8 DW boundary */ 228 /* IB packet must end on a 8 DW boundary */
216 while ((ring->wptr & 7) != 4) 229 cik_sdma_ring_insert_nop(ring, (12 - (ring->wptr & 7)) % 8);
217 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); 230
218 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));
219 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 */
220 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xffffffff); 233 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xffffffff);
@@ -501,6 +514,8 @@ static int cik_sdma_load_microcode(struct amdgpu_device *adev)
501 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 514 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
502 adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); 515 adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version);
503 adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); 516 adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version);
517 if (adev->sdma[i].feature_version >= 20)
518 adev->sdma[i].burst_nop = true;
504 fw_data = (const __le32 *) 519 fw_data = (const __le32 *)
505 (adev->sdma[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 520 (adev->sdma[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
506 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); 521 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0);
@@ -815,8 +830,19 @@ static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib,
815 */ 830 */
816static void cik_sdma_vm_pad_ib(struct amdgpu_ib *ib) 831static void cik_sdma_vm_pad_ib(struct amdgpu_ib *ib)
817{ 832{
818 while (ib->length_dw & 0x7) 833 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ib->ring);
819 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0); 834 u32 pad_count;
835 int i;
836
837 pad_count = (8 - (ib->length_dw & 0x7)) % 8;
838 for (i = 0; i < pad_count; i++)
839 if (sdma && sdma->burst_nop && (i == 0))
840 ib->ptr[ib->length_dw++] =
841 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0) |
842 SDMA_NOP_COUNT(pad_count - 1);
843 else
844 ib->ptr[ib->length_dw++] =
845 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0);
820} 846}
821 847
822/** 848/**
@@ -1303,6 +1329,7 @@ static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
1303 .test_ring = cik_sdma_ring_test_ring, 1329 .test_ring = cik_sdma_ring_test_ring,
1304 .test_ib = cik_sdma_ring_test_ib, 1330 .test_ib = cik_sdma_ring_test_ib,
1305 .is_lockup = cik_sdma_ring_is_lockup, 1331 .is_lockup = cik_sdma_ring_is_lockup,
1332 .insert_nop = cik_sdma_ring_insert_nop,
1306}; 1333};
1307 1334
1308static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) 1335static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev)
@@ -1363,16 +1390,16 @@ static void cik_sdma_emit_copy_buffer(struct amdgpu_ib *ib,
1363 * 1390 *
1364 * Fill GPU buffers using the DMA engine (CIK). 1391 * Fill GPU buffers using the DMA engine (CIK).
1365 */ 1392 */
1366static void cik_sdma_emit_fill_buffer(struct amdgpu_ring *ring, 1393static void cik_sdma_emit_fill_buffer(struct amdgpu_ib *ib,
1367 uint32_t src_data, 1394 uint32_t src_data,
1368 uint64_t dst_offset, 1395 uint64_t dst_offset,
1369 uint32_t byte_count) 1396 uint32_t byte_count)
1370{ 1397{
1371 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 0)); 1398 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 0);
1372 amdgpu_ring_write(ring, lower_32_bits(dst_offset)); 1399 ib->ptr[ib->length_dw++] = lower_32_bits(dst_offset);
1373 amdgpu_ring_write(ring, upper_32_bits(dst_offset)); 1400 ib->ptr[ib->length_dw++] = upper_32_bits(dst_offset);
1374 amdgpu_ring_write(ring, src_data); 1401 ib->ptr[ib->length_dw++] = src_data;
1375 amdgpu_ring_write(ring, byte_count); 1402 ib->ptr[ib->length_dw++] = byte_count;
1376} 1403}
1377 1404
1378static const struct amdgpu_buffer_funcs cik_sdma_buffer_funcs = { 1405static const struct amdgpu_buffer_funcs cik_sdma_buffer_funcs = {