diff options
author | Christian König <christian.koenig@amd.com> | 2018-01-12 15:57:53 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-02-19 14:18:09 -0500 |
commit | 9096d6e51a121c4cd2ea13e7b5087272425cf87a (patch) | |
tree | f13a4351900542b2209f3b61f7cda1923948114c /drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |
parent | 5518625d6a50c1724b2b2a796fc2fb1a8f1a9c21 (diff) |
drm/amdgpu: implement gmc_v9_0_emit_flush_gpu_tlb
Unify tlb flushing for gmc v9.
Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 61 |
1 files changed, 7 insertions, 54 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 8efe7f3ec0a1..76cdef29b9d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <drm/drmP.h> | 25 | #include <drm/drmP.h> |
26 | #include "amdgpu.h" | 26 | #include "amdgpu.h" |
27 | #include "amdgpu_vcn.h" | 27 | #include "amdgpu_vcn.h" |
28 | #include "soc15.h" | ||
28 | #include "soc15d.h" | 29 | #include "soc15d.h" |
29 | #include "soc15_common.h" | 30 | #include "soc15_common.h" |
30 | 31 | ||
@@ -852,22 +853,6 @@ static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring, | |||
852 | amdgpu_ring_write(ring, ib->length_dw); | 853 | amdgpu_ring_write(ring, ib->length_dw); |
853 | } | 854 | } |
854 | 855 | ||
855 | static void vcn_v1_0_dec_vm_reg_write(struct amdgpu_ring *ring, | ||
856 | uint32_t data0, uint32_t data1) | ||
857 | { | ||
858 | struct amdgpu_device *adev = ring->adev; | ||
859 | |||
860 | amdgpu_ring_write(ring, | ||
861 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0)); | ||
862 | amdgpu_ring_write(ring, data0); | ||
863 | amdgpu_ring_write(ring, | ||
864 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0)); | ||
865 | amdgpu_ring_write(ring, data1); | ||
866 | amdgpu_ring_write(ring, | ||
867 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0)); | ||
868 | amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); | ||
869 | } | ||
870 | |||
871 | static void vcn_v1_0_dec_vm_reg_wait(struct amdgpu_ring *ring, | 856 | static void vcn_v1_0_dec_vm_reg_wait(struct amdgpu_ring *ring, |
872 | uint32_t data0, uint32_t data1, uint32_t mask) | 857 | uint32_t data0, uint32_t data1, uint32_t mask) |
873 | { | 858 | { |
@@ -892,32 +877,17 @@ static void vcn_v1_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
892 | uint64_t pd_addr) | 877 | uint64_t pd_addr) |
893 | { | 878 | { |
894 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; | 879 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; |
895 | uint32_t req = ring->adev->gmc.gmc_funcs->get_invalidate_req(vmid); | ||
896 | uint64_t flags = AMDGPU_PTE_VALID; | ||
897 | unsigned eng = ring->vm_inv_eng; | 880 | unsigned eng = ring->vm_inv_eng; |
898 | uint32_t data0, data1, mask; | 881 | uint32_t data0, data1, mask; |
899 | 882 | ||
900 | amdgpu_gmc_get_vm_pde(ring->adev, -1, &pd_addr, &flags); | 883 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pasid, pd_addr); |
901 | pd_addr |= flags; | ||
902 | |||
903 | data0 = (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2; | ||
904 | data1 = upper_32_bits(pd_addr); | ||
905 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | ||
906 | |||
907 | data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2; | ||
908 | data1 = lower_32_bits(pd_addr); | ||
909 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | ||
910 | 884 | ||
885 | /* wait for register write */ | ||
911 | data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2; | 886 | data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2; |
912 | data1 = lower_32_bits(pd_addr); | 887 | data1 = lower_32_bits(pd_addr); |
913 | mask = 0xffffffff; | 888 | mask = 0xffffffff; |
914 | vcn_v1_0_dec_vm_reg_wait(ring, data0, data1, mask); | 889 | vcn_v1_0_dec_vm_reg_wait(ring, data0, data1, mask); |
915 | 890 | ||
916 | /* flush TLB */ | ||
917 | data0 = (hub->vm_inv_eng0_req + eng) << 2; | ||
918 | data1 = req; | ||
919 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | ||
920 | |||
921 | /* wait for flush */ | 891 | /* wait for flush */ |
922 | data0 = (hub->vm_inv_eng0_ack + eng) << 2; | 892 | data0 = (hub->vm_inv_eng0_ack + eng) << 2; |
923 | data1 = 1 << vmid; | 893 | data1 = 1 << vmid; |
@@ -1026,34 +996,17 @@ static void vcn_v1_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
1026 | uint64_t pd_addr) | 996 | uint64_t pd_addr) |
1027 | { | 997 | { |
1028 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; | 998 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; |
1029 | uint32_t req = ring->adev->gmc.gmc_funcs->get_invalidate_req(vmid); | ||
1030 | uint64_t flags = AMDGPU_PTE_VALID; | ||
1031 | unsigned eng = ring->vm_inv_eng; | 999 | unsigned eng = ring->vm_inv_eng; |
1032 | 1000 | ||
1033 | amdgpu_gmc_get_vm_pde(ring->adev, -1, &pd_addr, &flags); | 1001 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pasid, pd_addr); |
1034 | pd_addr |= flags; | ||
1035 | |||
1036 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | ||
1037 | amdgpu_ring_write(ring, | ||
1038 | (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2); | ||
1039 | amdgpu_ring_write(ring, upper_32_bits(pd_addr)); | ||
1040 | |||
1041 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | ||
1042 | amdgpu_ring_write(ring, | ||
1043 | (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2); | ||
1044 | amdgpu_ring_write(ring, lower_32_bits(pd_addr)); | ||
1045 | 1002 | ||
1003 | /* wait for reg writes */ | ||
1046 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); | 1004 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); |
1047 | amdgpu_ring_write(ring, | 1005 | amdgpu_ring_write(ring, |
1048 | (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2); | 1006 | (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2); |
1049 | amdgpu_ring_write(ring, 0xffffffff); | 1007 | amdgpu_ring_write(ring, 0xffffffff); |
1050 | amdgpu_ring_write(ring, lower_32_bits(pd_addr)); | 1008 | amdgpu_ring_write(ring, lower_32_bits(pd_addr)); |
1051 | 1009 | ||
1052 | /* flush TLB */ | ||
1053 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | ||
1054 | amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2); | ||
1055 | amdgpu_ring_write(ring, req); | ||
1056 | |||
1057 | /* wait for flush */ | 1010 | /* wait for flush */ |
1058 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); | 1011 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); |
1059 | amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2); | 1012 | amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2); |
@@ -1144,7 +1097,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = { | |||
1144 | .set_wptr = vcn_v1_0_dec_ring_set_wptr, | 1097 | .set_wptr = vcn_v1_0_dec_ring_set_wptr, |
1145 | .emit_frame_size = | 1098 | .emit_frame_size = |
1146 | 2 + /* vcn_v1_0_dec_ring_emit_hdp_invalidate */ | 1099 | 2 + /* vcn_v1_0_dec_ring_emit_hdp_invalidate */ |
1147 | 34 + /* vcn_v1_0_dec_ring_emit_vm_flush */ | 1100 | SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + 16 + /* vcn_v1_0_dec_ring_emit_vm_flush */ |
1148 | 14 + 14 + /* vcn_v1_0_dec_ring_emit_fence x2 vm fence */ | 1101 | 14 + 14 + /* vcn_v1_0_dec_ring_emit_fence x2 vm fence */ |
1149 | 6, | 1102 | 6, |
1150 | .emit_ib_size = 8, /* vcn_v1_0_dec_ring_emit_ib */ | 1103 | .emit_ib_size = 8, /* vcn_v1_0_dec_ring_emit_ib */ |
@@ -1173,7 +1126,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { | |||
1173 | .get_wptr = vcn_v1_0_enc_ring_get_wptr, | 1126 | .get_wptr = vcn_v1_0_enc_ring_get_wptr, |
1174 | .set_wptr = vcn_v1_0_enc_ring_set_wptr, | 1127 | .set_wptr = vcn_v1_0_enc_ring_set_wptr, |
1175 | .emit_frame_size = | 1128 | .emit_frame_size = |
1176 | 17 + /* vcn_v1_0_enc_ring_emit_vm_flush */ | 1129 | SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + 8 + /* vcn_v1_0_enc_ring_emit_vm_flush */ |
1177 | 5 + 5 + /* vcn_v1_0_enc_ring_emit_fence x2 vm fence */ | 1130 | 5 + 5 + /* vcn_v1_0_enc_ring_emit_fence x2 vm fence */ |
1178 | 1, /* vcn_v1_0_enc_ring_insert_end */ | 1131 | 1, /* vcn_v1_0_enc_ring_insert_end */ |
1179 | .emit_ib_size = 5, /* vcn_v1_0_enc_ring_emit_ib */ | 1132 | .emit_ib_size = 5, /* vcn_v1_0_enc_ring_emit_ib */ |