On Tue, Oct 10, 2023 at 6:17 AM Ma Jun <Jun.Ma2@xxxxxxx> 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@xxxxxxx> Series is: Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > .../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 >