[PATCH 2/2] drm/amd/pm: Add reset option for fan_ctrl on smu 13.0.7

Alex Deucher alexdeucher at gmail.com
Tue Oct 10 13:20:12 UTC 2023


On Tue, Oct 10, 2023 at 6:17 AM Ma Jun <Jun.Ma2 at amd.com> wrote:
>
> Add reset option for fan_ctrl interfaces on the smu v13.0.7
> User can use command "echo r > interface_name" to reset the
> interface to boot value
>
> Signed-off-by: Ma Jun <Jun.Ma2 at amd.com>

Series is:
Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c  | 69 +++++++++++++++++--
>  1 file changed, 64 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> index b8a7a1d853df..3c5526babb14 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> @@ -1497,6 +1497,59 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
>         return size;
>  }
>
> +static int smu_v13_0_7_od_restore_table_single(struct smu_context *smu, long input)
> +{
> +       struct smu_table_context *table_context = &smu->smu_table;
> +       OverDriveTableExternal_t *boot_overdrive_table =
> +               (OverDriveTableExternal_t *)table_context->boot_overdrive_table;
> +       OverDriveTableExternal_t *od_table =
> +               (OverDriveTableExternal_t *)table_context->overdrive_table;
> +       struct amdgpu_device *adev = smu->adev;
> +       int i;
> +
> +       switch (input) {
> +       case PP_OD_EDIT_FAN_CURVE:
> +               for (i = 0; i < NUM_OD_FAN_MAX_POINTS; i++) {
> +                       od_table->OverDriveTable.FanLinearTempPoints[i] =
> +                                       boot_overdrive_table->OverDriveTable.FanLinearTempPoints[i];
> +                       od_table->OverDriveTable.FanLinearPwmPoints[i] =
> +                                       boot_overdrive_table->OverDriveTable.FanLinearPwmPoints[i];
> +               }
> +               od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
> +               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
> +               break;
> +       case PP_OD_EDIT_ACOUSTIC_LIMIT:
> +               od_table->OverDriveTable.AcousticLimitRpmThreshold =
> +                                       boot_overdrive_table->OverDriveTable.AcousticLimitRpmThreshold;
> +               od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
> +               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
> +               break;
> +       case PP_OD_EDIT_ACOUSTIC_TARGET:
> +               od_table->OverDriveTable.AcousticTargetRpmThreshold =
> +                                       boot_overdrive_table->OverDriveTable.AcousticTargetRpmThreshold;
> +               od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
> +               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
> +               break;
> +       case PP_OD_EDIT_FAN_TARGET_TEMPERATURE:
> +               od_table->OverDriveTable.FanTargetTemperature =
> +                                       boot_overdrive_table->OverDriveTable.FanTargetTemperature;
> +               od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
> +               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
> +               break;
> +       case PP_OD_EDIT_FAN_MINIMUM_PWM:
> +               od_table->OverDriveTable.FanMinimumPwm =
> +                                       boot_overdrive_table->OverDriveTable.FanMinimumPwm;
> +               od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
> +               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
> +               break;
> +       default:
> +               dev_info(adev->dev, "Invalid table index: %ld\n", input);
> +               return -EINVAL;
> +       }
> +
> +       return 0;
> +}
> +
>  static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
>                                          enum PP_OD_DPM_TABLE_COMMAND type,
>                                          long input[],
> @@ -1783,11 +1836,17 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
>                 break;
>
>         case PP_OD_RESTORE_DEFAULT_TABLE:
> -               feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask;
> -               memcpy(od_table,
> -                      table_context->boot_overdrive_table,
> -                      sizeof(OverDriveTableExternal_t));
> -               od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask;
> +               if (size == 1) {
> +                       ret = smu_v13_0_7_od_restore_table_single(smu, input[0]);
> +                       if (ret)
> +                               return ret;
> +               } else {
> +                       feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask;
> +                       memcpy(od_table,
> +                                       table_context->boot_overdrive_table,
> +                                       sizeof(OverDriveTableExternal_t));
> +                       od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask;
> +               }
>                 fallthrough;
>
>         case PP_OD_COMMIT_DPM_TABLE:
> --
> 2.34.1
>


More information about the amd-gfx mailing list