[PATCH] drm/amd/pm: Add zero RPM enabled OD setting support for SMU14.0.2

Alex Deucher alexdeucher at gmail.com
Tue Mar 25 14:18:04 UTC 2025


On Tue, Mar 25, 2025 at 8:42 AM Tomasz Pakuła
<tomasz.pakula.oficjalny at gmail.com> wrote:
>
> Hook up zero RPM enable for 9070 and 9070 XT based on RDNA3
> (smu 13.0.0 and 13.0.7) code.
>
> Tested on 9070 XT Hellhound
>
> Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny at gmail.com>

Applied.  Thanks!

Alex

> ---
>  .../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 f7cfe1f35cae..82c2db972491 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
> @@ -79,6 +79,7 @@
>  #define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET              8
>  #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
>
>  static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
>         MSG_MAP(TestMessage,                    PPSMC_MSG_TestMessage,                 1),
> @@ -1052,6 +1053,10 @@ static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
>                 od_min_setting = overdrive_lowerlimits->FanMinimumPwm;
>                 od_max_setting = overdrive_upperlimits->FanMinimumPwm;
>                 break;
> +       case PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE:
> +               od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
> +               od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
> +               break;
>         default:
>                 od_min_setting = od_max_setting = INT_MAX;
>                 break;
> @@ -1330,6 +1335,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_ENABLE:
> +               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_ENABLE:\n");
> +               size += sysfs_emit_at(buf, size, "%d\n",
> +                               (int)od_table->OverDriveTable.FanZeroRpmEnable);
> +
> +               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_ENABLE,
> +                                                 &min_value,
> +                                                 &max_value);
> +               size += sysfs_emit_at(buf, size, "ZERO_RPM_ENABLE: %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) &&
> @@ -2270,7 +2293,9 @@ static void smu_v14_0_2_set_supported_od_feature_mask(struct smu_context *smu)
>                                             OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE |
>                                             OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET |
>                                             OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
> -                                           OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET;
> +                                           OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
> +                                           OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
> +                                           OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
>  }
>
>  static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu,
> @@ -2349,6 +2374,8 @@ static int smu_v14_0_2_set_default_od_settings(struct smu_context *smu)
>                         user_od_table_bak.OverDriveTable.FanTargetTemperature;
>                 user_od_table->OverDriveTable.FanMinimumPwm =
>                         user_od_table_bak.OverDriveTable.FanMinimumPwm;
> +               user_od_table->OverDriveTable.FanZeroRpmEnable =
> +                       user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
>         }
>
>         smu_v14_0_2_set_supported_od_feature_mask(smu);
> @@ -2396,6 +2423,11 @@ static int smu_v14_0_2_od_restore_table_single(struct smu_context *smu, long inp
>                 od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
>                 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
>                 break;
> +       case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
> +               od_table->OverDriveTable.FanZeroRpmEnable =
> +                                       boot_overdrive_table->OverDriveTable.FanZeroRpmEnable;
> +               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;
> @@ -2678,6 +2710,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
>                 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
>                 break;
>
> +       case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
> +               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_ENABLE,
> +                                                 &minimum,
> +                                                 &maximum);
> +               if (input[0] < minimum ||
> +                   input[0] > maximum) {
> +                       dev_info(adev->dev, "zero RPM enable setting(%ld) must be within [%d, %d]!\n",
> +                                input[0], minimum, maximum);
> +                       return -EINVAL;
> +               }
> +
> +               od_table->OverDriveTable.FanZeroRpmEnable = 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]);
>
> base-commit: 7547510d4a915f4f6d9b1262182d8db6763508f4
> --
> 2.49.0
>


More information about the amd-gfx mailing list