[PATCH 3/3] drm/amd/powerplay: support hwmon max/min fan speed setting on Vega20

Quan, Evan Evan.Quan at amd.com
Wed Oct 24 08:53:56 UTC 2018


Sure

From: Zhu, Rex
Sent: 2018年10月24日 16:37
To: Quan, Evan <Evan.Quan at amd.com>; amd-gfx at lists.freedesktop.org
Subject: Re: [PATCH 3/3] drm/amd/powerplay: support hwmon max/min fan speed setting on Vega20


-       percent = current_rpm * 100 / pp_table->FanMaximumRpm;
+       percent = (current_rpm * 100) /
+               hwmgr->thermal_controller.fanInfo.ulMaxRPM;


Better check hwmgr->thermal_controller.fanInfo.ulMaxRPM not equal to 0.



Best Regards

Rex

________________________________
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org<mailto:amd-gfx-bounces at lists.freedesktop.org>> on behalf of Evan Quan <evan.quan at amd.com<mailto:evan.quan at amd.com>>
Sent: Wednesday, October 24, 2018 4:11 PM
To: amd-gfx at lists.freedesktop.org<mailto:amd-gfx at lists.freedesktop.org>
Cc: Quan, Evan
Subject: [PATCH 3/3] drm/amd/powerplay: support hwmon max/min fan speed setting on Vega20

Added support for hwmon max/min fan speed setting on Vega20.

Change-Id: Ieab42c744d6c54f8b85a71be80f7c6832ae7352b
Signed-off-by: Evan Quan <evan.quan at amd.com<mailto:evan.quan at amd.com>>
---
 .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c    |  4 ++
 .../drm/amd/powerplay/hwmgr/vega20_thermal.c  | 56 ++++++++++++++++++-
 .../drm/amd/powerplay/hwmgr/vega20_thermal.h  |  4 ++
 3 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
index 57143d51e3ee..2513e6be3219 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
@@ -3539,6 +3539,10 @@ static const struct pp_hwmgr_func vega20_hwmgr_funcs = {
                 vega20_get_fan_control_mode,
         .set_fan_control_mode =
                 vega20_set_fan_control_mode,
+       .set_fan_speed_max_rpm =
+               vega20_fan_ctrl_set_fan_speed_max_rpm,
+       .set_fan_speed_min_rpm =
+               vega20_fan_ctrl_set_fan_speed_min_rpm,
         /* smu memory related */
         .notify_cac_buffer_info =
                 vega20_notify_cac_buffer_info,
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.c
index ede54e87e287..da9fd2168dcb 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.c
@@ -118,7 +118,6 @@ int vega20_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
                 uint32_t *speed)
 {
         struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
-       PPTable_t *pp_table = &(data->smc_state_table.pp_table);
         uint32_t current_rpm, percent = 0;
         int ret = 0;

@@ -126,7 +125,8 @@ int vega20_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
         if (ret)
                 return ret;

-       percent = current_rpm * 100 / pp_table->FanMaximumRpm;
+       percent = (current_rpm * 100) /
+               hwmgr->thermal_controller.fanInfo.ulMaxRPM;

         *speed = percent > 100 ? 100 : percent;

@@ -208,6 +208,58 @@ int vega20_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
         return vega20_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC_RPM);
 }

+int vega20_fan_ctrl_set_fan_speed_max_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
+{
+       struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
+       struct vega20_od8_settings *od8_settings = &(data->od8_settings);
+       int ret = 0;
+
+       if ((od8_settings->overdrive8_capabilities & OD8_ACOUSTIC_LIMIT_SCLK) &&
+           (speed > od8_settings->od8_settings_array[OD8_SETTING_FAN_ACOUSTIC_LIMIT].max_value ||
+            speed < od8_settings->od8_settings_array[OD8_SETTING_FAN_ACOUSTIC_LIMIT].min_value))
+               return -EINVAL;
+
+       ret = smum_send_msg_to_smc_with_parameter(hwmgr,
+                       PPSMC_MSG_SetFanMaxRpm,
+                       speed);
+       PP_ASSERT_WITH_CODE(!ret,
+                       "Set FanMaxRpm Failed!",
+                       return ret);
+
+       hwmgr->thermal_controller.fanInfo.ulMinRPM =
+               (speed * hwmgr->thermal_controller.fanInfo.ulMinPWM) / 255;
+
+       return ret;
+}
+
+int vega20_fan_ctrl_set_fan_speed_min_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
+{
+       struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
+       struct vega20_od8_settings *od8_settings = &(data->od8_settings);
+       int ret = 0;
+       uint32_t pwm = 0;
+
+       if ((od8_settings->overdrive8_capabilities & OD8_FAN_SPEED_MIN) &&
+           (speed > od8_settings->od8_settings_array[OD8_FAN_SPEED_MIN].max_value ||
+            speed < od8_settings->od8_settings_array[OD8_FAN_SPEED_MIN].min_value))
+               return -EINVAL;
+
+       if (speed > hwmgr->thermal_controller.fanInfo.ulMaxRPM)
+               return -EINVAL;
+
+       pwm = (speed * 255) / hwmgr->thermal_controller.fanInfo.ulMaxRPM;
+       ret = smum_send_msg_to_smc_with_parameter(hwmgr,
+                       PPSMC_MSG_SetFanMinPwm,
+                       pwm);
+       PP_ASSERT_WITH_CODE(!ret,
+                       "Set FanMinPwm Failed!",
+                       return ret);
+
+       hwmgr->thermal_controller.fanInfo.ulMinPWM = pwm;
+
+       return ret;
+}
+
 /**
 * Reads the remote temperature from the SIslands thermal controller.
 *
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.h
index 2d1769bbd24e..ddfc950e90ca 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.h
@@ -56,6 +56,10 @@ extern int vega20_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr,
                 uint32_t *speed);
 extern int vega20_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr,
                 uint32_t speed);
+extern int vega20_fan_ctrl_set_fan_speed_max_rpm(struct pp_hwmgr *hwmgr,
+               uint32_t speed);
+extern int vega20_fan_ctrl_set_fan_speed_min_rpm(struct pp_hwmgr *hwmgr,
+               uint32_t speed);
 extern int vega20_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
                 uint32_t *speed);
 extern int vega20_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr,
--
2.19.1

_______________________________________________
amd-gfx mailing list
amd-gfx at lists.freedesktop.org<mailto:amd-gfx at lists.freedesktop.org>
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
amd-gfx Info Page - freedesktop.org<https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
lists.freedesktop.org
To see the collection of prior postings to the list, visit the amd-gfx Archives.. Using amd-gfx: To post a message to all the list members, send email to amd-gfx at lists.freedesktop.org<mailto:amd-gfx at lists.freedesktop.org>. You can subscribe to the list, or change your existing subscription, in the sections below.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20181024/221dd090/attachment-0001.html>


More information about the amd-gfx mailing list