Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/pm: add zero RPM stop temperature OD setting support for SMU13

Together with the feature to enable or disable zero RPM in the last
commit, it also makes sense to expose the OD setting determining under
which temperature the fan should stop if zero RPM is enabled.

Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Wolfgang Müller <wolf@oriole.systems>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Wolfgang Müller and committed by
Alex Deucher
6bfe777e e89bd361

+186 -2
+6
Documentation/gpu/amdgpu/thermal.rst
··· 106 106 .. kernel-doc:: drivers/gpu/drm/amd/pm/amdgpu_pm.c 107 107 :doc: fan_zero_rpm_enable 108 108 109 + fan_zero_rpm_stop_temperature 110 + ----------------------------- 111 + 112 + .. kernel-doc:: drivers/gpu/drm/amd/pm/amdgpu_pm.c 113 + :doc: fan_zero_rpm_stop_temperature 114 + 109 115 GFXOFF 110 116 ====== 111 117
+2
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 120 120 OD_FAN_TARGET_TEMPERATURE, 121 121 OD_FAN_MINIMUM_PWM, 122 122 OD_FAN_ZERO_RPM_ENABLE, 123 + OD_FAN_ZERO_RPM_STOP_TEMP, 123 124 }; 124 125 125 126 enum amd_pp_sensors { ··· 202 201 PP_OD_EDIT_FAN_TARGET_TEMPERATURE, 203 202 PP_OD_EDIT_FAN_MINIMUM_PWM, 204 203 PP_OD_EDIT_FAN_ZERO_RPM_ENABLE, 204 + PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP, 205 205 }; 206 206 207 207 struct pp_states_info {
+65
drivers/gpu/drm/amd/pm/amdgpu_pm.c
··· 4163 4163 return umode; 4164 4164 } 4165 4165 4166 + /** 4167 + * DOC: fan_zero_rpm_stop_temperature 4168 + * 4169 + * The amdgpu driver provides a sysfs API for checking and adjusting the 4170 + * zero RPM stop temperature feature. 4171 + * 4172 + * Reading back the file shows you the current setting and the permitted 4173 + * ranges if changable. 4174 + * 4175 + * Writing an integer to the file, change the setting accordingly. 4176 + * 4177 + * When you have finished the editing, write "c" (commit) to the file to commit 4178 + * your changes. 4179 + * 4180 + * If you want to reset to the default value, write "r" (reset) to the file to 4181 + * reset them. 4182 + * 4183 + * This setting works only if the Zero RPM setting is enabled. It adjusts the 4184 + * temperature below which the fan can stop. 4185 + */ 4186 + static ssize_t fan_zero_rpm_stop_temp_show(struct kobject *kobj, 4187 + struct kobj_attribute *attr, 4188 + char *buf) 4189 + { 4190 + struct od_kobj *container = container_of(kobj, struct od_kobj, kobj); 4191 + struct amdgpu_device *adev = (struct amdgpu_device *)container->priv; 4192 + 4193 + return (ssize_t)amdgpu_retrieve_od_settings(adev, OD_FAN_ZERO_RPM_STOP_TEMP, buf); 4194 + } 4195 + 4196 + static ssize_t fan_zero_rpm_stop_temp_store(struct kobject *kobj, 4197 + struct kobj_attribute *attr, 4198 + const char *buf, 4199 + size_t count) 4200 + { 4201 + struct od_kobj *container = container_of(kobj, struct od_kobj, kobj); 4202 + struct amdgpu_device *adev = (struct amdgpu_device *)container->priv; 4203 + 4204 + return (ssize_t)amdgpu_distribute_custom_od_settings(adev, 4205 + PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP, 4206 + buf, 4207 + count); 4208 + } 4209 + 4210 + static umode_t fan_zero_rpm_stop_temp_visible(struct amdgpu_device *adev) 4211 + { 4212 + umode_t umode = 0000; 4213 + 4214 + if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE) 4215 + umode |= S_IRUSR | S_IRGRP | S_IROTH; 4216 + 4217 + if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET) 4218 + umode |= S_IWUSR; 4219 + 4220 + return umode; 4221 + } 4222 + 4166 4223 static struct od_feature_set amdgpu_od_set = { 4167 4224 .containers = { 4168 4225 [0] = { ··· 4271 4214 .is_visible = fan_zero_rpm_enable_visible, 4272 4215 .show = fan_zero_rpm_enable_show, 4273 4216 .store = fan_zero_rpm_enable_store, 4217 + }, 4218 + }, 4219 + [6] = { 4220 + .name = "fan_zero_rpm_stop_temperature", 4221 + .ops = { 4222 + .is_visible = fan_zero_rpm_stop_temp_visible, 4223 + .show = fan_zero_rpm_stop_temp_show, 4224 + .store = fan_zero_rpm_stop_temp_store, 4274 4225 }, 4275 4226 }, 4276 4227 },
+2
drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
··· 330 330 #define OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET BIT(9) 331 331 #define OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE BIT(10) 332 332 #define OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET BIT(11) 333 + #define OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE BIT(12) 334 + #define OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET BIT(13) 333 335 334 336 struct amdgpu_pm { 335 337 struct mutex mutex;
+2
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 2897 2897 clk_type = SMU_OD_FAN_MINIMUM_PWM; break; 2898 2898 case OD_FAN_ZERO_RPM_ENABLE: 2899 2899 clk_type = SMU_OD_FAN_ZERO_RPM_ENABLE; break; 2900 + case OD_FAN_ZERO_RPM_STOP_TEMP: 2901 + clk_type = SMU_OD_FAN_ZERO_RPM_STOP_TEMP; break; 2900 2902 default: 2901 2903 clk_type = SMU_CLK_COUNT; break; 2902 2904 }
+1
drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
··· 314 314 SMU_OD_FAN_TARGET_TEMPERATURE, 315 315 SMU_OD_FAN_MINIMUM_PWM, 316 316 SMU_OD_FAN_ZERO_RPM_ENABLE, 317 + SMU_OD_FAN_ZERO_RPM_STOP_TEMP, 317 318 SMU_CLK_COUNT, 318 319 }; 319 320
+54 -1
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
··· 108 108 #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9 109 109 #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10 110 110 #define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11 111 + #define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP 12 111 112 112 113 #define LINK_SPEED_MAX 3 113 114 ··· 1136 1135 od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable; 1137 1136 od_max_setting = overdrive_upperlimits->FanZeroRpmEnable; 1138 1137 break; 1138 + case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP: 1139 + od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp; 1140 + od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp; 1141 + break; 1139 1142 default: 1140 1143 od_min_setting = od_max_setting = INT_MAX; 1141 1144 break; ··· 1478 1473 min_value, max_value); 1479 1474 break; 1480 1475 1476 + case SMU_OD_FAN_ZERO_RPM_STOP_TEMP: 1477 + if (!smu_v13_0_0_is_od_feature_supported(smu, 1478 + PP_OD_FEATURE_ZERO_FAN_BIT)) 1479 + break; 1480 + 1481 + size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n"); 1482 + size += sysfs_emit_at(buf, size, "%d\n", 1483 + (int)od_table->OverDriveTable.FanZeroRpmStopTemp); 1484 + 1485 + size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); 1486 + smu_v13_0_0_get_od_setting_limits(smu, 1487 + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP, 1488 + &min_value, 1489 + &max_value); 1490 + size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n", 1491 + min_value, max_value); 1492 + break; 1493 + 1481 1494 case SMU_OD_RANGE: 1482 1495 if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) && 1483 1496 !smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && ··· 1596 1573 case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: 1597 1574 od_table->OverDriveTable.FanZeroRpmEnable = 1598 1575 boot_overdrive_table->OverDriveTable.FanZeroRpmEnable; 1576 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1577 + break; 1578 + case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP: 1579 + od_table->OverDriveTable.FanZeroRpmStopTemp = 1580 + boot_overdrive_table->OverDriveTable.FanZeroRpmStopTemp; 1599 1581 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1600 1582 break; 1601 1583 default: ··· 1917 1889 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1918 1890 break; 1919 1891 1892 + case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP: 1893 + if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) { 1894 + dev_warn(adev->dev, "Zero RPM setting not supported!\n"); 1895 + return -ENOTSUPP; 1896 + } 1897 + 1898 + smu_v13_0_0_get_od_setting_limits(smu, 1899 + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP, 1900 + &minimum, 1901 + &maximum); 1902 + if (input[0] < minimum || 1903 + input[0] > maximum) { 1904 + dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n", 1905 + input[0], minimum, maximum); 1906 + return -EINVAL; 1907 + } 1908 + 1909 + od_table->OverDriveTable.FanZeroRpmStopTemp = input[0]; 1910 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1911 + break; 1912 + 1920 1913 case PP_OD_RESTORE_DEFAULT_TABLE: 1921 1914 if (size == 1) { 1922 1915 ret = smu_v13_0_0_od_restore_table_single(smu, input[0]); ··· 2210 2161 OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE | 2211 2162 OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET | 2212 2163 OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE | 2213 - OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET; 2164 + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET | 2165 + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE | 2166 + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET; 2214 2167 } 2215 2168 2216 2169 static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu) ··· 2280 2229 user_od_table_bak.OverDriveTable.FanMinimumPwm; 2281 2230 user_od_table->OverDriveTable.FanZeroRpmEnable = 2282 2231 user_od_table_bak.OverDriveTable.FanZeroRpmEnable; 2232 + user_od_table->OverDriveTable.FanZeroRpmStopTemp = 2233 + user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp; 2283 2234 } 2284 2235 2285 2236 smu_v13_0_0_set_supported_od_feature_mask(smu);
+54 -1
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
··· 84 84 #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9 85 85 #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10 86 86 #define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11 87 + #define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP 12 87 88 88 89 #define LINK_SPEED_MAX 3 89 90 ··· 1125 1124 od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable; 1126 1125 od_max_setting = overdrive_upperlimits->FanZeroRpmEnable; 1127 1126 break; 1127 + case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP: 1128 + od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp; 1129 + od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp; 1130 + break; 1128 1131 default: 1129 1132 od_min_setting = od_max_setting = INT_MAX; 1130 1133 break; ··· 1467 1462 min_value, max_value); 1468 1463 break; 1469 1464 1465 + case SMU_OD_FAN_ZERO_RPM_STOP_TEMP: 1466 + if (!smu_v13_0_7_is_od_feature_supported(smu, 1467 + PP_OD_FEATURE_ZERO_FAN_BIT)) 1468 + break; 1469 + 1470 + size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n"); 1471 + size += sysfs_emit_at(buf, size, "%d\n", 1472 + (int)od_table->OverDriveTable.FanZeroRpmStopTemp); 1473 + 1474 + size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); 1475 + smu_v13_0_7_get_od_setting_limits(smu, 1476 + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP, 1477 + &min_value, 1478 + &max_value); 1479 + size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n", 1480 + min_value, max_value); 1481 + break; 1482 + 1470 1483 case SMU_OD_RANGE: 1471 1484 if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) && 1472 1485 !smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && ··· 1584 1561 case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: 1585 1562 od_table->OverDriveTable.FanZeroRpmEnable = 1586 1563 boot_overdrive_table->OverDriveTable.FanZeroRpmEnable; 1564 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1565 + break; 1566 + case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP: 1567 + od_table->OverDriveTable.FanZeroRpmStopTemp = 1568 + boot_overdrive_table->OverDriveTable.FanZeroRpmStopTemp; 1587 1569 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1588 1570 break; 1589 1571 default: ··· 1905 1877 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1906 1878 break; 1907 1879 1880 + case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP: 1881 + if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) { 1882 + dev_warn(adev->dev, "Zero RPM setting not supported!\n"); 1883 + return -ENOTSUPP; 1884 + } 1885 + 1886 + smu_v13_0_7_get_od_setting_limits(smu, 1887 + PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP, 1888 + &minimum, 1889 + &maximum); 1890 + if (input[0] < minimum || 1891 + input[0] > maximum) { 1892 + dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n", 1893 + input[0], minimum, maximum); 1894 + return -EINVAL; 1895 + } 1896 + 1897 + od_table->OverDriveTable.FanZeroRpmStopTemp = input[0]; 1898 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 1899 + break; 1900 + 1908 1901 case PP_OD_RESTORE_DEFAULT_TABLE: 1909 1902 if (size == 1) { 1910 1903 ret = smu_v13_0_7_od_restore_table_single(smu, input[0]); ··· 2194 2145 OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE | 2195 2146 OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET | 2196 2147 OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE | 2197 - OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET; 2148 + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET | 2149 + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE | 2150 + OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET; 2198 2151 } 2199 2152 2200 2153 static int smu_v13_0_7_set_default_od_settings(struct smu_context *smu) ··· 2264 2213 user_od_table_bak.OverDriveTable.FanMinimumPwm; 2265 2214 user_od_table->OverDriveTable.FanZeroRpmEnable = 2266 2215 user_od_table_bak.OverDriveTable.FanZeroRpmEnable; 2216 + user_od_table->OverDriveTable.FanZeroRpmStopTemp = 2217 + user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp; 2267 2218 } 2268 2219 2269 2220 smu_v13_0_7_set_supported_od_feature_mask(smu);