Skip to content

Commit 1cfeb60

Browse files
Lawstorantalexdeucher
authored andcommitted
drm/amdgpu/pm: Handle SCLK offset correctly in overdrive for smu 14.0.2
Currently, it seems like the code was carried over from RDNA3 because it assumes two possible values to set. RDNA4, instead of having: 0: min SCLK 1: max SCLK only has 0: SCLK offset This change makes it so it only reports current offset value instead of showing possible min/max values and their indices. Moreover, it now only accepts the offset as a value, without the indice index. Additionally, the lower bound was printed as %u by mistake. Old: OD_SCLK_OFFSET: 0: -500Mhz 1: 1000Mhz OD_MCLK: 0: 97Mhz 1: 1259MHz OD_VDDGFX_OFFSET: 0mV OD_RANGE: SCLK_OFFSET: -500Mhz 1000Mhz MCLK: 97Mhz 1500Mhz VDDGFX_OFFSET: -200mv 0mv New: OD_SCLK_OFFSET: 0Mhz OD_MCLK: 0: 97Mhz 1: 1259MHz OD_VDDGFX_OFFSET: 0mV OD_RANGE: SCLK_OFFSET: -500Mhz 1000Mhz MCLK: 97Mhz 1500Mhz VDDGFX_OFFSET: -200mv 0mv Setting this offset: Old: "s 1 <offset>" New: "s <offset>" Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4036 Reviewed-by: Yang Wang <kevinyang.wang@amd.com> Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent b5aaa82 commit 1cfeb60

File tree

1 file changed

+18
-41
lines changed

1 file changed

+18
-41
lines changed

drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,16 +1203,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
12031203
PP_OD_FEATURE_GFXCLK_BIT))
12041204
break;
12051205

1206-
PPTable_t *pptable = smu->smu_table.driver_pptable;
1207-
const OverDriveLimits_t * const overdrive_upperlimits =
1208-
&pptable->SkuTable.OverDriveLimitsBasicMax;
1209-
const OverDriveLimits_t * const overdrive_lowerlimits =
1210-
&pptable->SkuTable.OverDriveLimitsBasicMin;
1211-
12121206
size += sysfs_emit_at(buf, size, "OD_SCLK_OFFSET:\n");
1213-
size += sysfs_emit_at(buf, size, "0: %dMhz\n1: %uMhz\n",
1214-
overdrive_lowerlimits->GfxclkFoffset,
1215-
overdrive_upperlimits->GfxclkFoffset);
1207+
size += sysfs_emit_at(buf, size, "%dMhz\n",
1208+
od_table->OverDriveTable.GfxclkFoffset);
12161209
break;
12171210

12181211
case SMU_OD_MCLK:
@@ -1346,13 +1339,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
13461339
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
13471340

13481341
if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
1349-
smu_v14_0_2_get_od_setting_limits(smu,
1350-
PP_OD_FEATURE_GFXCLK_FMIN,
1351-
&min_value,
1352-
NULL);
13531342
smu_v14_0_2_get_od_setting_limits(smu,
13541343
PP_OD_FEATURE_GFXCLK_FMAX,
1355-
NULL,
1344+
&min_value,
13561345
&max_value);
13571346
size += sysfs_emit_at(buf, size, "SCLK_OFFSET: %7dMhz %10uMhz\n",
13581347
min_value, max_value);
@@ -2460,36 +2449,24 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
24602449
return -ENOTSUPP;
24612450
}
24622451

2463-
for (i = 0; i < size; i += 2) {
2464-
if (i + 2 > size) {
2465-
dev_info(adev->dev, "invalid number of input parameters %d\n", size);
2466-
return -EINVAL;
2467-
}
2468-
2469-
switch (input[i]) {
2470-
case 1:
2471-
smu_v14_0_2_get_od_setting_limits(smu,
2472-
PP_OD_FEATURE_GFXCLK_FMAX,
2473-
&minimum,
2474-
&maximum);
2475-
if (input[i + 1] < minimum ||
2476-
input[i + 1] > maximum) {
2477-
dev_info(adev->dev, "GfxclkFmax (%ld) must be within [%u, %u]!\n",
2478-
input[i + 1], minimum, maximum);
2479-
return -EINVAL;
2480-
}
2481-
2482-
od_table->OverDriveTable.GfxclkFoffset = input[i + 1];
2483-
od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT;
2484-
break;
2452+
if (size != 1) {
2453+
dev_info(adev->dev, "invalid number of input parameters %d\n", size);
2454+
return -EINVAL;
2455+
}
24852456

2486-
default:
2487-
dev_info(adev->dev, "Invalid SCLK_VDDC_TABLE index: %ld\n", input[i]);
2488-
dev_info(adev->dev, "Supported indices: [0:min,1:max]\n");
2489-
return -EINVAL;
2490-
}
2457+
smu_v14_0_2_get_od_setting_limits(smu,
2458+
PP_OD_FEATURE_GFXCLK_FMAX,
2459+
&minimum,
2460+
&maximum);
2461+
if (input[0] < minimum ||
2462+
input[0] > maximum) {
2463+
dev_info(adev->dev, "GfxclkFoffset must be within [%d, %u]!\n",
2464+
minimum, maximum);
2465+
return -EINVAL;
24912466
}
24922467

2468+
od_table->OverDriveTable.GfxclkFoffset = input[0];
2469+
od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT;
24932470
break;
24942471

24952472
case PP_OD_EDIT_MCLK_VDDC_TABLE:

0 commit comments

Comments
 (0)