Re: [PATCH 2/2] drm/amd/pm: add zero RPM stop temp OD setting support for SMU 14.0.2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Mar 17, 2025 at 6:53 AM Tomasz Pakuła
<tomasz.pakula.oficjalny@xxxxxxxxx> 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@xxxxxxxxx>
> ---
>  .../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
>




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux