aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-01-12 15:57:53 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-02-19 14:18:09 -0500
commit9096d6e51a121c4cd2ea13e7b5087272425cf87a (patch)
treef13a4351900542b2209f3b61f7cda1923948114c /drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
parent5518625d6a50c1724b2b2a796fc2fb1a8f1a9c21 (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.c61
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
855static 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
871static void vcn_v1_0_dec_vm_reg_wait(struct amdgpu_ring *ring, 856static 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 */