Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: SI support for UVD and VCE power managment

Port functionality from the Radeon driver to support
UVD and VCE power management.

Signed-off-by: Alex Jivin <alex.jivin@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Alex Jivin and committed by
Alex Deucher
a71a4f50 fb40bceb

+67 -17
+48 -17
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 3558 3558 { 3559 3559 int ret = 0; 3560 3560 3561 - ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable); 3562 - if (ret) 3563 - DRM_ERROR("Dpm %s uvd failed, ret = %d. \n", 3564 - enable ? "enable" : "disable", ret); 3561 + if (adev->family == AMDGPU_FAMILY_SI) { 3562 + if (enable) { 3563 + mutex_lock(&adev->pm.mutex); 3564 + adev->pm.dpm.uvd_active = true; 3565 + adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD; 3566 + mutex_unlock(&adev->pm.mutex); 3567 + } else { 3568 + mutex_lock(&adev->pm.mutex); 3569 + adev->pm.dpm.uvd_active = false; 3570 + mutex_unlock(&adev->pm.mutex); 3571 + } 3565 3572 3566 - /* enable/disable Low Memory PState for UVD (4k videos) */ 3567 - if (adev->asic_type == CHIP_STONEY && 3568 - adev->uvd.decode_image_width >= WIDTH_4K) { 3569 - struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; 3573 + amdgpu_pm_compute_clocks(adev); 3574 + } else { 3575 + ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable); 3576 + if (ret) 3577 + DRM_ERROR("Dpm %s uvd failed, ret = %d. \n", 3578 + enable ? "enable" : "disable", ret); 3570 3579 3571 - if (hwmgr && hwmgr->hwmgr_func && 3572 - hwmgr->hwmgr_func->update_nbdpm_pstate) 3573 - hwmgr->hwmgr_func->update_nbdpm_pstate(hwmgr, 3574 - !enable, 3575 - true); 3580 + /* enable/disable Low Memory PState for UVD (4k videos) */ 3581 + if (adev->asic_type == CHIP_STONEY && 3582 + adev->uvd.decode_image_width >= WIDTH_4K) { 3583 + struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; 3584 + 3585 + if (hwmgr && hwmgr->hwmgr_func && 3586 + hwmgr->hwmgr_func->update_nbdpm_pstate) 3587 + hwmgr->hwmgr_func->update_nbdpm_pstate(hwmgr, 3588 + !enable, 3589 + true); 3590 + } 3576 3591 } 3577 3592 } 3578 3593 ··· 3595 3580 { 3596 3581 int ret = 0; 3597 3582 3598 - ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable); 3599 - if (ret) 3600 - DRM_ERROR("Dpm %s vce failed, ret = %d. \n", 3601 - enable ? "enable" : "disable", ret); 3583 + if (adev->family == AMDGPU_FAMILY_SI) { 3584 + if (enable) { 3585 + mutex_lock(&adev->pm.mutex); 3586 + adev->pm.dpm.vce_active = true; 3587 + /* XXX select vce level based on ring/task */ 3588 + adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL; 3589 + mutex_unlock(&adev->pm.mutex); 3590 + } else { 3591 + mutex_lock(&adev->pm.mutex); 3592 + adev->pm.dpm.vce_active = false; 3593 + mutex_unlock(&adev->pm.mutex); 3594 + } 3595 + 3596 + amdgpu_pm_compute_clocks(adev); 3597 + } else { 3598 + ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable); 3599 + if (ret) 3600 + DRM_ERROR("Dpm %s vce failed, ret = %d. \n", 3601 + enable ? "enable" : "disable", ret); 3602 + } 3602 3603 } 3603 3604 3604 3605 void amdgpu_pm_print_power_states(struct amdgpu_device *adev)
+19
drivers/gpu/drm/amd/amdgpu/si_dpm.c
··· 6953 6953 return 0; 6954 6954 } 6955 6955 6956 + static void si_set_vce_clock(struct amdgpu_device *adev, 6957 + struct amdgpu_ps *new_rps, 6958 + struct amdgpu_ps *old_rps) 6959 + { 6960 + if ((old_rps->evclk != new_rps->evclk) || 6961 + (old_rps->ecclk != new_rps->ecclk)) { 6962 + /* Turn the clocks on when encoding, off otherwise */ 6963 + if (new_rps->evclk || new_rps->ecclk) { 6964 + /* Place holder for future VCE1.0 porting to amdgpu 6965 + vce_v1_0_enable_mgcg(adev, false, false);*/ 6966 + } else { 6967 + /* Place holder for future VCE1.0 porting to amdgpu 6968 + vce_v1_0_enable_mgcg(adev, true, false); 6969 + amdgpu_asic_set_vce_clocks(adev, new_rps->evclk, new_rps->ecclk);*/ 6970 + } 6971 + } 6972 + } 6973 + 6956 6974 static int si_dpm_set_power_state(void *handle) 6957 6975 { 6958 6976 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 7047 7029 return ret; 7048 7030 } 7049 7031 ni_set_uvd_clock_after_set_eng_clock(adev, new_ps, old_ps); 7032 + si_set_vce_clock(adev, new_ps, old_ps); 7050 7033 if (eg_pi->pcie_performance_request) 7051 7034 si_notify_link_speed_change_after_state_change(adev, new_ps, old_ps); 7052 7035 ret = si_set_power_state_conditionally_enable_ulv(adev, new_ps);