drm/amd/pm: Add reset option for fan_curve on smu13_0_0
authorMa Jun <Jun.Ma2@amd.com>
Thu, 7 Sep 2023 07:33:12 +0000 (15:33 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 26 Sep 2023 21:00:21 +0000 (17:00 -0400)
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@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

index 5f9e3737243eb304d80fa857c3b1263a959a0de3..2d19282e4fbef8922fdffeb2da62ae45fa188a21 100644 (file)
@@ -3446,6 +3446,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;
        }
@@ -3540,6 +3545,9 @@ err_out0:
  * 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
index 0bb9f14262548f294fa98756c7cf33259629c4c4..684b4e01fac24cfdf917478ef1cfb535ae44958e 100644 (file)
@@ -1511,6 +1511,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[],
@@ -1797,13 +1827,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;
-
        case PP_OD_COMMIT_DPM_TABLE:
                /*
                 * The member below instructs PMFW the settings focused in