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.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 63d7f97e81b7..e9282415c24f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -278,6 +278,7 @@ static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev)
278 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4); 278 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
279 uint32_t offset; 279 uint32_t offset;
280 280
281 /* cache window 0: fw */
281 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 282 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
282 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, 283 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
283 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo)); 284 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo));
@@ -297,20 +298,21 @@ static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev)
297 298
298 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size); 299 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size);
299 300
301 /* cache window 1: stack */
300 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, 302 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
301 lower_32_bits(adev->vcn.gpu_addr + offset)); 303 lower_32_bits(adev->vcn.gpu_addr + offset));
302 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, 304 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
303 upper_32_bits(adev->vcn.gpu_addr + offset)); 305 upper_32_bits(adev->vcn.gpu_addr + offset));
304 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0); 306 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
305 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE); 307 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
306 308
309 /* cache window 2: context */
307 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, 310 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
308 lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE)); 311 lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
309 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, 312 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
310 upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE)); 313 upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
311 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0); 314 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
312 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, 315 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
313 AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40));
314 316
315 WREG32_SOC15(UVD, 0, mmUVD_UDEC_ADDR_CONFIG, 317 WREG32_SOC15(UVD, 0, mmUVD_UDEC_ADDR_CONFIG,
316 adev->gfx.config.gb_addr_config); 318 adev->gfx.config.gb_addr_config);
@@ -325,6 +327,7 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev)
325 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4); 327 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
326 uint32_t offset; 328 uint32_t offset;
327 329
330 /* cache window 0: fw */
328 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 331 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
329 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, 332 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
330 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo), 333 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo),
@@ -347,24 +350,25 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev)
347 350
348 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size, 0xFFFFFFFF, 0); 351 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size, 0xFFFFFFFF, 0);
349 352
353 /* cache window 1: stack */
350 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, 354 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
351 lower_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0); 355 lower_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0);
352 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, 356 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
353 upper_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0); 357 upper_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0);
354 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0, 358 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0,
355 0xFFFFFFFF, 0); 359 0xFFFFFFFF, 0);
356 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE, 360 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE,
357 0xFFFFFFFF, 0); 361 0xFFFFFFFF, 0);
358 362
363 /* cache window 2: context */
359 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, 364 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
360 lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE), 365 lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
361 0xFFFFFFFF, 0); 366 0xFFFFFFFF, 0);
362 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, 367 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
363 upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE), 368 upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
364 0xFFFFFFFF, 0); 369 0xFFFFFFFF, 0);
365 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0, 0xFFFFFFFF, 0); 370 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0, 0xFFFFFFFF, 0);
366 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, 371 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE,
367 AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40),
368 0xFFFFFFFF, 0); 372 0xFFFFFFFF, 0);
369 373
370 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_ADDR_CONFIG, 374 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_ADDR_CONFIG,
@@ -601,8 +605,6 @@ static void vcn_v1_0_clock_gating_dpg_mode(struct amdgpu_device *adev, uint8_t s
601 reg_data = 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 605 reg_data = 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
602 reg_data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; 606 reg_data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
603 reg_data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT; 607 reg_data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
604 WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_CGC_CTRL, reg_data, 0xFFFFFFFF, sram_sel);
605
606 reg_data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK | 608 reg_data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
607 UVD_CGC_CTRL__UDEC_CM_MODE_MASK | 609 UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
608 UVD_CGC_CTRL__UDEC_IT_MODE_MASK | 610 UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
@@ -812,12 +814,12 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
812 814
813 for (j = 0; j < 100; ++j) { 815 for (j = 0; j < 100; ++j) {
814 status = RREG32_SOC15(UVD, 0, mmUVD_STATUS); 816 status = RREG32_SOC15(UVD, 0, mmUVD_STATUS);
815 if (status & 2) 817 if (status & UVD_STATUS__IDLE)
816 break; 818 break;
817 mdelay(10); 819 mdelay(10);
818 } 820 }
819 r = 0; 821 r = 0;
820 if (status & 2) 822 if (status & UVD_STATUS__IDLE)
821 break; 823 break;
822 824
823 DRM_ERROR("VCN decode not responding, trying to reset the VCPU!!!\n"); 825 DRM_ERROR("VCN decode not responding, trying to reset the VCPU!!!\n");
@@ -875,6 +877,8 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
875 /* Initialize the ring buffer's read and write pointers */ 877 /* Initialize the ring buffer's read and write pointers */
876 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0); 878 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0);
877 879
880 WREG32_SOC15(UVD, 0, mmUVD_SCRATCH2, 0);
881
878 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR); 882 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);
879 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 883 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
880 lower_32_bits(ring->wptr)); 884 lower_32_bits(ring->wptr));
@@ -898,12 +902,13 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
898 902
899 ring = &adev->vcn.ring_jpeg; 903 ring = &adev->vcn.ring_jpeg;
900 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0); 904 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
901 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, (0x00000001L | 0x00000002L)); 905 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK |
906 UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
902 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, lower_32_bits(ring->gpu_addr)); 907 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, lower_32_bits(ring->gpu_addr));
903 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, upper_32_bits(ring->gpu_addr)); 908 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, upper_32_bits(ring->gpu_addr));
904 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, 0); 909 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, 0);
905 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, 0); 910 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, 0);
906 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 0x00000002L); 911 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
907 912
908 /* initialize wptr */ 913 /* initialize wptr */
909 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 914 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
@@ -1051,6 +1056,8 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev)
1051 /* Initialize the ring buffer's read and write pointers */ 1056 /* Initialize the ring buffer's read and write pointers */
1052 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0); 1057 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0);
1053 1058
1059 WREG32_SOC15(UVD, 0, mmUVD_SCRATCH2, 0);
1060
1054 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR); 1061 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);
1055 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 1062 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
1056 lower_32_bits(ring->wptr)); 1063 lower_32_bits(ring->wptr));
@@ -1120,8 +1127,9 @@ static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev)
1120{ 1127{
1121 int ret_code; 1128 int ret_code;
1122 1129
1123 /* Wait for power status to be 1 */ 1130 /* Wait for power status to be UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF */
1124 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 0x1, 1131 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
1132 UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF,
1125 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 1133 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
1126 1134
1127 /* disable dynamic power gating mode */ 1135 /* disable dynamic power gating mode */
@@ -1147,7 +1155,7 @@ static bool vcn_v1_0_is_idle(void *handle)
1147{ 1155{
1148 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1156 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1149 1157
1150 return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2); 1158 return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == UVD_STATUS__IDLE);
1151} 1159}
1152 1160
1153static int vcn_v1_0_wait_for_idle(void *handle) 1161static int vcn_v1_0_wait_for_idle(void *handle)
@@ -1155,7 +1163,8 @@ static int vcn_v1_0_wait_for_idle(void *handle)
1155 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1163 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1156 int ret = 0; 1164 int ret = 0;
1157 1165
1158 SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_STATUS, 0x2, 0x2, ret); 1166 SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_STATUS, UVD_STATUS__IDLE,
1167 UVD_STATUS__IDLE, ret);
1159 1168
1160 return ret; 1169 return ret;
1161} 1170}
@@ -1217,6 +1226,10 @@ static void vcn_v1_0_dec_ring_set_wptr(struct amdgpu_ring *ring)
1217{ 1226{
1218 struct amdgpu_device *adev = ring->adev; 1227 struct amdgpu_device *adev = ring->adev;
1219 1228
1229 if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
1230 WREG32_SOC15(UVD, 0, mmUVD_SCRATCH2,
1231 lower_32_bits(ring->wptr) | 0x80000000);
1232
1220 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr)); 1233 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr));
1221} 1234}
1222 1235