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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/pm: correct the fan speed RPM retrieving

The relationship "PWM = RPM / smu->fan_max_rpm" between fan speed
PWM and RPM is not true for SMU11 ASICs. So, we need a new way to
retrieving the fan speed RPM.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Evan Quan and committed by
Alex Deucher
d9ca7567 fb1f667e

+106 -5
+3
drivers/gpu/drm/amd/include/asic_reg/thm/thm_11_0_2_offset.h
··· 38 38 #define mmCG_TACH_CTRL 0x006a 39 39 #define mmCG_TACH_CTRL_BASE_IDX 0 40 40 41 + #define mmCG_TACH_STATUS 0x006b 42 + #define mmCG_TACH_STATUS_BASE_IDX 0 43 + 41 44 #define mmTHM_THERMAL_INT_ENA 0x000a 42 45 #define mmTHM_THERMAL_INT_ENA_BASE_IDX 0 43 46 #define mmTHM_THERMAL_INT_CTRL 0x000b
+5
drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
··· 730 730 int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed); 731 731 732 732 /** 733 + * @get_fan_speed_rpm: Get the current fan speed in rpm. 734 + */ 735 + int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed); 736 + 737 + /** 733 738 * @set_watermarks_table: Configure and upload the watermarks tables to 734 739 * the SMU. 735 740 */
+3
drivers/gpu/drm/amd/pm/inc/smu_v11_0.h
··· 230 230 int smu_v11_0_get_fan_speed_percent(struct smu_context *smu, 231 231 uint32_t *speed); 232 232 233 + int smu_v11_0_get_fan_speed_rpm(struct smu_context *smu, 234 + uint32_t *speed); 235 + 233 236 int smu_v11_0_set_xgmi_pstate(struct smu_context *smu, 234 237 uint32_t pstate); 235 238
+2 -5
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 2639 2639 { 2640 2640 struct smu_context *smu = handle; 2641 2641 int ret = 0; 2642 - u32 percent; 2643 2642 2644 2643 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2645 2644 return -EOPNOTSUPP; 2646 2645 2647 2646 mutex_lock(&smu->mutex); 2648 2647 2649 - if (smu->ppt_funcs->get_fan_speed_percent) { 2650 - ret = smu->ppt_funcs->get_fan_speed_percent(smu, &percent); 2651 - *speed = percent * smu->fan_max_rpm / 100; 2652 - } 2648 + if (smu->ppt_funcs->get_fan_speed_rpm) 2649 + ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); 2653 2650 2654 2651 mutex_unlock(&smu->mutex); 2655 2652
+24
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
··· 1162 1162 return ret; 1163 1163 } 1164 1164 1165 + static int arcturus_get_fan_speed_rpm(struct smu_context *smu, 1166 + uint32_t *speed) 1167 + { 1168 + int ret = 0; 1169 + 1170 + if (!speed) 1171 + return -EINVAL; 1172 + 1173 + switch (smu_v11_0_get_fan_control_mode(smu)) { 1174 + case AMD_FAN_CTRL_AUTO: 1175 + ret = arcturus_get_smu_metrics_data(smu, 1176 + METRICS_CURR_FANSPEED, 1177 + speed); 1178 + break; 1179 + default: 1180 + ret = smu_v11_0_get_fan_speed_rpm(smu, 1181 + speed); 1182 + break; 1183 + } 1184 + 1185 + return ret; 1186 + } 1187 + 1165 1188 static int arcturus_get_fan_parameters(struct smu_context *smu) 1166 1189 { 1167 1190 PPTable_t *pptable = smu->smu_table.driver_pptable; ··· 2271 2248 .force_clk_levels = arcturus_force_clk_levels, 2272 2249 .read_sensor = arcturus_read_sensor, 2273 2250 .get_fan_speed_percent = smu_v11_0_get_fan_speed_percent, 2251 + .get_fan_speed_rpm = arcturus_get_fan_speed_rpm, 2274 2252 .get_power_profile_mode = arcturus_get_power_profile_mode, 2275 2253 .set_power_profile_mode = arcturus_set_power_profile_mode, 2276 2254 .set_performance_level = arcturus_set_performance_level,
+24
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
··· 1671 1671 return !!(feature_enabled & SMC_DPM_FEATURE); 1672 1672 } 1673 1673 1674 + static int navi10_get_fan_speed_rpm(struct smu_context *smu, 1675 + uint32_t *speed) 1676 + { 1677 + int ret = 0; 1678 + 1679 + if (!speed) 1680 + return -EINVAL; 1681 + 1682 + switch (smu_v11_0_get_fan_control_mode(smu)) { 1683 + case AMD_FAN_CTRL_AUTO: 1684 + ret = navi10_get_smu_metrics_data(smu, 1685 + METRICS_CURR_FANSPEED, 1686 + speed); 1687 + break; 1688 + default: 1689 + ret = smu_v11_0_get_fan_speed_rpm(smu, 1690 + speed); 1691 + break; 1692 + } 1693 + 1694 + return ret; 1695 + } 1696 + 1674 1697 static int navi10_get_fan_parameters(struct smu_context *smu) 1675 1698 { 1676 1699 PPTable_t *pptable = smu->smu_table.driver_pptable; ··· 3228 3205 .notify_smc_display_config = navi10_notify_smc_display_config, 3229 3206 .is_dpm_running = navi10_is_dpm_running, 3230 3207 .get_fan_speed_percent = smu_v11_0_get_fan_speed_percent, 3208 + .get_fan_speed_rpm = navi10_get_fan_speed_rpm, 3231 3209 .get_power_profile_mode = navi10_get_power_profile_mode, 3232 3210 .set_power_profile_mode = navi10_set_power_profile_mode, 3233 3211 .set_watermarks_table = navi10_set_watermarks_table,
+17
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 1354 1354 return !!(feature_enabled & SMC_DPM_FEATURE); 1355 1355 } 1356 1356 1357 + static int sienna_cichlid_get_fan_speed_rpm(struct smu_context *smu, 1358 + uint32_t *speed) 1359 + { 1360 + if (!speed) 1361 + return -EINVAL; 1362 + 1363 + /* 1364 + * For Sienna_Cichlid and later, the fan speed(rpm) reported 1365 + * by pmfw is always trustable(even when the fan control feature 1366 + * disabled or 0 RPM kicked in). 1367 + */ 1368 + return sienna_cichlid_get_smu_metrics_data(smu, 1369 + METRICS_CURR_FANSPEED, 1370 + speed); 1371 + } 1372 + 1357 1373 static int sienna_cichlid_get_fan_parameters(struct smu_context *smu) 1358 1374 { 1359 1375 uint16_t *table_member; ··· 3853 3837 .notify_smc_display_config = sienna_cichlid_notify_smc_display_config, 3854 3838 .is_dpm_running = sienna_cichlid_is_dpm_running, 3855 3839 .get_fan_speed_percent = smu_v11_0_get_fan_speed_percent, 3840 + .get_fan_speed_rpm = sienna_cichlid_get_fan_speed_rpm, 3856 3841 .get_power_profile_mode = sienna_cichlid_get_power_profile_mode, 3857 3842 .set_power_profile_mode = sienna_cichlid_set_power_profile_mode, 3858 3843 .set_watermarks_table = sienna_cichlid_set_watermarks_table,
+28
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
··· 1298 1298 return 0; 1299 1299 } 1300 1300 1301 + int smu_v11_0_get_fan_speed_rpm(struct smu_context *smu, 1302 + uint32_t *speed) 1303 + { 1304 + struct amdgpu_device *adev = smu->adev; 1305 + uint32_t crystal_clock_freq = 2500; 1306 + uint32_t tach_status; 1307 + uint64_t tmp64; 1308 + 1309 + /* 1310 + * For pre Sienna Cichlid ASICs, the 0 RPM may be not correctly 1311 + * detected via register retrieving. To workaround this, we will 1312 + * report the fan speed as 0 RPM if user just requested such. 1313 + */ 1314 + if ((smu->user_dpm_profile.flags & SMU_CUSTOM_FAN_SPEED_RPM) 1315 + && !smu->user_dpm_profile.fan_speed_rpm) { 1316 + *speed = 0; 1317 + return 0; 1318 + } 1319 + 1320 + tmp64 = (uint64_t)crystal_clock_freq * 60 * 10000; 1321 + 1322 + tach_status = RREG32_SOC15(THM, 0, mmCG_TACH_STATUS); 1323 + do_div(tmp64, tach_status); 1324 + *speed = (uint32_t)tmp64; 1325 + 1326 + return 0; 1327 + } 1328 + 1301 1329 int 1302 1330 smu_v11_0_set_fan_control_mode(struct smu_context *smu, 1303 1331 uint32_t mode)