diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-09-06 12:33:04 -0400 |
---|---|---|
committer | Christian König <christian.koenig@amd.com> | 2014-02-18 10:11:46 -0500 |
commit | a1d6f97c8cfa7c3554d0391c0b16505d1d97f380 (patch) | |
tree | b99fc950e38a90fc25d9ccc066dd477c79699798 /drivers/gpu | |
parent | b9fa18837610483b09a07f1419e6b9f333c46023 (diff) |
drm/radeon/cik: enable/disable vce cg when encoding v2
Some of the vce clocks are automatic, others need to
be manually enabled. For ease, just disable cg when
vce is active.
v2: rebased
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/radeon/ci_dpm.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/kv_dpm.c | 4 |
3 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index 6669d3252f57..cad89a977527 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
@@ -172,6 +172,8 @@ extern void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev, | |||
172 | extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev); | 172 | extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev); |
173 | extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev); | 173 | extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev); |
174 | extern int ci_mc_load_microcode(struct radeon_device *rdev); | 174 | extern int ci_mc_load_microcode(struct radeon_device *rdev); |
175 | extern void cik_update_cg(struct radeon_device *rdev, | ||
176 | u32 block, bool enable); | ||
175 | 177 | ||
176 | static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev, | 178 | static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev, |
177 | struct atom_voltage_table_entry *voltage_table, | 179 | struct atom_voltage_table_entry *voltage_table, |
@@ -3627,8 +3629,10 @@ static int ci_update_vce_dpm(struct radeon_device *rdev, | |||
3627 | 3629 | ||
3628 | if (radeon_current_state->evclk != radeon_new_state->evclk) { | 3630 | if (radeon_current_state->evclk != radeon_new_state->evclk) { |
3629 | if (radeon_new_state->evclk) { | 3631 | if (radeon_new_state->evclk) { |
3630 | pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(rdev); | 3632 | /* turn the clocks on when encoding */ |
3633 | cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, false); | ||
3631 | 3634 | ||
3635 | pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(rdev); | ||
3632 | tmp = RREG32_SMC(DPM_TABLE_475); | 3636 | tmp = RREG32_SMC(DPM_TABLE_475); |
3633 | tmp &= ~VceBootLevel_MASK; | 3637 | tmp &= ~VceBootLevel_MASK; |
3634 | tmp |= VceBootLevel(pi->smc_state_table.VceBootLevel); | 3638 | tmp |= VceBootLevel(pi->smc_state_table.VceBootLevel); |
@@ -3636,6 +3640,9 @@ static int ci_update_vce_dpm(struct radeon_device *rdev, | |||
3636 | 3640 | ||
3637 | ret = ci_enable_vce_dpm(rdev, true); | 3641 | ret = ci_enable_vce_dpm(rdev, true); |
3638 | } else { | 3642 | } else { |
3643 | /* turn the clocks off when not encoding */ | ||
3644 | cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, true); | ||
3645 | |||
3639 | ret = ci_enable_vce_dpm(rdev, false); | 3646 | ret = ci_enable_vce_dpm(rdev, false); |
3640 | } | 3647 | } |
3641 | } | 3648 | } |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index ecb16b14f049..2b31c3233a5e 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -75,6 +75,7 @@ extern void si_init_uvd_internal_cg(struct radeon_device *rdev); | |||
75 | extern int cik_sdma_resume(struct radeon_device *rdev); | 75 | extern int cik_sdma_resume(struct radeon_device *rdev); |
76 | extern void cik_sdma_enable(struct radeon_device *rdev, bool enable); | 76 | extern void cik_sdma_enable(struct radeon_device *rdev, bool enable); |
77 | extern void cik_sdma_fini(struct radeon_device *rdev); | 77 | extern void cik_sdma_fini(struct radeon_device *rdev); |
78 | extern void vce_v2_0_enable_mgcg(struct radeon_device *rdev, bool enable); | ||
78 | static void cik_rlc_stop(struct radeon_device *rdev); | 79 | static void cik_rlc_stop(struct radeon_device *rdev); |
79 | static void cik_pcie_gen3_enable(struct radeon_device *rdev); | 80 | static void cik_pcie_gen3_enable(struct radeon_device *rdev); |
80 | static void cik_program_aspm(struct radeon_device *rdev); | 81 | static void cik_program_aspm(struct radeon_device *rdev); |
@@ -6141,6 +6142,10 @@ void cik_update_cg(struct radeon_device *rdev, | |||
6141 | cik_enable_hdp_mgcg(rdev, enable); | 6142 | cik_enable_hdp_mgcg(rdev, enable); |
6142 | cik_enable_hdp_ls(rdev, enable); | 6143 | cik_enable_hdp_ls(rdev, enable); |
6143 | } | 6144 | } |
6145 | |||
6146 | if (block & RADEON_CG_BLOCK_VCE) { | ||
6147 | vce_v2_0_enable_mgcg(rdev, enable); | ||
6148 | } | ||
6144 | } | 6149 | } |
6145 | 6150 | ||
6146 | static void cik_init_cg(struct radeon_device *rdev) | 6151 | static void cik_init_cg(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 9ee1f28bbd85..16ec9d56a234 100644 --- a/drivers/gpu/drm/radeon/kv_dpm.c +++ b/drivers/gpu/drm/radeon/kv_dpm.c | |||
@@ -1412,6 +1412,8 @@ static int kv_update_vce_dpm(struct radeon_device *rdev, | |||
1412 | 1412 | ||
1413 | if (radeon_new_state->evclk > 0 && radeon_current_state->evclk == 0) { | 1413 | if (radeon_new_state->evclk > 0 && radeon_current_state->evclk == 0) { |
1414 | kv_dpm_powergate_vce(rdev, false); | 1414 | kv_dpm_powergate_vce(rdev, false); |
1415 | /* turn the clocks on when encoding */ | ||
1416 | cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, false); | ||
1415 | if (pi->caps_stable_p_state) | 1417 | if (pi->caps_stable_p_state) |
1416 | pi->vce_boot_level = table->count - 1; | 1418 | pi->vce_boot_level = table->count - 1; |
1417 | else | 1419 | else |
@@ -1434,6 +1436,8 @@ static int kv_update_vce_dpm(struct radeon_device *rdev, | |||
1434 | kv_enable_vce_dpm(rdev, true); | 1436 | kv_enable_vce_dpm(rdev, true); |
1435 | } else if (radeon_new_state->evclk == 0 && radeon_current_state->evclk > 0) { | 1437 | } else if (radeon_new_state->evclk == 0 && radeon_current_state->evclk > 0) { |
1436 | kv_enable_vce_dpm(rdev, false); | 1438 | kv_enable_vce_dpm(rdev, false); |
1439 | /* turn the clocks off when not encoding */ | ||
1440 | cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, true); | ||
1437 | kv_dpm_powergate_vce(rdev, true); | 1441 | kv_dpm_powergate_vce(rdev, true); |
1438 | } | 1442 | } |
1439 | 1443 | ||