aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/si_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si_dma.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dma.c50
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
29const u32 sdma_offsets[SDMA_MAX_INSTANCE] = 30const 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
77static 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
84static 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)
475static void si_dma_ring_emit_vm_flush(struct amdgpu_ring *ring, 462static 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
476static 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
499static int si_dma_early_init(void *handle) 484static 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
793static void si_dma_set_ring_funcs(struct amdgpu_device *adev) 776static 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