Skip to content

Commit b03f181

Browse files
Lawstorantalexdeucher
authored andcommitted
drm/amd/pm: Add zero RPM enabled OD setting support for SMU14.0.2
Hook up zero RPM enable for 9070 and 9070 XT based on RDNA3 (smu 13.0.0 and 13.0.7) code. Tested on 9070 XT Hellhound Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org # 6.12.x Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 7c246a0 commit b03f181

File tree

1 file changed

+54
-1
lines changed

1 file changed

+54
-1
lines changed

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

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
#define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET 8
8080
#define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
8181
#define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
82+
#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11
8283

8384
static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
8485
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
@@ -1052,6 +1053,10 @@ static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
10521053
od_min_setting = overdrive_lowerlimits->FanMinimumPwm;
10531054
od_max_setting = overdrive_upperlimits->FanMinimumPwm;
10541055
break;
1056+
case PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE:
1057+
od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
1058+
od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
1059+
break;
10551060
default:
10561061
od_min_setting = od_max_setting = INT_MAX;
10571062
break;
@@ -1330,6 +1335,24 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
13301335
min_value, max_value);
13311336
break;
13321337

1338+
case SMU_OD_FAN_ZERO_RPM_ENABLE:
1339+
if (!smu_v14_0_2_is_od_feature_supported(smu,
1340+
PP_OD_FEATURE_ZERO_FAN_BIT))
1341+
break;
1342+
1343+
size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_ENABLE:\n");
1344+
size += sysfs_emit_at(buf, size, "%d\n",
1345+
(int)od_table->OverDriveTable.FanZeroRpmEnable);
1346+
1347+
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
1348+
smu_v14_0_2_get_od_setting_limits(smu,
1349+
PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE,
1350+
&min_value,
1351+
&max_value);
1352+
size += sysfs_emit_at(buf, size, "ZERO_RPM_ENABLE: %u %u\n",
1353+
min_value, max_value);
1354+
break;
1355+
13331356
case SMU_OD_RANGE:
13341357
if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
13351358
!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) &&
@@ -2270,7 +2293,9 @@ static void smu_v14_0_2_set_supported_od_feature_mask(struct smu_context *smu)
22702293
OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE |
22712294
OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET |
22722295
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
2273-
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET;
2296+
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
2297+
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
2298+
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
22742299
}
22752300

22762301
static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu,
@@ -2349,6 +2374,8 @@ static int smu_v14_0_2_set_default_od_settings(struct smu_context *smu)
23492374
user_od_table_bak.OverDriveTable.FanTargetTemperature;
23502375
user_od_table->OverDriveTable.FanMinimumPwm =
23512376
user_od_table_bak.OverDriveTable.FanMinimumPwm;
2377+
user_od_table->OverDriveTable.FanZeroRpmEnable =
2378+
user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
23522379
}
23532380

23542381
smu_v14_0_2_set_supported_od_feature_mask(smu);
@@ -2396,6 +2423,11 @@ static int smu_v14_0_2_od_restore_table_single(struct smu_context *smu, long inp
23962423
od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
23972424
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
23982425
break;
2426+
case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
2427+
od_table->OverDriveTable.FanZeroRpmEnable =
2428+
boot_overdrive_table->OverDriveTable.FanZeroRpmEnable;
2429+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
2430+
break;
23992431
case PP_OD_EDIT_ACOUSTIC_LIMIT:
24002432
od_table->OverDriveTable.AcousticLimitRpmThreshold =
24012433
boot_overdrive_table->OverDriveTable.AcousticLimitRpmThreshold;
@@ -2678,6 +2710,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
26782710
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
26792711
break;
26802712

2713+
case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
2714+
if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
2715+
dev_warn(adev->dev, "Zero RPM setting not supported!\n");
2716+
return -ENOTSUPP;
2717+
}
2718+
2719+
smu_v14_0_2_get_od_setting_limits(smu,
2720+
PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE,
2721+
&minimum,
2722+
&maximum);
2723+
if (input[0] < minimum ||
2724+
input[0] > maximum) {
2725+
dev_info(adev->dev, "zero RPM enable setting(%ld) must be within [%d, %d]!\n",
2726+
input[0], minimum, maximum);
2727+
return -EINVAL;
2728+
}
2729+
2730+
od_table->OverDriveTable.FanZeroRpmEnable = input[0];
2731+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
2732+
break;
2733+
26812734
case PP_OD_RESTORE_DEFAULT_TABLE:
26822735
if (size == 1) {
26832736
ret = smu_v14_0_2_od_restore_table_single(smu, input[0]);

0 commit comments

Comments
 (0)