[PATCH] drm/amd/pm: correct the checks for fan attributes support
Quan, Evan
Evan.Quan at amd.com
Tue Jan 11 10:06:33 UTC 2022
[AMD Official Use Only]
> -----Original Message-----
> From: Lazar, Lijo <Lijo.Lazar at amd.com>
> Sent: Tuesday, January 11, 2022 4:14 PM
> To: Quan, Evan <Evan.Quan at amd.com>; amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Chen, Guchun
> <Guchun.Chen at amd.com>
> 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 power
> implementation
> > details to
> > amdgpu_pm.c")
> >
> > Signed-off-by: Evan Quan <evan.quan at amd.com>
> > 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 @@ int
> amdgpu_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, you will see the checks (for the layers down) there.
This patch checks not only those amdgpu_dpm_xxxx APIs, but also those downstream interfaces(smu_xxxx and pp_dpm_xxxx).
BR
Evan
>
> Thanks,
> Lijo
>
> > mutex_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(struct
> amdgpu_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(struct
> amdgpu_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(struct
> amdgpu_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(struct
> amdgpu_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 @@ int
> amdgpu_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_t hwmon_attributes_visible(struct
> kobject *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(struct
> kobject *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 query
> fan */
> > - ((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't
> query 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't
> manage 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't
> manage state */
> > effective_mode &= ~S_IWUSR;
> >
> > @@ -3291,16 +3290,16 @@ static umode_t
> hwmon_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 void si_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_type
> pp_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_t mode)
> > {
> > 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(struct
> smu_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(struct
> smu_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 set
> manual 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 set
> manual 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 int smu_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,
> >
More information about the amd-gfx
mailing list