diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si_dma.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dma.c | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.c b/drivers/gpu/drm/amd/amdgpu/si_dma.c index 9a29c1399091..b75d901ba3c4 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dma.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dma.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <drm/drmP.h> | 24 | #include <drm/drmP.h> |
25 | #include "amdgpu.h" | 25 | #include "amdgpu.h" |
26 | #include "amdgpu_trace.h" | 26 | #include "amdgpu_trace.h" |
27 | #include "si.h" | ||
27 | #include "sid.h" | 28 | #include "sid.h" |
28 | 29 | ||
29 | const u32 sdma_offsets[SDMA_MAX_INSTANCE] = | 30 | const u32 sdma_offsets[SDMA_MAX_INSTANCE] = |
@@ -74,20 +75,6 @@ static void si_dma_ring_emit_ib(struct amdgpu_ring *ring, | |||
74 | 75 | ||
75 | } | 76 | } |
76 | 77 | ||
77 | static void si_dma_ring_emit_hdp_flush(struct amdgpu_ring *ring) | ||
78 | { | ||
79 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | ||
80 | amdgpu_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL)); | ||
81 | amdgpu_ring_write(ring, 1); | ||
82 | } | ||
83 | |||
84 | static void si_dma_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) | ||
85 | { | ||
86 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | ||
87 | amdgpu_ring_write(ring, (0xf << 16) | (HDP_DEBUG0)); | ||
88 | amdgpu_ring_write(ring, 1); | ||
89 | } | ||
90 | |||
91 | /** | 78 | /** |
92 | * si_dma_ring_emit_fence - emit a fence on the DMA ring | 79 | * si_dma_ring_emit_fence - emit a fence on the DMA ring |
93 | * | 80 | * |
@@ -134,7 +121,7 @@ static void si_dma_stop(struct amdgpu_device *adev) | |||
134 | WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl); | 121 | WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl); |
135 | 122 | ||
136 | if (adev->mman.buffer_funcs_ring == ring) | 123 | if (adev->mman.buffer_funcs_ring == ring) |
137 | amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size); | 124 | amdgpu_ttm_set_buffer_funcs_status(adev, false); |
138 | ring->ready = false; | 125 | ring->ready = false; |
139 | } | 126 | } |
140 | } | 127 | } |
@@ -197,7 +184,7 @@ static int si_dma_start(struct amdgpu_device *adev) | |||
197 | } | 184 | } |
198 | 185 | ||
199 | if (adev->mman.buffer_funcs_ring == ring) | 186 | if (adev->mman.buffer_funcs_ring == ring) |
200 | amdgpu_ttm_set_active_vram_size(adev, adev->mc.real_vram_size); | 187 | amdgpu_ttm_set_buffer_funcs_status(adev, true); |
201 | } | 188 | } |
202 | 189 | ||
203 | return 0; | 190 | return 0; |
@@ -475,17 +462,7 @@ static void si_dma_ring_emit_pipeline_sync(struct amdgpu_ring *ring) | |||
475 | static void si_dma_ring_emit_vm_flush(struct amdgpu_ring *ring, | 462 | static void si_dma_ring_emit_vm_flush(struct amdgpu_ring *ring, |
476 | unsigned vmid, uint64_t pd_addr) | 463 | unsigned vmid, uint64_t pd_addr) |
477 | { | 464 | { |
478 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | 465 | amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); |
479 | if (vmid < 8) | ||
480 | amdgpu_ring_write(ring, (0xf << 16) | (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vmid)); | ||
481 | else | ||
482 | amdgpu_ring_write(ring, (0xf << 16) | (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + (vmid - 8))); | ||
483 | amdgpu_ring_write(ring, pd_addr >> 12); | ||
484 | |||
485 | /* bits 0-7 are the VM contexts0-7 */ | ||
486 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | ||
487 | amdgpu_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST)); | ||
488 | amdgpu_ring_write(ring, 1 << vmid); | ||
489 | 466 | ||
490 | /* wait for invalidate to complete */ | 467 | /* wait for invalidate to complete */ |
491 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0)); | 468 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0)); |
@@ -496,6 +473,14 @@ static void si_dma_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
496 | amdgpu_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */ | 473 | amdgpu_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */ |
497 | } | 474 | } |
498 | 475 | ||
476 | static void si_dma_ring_emit_wreg(struct amdgpu_ring *ring, | ||
477 | uint32_t reg, uint32_t val) | ||
478 | { | ||
479 | amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | ||
480 | amdgpu_ring_write(ring, (0xf << 16) | reg); | ||
481 | amdgpu_ring_write(ring, val); | ||
482 | } | ||
483 | |||
499 | static int si_dma_early_init(void *handle) | 484 | static int si_dma_early_init(void *handle) |
500 | { | 485 | { |
501 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 486 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
@@ -772,22 +757,20 @@ static const struct amdgpu_ring_funcs si_dma_ring_funcs = { | |||
772 | .get_wptr = si_dma_ring_get_wptr, | 757 | .get_wptr = si_dma_ring_get_wptr, |
773 | .set_wptr = si_dma_ring_set_wptr, | 758 | .set_wptr = si_dma_ring_set_wptr, |
774 | .emit_frame_size = | 759 | .emit_frame_size = |
775 | 3 + /* si_dma_ring_emit_hdp_flush */ | 760 | 3 + 3 + /* hdp flush / invalidate */ |
776 | 3 + /* si_dma_ring_emit_hdp_invalidate */ | ||
777 | 6 + /* si_dma_ring_emit_pipeline_sync */ | 761 | 6 + /* si_dma_ring_emit_pipeline_sync */ |
778 | 12 + /* si_dma_ring_emit_vm_flush */ | 762 | SI_FLUSH_GPU_TLB_NUM_WREG * 3 + 6 + /* si_dma_ring_emit_vm_flush */ |
779 | 9 + 9 + 9, /* si_dma_ring_emit_fence x3 for user fence, vm fence */ | 763 | 9 + 9 + 9, /* si_dma_ring_emit_fence x3 for user fence, vm fence */ |
780 | .emit_ib_size = 7 + 3, /* si_dma_ring_emit_ib */ | 764 | .emit_ib_size = 7 + 3, /* si_dma_ring_emit_ib */ |
781 | .emit_ib = si_dma_ring_emit_ib, | 765 | .emit_ib = si_dma_ring_emit_ib, |
782 | .emit_fence = si_dma_ring_emit_fence, | 766 | .emit_fence = si_dma_ring_emit_fence, |
783 | .emit_pipeline_sync = si_dma_ring_emit_pipeline_sync, | 767 | .emit_pipeline_sync = si_dma_ring_emit_pipeline_sync, |
784 | .emit_vm_flush = si_dma_ring_emit_vm_flush, | 768 | .emit_vm_flush = si_dma_ring_emit_vm_flush, |
785 | .emit_hdp_flush = si_dma_ring_emit_hdp_flush, | ||
786 | .emit_hdp_invalidate = si_dma_ring_emit_hdp_invalidate, | ||
787 | .test_ring = si_dma_ring_test_ring, | 769 | .test_ring = si_dma_ring_test_ring, |
788 | .test_ib = si_dma_ring_test_ib, | 770 | .test_ib = si_dma_ring_test_ib, |
789 | .insert_nop = amdgpu_ring_insert_nop, | 771 | .insert_nop = amdgpu_ring_insert_nop, |
790 | .pad_ib = si_dma_ring_pad_ib, | 772 | .pad_ib = si_dma_ring_pad_ib, |
773 | .emit_wreg = si_dma_ring_emit_wreg, | ||
791 | }; | 774 | }; |
792 | 775 | ||
793 | static void si_dma_set_ring_funcs(struct amdgpu_device *adev) | 776 | static void si_dma_set_ring_funcs(struct amdgpu_device *adev) |
@@ -891,9 +874,6 @@ static const struct amdgpu_vm_pte_funcs si_dma_vm_pte_funcs = { | |||
891 | .copy_pte = si_dma_vm_copy_pte, | 874 | .copy_pte = si_dma_vm_copy_pte, |
892 | 875 | ||
893 | .write_pte = si_dma_vm_write_pte, | 876 | .write_pte = si_dma_vm_write_pte, |
894 | |||
895 | .set_max_nums_pte_pde = 0xffff8 >> 3, | ||
896 | .set_pte_pde_num_dw = 9, | ||
897 | .set_pte_pde = si_dma_vm_set_pte_pde, | 877 | .set_pte_pde = si_dma_vm_set_pte_pde, |
898 | }; | 878 | }; |
899 | 879 | ||