[PATCH 2/2] drm/amd/pm: add zero RPM stop temp OD setting support for SMU 14.0.2
Alex Deucher
alexdeucher at gmail.com
Mon Mar 17 14:14:54 UTC 2025
On Mon, Mar 17, 2025 at 6:53 AM Tomasz Pakuła
<tomasz.pakula.oficjalny at gmail.com> wrote:
>
> Hook up zero RPM stop temperature for 9070 and 9070 XT based on RDNA3
> (smu 13.0.0 and 13.0.7) code.
>
> Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny at gmail.com>
> ---
> .../swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h | 3 +-
> .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 50 ++++++++++++++++++-
> 2 files changed, 51 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
> index c2fd0a4a13e5..a5eba7b91e2f 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
> @@ -846,9 +846,10 @@ typedef struct {
> uint16_t FanTargetTemperature; // Degree Celcius
> //zero fan
> uint8_t FanZeroRpmEnable;
> + uint8_t FanZeroRpmStopTemp;
> //temperature
> uint8_t MaxOpTemp;
> - uint8_t Padding1[2];
> + uint8_t Padding1;
>
> //Full Ctrl
> uint16_t GfxVoltageFullCtrlMode;
This makes a change to the firmware interface. Presumably it works
differently here. @Kenneth Feng or @Wang, Yang(Kevin) to confirm how
this works with respect to the firmware.
Alex
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> index fedf0c8c4741..4e7eed0cc41c 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> @@ -80,6 +80,7 @@
> #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
> #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
> #define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11
> +#define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP 12
>
> static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
> MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
> @@ -1057,6 +1058,10 @@ static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
> od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
> od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
> break;
> + case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP:
> + od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp;
> + od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp;
> + break;
> default:
> od_min_setting = od_max_setting = INT_MAX;
> break;
> @@ -1360,6 +1365,24 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
> min_value, max_value);
> break;
>
> + case SMU_OD_FAN_ZERO_RPM_STOP_TEMP:
> + if (!smu_v14_0_2_is_od_feature_supported(smu,
> + PP_OD_FEATURE_ZERO_FAN_BIT))
> + break;
> +
> + size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n");
> + size += sysfs_emit_at(buf, size, "%d\n",
> + (int)od_table->OverDriveTable.FanZeroRpmStopTemp);
> +
> + size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
> + smu_v14_0_2_get_od_setting_limits(smu,
> + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
> + &min_value,
> + &max_value);
> + size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n",
> + min_value, max_value);
> + break;
> +
> case SMU_OD_RANGE:
> if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
> !smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) &&
> @@ -2306,7 +2329,9 @@ static void smu_v14_0_2_set_supported_od_feature_mask(struct smu_context *smu)
> OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
> OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
> OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
> - OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
> + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET |
> + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE |
> + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET;
> }
>
> static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu,
> @@ -2387,6 +2412,8 @@ static int smu_v14_0_2_set_default_od_settings(struct smu_context *smu)
> user_od_table_bak.OverDriveTable.FanMinimumPwm;
> user_od_table->OverDriveTable.FanZeroRpmEnable =
> user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
> + user_od_table->OverDriveTable.FanZeroRpmStopTemp =
> + user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp;
> }
>
> smu_v14_0_2_set_supported_od_feature_mask(smu);
> @@ -2754,6 +2781,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
> od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
> break;
>
> + case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
> + if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
> + dev_warn(adev->dev, "Zero RPM setting not supported!\n");
> + return -ENOTSUPP;
> + }
> +
> + smu_v14_0_2_get_od_setting_limits(smu,
> + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
> + &minimum,
> + &maximum);
> + if (input[0] < minimum ||
> + input[0] > maximum) {
> + dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n",
> + input[0], minimum, maximum);
> + return -EINVAL;
> + }
> +
> + od_table->OverDriveTable.FanZeroRpmStopTemp = input[0];
> + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
> + break;
> +
> case PP_OD_RESTORE_DEFAULT_TABLE:
> if (size == 1) {
> ret = smu_v14_0_2_od_restore_table_single(smu, input[0]);
> --
> 2.48.1
>
More information about the amd-gfx
mailing list