diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 159 |
1 files changed, 61 insertions, 98 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index b99e15c43e45..8c132673bc79 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 | ||
@@ -74,13 +75,13 @@ static int vcn_v1_0_sw_init(void *handle) | |||
74 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 75 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
75 | 76 | ||
76 | /* VCN DEC TRAP */ | 77 | /* VCN DEC TRAP */ |
77 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VCN, 124, &adev->vcn.irq); | 78 | r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 124, &adev->vcn.irq); |
78 | if (r) | 79 | if (r) |
79 | return r; | 80 | return r; |
80 | 81 | ||
81 | /* VCN ENC TRAP */ | 82 | /* VCN ENC TRAP */ |
82 | for (i = 0; i < adev->vcn.num_enc_rings; ++i) { | 83 | for (i = 0; i < adev->vcn.num_enc_rings; ++i) { |
83 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VCN, i + 119, | 84 | r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, i + 119, |
84 | &adev->vcn.irq); | 85 | &adev->vcn.irq); |
85 | if (r) | 86 | if (r) |
86 | return r; | 87 | return r; |
@@ -809,21 +810,6 @@ static void vcn_v1_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 | |||
809 | } | 810 | } |
810 | 811 | ||
811 | /** | 812 | /** |
812 | * vcn_v1_0_dec_ring_hdp_invalidate - emit an hdp invalidate | ||
813 | * | ||
814 | * @ring: amdgpu_ring pointer | ||
815 | * | ||
816 | * Emits an hdp invalidate. | ||
817 | */ | ||
818 | static void vcn_v1_0_dec_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) | ||
819 | { | ||
820 | struct amdgpu_device *adev = ring->adev; | ||
821 | |||
822 | amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 0)); | ||
823 | amdgpu_ring_write(ring, 1); | ||
824 | } | ||
825 | |||
826 | /** | ||
827 | * vcn_v1_0_dec_ring_emit_ib - execute indirect buffer | 813 | * vcn_v1_0_dec_ring_emit_ib - execute indirect buffer |
828 | * | 814 | * |
829 | * @ring: amdgpu_ring pointer | 815 | * @ring: amdgpu_ring pointer |
@@ -852,33 +838,18 @@ static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring, | |||
852 | amdgpu_ring_write(ring, ib->length_dw); | 838 | amdgpu_ring_write(ring, ib->length_dw); |
853 | } | 839 | } |
854 | 840 | ||
855 | static void vcn_v1_0_dec_vm_reg_write(struct amdgpu_ring *ring, | 841 | static void vcn_v1_0_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, |
856 | uint32_t data0, uint32_t data1) | 842 | uint32_t reg, uint32_t val, |
843 | uint32_t mask) | ||
857 | { | 844 | { |
858 | struct amdgpu_device *adev = ring->adev; | 845 | struct amdgpu_device *adev = ring->adev; |
859 | 846 | ||
860 | amdgpu_ring_write(ring, | 847 | amdgpu_ring_write(ring, |
861 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0)); | 848 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0)); |
862 | amdgpu_ring_write(ring, data0); | 849 | amdgpu_ring_write(ring, reg << 2); |
863 | amdgpu_ring_write(ring, | 850 | amdgpu_ring_write(ring, |
864 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0)); | 851 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0)); |
865 | amdgpu_ring_write(ring, data1); | 852 | amdgpu_ring_write(ring, val); |
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, | ||
872 | uint32_t data0, uint32_t data1, uint32_t mask) | ||
873 | { | ||
874 | struct amdgpu_device *adev = ring->adev; | ||
875 | |||
876 | amdgpu_ring_write(ring, | ||
877 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0)); | ||
878 | amdgpu_ring_write(ring, data0); | ||
879 | amdgpu_ring_write(ring, | ||
880 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0)); | ||
881 | amdgpu_ring_write(ring, data1); | ||
882 | amdgpu_ring_write(ring, | 853 | amdgpu_ring_write(ring, |
883 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH8), 0)); | 854 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH8), 0)); |
884 | amdgpu_ring_write(ring, mask); | 855 | amdgpu_ring_write(ring, mask); |
@@ -888,40 +859,34 @@ static void vcn_v1_0_dec_vm_reg_wait(struct amdgpu_ring *ring, | |||
888 | } | 859 | } |
889 | 860 | ||
890 | static void vcn_v1_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, | 861 | static void vcn_v1_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, |
891 | unsigned vmid, uint64_t pd_addr) | 862 | unsigned vmid, uint64_t pd_addr) |
892 | { | 863 | { |
893 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; | 864 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; |
894 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vmid); | ||
895 | uint64_t flags = AMDGPU_PTE_VALID; | ||
896 | unsigned eng = ring->vm_inv_eng; | ||
897 | uint32_t data0, data1, mask; | 865 | uint32_t data0, data1, mask; |
898 | 866 | ||
899 | amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags); | 867 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); |
900 | pd_addr |= flags; | ||
901 | |||
902 | data0 = (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2; | ||
903 | data1 = upper_32_bits(pd_addr); | ||
904 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | ||
905 | |||
906 | data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2; | ||
907 | data1 = lower_32_bits(pd_addr); | ||
908 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | ||
909 | 868 | ||
910 | data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2; | 869 | /* wait for register write */ |
870 | data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2; | ||
911 | data1 = lower_32_bits(pd_addr); | 871 | data1 = lower_32_bits(pd_addr); |
912 | mask = 0xffffffff; | 872 | mask = 0xffffffff; |
913 | vcn_v1_0_dec_vm_reg_wait(ring, data0, data1, mask); | 873 | vcn_v1_0_dec_ring_emit_reg_wait(ring, data0, data1, mask); |
914 | 874 | } | |
915 | /* flush TLB */ | 875 | |
916 | data0 = (hub->vm_inv_eng0_req + eng) << 2; | 876 | static void vcn_v1_0_dec_ring_emit_wreg(struct amdgpu_ring *ring, |
917 | data1 = req; | 877 | uint32_t reg, uint32_t val) |
918 | vcn_v1_0_dec_vm_reg_write(ring, data0, data1); | 878 | { |
919 | 879 | struct amdgpu_device *adev = ring->adev; | |
920 | /* wait for flush */ | 880 | |
921 | data0 = (hub->vm_inv_eng0_ack + eng) << 2; | 881 | amdgpu_ring_write(ring, |
922 | data1 = 1 << vmid; | 882 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0)); |
923 | mask = 1 << vmid; | 883 | amdgpu_ring_write(ring, reg << 2); |
924 | vcn_v1_0_dec_vm_reg_wait(ring, data0, data1, mask); | 884 | amdgpu_ring_write(ring, |
885 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0)); | ||
886 | amdgpu_ring_write(ring, val); | ||
887 | amdgpu_ring_write(ring, | ||
888 | PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0)); | ||
889 | amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); | ||
925 | } | 890 | } |
926 | 891 | ||
927 | /** | 892 | /** |
@@ -1020,43 +985,34 @@ static void vcn_v1_0_enc_ring_emit_ib(struct amdgpu_ring *ring, | |||
1020 | amdgpu_ring_write(ring, ib->length_dw); | 985 | amdgpu_ring_write(ring, ib->length_dw); |
1021 | } | 986 | } |
1022 | 987 | ||
988 | static void vcn_v1_0_enc_ring_emit_reg_wait(struct amdgpu_ring *ring, | ||
989 | uint32_t reg, uint32_t val, | ||
990 | uint32_t mask) | ||
991 | { | ||
992 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); | ||
993 | amdgpu_ring_write(ring, reg << 2); | ||
994 | amdgpu_ring_write(ring, mask); | ||
995 | amdgpu_ring_write(ring, val); | ||
996 | } | ||
997 | |||
1023 | static void vcn_v1_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, | 998 | static void vcn_v1_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, |
1024 | unsigned int vmid, uint64_t pd_addr) | 999 | unsigned int vmid, uint64_t pd_addr) |
1025 | { | 1000 | { |
1026 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; | 1001 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; |
1027 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vmid); | ||
1028 | uint64_t flags = AMDGPU_PTE_VALID; | ||
1029 | unsigned eng = ring->vm_inv_eng; | ||
1030 | |||
1031 | amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags); | ||
1032 | pd_addr |= flags; | ||
1033 | 1002 | ||
1034 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | 1003 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); |
1035 | amdgpu_ring_write(ring, | ||
1036 | (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2); | ||
1037 | amdgpu_ring_write(ring, upper_32_bits(pd_addr)); | ||
1038 | |||
1039 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | ||
1040 | amdgpu_ring_write(ring, | ||
1041 | (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2); | ||
1042 | amdgpu_ring_write(ring, lower_32_bits(pd_addr)); | ||
1043 | 1004 | ||
1044 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); | 1005 | /* wait for reg writes */ |
1045 | amdgpu_ring_write(ring, | 1006 | vcn_v1_0_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 + vmid * 2, |
1046 | (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2); | 1007 | lower_32_bits(pd_addr), 0xffffffff); |
1047 | amdgpu_ring_write(ring, 0xffffffff); | 1008 | } |
1048 | amdgpu_ring_write(ring, lower_32_bits(pd_addr)); | ||
1049 | 1009 | ||
1050 | /* flush TLB */ | 1010 | static void vcn_v1_0_enc_ring_emit_wreg(struct amdgpu_ring *ring, |
1011 | uint32_t reg, uint32_t val) | ||
1012 | { | ||
1051 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); | 1013 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); |
1052 | amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2); | 1014 | amdgpu_ring_write(ring, reg << 2); |
1053 | amdgpu_ring_write(ring, req); | 1015 | amdgpu_ring_write(ring, val); |
1054 | |||
1055 | /* wait for flush */ | ||
1056 | amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT); | ||
1057 | amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2); | ||
1058 | amdgpu_ring_write(ring, 1 << vmid); | ||
1059 | amdgpu_ring_write(ring, 1 << vmid); | ||
1060 | } | 1016 | } |
1061 | 1017 | ||
1062 | static int vcn_v1_0_set_interrupt_state(struct amdgpu_device *adev, | 1018 | static int vcn_v1_0_set_interrupt_state(struct amdgpu_device *adev, |
@@ -1133,15 +1089,16 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = { | |||
1133 | .get_wptr = vcn_v1_0_dec_ring_get_wptr, | 1089 | .get_wptr = vcn_v1_0_dec_ring_get_wptr, |
1134 | .set_wptr = vcn_v1_0_dec_ring_set_wptr, | 1090 | .set_wptr = vcn_v1_0_dec_ring_set_wptr, |
1135 | .emit_frame_size = | 1091 | .emit_frame_size = |
1136 | 2 + /* vcn_v1_0_dec_ring_emit_hdp_invalidate */ | 1092 | 6 + 6 + /* hdp invalidate / flush */ |
1137 | 34 + /* vcn_v1_0_dec_ring_emit_vm_flush */ | 1093 | SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + |
1094 | SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + | ||
1095 | 8 + /* vcn_v1_0_dec_ring_emit_vm_flush */ | ||
1138 | 14 + 14 + /* vcn_v1_0_dec_ring_emit_fence x2 vm fence */ | 1096 | 14 + 14 + /* vcn_v1_0_dec_ring_emit_fence x2 vm fence */ |
1139 | 6, | 1097 | 6, |
1140 | .emit_ib_size = 8, /* vcn_v1_0_dec_ring_emit_ib */ | 1098 | .emit_ib_size = 8, /* vcn_v1_0_dec_ring_emit_ib */ |
1141 | .emit_ib = vcn_v1_0_dec_ring_emit_ib, | 1099 | .emit_ib = vcn_v1_0_dec_ring_emit_ib, |
1142 | .emit_fence = vcn_v1_0_dec_ring_emit_fence, | 1100 | .emit_fence = vcn_v1_0_dec_ring_emit_fence, |
1143 | .emit_vm_flush = vcn_v1_0_dec_ring_emit_vm_flush, | 1101 | .emit_vm_flush = vcn_v1_0_dec_ring_emit_vm_flush, |
1144 | .emit_hdp_invalidate = vcn_v1_0_dec_ring_emit_hdp_invalidate, | ||
1145 | .test_ring = amdgpu_vcn_dec_ring_test_ring, | 1102 | .test_ring = amdgpu_vcn_dec_ring_test_ring, |
1146 | .test_ib = amdgpu_vcn_dec_ring_test_ib, | 1103 | .test_ib = amdgpu_vcn_dec_ring_test_ib, |
1147 | .insert_nop = vcn_v1_0_ring_insert_nop, | 1104 | .insert_nop = vcn_v1_0_ring_insert_nop, |
@@ -1150,6 +1107,8 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = { | |||
1150 | .pad_ib = amdgpu_ring_generic_pad_ib, | 1107 | .pad_ib = amdgpu_ring_generic_pad_ib, |
1151 | .begin_use = amdgpu_vcn_ring_begin_use, | 1108 | .begin_use = amdgpu_vcn_ring_begin_use, |
1152 | .end_use = amdgpu_vcn_ring_end_use, | 1109 | .end_use = amdgpu_vcn_ring_end_use, |
1110 | .emit_wreg = vcn_v1_0_dec_ring_emit_wreg, | ||
1111 | .emit_reg_wait = vcn_v1_0_dec_ring_emit_reg_wait, | ||
1153 | }; | 1112 | }; |
1154 | 1113 | ||
1155 | static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { | 1114 | static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { |
@@ -1162,7 +1121,9 @@ static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { | |||
1162 | .get_wptr = vcn_v1_0_enc_ring_get_wptr, | 1121 | .get_wptr = vcn_v1_0_enc_ring_get_wptr, |
1163 | .set_wptr = vcn_v1_0_enc_ring_set_wptr, | 1122 | .set_wptr = vcn_v1_0_enc_ring_set_wptr, |
1164 | .emit_frame_size = | 1123 | .emit_frame_size = |
1165 | 17 + /* vcn_v1_0_enc_ring_emit_vm_flush */ | 1124 | SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + |
1125 | SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 4 + | ||
1126 | 4 + /* vcn_v1_0_enc_ring_emit_vm_flush */ | ||
1166 | 5 + 5 + /* vcn_v1_0_enc_ring_emit_fence x2 vm fence */ | 1127 | 5 + 5 + /* vcn_v1_0_enc_ring_emit_fence x2 vm fence */ |
1167 | 1, /* vcn_v1_0_enc_ring_insert_end */ | 1128 | 1, /* vcn_v1_0_enc_ring_insert_end */ |
1168 | .emit_ib_size = 5, /* vcn_v1_0_enc_ring_emit_ib */ | 1129 | .emit_ib_size = 5, /* vcn_v1_0_enc_ring_emit_ib */ |
@@ -1176,6 +1137,8 @@ static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { | |||
1176 | .pad_ib = amdgpu_ring_generic_pad_ib, | 1137 | .pad_ib = amdgpu_ring_generic_pad_ib, |
1177 | .begin_use = amdgpu_vcn_ring_begin_use, | 1138 | .begin_use = amdgpu_vcn_ring_begin_use, |
1178 | .end_use = amdgpu_vcn_ring_end_use, | 1139 | .end_use = amdgpu_vcn_ring_end_use, |
1140 | .emit_wreg = vcn_v1_0_enc_ring_emit_wreg, | ||
1141 | .emit_reg_wait = vcn_v1_0_enc_ring_emit_reg_wait, | ||
1179 | }; | 1142 | }; |
1180 | 1143 | ||
1181 | static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev) | 1144 | static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev) |