aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/ci_dpm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c29
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
2211static int ci_upload_firmware(struct amdgpu_device *adev) 2211static 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;