|
79 | 79 | #define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET 8
|
80 | 80 | #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
|
81 | 81 | #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
|
| 82 | +#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11 |
82 | 83 |
|
83 | 84 | static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
|
84 | 85 | 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,
|
1052 | 1053 | od_min_setting = overdrive_lowerlimits->FanMinimumPwm;
|
1053 | 1054 | od_max_setting = overdrive_upperlimits->FanMinimumPwm;
|
1054 | 1055 | 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; |
1055 | 1060 | default:
|
1056 | 1061 | od_min_setting = od_max_setting = INT_MAX;
|
1057 | 1062 | break;
|
@@ -1330,6 +1335,24 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
|
1330 | 1335 | min_value, max_value);
|
1331 | 1336 | break;
|
1332 | 1337 |
|
| 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 | + |
1333 | 1356 | case SMU_OD_RANGE:
|
1334 | 1357 | if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
|
1335 | 1358 | !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)
|
2270 | 2293 | OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE |
|
2271 | 2294 | OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET |
|
2272 | 2295 | 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; |
2274 | 2299 | }
|
2275 | 2300 |
|
2276 | 2301 | 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)
|
2349 | 2374 | user_od_table_bak.OverDriveTable.FanTargetTemperature;
|
2350 | 2375 | user_od_table->OverDriveTable.FanMinimumPwm =
|
2351 | 2376 | user_od_table_bak.OverDriveTable.FanMinimumPwm;
|
| 2377 | + user_od_table->OverDriveTable.FanZeroRpmEnable = |
| 2378 | + user_od_table_bak.OverDriveTable.FanZeroRpmEnable; |
2352 | 2379 | }
|
2353 | 2380 |
|
2354 | 2381 | 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
|
2396 | 2423 | od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
|
2397 | 2424 | od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
2398 | 2425 | 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; |
2399 | 2431 | case PP_OD_EDIT_ACOUSTIC_LIMIT:
|
2400 | 2432 | od_table->OverDriveTable.AcousticLimitRpmThreshold =
|
2401 | 2433 | boot_overdrive_table->OverDriveTable.AcousticLimitRpmThreshold;
|
@@ -2678,6 +2710,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
|
2678 | 2710 | od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
2679 | 2711 | break;
|
2680 | 2712 |
|
| 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 | + |
2681 | 2734 | case PP_OD_RESTORE_DEFAULT_TABLE:
|
2682 | 2735 | if (size == 1) {
|
2683 | 2736 | ret = smu_v14_0_2_od_restore_table_single(smu, input[0]);
|
|
0 commit comments