On Mon, Sep 11, 2023 at 2:00 AM Ma Jun <Jun.Ma2@xxxxxxx> 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@xxxxxxx> > --- > 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. Alex > - > case PP_OD_COMMIT_DPM_TABLE: > /* > * The member below instructs PMFW the settings focused in > -- > 2.34.1 >