Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> On Mon, Aug 21, 2023 at 2:50 AM Evan Quan <evan.quan@xxxxxxx> wrote: > > The voltage offset setting will be applied to the whole v/f curve line > instead of per anchor point base. > > Signed-off-by: Evan Quan <evan.quan@xxxxxxx> > --- > drivers/gpu/drm/amd/pm/amdgpu_pm.c | 45 +++++++------------ > .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 31 ++++++------- > .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 31 ++++++------- > 3 files changed, 43 insertions(+), 64 deletions(-) > > diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c > index f03647fa3df6..97d550ac6942 100644 > --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c > +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c > @@ -643,18 +643,14 @@ static ssize_t amdgpu_set_pp_table(struct device *dev, > * They can be used to calibrate the sclk voltage curve. This is > * available for Vega20 and NV1X. > * > - * - voltage offset for the six anchor points of the v/f curve labeled > - * OD_VDDC_CURVE. They can be used to calibrate the v/f curve. This > - * is only availabe for some SMU13 ASICs. > - * > * - voltage offset(in mV) applied on target voltage calculation. > - * This is available for Sienna Cichlid, Navy Flounder and Dimgrey > - * Cavefish. For these ASICs, the target voltage calculation can be > - * illustrated by "voltage = voltage calculated from v/f curve + > - * overdrive vddgfx offset" > + * This is available for Sienna Cichlid, Navy Flounder, Dimgrey > + * Cavefish and some later SMU13 ASICs. For these ASICs, the target > + * voltage calculation can be illustrated by "voltage = voltage > + * calculated from v/f curve + overdrive vddgfx offset" > * > - * - a list of valid ranges for sclk, mclk, and voltage curve points > - * labeled OD_RANGE > + * - a list of valid ranges for sclk, mclk, voltage curve points > + * or voltage offset labeled OD_RANGE > * > * < For APUs > > * > @@ -686,24 +682,17 @@ static ssize_t amdgpu_set_pp_table(struct device *dev, > * E.g., "p 2 0 800" would set the minimum core clock on core > * 2 to 800Mhz. > * > - * For sclk voltage curve, > - * - For NV1X, enter the new values by writing a string that > - * contains "vc point clock voltage" to the file. The points > - * are indexed by 0, 1 and 2. E.g., "vc 0 300 600" will update > - * point1 with clock set as 300Mhz and voltage as 600mV. "vc 2 > - * 1000 1000" will update point3 with clock set as 1000Mhz and > - * voltage 1000mV. > - * - For SMU13 ASICs, enter the new values by writing a string that > - * contains "vc anchor_point_index voltage_offset" to the file. > - * There are total six anchor points defined on the v/f curve with > - * index as 0 - 5. > - * - "vc 0 10" will update the voltage offset for point1 as 10mv. > - * - "vc 5 -10" will update the voltage offset for point6 as -10mv. > - * > - * To update the voltage offset applied for gfxclk/voltage calculation, > - * enter the new value by writing a string that contains "vo offset". > - * This is supported by Sienna Cichlid, Navy Flounder and Dimgrey Cavefish. > - * And the offset can be a positive or negative value. > + * For sclk voltage curve supported by Vega20 and NV1X, enter the new > + * values by writing a string that contains "vc point clock voltage" > + * to the file. The points are indexed by 0, 1 and 2. E.g., "vc 0 300 > + * 600" will update point1 with clock set as 300Mhz and voltage as 600mV. > + * "vc 2 1000 1000" will update point3 with clock set as 1000Mhz and > + * voltage 1000mV. > + * > + * For voltage offset supported by Sienna Cichlid, Navy Flounder, Dimgrey > + * Cavefish and some later SMU13 ASICs, enter the new value by writing a > + * string that contains "vo offset". E.g., "vo -10" will update the extra > + * voltage offset applied to the whole v/f curve line as -10mv. > * > * - When you have edited all of the states as needed, write "c" (commit) > * to the file to commit your changes > 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 3903a47669e4..bd0d5f027cac 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 > @@ -1304,16 +1304,14 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, > od_table->OverDriveTable.UclkFmax); > break; > > - case SMU_OD_VDDC_CURVE: > + case SMU_OD_VDDGFX_OFFSET: > if (!smu_v13_0_0_is_od_feature_supported(smu, > PP_OD_FEATURE_GFX_VF_CURVE_BIT)) > break; > > - size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n"); > - for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) > - size += sysfs_emit_at(buf, size, "%d: %dmv\n", > - i, > - od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]); > + size += sysfs_emit_at(buf, size, "OD_VDDGFX_OFFSET:\n"); > + size += sysfs_emit_at(buf, size, "%dmV\n", > + od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[0]); > break; > > case SMU_OD_RANGE: > @@ -1355,7 +1353,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, > PP_OD_FEATURE_GFX_VF_CURVE, > &min_value, > &max_value); > - size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", > + size += sysfs_emit_at(buf, size, "VDDGFX_OFFSET: %7dmv %10dmv\n", > min_value, max_value); > } > break; > @@ -1504,29 +1502,26 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, > } > break; > > - case PP_OD_EDIT_VDDC_CURVE: > + case PP_OD_EDIT_VDDGFX_OFFSET: > if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { > - dev_warn(adev->dev, "VF curve setting not supported!\n"); > + dev_warn(adev->dev, "Gfx offset setting not supported!\n"); > return -ENOTSUPP; > } > > - if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS || > - input[0] < 0) > - return -EINVAL; > - > smu_v13_0_0_get_od_setting_limits(smu, > PP_OD_FEATURE_GFX_VF_CURVE, > &minimum, > &maximum); > - if (input[1] < minimum || > - input[1] > maximum) { > + if (input[0] < minimum || > + input[0] > maximum) { > dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n", > - input[1], minimum, maximum); > + input[0], minimum, maximum); > return -EINVAL; > } > > - od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1]; > - od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; > + for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) > + od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = input[0]; > + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT); > break; > > case PP_OD_RESTORE_DEFAULT_TABLE: > 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 94ef5b4d116d..e54a6efc4fb5 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 > @@ -1284,16 +1284,14 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu, > od_table->OverDriveTable.UclkFmax); > break; > > - case SMU_OD_VDDC_CURVE: > + case SMU_OD_VDDGFX_OFFSET: > if (!smu_v13_0_7_is_od_feature_supported(smu, > PP_OD_FEATURE_GFX_VF_CURVE_BIT)) > break; > > - size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n"); > - for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) > - size += sysfs_emit_at(buf, size, "%d: %dmv\n", > - i, > - od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]); > + size += sysfs_emit_at(buf, size, "OD_VDDGFX_OFFSET:\n"); > + size += sysfs_emit_at(buf, size, "%dmV\n", > + od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[0]); > break; > > case SMU_OD_RANGE: > @@ -1335,7 +1333,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu, > PP_OD_FEATURE_GFX_VF_CURVE, > &min_value, > &max_value); > - size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", > + size += sysfs_emit_at(buf, size, "VDDGFX_OFFSET: %7dmv %10dmv\n", > min_value, max_value); > } > break; > @@ -1484,29 +1482,26 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, > } > break; > > - case PP_OD_EDIT_VDDC_CURVE: > + case PP_OD_EDIT_VDDGFX_OFFSET: > if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { > - dev_warn(adev->dev, "VF curve setting not supported!\n"); > + dev_warn(adev->dev, "Gfx offset setting not supported!\n"); > return -ENOTSUPP; > } > > - if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS || > - input[0] < 0) > - return -EINVAL; > - > smu_v13_0_7_get_od_setting_limits(smu, > PP_OD_FEATURE_GFX_VF_CURVE, > &minimum, > &maximum); > - if (input[1] < minimum || > - input[1] > maximum) { > + if (input[0] < minimum || > + input[0] > maximum) { > dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n", > - input[1], minimum, maximum); > + input[0],minimum, maximum); > return -EINVAL; > } > > - od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1]; > - od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; > + for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) > + od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = input[0]; > + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT); > break; > > case PP_OD_RESTORE_DEFAULT_TABLE: > -- > 2.34.1 >