AMD General

Hi Kenneth,

Please add "Closes:" tag in commit message.

Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5905

Reviewed-by: Kevin Wang <[email protected]>

Best Regards,
Kevin

> -----Original Message-----
> From: Kenneth Feng <[email protected]>
> Sent: Friday, October 9, 2026 16:20
> To: [email protected]
> Cc: Wang, Kevin <[email protected]>; Feng, Kenneth
> <[email protected]>
> Subject: [PATCH] drm/amd/pm: add zero fan stop temperature support on smu
> 14.0.2
>
> add zero fan stop temperature support on smu 14.0.2
>
> Signed-off-by: Kenneth Feng <[email protected]>
> ---
>  .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  | 55 ++++++++++++++++++-
>  1 file changed, 54 insertions(+), 1 deletion(-)
>
> 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 1054c4b4b03e..e095bebecfbd 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
> @@ -89,6 +89,7 @@ static const struct smu_feature_bits
> smu_v14_0_2_dpm_features = {
>  #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),
> @@ -1020,6 +1021,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 = pptable->SkuTable.MsgLimits.FanStopTempMin;
> +             od_max_setting = pptable->SkuTable.MsgLimits.FanStopTempMax;
> +             break;
>       default:
>               od_min_setting = od_max_setting = INT_MAX;
>               break;
> @@ -1244,6 +1249,24 @@ static int smu_v14_0_2_emit_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) && @@ -2308,7 +2331,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, @@ 
> -2389,6
> +2414,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);
> @@ -2443,6 +2470,11 @@ static int smu_v14_0_2_od_restore_table_single(struct
> smu_context *smu, long inp
>                                       boot_overdrive_table-
> >OverDriveTable.FanZeroRpmEnable;
>               od_table->OverDriveTable.FeatureCtrlMask |=
> BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
>               break;
> +     case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
> +             od_table->OverDriveTable.FanZeroRpmStopTemp =
> +                                     boot_overdrive_table-
> >OverDriveTable.FanZeroRpmStopTemp;
> +             od_table->OverDriveTable.FeatureCtrlMask |=
> BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
> +             break;
>       case PP_OD_EDIT_ACOUSTIC_LIMIT:
>               od_table->OverDriveTable.AcousticLimitRpmThreshold =
>                                       boot_overdrive_table-
> >OverDriveTable.AcousticLimitRpmThreshold;
> @@ -2749,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.43.0

Reply via email to