diff options
author | Dave Airlie <airlied@redhat.com> | 2015-09-03 23:06:29 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-09-03 23:06:29 -0400 |
commit | 99495589aa4de7166af254bc497cdbe133fc24bb (patch) | |
tree | d525e957854064f2492976e9beb8a04dddc28143 /drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |
parent | 879a37d00f1882b1e56a66e626af4194d592d257 (diff) | |
parent | bddf8026386927985ef6d0d11c3ba78f70b76bad (diff) |
Merge branch 'drm-next-4.3' of git://people.freedesktop.org/~agd5f/linux into drm-next
More fixes for radeon and amdgpu for 4.3:
- Send full DP aux address fixes for radeon and amdgpu
- Fix an HDMI display regression for pre-DCE5 parts
- UVD suspend fixes for amdgpu
- Add an rs480 suspend quirk
- Fix bo reserve handling in amdgpu GEM_OP ioctl
- GPU scheduler fixes
- SDMA optimizations
- MEC fix for Fiji
* 'drm-next-4.3' of git://people.freedesktop.org/~agd5f/linux: (21 commits)
drm/amdgpu: set MEC doorbell range for Fiji
drm/amdgpu: implement burst NOP for SDMA
drm/amdgpu: add insert_nop ring func and default implementation
drm/amdgpu: add amdgpu_get_sdma_instance helper function
drm/amdgpu: add AMDGPU_MAX_SDMA_INSTANCES
drm/amdgpu: add burst_nop flag for sdma
drm/amdgpu: add count field for the SDMA NOP packet v2
drm/amdgpu: use PT for VM sync on unmap
drm/amdgpu: make wait_event uninterruptible in push_job
drm/amdgpu: fix amdgpu_bo_unreserve order in GEM_OP IOCTL v2
drm/amdgpu: partially revert "modify amdgpu_fence_wait_any() to amdgpu_fence_wait_multiple()" v2
Add radeon suspend/resume quirk for HP Compaq dc5750.
drm/amdgpu: re-work sync_resv
drm/amdgpu/atom: Send out the full AUX address
drm/radeon/native: Send out the full AUX address
drm/radeon/atom: Send out the full AUX address
drm/amdgpu: use IB for fill_buffer instead of direct command
drm/amdgpu: stop trying to suspend UVD sessions v2
drm/amdgpu: add scheduler dependency callback v2
drm/amdgpu: let the scheduler work more with jobs v2
...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 47 |
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 | ||
191 | static 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 | */ |
816 | static void cik_sdma_vm_pad_ib(struct amdgpu_ib *ib) | 831 | static 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 | ||
1308 | static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) | 1335 | static 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 | */ |
1366 | static void cik_sdma_emit_fill_buffer(struct amdgpu_ring *ring, | 1393 | static 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 | ||
1378 | static const struct amdgpu_buffer_funcs cik_sdma_buffer_funcs = { | 1405 | static const struct amdgpu_buffer_funcs cik_sdma_buffer_funcs = { |