aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c159
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 */
818static 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
855static void vcn_v1_0_dec_vm_reg_write(struct amdgpu_ring *ring, 841static 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
871static 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
890static void vcn_v1_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, 861static 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; 876static 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
988static 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
1023static void vcn_v1_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, 998static 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 */ 1010static 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
1062static int vcn_v1_0_set_interrupt_state(struct amdgpu_device *adev, 1018static 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
1155static const struct amdgpu_ring_funcs vcn_v1_0_enc_ring_vm_funcs = { 1114static 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
1181static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev) 1144static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev)