On 1/11/2022 4:12 PM, Quan, Evan wrote:
[AMD Official Use Only]-----Original Message----- From: Lazar, Lijo <Lijo.Lazar@xxxxxxx> Sent: Tuesday, January 11, 2022 6:15 PM To: Quan, Evan <Evan.Quan@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Chen, Guchun <Guchun.Chen@xxxxxxx> Subject: Re: [PATCH] drm/amd/pm: correct the checks for fan attributes support On 1/11/2022 3:36 PM, Quan, Evan wrote:[AMD Official Use Only]-----Original Message----- From: Lazar, Lijo <Lijo.Lazar@xxxxxxx> Sent: Tuesday, January 11, 2022 4:14 PM To: Quan, Evan <Evan.Quan@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Chen, Guchun <Guchun.Chen@xxxxxxx> Subject: Re: [PATCH] drm/amd/pm: correct the checks for fan attributes support On 1/11/2022 1:17 PM, Evan Quan wrote:On functionality unsupported, -EOPNOTSUPP will be returned. And we rely on that to determine the fan attributes support. Fixes: 801771de0331 ("drm/amd/pm: do not expose powerimplementationdetails to amdgpu_pm.c") Signed-off-by: Evan Quan <evan.quan@xxxxxxx> Change-Id: I95e7e0beebd678a446221a72234cd356e14f0fcd --- .../gpu/drm/amd/include/kgd_pp_interface.h | 4 +- drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 31 ++++- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 21 ++-- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 10 +- .../gpu/drm/amd/pm/powerplay/amd_powerplay.c | 59 ++++----- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 115+++++++++---------6 files changed, 132 insertions(+), 108 deletions(-) diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h index a8eec91c0995..387120099493 100644 --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h @@ -315,8 +315,8 @@ struct amd_pm_funcs { void *rps, bool *equal); /* export for sysfs */ - void (*set_fan_control_mode)(void *handle, u32 mode); - u32 (*get_fan_control_mode)(void *handle); + int (*set_fan_control_mode)(void *handle, u32 mode); + int (*get_fan_control_mode)(void *handle, u32 *fan_mode); int (*set_fan_speed_pwm)(void *handle, u32 speed); int (*get_fan_speed_pwm)(void *handle, u32 *speed); int (*force_clock_level)(void *handle, enum pp_clock_type type, uint32_t mask); diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c index 68d2e80a673b..fe69785df403 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c @@ -1030,15 +1030,20 @@ intamdgpu_dpm_get_fan_control_mode(struct amdgpu_device *adev,uint32_t *fan_mode) { const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; + int ret = 0; if (!pp_funcs->get_fan_control_mode) return -EOPNOTSUPP; + if (!fan_mode) + return -EINVAL; +pp_funcs most likely will be there for smu/powerplay subsystem. I think the checks should be at one layer down - smu_get_fan_control_mode() and pp_dpm_get_fan_control_mode() First one will check if ppt func is implemented and second one will check if hwmgr func is implemented for the specific ASIC.[Quan, Evan] Yes, I agree. And if you go through the changes below, youwill see the checks (for the layers down) there.This patch checks not only those amdgpu_dpm_xxxx APIs, but also thosedownstream interfaces(smu_xxxx and pp_dpm_xxxx).Say you call amdgpu_dpm_get_fan_control_mode(adev, NULL) from amdgpu_pm pp_funcs->get_fan_control_mode => this will point to smu_get_fan_control_mode for all swsmu ASICs. So "if (!pp_funcs-get_fan_control_mode)" will be false.The next statement is NULL check and it will return -EINVAL. What we want to know is ppt_func is implemented or not for the particualr swsmu ASIC. Isn't that the case or am I reading it differently?[Quan, Evan] OK, I get your point now. Hmm, that will be a little tricky. I suppose the EINVAL check needs to be dispatched in every instance(pp_dpm_xxxxx, smu_xxxx, si_dpm_xxxx) then. Any better idea?
Yeah, that is what I meant by "checks should be at one layer down". Thanks, Lijo
BR EvanThanks, LijoBR EvanThanks, Lijomutex_lock(&adev->pm.mutex); - *fan_mode = pp_funcs->get_fan_control_mode(adev- powerplay.pp_handle); + ret = pp_funcs->get_fan_control_mode(adev- powerplay.pp_handle, + fan_mode); mutex_unlock(&adev->pm.mutex); - return 0; + return ret; } int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev,@@-1048,6 +1053,9 @@ int amdgpu_dpm_set_fan_speed_pwm(structamdgpu_device *adev,int ret = 0; if (!pp_funcs->set_fan_speed_pwm) + return -EOPNOTSUPP; + + if (speed == U32_MAX) return -EINVAL; mutex_lock(&adev->pm.mutex); @@ -1065,6 +1073,9 @@ int amdgpu_dpm_get_fan_speed_pwm(structamdgpu_device *adev,int ret = 0; if (!pp_funcs->get_fan_speed_pwm) + return -EOPNOTSUPP; + + if (!speed) return -EINVAL; mutex_lock(&adev->pm.mutex); @@ -1082,6 +1093,9 @@ int amdgpu_dpm_get_fan_speed_rpm(structamdgpu_device *adev,int ret = 0; if (!pp_funcs->get_fan_speed_rpm) + return -EOPNOTSUPP; + + if (!speed) return -EINVAL; mutex_lock(&adev->pm.mutex); @@ -1099,6 +1113,9 @@ int amdgpu_dpm_set_fan_speed_rpm(structamdgpu_device *adev,int ret = 0; if (!pp_funcs->set_fan_speed_rpm) + return -EOPNOTSUPP; + + if (speed == U32_MAX) return -EINVAL; mutex_lock(&adev->pm.mutex); @@ -1113,16 +1130,20 @@ intamdgpu_dpm_set_fan_control_mode(struct amdgpu_device *adev,uint32_t mode) { const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; + int ret = 0; if (!pp_funcs->set_fan_control_mode) return -EOPNOTSUPP; + if (mode == U32_MAX) + return -EINVAL; + mutex_lock(&adev->pm.mutex); - pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle, - mode); + ret = pp_funcs->set_fan_control_mode(adev- powerplay.pp_handle, + mode); mutex_unlock(&adev->pm.mutex); - return 0; + return ret; } int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index d3eab245e0fe..940cbe751163 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -3197,7 +3197,6 @@ static umode_thwmon_attributes_visible(structkobject *kobj,struct device *dev = kobj_to_dev(kobj); struct amdgpu_device *adev = dev_get_drvdata(dev); umode_t effective_mode = attr->mode; - uint32_t speed = 0; /* under multi-vf mode, the hwmon attributes are all not supported*/if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))@@-3263,15 +3262,15 @@ static umode_t hwmon_attributes_visible(structkobject *kobj,return 0; /* mask fan attributes if we have no bindings for this asic to expose*/- if (((amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL)&&+ if (((amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) &&attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't queryfan */- ((amdgpu_dpm_get_fan_control_mode(adev, &speed) == -EOPNOTSUPP) &&+ ((amdgpu_dpm_get_fan_control_mode(adev, NULL) == -EOPNOTSUPP) &&attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can'tquery state */effective_mode &= ~S_IRUGO; - if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL)&&+ if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) &&attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can'tmanage fan */- ((amdgpu_dpm_set_fan_control_mode(adev, speed) == -EOPNOTSUPP) &&+ ((amdgpu_dpm_set_fan_control_mode(adev, U32_MAX) == +-EOPNOTSUPP) && attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can'tmanage state */effective_mode &= ~S_IWUSR; @@ -3291,16 +3290,16 @@ static umode_thwmon_attributes_visible(struct kobject *kobj,return 0; /* hide max/min values if we can't both query and manage the fan */ - if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL)&&- (amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL)&&- (amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL)&&- (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL))&&+ if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) &&+ (amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) &&+ (amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) &&+ (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP)) &&(attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) return 0; - if ((amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL)&&- (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL)&&+ if ((amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) &&+ (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP) &&(attr == &sensor_dev_attr_fan1_max.dev_attr.attr || attr == &sensor_dev_attr_fan1_min.dev_attr.attr)) return 0; diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c index 92b987fb31d4..7677d3a21f8c 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c @@ -6669,7 +6669,7 @@ static int si_dpm_set_fan_speed_pwm(void*handle,return 0; } -static void si_dpm_set_fan_control_mode(void *handle, u32 mode) +static int si_dpm_set_fan_control_mode(void *handle, u32 mode) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; @@ -6685,9 +6685,11 @@ static voidsi_dpm_set_fan_control_mode(void*handle, u32 mode)else si_fan_ctrl_set_default_mode(adev); } + + return 0; } -static u32 si_dpm_get_fan_control_mode(void *handle) +static int si_dpm_get_fan_control_mode(void *handle, u32*fan_mode){ struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct si_power_info *si_pi = si_get_pi(adev); @@ -6697,7 +6699,9 @@ static u32 si_dpm_get_fan_control_mode(void *handle) return 0; tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK; - return (tmp >> FDO_PWM_MODE_SHIFT); + *fan_mode = (tmp >> FDO_PWM_MODE_SHIFT); + + return 0; } #if 0 diff --git a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c index 89341729744d..57bc9405d6a9 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c @@ -488,38 +488,37 @@ static enum amd_pm_state_typepp_dpm_get_current_power_state(void *handle)return pm_type; } -static void pp_dpm_set_fan_control_mode(void *handle, uint32_t mode) +static int pp_dpm_set_fan_control_mode(void *handle, uint32_tmode){ struct pp_hwmgr *hwmgr = handle; if (!hwmgr || !hwmgr->pm_en) - return; + return -EOPNOTSUPP; + + if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) + return -EOPNOTSUPP; - if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) { - pr_info_ratelimited("%s was not implemented.\n",__func__);- return; - } mutex_lock(&hwmgr->smu_lock); hwmgr->hwmgr_func->set_fan_control_mode(hwmgr, mode); mutex_unlock(&hwmgr->smu_lock); + + return 0; } -static uint32_t pp_dpm_get_fan_control_mode(void *handle) +static int pp_dpm_get_fan_control_mode(void *handle, uint32_t +*fan_mode) { struct pp_hwmgr *hwmgr = handle; - uint32_t mode = 0; if (!hwmgr || !hwmgr->pm_en) - return 0; + return -EOPNOTSUPP; + + if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) + return -EOPNOTSUPP; - if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) { - pr_info_ratelimited("%s was not implemented.\n",__func__);- return 0; - } mutex_lock(&hwmgr->smu_lock); - mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr); + *fan_mode = hwmgr->hwmgr_func- get_fan_control_mode(hwmgr); mutex_unlock(&hwmgr->smu_lock); - return mode; + return 0; } static int pp_dpm_set_fan_speed_pwm(void *handle, uint32_t speed)@@-528,12 +527,11 @@ static int pp_dpm_set_fan_speed_pwm(void*handle,uint32_t speed)int ret = 0; if (!hwmgr || !hwmgr->pm_en) - return -EINVAL; + return -EOPNOTSUPP; + + if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL) + return -EOPNOTSUPP; - if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL) { - pr_info_ratelimited("%s was not implemented.\n",__func__);- return 0; - } mutex_lock(&hwmgr->smu_lock); ret = hwmgr->hwmgr_func->set_fan_speed_pwm(hwmgr, speed); mutex_unlock(&hwmgr->smu_lock); @@ -546,12 +544,10 @@ static int pp_dpm_get_fan_speed_pwm(void*handle, uint32_t *speed)int ret = 0; if (!hwmgr || !hwmgr->pm_en) - return -EINVAL; + return -EOPNOTSUPP; - if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL) { - pr_info_ratelimited("%s was not implemented.\n",__func__);- return 0; - } + if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL) + return -EOPNOTSUPP; mutex_lock(&hwmgr->smu_lock); ret = hwmgr->hwmgr_func->get_fan_speed_pwm(hwmgr, speed);@@-565,10 +561,10 @@ static int pp_dpm_get_fan_speed_rpm(void*handle,uint32_t *rpm)int ret = 0; if (!hwmgr || !hwmgr->pm_en) - return -EINVAL; + return -EOPNOTSUPP; if (hwmgr->hwmgr_func->get_fan_speed_rpm == NULL) - return -EINVAL; + return -EOPNOTSUPP; mutex_lock(&hwmgr->smu_lock); ret = hwmgr->hwmgr_func->get_fan_speed_rpm(hwmgr, rpm);@@ -582,12+578,11 @@ static int pp_dpm_set_fan_speed_rpm(void *handle,uint32_t rpm)int ret = 0; if (!hwmgr || !hwmgr->pm_en) - return -EINVAL; + return -EOPNOTSUPP; + + if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) + return -EOPNOTSUPP; - if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) { - pr_info_ratelimited("%s was not implemented.\n",__func__);- return 0; - } mutex_lock(&hwmgr->smu_lock); ret = hwmgr->hwmgr_func->set_fan_speed_rpm(hwmgr, rpm); mutex_unlock(&hwmgr->smu_lock); diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index c374c3067496..474f1f04cc96 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -59,7 +59,7 @@ static int smu_handle_task(struct smu_context*smu,bool lock_needed); 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(struct smu_context *smu, int value); +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_fan_speed_rpm(void *handle, uint32_t speed); static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled); @@ -407,7 +407,7 @@ static void smu_restore_dpm_user_profile(structsmu_context *smu)if (smu->user_dpm_profile.fan_mode ==AMD_FAN_CTRL_MANUAL ||smu->user_dpm_profile.fan_mode == AMD_FAN_CTRL_NONE) { ret = smu_set_fan_control_mode(smu, smu- user_dpm_profile.fan_mode); - if (ret) { + if (ret != -EOPNOTSUPP) { smu->user_dpm_profile.fan_speed_pwm = 0; smu->user_dpm_profile.fan_speed_rpm = 0; smu->user_dpm_profile.fan_mode =AMD_FAN_CTRL_AUTO; @@ -416,13+416,13 @@ static void smu_restore_dpm_user_profile(structsmu_context*smu) if (smu->user_dpm_profile.fan_speed_pwm) { ret = smu_set_fan_speed_pwm(smu, smu- user_dpm_profile.fan_speed_pwm); - if (ret) + if (ret != -EOPNOTSUPP) dev_err(smu->adev->dev, "Failed to setmanual fan speed in pwm\n");} if (smu->user_dpm_profile.fan_speed_rpm) { ret = smu_set_fan_speed_rpm(smu, smu- user_dpm_profile.fan_speed_rpm); - if (ret) + if (ret != -EOPNOTSUPP) dev_err(smu->adev->dev, "Failed to setmanual fan speed in rpm\n");} } @@ -2218,18 +2218,19 @@ static int smu_set_fan_speed_rpm(void*handle, uint32_t speed)if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) return -EOPNOTSUPP; + if (!smu->ppt_funcs->set_fan_speed_rpm) + return -EOPNOTSUPP; + mutex_lock(&smu->mutex); - if (smu->ppt_funcs->set_fan_speed_rpm) { - ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed); - if (!ret && !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {- smu->user_dpm_profile.flags |=SMU_CUSTOM_FAN_SPEED_RPM;- smu->user_dpm_profile.fan_speed_rpm = speed; + ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed); + if (!ret && !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {+ smu->user_dpm_profile.flags |=SMU_CUSTOM_FAN_SPEED_RPM;+ smu->user_dpm_profile.fan_speed_rpm = speed; - /* Override custom PWM setting as they cannot co-exist */- smu->user_dpm_profile.flags &=~SMU_CUSTOM_FAN_SPEED_PWM;- smu->user_dpm_profile.fan_speed_pwm = 0; - } + /* Override custom PWM setting as they cannot co-exist */ + smu->user_dpm_profile.flags &=~SMU_CUSTOM_FAN_SPEED_PWM;+ smu->user_dpm_profile.fan_speed_pwm = 0; } mutex_unlock(&smu->mutex); @@ -2562,60 +2563,59 @@ static intsmu_set_power_profile_mode(void*handle,} -static u32 smu_get_fan_control_mode(void *handle) +static int smu_get_fan_control_mode(void *handle, u32 *fan_mode) { struct smu_context *smu = handle; - u32 ret = 0; if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) - return AMD_FAN_CTRL_NONE; + return -EOPNOTSUPP; + + if (!smu->ppt_funcs->get_fan_control_mode) + return -EOPNOTSUPP; mutex_lock(&smu->mutex); - if (smu->ppt_funcs->get_fan_control_mode) - ret = smu->ppt_funcs->get_fan_control_mode(smu); + *fan_mode = smu->ppt_funcs->get_fan_control_mode(smu); mutex_unlock(&smu->mutex); - return ret; + return 0; } -static int smu_set_fan_control_mode(struct smu_context *smu, int value) +static int smu_set_fan_control_mode(void *handle, u32 value) { + struct smu_context *smu = handle; int ret = 0; if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) - return -EOPNOTSUPP; + return -EOPNOTSUPP; + + if (!smu->ppt_funcs->set_fan_control_mode) + return -EOPNOTSUPP; mutex_lock(&smu->mutex); - if (smu->ppt_funcs->set_fan_control_mode) { - ret = smu->ppt_funcs->set_fan_control_mode(smu, value); - if (!ret && !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE))- smu->user_dpm_profile.fan_mode = value; - } + ret = smu->ppt_funcs->set_fan_control_mode(smu, value); + if (ret) + goto out; - mutex_unlock(&smu->mutex); + if (!(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {+ smu->user_dpm_profile.fan_mode = value; - /* reset user dpm fan speed */ - if (!ret && value != AMD_FAN_CTRL_MANUAL && - !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {- smu->user_dpm_profile.fan_speed_pwm = 0; - smu->user_dpm_profile.fan_speed_rpm = 0; - smu->user_dpm_profile.flags &=~(SMU_CUSTOM_FAN_SPEED_RPM |SMU_CUSTOM_FAN_SPEED_PWM);+ /* reset user dpm fan speed */ + if (value != AMD_FAN_CTRL_MANUAL) { + smu->user_dpm_profile.fan_speed_pwm = 0; + smu->user_dpm_profile.fan_speed_rpm = 0; + smu->user_dpm_profile.flags &=~(SMU_CUSTOM_FAN_SPEED_RPM |SMU_CUSTOM_FAN_SPEED_PWM);+ } } - return ret; -} - -static void smu_pp_set_fan_control_mode(void *handle, u32 value) -{ - struct smu_context *smu = handle; +out: + mutex_unlock(&smu->mutex); - smu_set_fan_control_mode(smu, value); + return ret; } - static int smu_get_fan_speed_pwm(void *handle, u32 *speed) { struct smu_context *smu = handle; @@ -2624,10 +2624,12 @@ static int smu_get_fan_speed_pwm(void*handle, u32 *speed)if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) return -EOPNOTSUPP; + if (!smu->ppt_funcs->get_fan_speed_pwm) + return -EOPNOTSUPP; + mutex_lock(&smu->mutex); - if (smu->ppt_funcs->get_fan_speed_pwm) - ret = smu->ppt_funcs->get_fan_speed_pwm(smu, speed); + ret = smu->ppt_funcs->get_fan_speed_pwm(smu, speed); mutex_unlock(&smu->mutex); @@ -2642,18 +2644,19 @@ static int smu_set_fan_speed_pwm(void*handle, u32 speed)if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) return -EOPNOTSUPP; + if (!smu->ppt_funcs->set_fan_speed_pwm) + return -EOPNOTSUPP; + mutex_lock(&smu->mutex); - if (smu->ppt_funcs->set_fan_speed_pwm) { - ret = smu->ppt_funcs->set_fan_speed_pwm(smu, speed); - if (!ret && !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {- smu->user_dpm_profile.flags |=SMU_CUSTOM_FAN_SPEED_PWM;- smu->user_dpm_profile.fan_speed_pwm = speed; + ret = smu->ppt_funcs->set_fan_speed_pwm(smu, speed); + if (!ret && !(smu->user_dpm_profile.flags &SMU_DPM_USER_PROFILE_RESTORE)) {+ smu->user_dpm_profile.flags |=SMU_CUSTOM_FAN_SPEED_PWM;+ smu->user_dpm_profile.fan_speed_pwm = speed; - /* Override custom RPM setting as they cannot co-exist */- smu->user_dpm_profile.flags &=~SMU_CUSTOM_FAN_SPEED_RPM;- smu->user_dpm_profile.fan_speed_rpm = 0; - } + /* Override custom RPM setting as they cannot co-exist */ + smu->user_dpm_profile.flags &=~SMU_CUSTOM_FAN_SPEED_RPM;+ smu->user_dpm_profile.fan_speed_rpm = 0; } mutex_unlock(&smu->mutex); @@ -2669,10 +2672,12 @@ static int smu_get_fan_speed_rpm(void*handle, uint32_t *speed)if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) return -EOPNOTSUPP; + if (!smu->ppt_funcs->get_fan_speed_rpm) + return -EOPNOTSUPP; + mutex_lock(&smu->mutex); - if (smu->ppt_funcs->get_fan_speed_rpm) - ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); + ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); mutex_unlock(&smu->mutex); @@ -3101,7 +3106,7 @@ static int smu_get_prv_buffer_details(void *handle, void **addr, size_t *size) static const struct amd_pm_funcs swsmu_pm_funcs = { /* export for sysfs */ - .set_fan_control_mode = smu_pp_set_fan_control_mode, + .set_fan_control_mode = smu_set_fan_control_mode, .get_fan_control_mode = smu_get_fan_control_mode, .set_fan_speed_pwm = smu_set_fan_speed_pwm, .get_fan_speed_pwm = smu_get_fan_speed_pwm,