diff options
author | Leo Liu <leo.liu@amd.com> | 2019-04-26 13:46:21 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-07-18 15:18:05 -0400 |
commit | 530e30fc32d3834288980777825a8ec0303fbccc (patch) | |
tree | bfa871f11153bd8783e6ac68d1e7030914ce1ed6 | |
parent | 39a5053fb2231d26f296734390bae7d7d36a9130 (diff) |
drm/amdgpu: enable the Doorbell support for VCN2.5
Including decode, encode, and JPEG decode rings
Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 64 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | 4 |
2 files changed, 56 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index f9d6819f0260..840737df19c0 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | |||
@@ -128,6 +128,8 @@ static int vcn_v2_5_sw_init(void *handle) | |||
128 | return r; | 128 | return r; |
129 | 129 | ||
130 | ring = &adev->vcn.ring_dec; | 130 | ring = &adev->vcn.ring_dec; |
131 | ring->use_doorbell = true; | ||
132 | ring->doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1 << 1; | ||
131 | sprintf(ring->name, "vcn_dec"); | 133 | sprintf(ring->name, "vcn_dec"); |
132 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); | 134 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); |
133 | if (r) | 135 | if (r) |
@@ -153,6 +155,8 @@ static int vcn_v2_5_sw_init(void *handle) | |||
153 | 155 | ||
154 | for (i = 0; i < adev->vcn.num_enc_rings; ++i) { | 156 | for (i = 0; i < adev->vcn.num_enc_rings; ++i) { |
155 | ring = &adev->vcn.ring_enc[i]; | 157 | ring = &adev->vcn.ring_enc[i]; |
158 | ring->use_doorbell = true; | ||
159 | ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + i; | ||
156 | sprintf(ring->name, "vcn_enc%d", i); | 160 | sprintf(ring->name, "vcn_enc%d", i); |
157 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); | 161 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); |
158 | if (r) | 162 | if (r) |
@@ -160,6 +164,8 @@ static int vcn_v2_5_sw_init(void *handle) | |||
160 | } | 164 | } |
161 | 165 | ||
162 | ring = &adev->vcn.ring_jpeg; | 166 | ring = &adev->vcn.ring_jpeg; |
167 | ring->use_doorbell = true; | ||
168 | ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1; | ||
163 | sprintf(ring->name, "vcn_jpeg"); | 169 | sprintf(ring->name, "vcn_jpeg"); |
164 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); | 170 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); |
165 | if (r) | 171 | if (r) |
@@ -879,7 +885,10 @@ static uint64_t vcn_v2_5_dec_ring_get_wptr(struct amdgpu_ring *ring) | |||
879 | { | 885 | { |
880 | struct amdgpu_device *adev = ring->adev; | 886 | struct amdgpu_device *adev = ring->adev; |
881 | 887 | ||
882 | return RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR); | 888 | if (ring->use_doorbell) |
889 | return adev->wb.wb[ring->wptr_offs]; | ||
890 | else | ||
891 | return RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR); | ||
883 | } | 892 | } |
884 | 893 | ||
885 | /** | 894 | /** |
@@ -893,7 +902,12 @@ static void vcn_v2_5_dec_ring_set_wptr(struct amdgpu_ring *ring) | |||
893 | { | 902 | { |
894 | struct amdgpu_device *adev = ring->adev; | 903 | struct amdgpu_device *adev = ring->adev; |
895 | 904 | ||
896 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr)); | 905 | if (ring->use_doorbell) { |
906 | adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); | ||
907 | WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); | ||
908 | } else { | ||
909 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr)); | ||
910 | } | ||
897 | } | 911 | } |
898 | 912 | ||
899 | static const struct amdgpu_ring_funcs vcn_v2_5_dec_ring_vm_funcs = { | 913 | static const struct amdgpu_ring_funcs vcn_v2_5_dec_ring_vm_funcs = { |
@@ -954,10 +968,17 @@ static uint64_t vcn_v2_5_enc_ring_get_wptr(struct amdgpu_ring *ring) | |||
954 | { | 968 | { |
955 | struct amdgpu_device *adev = ring->adev; | 969 | struct amdgpu_device *adev = ring->adev; |
956 | 970 | ||
957 | if (ring == &adev->vcn.ring_enc[0]) | 971 | if (ring == &adev->vcn.ring_enc[0]) { |
958 | return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR); | 972 | if (ring->use_doorbell) |
959 | else | 973 | return adev->wb.wb[ring->wptr_offs]; |
960 | return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2); | 974 | else |
975 | return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR); | ||
976 | } else { | ||
977 | if (ring->use_doorbell) | ||
978 | return adev->wb.wb[ring->wptr_offs]; | ||
979 | else | ||
980 | return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2); | ||
981 | } | ||
961 | } | 982 | } |
962 | 983 | ||
963 | /** | 984 | /** |
@@ -971,10 +992,21 @@ static void vcn_v2_5_enc_ring_set_wptr(struct amdgpu_ring *ring) | |||
971 | { | 992 | { |
972 | struct amdgpu_device *adev = ring->adev; | 993 | struct amdgpu_device *adev = ring->adev; |
973 | 994 | ||
974 | if (ring == &adev->vcn.ring_enc[0]) | 995 | if (ring == &adev->vcn.ring_enc[0]) { |
975 | WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); | 996 | if (ring->use_doorbell) { |
976 | else | 997 | adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); |
977 | WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); | 998 | WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); |
999 | } else { | ||
1000 | WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); | ||
1001 | } | ||
1002 | } else { | ||
1003 | if (ring->use_doorbell) { | ||
1004 | adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); | ||
1005 | WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); | ||
1006 | } else { | ||
1007 | WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); | ||
1008 | } | ||
1009 | } | ||
978 | } | 1010 | } |
979 | 1011 | ||
980 | static const struct amdgpu_ring_funcs vcn_v2_5_enc_ring_vm_funcs = { | 1012 | static const struct amdgpu_ring_funcs vcn_v2_5_enc_ring_vm_funcs = { |
@@ -1032,7 +1064,10 @@ static uint64_t vcn_v2_5_jpeg_ring_get_wptr(struct amdgpu_ring *ring) | |||
1032 | { | 1064 | { |
1033 | struct amdgpu_device *adev = ring->adev; | 1065 | struct amdgpu_device *adev = ring->adev; |
1034 | 1066 | ||
1035 | return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); | 1067 | if (ring->use_doorbell) |
1068 | return adev->wb.wb[ring->wptr_offs]; | ||
1069 | else | ||
1070 | return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); | ||
1036 | } | 1071 | } |
1037 | 1072 | ||
1038 | /** | 1073 | /** |
@@ -1046,7 +1081,12 @@ static void vcn_v2_5_jpeg_ring_set_wptr(struct amdgpu_ring *ring) | |||
1046 | { | 1081 | { |
1047 | struct amdgpu_device *adev = ring->adev; | 1082 | struct amdgpu_device *adev = ring->adev; |
1048 | 1083 | ||
1049 | WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); | 1084 | if (ring->use_doorbell) { |
1085 | adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); | ||
1086 | WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); | ||
1087 | } else { | ||
1088 | WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); | ||
1089 | } | ||
1050 | } | 1090 | } |
1051 | 1091 | ||
1052 | static const struct amdgpu_ring_funcs vcn_v2_5_jpeg_ring_vm_funcs = { | 1092 | static const struct amdgpu_ring_funcs vcn_v2_5_jpeg_ring_vm_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c index 0db84386252a..79223188bd47 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c +++ b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | |||
@@ -85,6 +85,10 @@ void vega20_doorbell_index_init(struct amdgpu_device *adev) | |||
85 | adev->doorbell_index.uvd_vce.vce_ring2_3 = AMDGPU_VEGA20_DOORBELL64_VCE_RING2_3; | 85 | adev->doorbell_index.uvd_vce.vce_ring2_3 = AMDGPU_VEGA20_DOORBELL64_VCE_RING2_3; |
86 | adev->doorbell_index.uvd_vce.vce_ring4_5 = AMDGPU_VEGA20_DOORBELL64_VCE_RING4_5; | 86 | adev->doorbell_index.uvd_vce.vce_ring4_5 = AMDGPU_VEGA20_DOORBELL64_VCE_RING4_5; |
87 | adev->doorbell_index.uvd_vce.vce_ring6_7 = AMDGPU_VEGA20_DOORBELL64_VCE_RING6_7; | 87 | adev->doorbell_index.uvd_vce.vce_ring6_7 = AMDGPU_VEGA20_DOORBELL64_VCE_RING6_7; |
88 | adev->doorbell_index.vcn.vcn_ring0_1 = AMDGPU_VEGA20_DOORBELL64_VCN0_1; | ||
89 | adev->doorbell_index.vcn.vcn_ring2_3 = AMDGPU_VEGA20_DOORBELL64_VCN2_3; | ||
90 | adev->doorbell_index.vcn.vcn_ring4_5 = AMDGPU_VEGA20_DOORBELL64_VCN4_5; | ||
91 | adev->doorbell_index.vcn.vcn_ring6_7 = AMDGPU_VEGA20_DOORBELL64_VCN6_7; | ||
88 | 92 | ||
89 | adev->doorbell_index.first_non_cp = AMDGPU_VEGA20_DOORBELL64_FIRST_NON_CP; | 93 | adev->doorbell_index.first_non_cp = AMDGPU_VEGA20_DOORBELL64_FIRST_NON_CP; |
90 | adev->doorbell_index.last_non_cp = AMDGPU_VEGA20_DOORBELL64_LAST_NON_CP; | 94 | adev->doorbell_index.last_non_cp = AMDGPU_VEGA20_DOORBELL64_LAST_NON_CP; |