Skip to content

Commit d9d4cb2

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> (cherry picked from commit 1cfeb60) Cc: stable@vger.kernel.org # 6.12.x
1 parent d600732 commit d9d4cb2

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
@@ -1193,16 +1193,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
11931193
PP_OD_FEATURE_GFXCLK_BIT))
11941194
break;
11951195

1196-
PPTable_t *pptable = smu->smu_table.driver_pptable;
1197-
const OverDriveLimits_t * const overdrive_upperlimits =
1198-
&pptable->SkuTable.OverDriveLimitsBasicMax;
1199-
const OverDriveLimits_t * const overdrive_lowerlimits =
1200-
&pptable->SkuTable.OverDriveLimitsBasicMin;
1201-
12021196
size += sysfs_emit_at(buf, size, "OD_SCLK_OFFSET:\n");
1203-
size += sysfs_emit_at(buf, size, "0: %dMhz\n1: %uMhz\n",
1204-
overdrive_lowerlimits->GfxclkFoffset,
1205-
overdrive_upperlimits->GfxclkFoffset);
1197+
size += sysfs_emit_at(buf, size, "%dMhz\n",
1198+
od_table->OverDriveTable.GfxclkFoffset);
12061199
break;
12071200

12081201
case SMU_OD_MCLK:
@@ -1336,13 +1329,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
13361329
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
13371330

13381331
if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
1339-
smu_v14_0_2_get_od_setting_limits(smu,
1340-
PP_OD_FEATURE_GFXCLK_FMIN,
1341-
&min_value,
1342-
NULL);
13431332
smu_v14_0_2_get_od_setting_limits(smu,
13441333
PP_OD_FEATURE_GFXCLK_FMAX,
1345-
NULL,
1334+
&min_value,
13461335
&max_value);
13471336
size += sysfs_emit_at(buf, size, "SCLK_OFFSET: %7dMhz %10uMhz\n",
13481337
min_value, max_value);
@@ -2450,36 +2439,24 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
24502439
return -ENOTSUPP;
24512440
}
24522441

2453-
for (i = 0; i < size; i += 2) {
2454-
if (i + 2 > size) {
2455-
dev_info(adev->dev, "invalid number of input parameters %d\n", size);
2456-
return -EINVAL;
2457-
}
2458-
2459-
switch (input[i]) {
2460-
case 1:
2461-
smu_v14_0_2_get_od_setting_limits(smu,
2462-
PP_OD_FEATURE_GFXCLK_FMAX,
2463-
&minimum,
2464-
&maximum);
2465-
if (input[i + 1] < minimum ||
2466-
input[i + 1] > maximum) {
2467-
dev_info(adev->dev, "GfxclkFmax (%ld) must be within [%u, %u]!\n",
2468-
input[i + 1], minimum, maximum);
2469-
return -EINVAL;
2470-
}
2471-
2472-
od_table->OverDriveTable.GfxclkFoffset = input[i + 1];
2473-
od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT;
2474-
break;
2442+
if (size != 1) {
2443+
dev_info(adev->dev, "invalid number of input parameters %d\n", size);
2444+
return -EINVAL;
2445+
}
24752446

2476-
default:
2477-
dev_info(adev->dev, "Invalid SCLK_VDDC_TABLE index: %ld\n", input[i]);
2478-
dev_info(adev->dev, "Supported indices: [0:min,1:max]\n");
2479-
return -EINVAL;
2480-
}
2447+
smu_v14_0_2_get_od_setting_limits(smu,
2448+
PP_OD_FEATURE_GFXCLK_FMAX,
2449+
&minimum,
2450+
&maximum);
2451+
if (input[0] < minimum ||
2452+
input[0] > maximum) {
2453+
dev_info(adev->dev, "GfxclkFoffset must be within [%d, %u]!\n",
2454+
minimum, maximum);
2455+
return -EINVAL;
24812456
}
24822457

2458+
od_table->OverDriveTable.GfxclkFoffset = input[0];
2459+
od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT;
24832460
break;
24842461

24852462
case PP_OD_EDIT_MCLK_VDDC_TABLE:

0 commit comments

Comments
 (0)