Commit 2b4c8022 authored by Alex Deucher's avatar Alex Deucher

drm/radeon/dpm: implement force performance level for KB/KV

Allows you to force the selected performance level via sysfs.
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ae3e40e8
...@@ -40,6 +40,7 @@ static void kv_enable_new_levels(struct radeon_device *rdev); ...@@ -40,6 +40,7 @@ static void kv_enable_new_levels(struct radeon_device *rdev);
static void kv_program_nbps_index_settings(struct radeon_device *rdev, static void kv_program_nbps_index_settings(struct radeon_device *rdev,
struct radeon_ps *new_rps); struct radeon_ps *new_rps);
static int kv_set_enabled_levels(struct radeon_device *rdev); static int kv_set_enabled_levels(struct radeon_device *rdev);
static int kv_force_dpm_highest(struct radeon_device *rdev);
static int kv_force_dpm_lowest(struct radeon_device *rdev); static int kv_force_dpm_lowest(struct radeon_device *rdev);
static void kv_apply_state_adjust_rules(struct radeon_device *rdev, static void kv_apply_state_adjust_rules(struct radeon_device *rdev,
struct radeon_ps *new_rps, struct radeon_ps *new_rps,
...@@ -1641,6 +1642,30 @@ static int kv_enable_nb_dpm(struct radeon_device *rdev) ...@@ -1641,6 +1642,30 @@ static int kv_enable_nb_dpm(struct radeon_device *rdev)
return ret; return ret;
} }
int kv_dpm_force_performance_level(struct radeon_device *rdev,
enum radeon_dpm_forced_level level)
{
int ret;
if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
ret = kv_force_dpm_highest(rdev);
if (ret)
return ret;
} else if (level == RADEON_DPM_FORCED_LEVEL_LOW) {
ret = kv_force_dpm_lowest(rdev);
if (ret)
return ret;
} else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
ret = kv_unforce_levels(rdev);
if (ret)
return ret;
}
rdev->pm.dpm.forced_level = level;
return 0;
}
int kv_dpm_pre_set_power_state(struct radeon_device *rdev) int kv_dpm_pre_set_power_state(struct radeon_device *rdev)
{ {
struct kv_power_info *pi = kv_get_pi(rdev); struct kv_power_info *pi = kv_get_pi(rdev);
...@@ -1720,6 +1745,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev) ...@@ -1720,6 +1745,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
kv_enable_nb_dpm(rdev); kv_enable_nb_dpm(rdev);
} }
} }
rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO;
return 0; return 0;
} }
...@@ -1796,6 +1822,23 @@ static void kv_construct_boot_state(struct radeon_device *rdev) ...@@ -1796,6 +1822,23 @@ static void kv_construct_boot_state(struct radeon_device *rdev)
pi->boot_pl.vce_wm = 0; pi->boot_pl.vce_wm = 0;
} }
static int kv_force_dpm_highest(struct radeon_device *rdev)
{
int ret;
u32 enable_mask, i;
ret = kv_dpm_get_enable_mask(rdev, &enable_mask);
if (ret)
return ret;
for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i >= 0; i--) {
if (enable_mask & (1 << i))
break;
}
return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
}
static int kv_force_dpm_lowest(struct radeon_device *rdev) static int kv_force_dpm_lowest(struct radeon_device *rdev)
{ {
int ret; int ret;
......
...@@ -2641,6 +2641,7 @@ static struct radeon_asic kv_asic = { ...@@ -2641,6 +2641,7 @@ static struct radeon_asic kv_asic = {
.get_mclk = &kv_dpm_get_mclk, .get_mclk = &kv_dpm_get_mclk,
.print_power_state = &kv_dpm_print_power_state, .print_power_state = &kv_dpm_print_power_state,
.debugfs_print_current_performance_level = &kv_dpm_debugfs_print_current_performance_level, .debugfs_print_current_performance_level = &kv_dpm_debugfs_print_current_performance_level,
.force_performance_level = &kv_dpm_force_performance_level,
}, },
.pflip = { .pflip = {
.pre_page_flip = &evergreen_pre_page_flip, .pre_page_flip = &evergreen_pre_page_flip,
......
...@@ -784,5 +784,7 @@ void kv_dpm_print_power_state(struct radeon_device *rdev, ...@@ -784,5 +784,7 @@ void kv_dpm_print_power_state(struct radeon_device *rdev,
struct radeon_ps *ps); struct radeon_ps *ps);
void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
struct seq_file *m); struct seq_file *m);
int kv_dpm_force_performance_level(struct radeon_device *rdev,
enum radeon_dpm_forced_level level);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment