diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/trinity_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/trinity_dpm.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/trinity_dpm.c b/drivers/gpu/drm/radeon/trinity_dpm.c index b07b7b8f1aff..7f998bf1cc9d 100644 --- a/drivers/gpu/drm/radeon/trinity_dpm.c +++ b/drivers/gpu/drm/radeon/trinity_dpm.c | |||
@@ -1068,6 +1068,17 @@ static void trinity_update_requested_ps(struct radeon_device *rdev, | |||
1068 | pi->requested_rps.ps_priv = &pi->requested_ps; | 1068 | pi->requested_rps.ps_priv = &pi->requested_ps; |
1069 | } | 1069 | } |
1070 | 1070 | ||
1071 | void trinity_dpm_enable_bapm(struct radeon_device *rdev, bool enable) | ||
1072 | { | ||
1073 | struct trinity_power_info *pi = trinity_get_pi(rdev); | ||
1074 | |||
1075 | if (pi->enable_bapm) { | ||
1076 | trinity_acquire_mutex(rdev); | ||
1077 | trinity_dpm_bapm_enable(rdev, enable); | ||
1078 | trinity_release_mutex(rdev); | ||
1079 | } | ||
1080 | } | ||
1081 | |||
1071 | int trinity_dpm_enable(struct radeon_device *rdev) | 1082 | int trinity_dpm_enable(struct radeon_device *rdev) |
1072 | { | 1083 | { |
1073 | struct trinity_power_info *pi = trinity_get_pi(rdev); | 1084 | struct trinity_power_info *pi = trinity_get_pi(rdev); |
@@ -1091,6 +1102,7 @@ int trinity_dpm_enable(struct radeon_device *rdev) | |||
1091 | trinity_program_sclk_dpm(rdev); | 1102 | trinity_program_sclk_dpm(rdev); |
1092 | trinity_start_dpm(rdev); | 1103 | trinity_start_dpm(rdev); |
1093 | trinity_wait_for_dpm_enabled(rdev); | 1104 | trinity_wait_for_dpm_enabled(rdev); |
1105 | trinity_dpm_bapm_enable(rdev, false); | ||
1094 | trinity_release_mutex(rdev); | 1106 | trinity_release_mutex(rdev); |
1095 | 1107 | ||
1096 | if (rdev->irq.installed && | 1108 | if (rdev->irq.installed && |
@@ -1116,6 +1128,7 @@ void trinity_dpm_disable(struct radeon_device *rdev) | |||
1116 | trinity_release_mutex(rdev); | 1128 | trinity_release_mutex(rdev); |
1117 | return; | 1129 | return; |
1118 | } | 1130 | } |
1131 | trinity_dpm_bapm_enable(rdev, false); | ||
1119 | trinity_disable_clock_power_gating(rdev); | 1132 | trinity_disable_clock_power_gating(rdev); |
1120 | sumo_clear_vc(rdev); | 1133 | sumo_clear_vc(rdev); |
1121 | trinity_wait_for_level_0(rdev); | 1134 | trinity_wait_for_level_0(rdev); |
@@ -1212,6 +1225,8 @@ int trinity_dpm_set_power_state(struct radeon_device *rdev) | |||
1212 | 1225 | ||
1213 | trinity_acquire_mutex(rdev); | 1226 | trinity_acquire_mutex(rdev); |
1214 | if (pi->enable_dpm) { | 1227 | if (pi->enable_dpm) { |
1228 | if (pi->enable_bapm) | ||
1229 | trinity_dpm_bapm_enable(rdev, rdev->pm.dpm.ac_power); | ||
1215 | trinity_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps); | 1230 | trinity_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps); |
1216 | trinity_enable_power_level_0(rdev); | 1231 | trinity_enable_power_level_0(rdev); |
1217 | trinity_force_level_0(rdev); | 1232 | trinity_force_level_0(rdev); |
@@ -1221,7 +1236,6 @@ int trinity_dpm_set_power_state(struct radeon_device *rdev) | |||
1221 | trinity_force_level_0(rdev); | 1236 | trinity_force_level_0(rdev); |
1222 | trinity_unforce_levels(rdev); | 1237 | trinity_unforce_levels(rdev); |
1223 | trinity_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps); | 1238 | trinity_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps); |
1224 | rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO; | ||
1225 | } | 1239 | } |
1226 | trinity_release_mutex(rdev); | 1240 | trinity_release_mutex(rdev); |
1227 | 1241 | ||
@@ -1854,6 +1868,7 @@ int trinity_dpm_init(struct radeon_device *rdev) | |||
1854 | for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) | 1868 | for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) |
1855 | pi->at[i] = TRINITY_AT_DFLT; | 1869 | pi->at[i] = TRINITY_AT_DFLT; |
1856 | 1870 | ||
1871 | pi->enable_bapm = true; | ||
1857 | pi->enable_nbps_policy = true; | 1872 | pi->enable_nbps_policy = true; |
1858 | pi->enable_sclk_ds = true; | 1873 | pi->enable_sclk_ds = true; |
1859 | pi->enable_gfx_power_gating = true; | 1874 | pi->enable_gfx_power_gating = true; |