[PATCH] drm/amd/pm: Add reset option for fan_curve on smu13_0_0

Alex Deucher alexdeucher at gmail.com
Wed Sep 20 14:05:15 UTC 2023


On Tue, Sep 19, 2023 at 11:00 PM Ma, Jun <majun at amd.com> wrote:
>
> Hi Alex,
>
> On 9/18/2023 10:05 PM, Alex Deucher wrote:
> > On Mon, Sep 11, 2023 at 2:00 AM Ma Jun <Jun.Ma2 at amd.com> wrote:
> >>
> >> Add reset option for fan_curve.
> >> User can use command "echo r > fan_cure" to reset the fan_curve
> >> to boot value
> >>
> >> Signed-off-by: Ma Jun <Jun.Ma2 at amd.com>
> >> ---
> >>  drivers/gpu/drm/amd/pm/amdgpu_pm.c            |  8 ++++
> >>  .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c  | 43 +++++++++++++++++--
> >>  2 files changed, 47 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >> index d05d9cd61331..2acac21387bc 100644
> >> --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >> +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >> @@ -3437,6 +3437,11 @@ static int parse_input_od_command_lines(const char *buf,
> >>         case 'c':
> >>                 *type = PP_OD_COMMIT_DPM_TABLE;
> >>                 return 0;
> >> +       case 'r':
> >> +               params[parameter_size] = *type;
> >> +               *num_of_params = 1;
> >> +               *type = PP_OD_RESTORE_DEFAULT_TABLE;
> >> +               return 0;
> >>         default:
> >>                 break;
> >>         }
> >> @@ -3531,6 +3536,9 @@ amdgpu_distribute_custom_od_settings(struct amdgpu_device *adev,
> >>   * When you have finished the editing, write "c" (commit) to the file to commit
> >>   * your changes.
> >>   *
> >> + * If you want to reset to the default value, write "r" (reset) to the file to
> >> + * reset them
> >> + *
> >>   * There are two fan control modes supported: auto and manual. With auto mode,
> >>   * PMFW handles the fan speed control(how fan speed reacts to ASIC temperature).
> >>   * While with manual mode, users can set their own fan curve line as what
> >> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> >> index a719bae54e2c..644773c4bccb 100644
> >> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> >> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> >> @@ -1484,6 +1484,36 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
> >>         return size;
> >>  }
> >>
> >> +
> >> +static int smu_v13_0_0_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;
> >> +       default:
> >> +               dev_info(adev->dev, "Invalid table index: %ld\n", input);
> >> +               return -EINVAL;
> >> +       }
> >> +
> >> +       return 0;
> >> +}
> >> +
> >>  static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
> >>                                          enum PP_OD_DPM_TABLE_COMMAND type,
> >>                                          long input[],
> >> @@ -1770,13 +1800,18 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
> >>                 break;
> >>
> >>         case PP_OD_RESTORE_DEFAULT_TABLE:
> >> -               feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask;
> >> -               memcpy(od_table,
> >> +               if (size == 1) {
> >> +                       ret = smu_v13_0_0_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;
> >> +                       od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask;
> >> +               }
> >>                 fallthrough;
> >
> > I'm not sure the fallthrough here is correct.  I think setting the
> > reset should just reset the values, but you'd still need to commit to
> > actually set them to the firmware.  Double check that the behavior is
> > consistent with older chips.
> >
>
> We also use the "fallthrough" in sienna_cichlid_od_edit_dpm_table() and
> smu_v13_0_7_od_edit_dpm_table().
>
> But other chips used "break" here for reset. I think user maybe need
> to use command " echo r > xx" and "echo c > xx" to reset.
>
> So, It seems that it makes more sense to use  "fallthrough" here.
>

I guess if that's what we do for seinna_cichlid, it's fine.  Too bad
we lost consistency here.
Acked-by: Alex Deucher <alexander.deucher at amd.com>

> Regards,
> Ma Jun
>
> > Alex
> >
> >
> >> -
> >>         case PP_OD_COMMIT_DPM_TABLE:
> >>                 /*
> >>                  * The member below instructs PMFW the settings focused in
> >> --
> >> 2.34.1
> >>


More information about the amd-gfx mailing list