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

Ma, Jun majun at amd.com
Wed Sep 20 03:00:25 UTC 2023


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.

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