mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
drm/amd: Stop overloading power limit with limit type
When passed around internally the upper 8 bits of power limit include the limit type. This is non-obvious without digging into the nuances of each function. Instead pass the limit type as an argument to all applicable layers. Reviewed-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
16dc933a4f
commit
5f4f49a41c
|
|
@ -454,7 +454,7 @@ struct amd_pm_funcs {
|
|||
bool gate,
|
||||
int inst);
|
||||
int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id);
|
||||
int (*set_power_limit)(void *handle, uint32_t n);
|
||||
int (*set_power_limit)(void *handle, uint32_t limit_type, uint32_t n);
|
||||
int (*get_power_limit)(void *handle, uint32_t *limit,
|
||||
enum pp_power_limit_level pp_limit_level,
|
||||
enum pp_power_type power_type);
|
||||
|
|
|
|||
|
|
@ -1616,6 +1616,7 @@ int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
|
|||
}
|
||||
|
||||
int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
|
||||
uint32_t limit_type,
|
||||
uint32_t limit)
|
||||
{
|
||||
const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
|
||||
|
|
@ -1626,7 +1627,7 @@ int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
|
|||
|
||||
mutex_lock(&adev->pm.mutex);
|
||||
ret = pp_funcs->set_power_limit(adev->powerplay.pp_handle,
|
||||
limit);
|
||||
limit_type, limit);
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -3390,13 +3390,12 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev,
|
|||
return err;
|
||||
|
||||
value = value / 1000000; /* convert to Watt */
|
||||
value |= limit_type << 24;
|
||||
|
||||
err = amdgpu_pm_get_access(adev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = amdgpu_dpm_set_power_limit(adev, value);
|
||||
err = amdgpu_dpm_set_power_limit(adev, limit_type, value);
|
||||
|
||||
amdgpu_pm_put_access(adev);
|
||||
|
||||
|
|
|
|||
|
|
@ -553,7 +553,7 @@ int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
|
|||
enum pp_power_limit_level pp_limit_level,
|
||||
enum pp_power_type power_type);
|
||||
int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
|
||||
uint32_t limit);
|
||||
uint32_t limit_type, uint32_t limit);
|
||||
int amdgpu_dpm_is_cclk_dpm_supported(struct amdgpu_device *adev);
|
||||
int amdgpu_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
|
||||
struct seq_file *m);
|
||||
|
|
|
|||
|
|
@ -952,7 +952,7 @@ static int pp_dpm_switch_power_profile(void *handle,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pp_set_power_limit(void *handle, uint32_t limit)
|
||||
static int pp_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr = handle;
|
||||
uint32_t max_power_limit;
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ static int smu_handle_task(struct smu_context *smu,
|
|||
static int smu_reset(struct smu_context *smu);
|
||||
static int smu_set_fan_speed_pwm(void *handle, u32 speed);
|
||||
static int smu_set_fan_control_mode(void *handle, u32 value);
|
||||
static int smu_set_power_limit(void *handle, uint32_t limit);
|
||||
static int smu_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit);
|
||||
static int smu_set_fan_speed_rpm(void *handle, uint32_t speed);
|
||||
static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);
|
||||
static int smu_set_mp1_state(void *handle, enum pp_mp1_state mp1_state);
|
||||
|
|
@ -510,7 +510,7 @@ static void smu_restore_dpm_user_profile(struct smu_context *smu)
|
|||
|
||||
/* set the user dpm power limit */
|
||||
if (smu->user_dpm_profile.power_limit) {
|
||||
ret = smu_set_power_limit(smu, smu->user_dpm_profile.power_limit);
|
||||
ret = smu_set_power_limit(smu, SMU_DEFAULT_PPT_LIMIT, smu->current_power_limit);
|
||||
if (ret)
|
||||
dev_err(smu->adev->dev, "Failed to set power limit value\n");
|
||||
}
|
||||
|
|
@ -2258,7 +2258,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
|
|||
adev->pm.dpm_enabled = true;
|
||||
|
||||
if (smu->current_power_limit) {
|
||||
ret = smu_set_power_limit(smu, smu->current_power_limit);
|
||||
ret = smu_set_power_limit(smu, SMU_DEFAULT_PPT_LIMIT, smu->current_power_limit);
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2958,16 +2958,14 @@ int smu_get_power_limit(void *handle,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int smu_set_power_limit(void *handle, uint32_t limit)
|
||||
static int smu_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit)
|
||||
{
|
||||
struct smu_context *smu = handle;
|
||||
uint32_t limit_type = limit >> 24;
|
||||
int ret = 0;
|
||||
|
||||
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
limit &= (1<<24)-1;
|
||||
if (limit_type != SMU_DEFAULT_PPT_LIMIT)
|
||||
if (smu->ppt_funcs->set_power_limit)
|
||||
return smu->ppt_funcs->set_power_limit(smu, limit_type, limit);
|
||||
|
|
|
|||
|
|
@ -2397,7 +2397,6 @@ static int vangogh_set_power_limit(struct smu_context *smu,
|
|||
smu->current_power_limit = ppt_limit;
|
||||
break;
|
||||
case SMU_FAST_PPT_LIMIT:
|
||||
ppt_limit &= ~(SMU_FAST_PPT_LIMIT << 24);
|
||||
if (ppt_limit > power_context->max_fast_ppt_limit) {
|
||||
dev_err(smu->adev->dev,
|
||||
"New power limit (%d) is over the max allowed %d\n",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user