diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/ci_dpm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/ci_dpm.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c index 9498e78b90d7..f97ecb49972e 100644 --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c | |||
@@ -2210,7 +2210,6 @@ static void ci_clear_vc(struct amdgpu_device *adev) | |||
2210 | 2210 | ||
2211 | static int ci_upload_firmware(struct amdgpu_device *adev) | 2211 | static int ci_upload_firmware(struct amdgpu_device *adev) |
2212 | { | 2212 | { |
2213 | struct ci_power_info *pi = ci_get_pi(adev); | ||
2214 | int i, ret; | 2213 | int i, ret; |
2215 | 2214 | ||
2216 | if (amdgpu_ci_is_smc_running(adev)) { | 2215 | if (amdgpu_ci_is_smc_running(adev)) { |
@@ -2227,7 +2226,7 @@ static int ci_upload_firmware(struct amdgpu_device *adev) | |||
2227 | amdgpu_ci_stop_smc_clock(adev); | 2226 | amdgpu_ci_stop_smc_clock(adev); |
2228 | amdgpu_ci_reset_smc(adev); | 2227 | amdgpu_ci_reset_smc(adev); |
2229 | 2228 | ||
2230 | ret = amdgpu_ci_load_smc_ucode(adev, pi->sram_end); | 2229 | ret = amdgpu_ci_load_smc_ucode(adev, SMC_RAM_END); |
2231 | 2230 | ||
2232 | return ret; | 2231 | return ret; |
2233 | 2232 | ||
@@ -4257,12 +4256,6 @@ static int ci_update_vce_dpm(struct amdgpu_device *adev, | |||
4257 | 4256 | ||
4258 | if (amdgpu_current_state->evclk != amdgpu_new_state->evclk) { | 4257 | if (amdgpu_current_state->evclk != amdgpu_new_state->evclk) { |
4259 | if (amdgpu_new_state->evclk) { | 4258 | if (amdgpu_new_state->evclk) { |
4260 | /* turn the clocks on when encoding */ | ||
4261 | ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE, | ||
4262 | AMD_CG_STATE_UNGATE); | ||
4263 | if (ret) | ||
4264 | return ret; | ||
4265 | |||
4266 | pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(adev); | 4259 | pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(adev); |
4267 | tmp = RREG32_SMC(ixDPM_TABLE_475); | 4260 | tmp = RREG32_SMC(ixDPM_TABLE_475); |
4268 | tmp &= ~DPM_TABLE_475__VceBootLevel_MASK; | 4261 | tmp &= ~DPM_TABLE_475__VceBootLevel_MASK; |
@@ -4274,9 +4267,6 @@ static int ci_update_vce_dpm(struct amdgpu_device *adev, | |||
4274 | ret = ci_enable_vce_dpm(adev, false); | 4267 | ret = ci_enable_vce_dpm(adev, false); |
4275 | if (ret) | 4268 | if (ret) |
4276 | return ret; | 4269 | return ret; |
4277 | /* turn the clocks off when not encoding */ | ||
4278 | ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE, | ||
4279 | AMD_CG_STATE_GATE); | ||
4280 | } | 4270 | } |
4281 | } | 4271 | } |
4282 | return ret; | 4272 | return ret; |
@@ -6278,13 +6268,13 @@ static int ci_dpm_sw_init(void *handle) | |||
6278 | adev->pm.current_mclk = adev->clock.default_mclk; | 6268 | adev->pm.current_mclk = adev->clock.default_mclk; |
6279 | adev->pm.int_thermal_type = THERMAL_TYPE_NONE; | 6269 | adev->pm.int_thermal_type = THERMAL_TYPE_NONE; |
6280 | 6270 | ||
6281 | if (amdgpu_dpm == 0) | ||
6282 | return 0; | ||
6283 | |||
6284 | ret = ci_dpm_init_microcode(adev); | 6271 | ret = ci_dpm_init_microcode(adev); |
6285 | if (ret) | 6272 | if (ret) |
6286 | return ret; | 6273 | return ret; |
6287 | 6274 | ||
6275 | if (amdgpu_dpm == 0) | ||
6276 | return 0; | ||
6277 | |||
6288 | INIT_WORK(&adev->pm.dpm.thermal.work, amdgpu_dpm_thermal_work_handler); | 6278 | INIT_WORK(&adev->pm.dpm.thermal.work, amdgpu_dpm_thermal_work_handler); |
6289 | mutex_lock(&adev->pm.mutex); | 6279 | mutex_lock(&adev->pm.mutex); |
6290 | ret = ci_dpm_init(adev); | 6280 | ret = ci_dpm_init(adev); |
@@ -6328,8 +6318,15 @@ static int ci_dpm_hw_init(void *handle) | |||
6328 | 6318 | ||
6329 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 6319 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
6330 | 6320 | ||
6331 | if (!amdgpu_dpm) | 6321 | if (!amdgpu_dpm) { |
6322 | ret = ci_upload_firmware(adev); | ||
6323 | if (ret) { | ||
6324 | DRM_ERROR("ci_upload_firmware failed\n"); | ||
6325 | return ret; | ||
6326 | } | ||
6327 | ci_dpm_start_smc(adev); | ||
6332 | return 0; | 6328 | return 0; |
6329 | } | ||
6333 | 6330 | ||
6334 | mutex_lock(&adev->pm.mutex); | 6331 | mutex_lock(&adev->pm.mutex); |
6335 | ci_dpm_setup_asic(adev); | 6332 | ci_dpm_setup_asic(adev); |
@@ -6351,6 +6348,8 @@ static int ci_dpm_hw_fini(void *handle) | |||
6351 | mutex_lock(&adev->pm.mutex); | 6348 | mutex_lock(&adev->pm.mutex); |
6352 | ci_dpm_disable(adev); | 6349 | ci_dpm_disable(adev); |
6353 | mutex_unlock(&adev->pm.mutex); | 6350 | mutex_unlock(&adev->pm.mutex); |
6351 | } else { | ||
6352 | ci_dpm_stop_smc(adev); | ||
6354 | } | 6353 | } |
6355 | 6354 | ||
6356 | return 0; | 6355 | return 0; |