|
107 | 107 | #define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET 8 |
108 | 108 | #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9 |
109 | 109 | #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10 |
| 110 | +#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11 |
110 | 111 |
|
111 | 112 | #define LINK_SPEED_MAX 3 |
112 | 113 |
|
@@ -1130,6 +1131,10 @@ static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu, |
1130 | 1131 | od_min_setting = overdrive_lowerlimits->FanMinimumPwm; |
1131 | 1132 | od_max_setting = overdrive_upperlimits->FanMinimumPwm; |
1132 | 1133 | break; |
| 1134 | + case PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE: |
| 1135 | + od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable; |
| 1136 | + od_max_setting = overdrive_upperlimits->FanZeroRpmEnable; |
| 1137 | + break; |
1133 | 1138 | default: |
1134 | 1139 | od_min_setting = od_max_setting = INT_MAX; |
1135 | 1140 | break; |
@@ -1450,6 +1455,24 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, |
1450 | 1455 | min_value, max_value); |
1451 | 1456 | break; |
1452 | 1457 |
|
| 1458 | + case SMU_OD_FAN_ZERO_RPM_ENABLE: |
| 1459 | + if (!smu_v13_0_0_is_od_feature_supported(smu, |
| 1460 | + PP_OD_FEATURE_ZERO_FAN_BIT)) |
| 1461 | + break; |
| 1462 | + |
| 1463 | + size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_ENABLE:\n"); |
| 1464 | + size += sysfs_emit_at(buf, size, "%d\n", |
| 1465 | + (int)od_table->OverDriveTable.FanZeroRpmEnable); |
| 1466 | + |
| 1467 | + size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); |
| 1468 | + smu_v13_0_0_get_od_setting_limits(smu, |
| 1469 | + PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE, |
| 1470 | + &min_value, |
| 1471 | + &max_value); |
| 1472 | + size += sysfs_emit_at(buf, size, "ZERO_RPM_ENABLE: %u %u\n", |
| 1473 | + min_value, max_value); |
| 1474 | + break; |
| 1475 | + |
1453 | 1476 | case SMU_OD_RANGE: |
1454 | 1477 | if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) && |
1455 | 1478 | !smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && |
@@ -1547,6 +1570,11 @@ static int smu_v13_0_0_od_restore_table_single(struct smu_context *smu, long inp |
1547 | 1570 | od_table->OverDriveTable.FanMode = FAN_MODE_AUTO; |
1548 | 1571 | od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT); |
1549 | 1572 | break; |
| 1573 | + case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: |
| 1574 | + od_table->OverDriveTable.FanZeroRpmEnable = |
| 1575 | + boot_overdrive_table->OverDriveTable.FanZeroRpmEnable; |
| 1576 | + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); |
| 1577 | + break; |
1550 | 1578 | default: |
1551 | 1579 | dev_info(adev->dev, "Invalid table index: %ld\n", input); |
1552 | 1580 | return -EINVAL; |
@@ -1840,6 +1868,27 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, |
1840 | 1868 | od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT); |
1841 | 1869 | break; |
1842 | 1870 |
|
| 1871 | + case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: |
| 1872 | + if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) { |
| 1873 | + dev_warn(adev->dev, "Zero RPM setting not supported!\n"); |
| 1874 | + return -ENOTSUPP; |
| 1875 | + } |
| 1876 | + |
| 1877 | + smu_v13_0_0_get_od_setting_limits(smu, |
| 1878 | + PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE, |
| 1879 | + &minimum, |
| 1880 | + &maximum); |
| 1881 | + if (input[0] < minimum || |
| 1882 | + input[0] > maximum) { |
| 1883 | + dev_info(adev->dev, "zero RPM enable setting(%ld) must be within [%d, %d]!\n", |
| 1884 | + input[0], minimum, maximum); |
| 1885 | + return -EINVAL; |
| 1886 | + } |
| 1887 | + |
| 1888 | + od_table->OverDriveTable.FanZeroRpmEnable = input[0]; |
| 1889 | + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); |
| 1890 | + break; |
| 1891 | + |
1843 | 1892 | case PP_OD_RESTORE_DEFAULT_TABLE: |
1844 | 1893 | if (size == 1) { |
1845 | 1894 | ret = smu_v13_0_0_od_restore_table_single(smu, input[0]); |
@@ -2110,7 +2159,9 @@ static void smu_v13_0_0_set_supported_od_feature_mask(struct smu_context *smu) |
2110 | 2159 | OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE | |
2111 | 2160 | OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET | |
2112 | 2161 | OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE | |
2113 | | - OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET; |
| 2162 | + OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET | |
| 2163 | + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE | |
| 2164 | + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET; |
2114 | 2165 | } |
2115 | 2166 |
|
2116 | 2167 | static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu) |
@@ -2176,6 +2227,8 @@ static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu) |
2176 | 2227 | user_od_table_bak.OverDriveTable.FanTargetTemperature; |
2177 | 2228 | user_od_table->OverDriveTable.FanMinimumPwm = |
2178 | 2229 | user_od_table_bak.OverDriveTable.FanMinimumPwm; |
| 2230 | + user_od_table->OverDriveTable.FanZeroRpmEnable = |
| 2231 | + user_od_table_bak.OverDriveTable.FanZeroRpmEnable; |
2179 | 2232 | } |
2180 | 2233 |
|
2181 | 2234 | smu_v13_0_0_set_supported_od_feature_mask(smu); |
|
0 commit comments