diff options
author | Dave Airlie <airlied@redhat.com> | 2018-10-11 00:53:40 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-10-11 00:53:45 -0400 |
commit | ca4b869240d5810ebac6b1570ad7beffcfbac2f5 (patch) | |
tree | d7e36e551b058316ab35e28f1bb992ce06b2ce0c /drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |
parent | 46972c03ab667dc298cad0c9db517fb9b1521b5f (diff) | |
parent | df2fc43d09d3ee5ede82cab9299df5e78aa427b5 (diff) |
Merge branch 'drm-next-4.20' of git://people.freedesktop.org/~agd5f/linux into drm-next
Add a new list.h helper for doing bulk updates. Used by ttm.
- Fixes for display underflow on VI APUs at 4K with UVD running
- Endian fixes for powerplay on vega
- DC fixes for interlaced video
- Vega20 powerplay fixes
- RV/RV2/PCO powerplay fixes
- Fix for spurious ACPI events on HG laptops
- Fix a memory leak in DC on driver unload
- Fixes for manual fan control mode switching
- Suspend/resume robustness fixes
- Fix display handling on RV2
- VCN fixes for DPG on PCO
- Misc code cleanups and warning fixes
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181011014739.3117-1-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.c | 53 |
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 | ||
1153 | static int vcn_v1_0_wait_for_idle(void *handle) | 1161 | static 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 | ||