aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-09-06 12:33:04 -0400
committerChristian König <christian.koenig@amd.com>2014-02-18 10:11:46 -0500
commita1d6f97c8cfa7c3554d0391c0b16505d1d97f380 (patch)
treeb99fc950e38a90fc25d9ccc066dd477c79699798 /drivers/gpu
parentb9fa18837610483b09a07f1419e6b9f333c46023 (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.c9
-rw-r--r--drivers/gpu/drm/radeon/cik.c5
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.c4
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,
172extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev); 172extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev);
173extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev); 173extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev);
174extern int ci_mc_load_microcode(struct radeon_device *rdev); 174extern int ci_mc_load_microcode(struct radeon_device *rdev);
175extern void cik_update_cg(struct radeon_device *rdev,
176 u32 block, bool enable);
175 177
176static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev, 178static 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);
75extern int cik_sdma_resume(struct radeon_device *rdev); 75extern int cik_sdma_resume(struct radeon_device *rdev);
76extern void cik_sdma_enable(struct radeon_device *rdev, bool enable); 76extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
77extern void cik_sdma_fini(struct radeon_device *rdev); 77extern void cik_sdma_fini(struct radeon_device *rdev);
78extern void vce_v2_0_enable_mgcg(struct radeon_device *rdev, bool enable);
78static void cik_rlc_stop(struct radeon_device *rdev); 79static void cik_rlc_stop(struct radeon_device *rdev);
79static void cik_pcie_gen3_enable(struct radeon_device *rdev); 80static void cik_pcie_gen3_enable(struct radeon_device *rdev);
80static void cik_program_aspm(struct radeon_device *rdev); 81static 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
6146static void cik_init_cg(struct radeon_device *rdev) 6151static 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