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

Revert "drm/amdgpu/swsmu: drop set_fan_speed_percent (v2)"

On some boards the rpm interface apparently does not work at all
leading to the fan not spinning or spinning at strange speeds.
Revert this for now to fix 5.10, 5.11. The follow on patch
fixes this properly for 5.12.

This reverts commit 8d6e65adc25e23fabbc5293b6cd320195c708dca.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1408
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org

+39 -8
+1
drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
··· 553 553 *clock_req); 554 554 uint32_t (*get_fan_control_mode)(struct smu_context *smu); 555 555 int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode); 556 + int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed); 556 557 int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed); 557 558 int (*set_xgmi_pstate)(struct smu_context *smu, uint32_t pstate); 558 559 int (*gfx_off_control)(struct smu_context *smu, bool enable);
+3
drivers/gpu/drm/amd/pm/inc/smu_v11_0.h
··· 203 203 smu_v11_0_set_fan_control_mode(struct smu_context *smu, 204 204 uint32_t mode); 205 205 206 + int 207 + smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed); 208 + 206 209 int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu, 207 210 uint32_t speed); 208 211
+2 -7
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 2151 2151 int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed) 2152 2152 { 2153 2153 int ret = 0; 2154 - uint32_t rpm; 2155 2154 2156 2155 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2157 2156 return -EOPNOTSUPP; 2158 2157 2159 2158 mutex_lock(&smu->mutex); 2160 2159 2161 - if (smu->ppt_funcs->set_fan_speed_rpm) { 2162 - if (speed > 100) 2163 - speed = 100; 2164 - rpm = speed * smu->fan_max_rpm / 100; 2165 - ret = smu->ppt_funcs->set_fan_speed_rpm(smu, rpm); 2166 - } 2160 + if (smu->ppt_funcs->set_fan_speed_percent) 2161 + ret = smu->ppt_funcs->set_fan_speed_percent(smu, speed); 2167 2162 2168 2163 mutex_unlock(&smu->mutex); 2169 2164
+1
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
··· 2326 2326 .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request, 2327 2327 .get_fan_control_mode = smu_v11_0_get_fan_control_mode, 2328 2328 .set_fan_control_mode = smu_v11_0_set_fan_control_mode, 2329 + .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent, 2329 2330 .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm, 2330 2331 .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate, 2331 2332 .gfx_off_control = smu_v11_0_gfx_off_control,
+1
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
··· 2456 2456 .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request, 2457 2457 .get_fan_control_mode = smu_v11_0_get_fan_control_mode, 2458 2458 .set_fan_control_mode = smu_v11_0_set_fan_control_mode, 2459 + .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent, 2459 2460 .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm, 2460 2461 .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate, 2461 2462 .gfx_off_control = smu_v11_0_gfx_off_control,
+1
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 2802 2802 .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request, 2803 2803 .get_fan_control_mode = smu_v11_0_get_fan_control_mode, 2804 2804 .set_fan_control_mode = smu_v11_0_set_fan_control_mode, 2805 + .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent, 2805 2806 .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm, 2806 2807 .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate, 2807 2808 .gfx_off_control = smu_v11_0_gfx_off_control,
+30 -1
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
··· 1174 1174 } 1175 1175 1176 1176 int 1177 + smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed) 1178 + { 1179 + struct amdgpu_device *adev = smu->adev; 1180 + uint32_t duty100, duty; 1181 + uint64_t tmp64; 1182 + 1183 + if (speed > 100) 1184 + speed = 100; 1185 + 1186 + if (smu_v11_0_auto_fan_control(smu, 0)) 1187 + return -EINVAL; 1188 + 1189 + duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1), 1190 + CG_FDO_CTRL1, FMAX_DUTY100); 1191 + if (!duty100) 1192 + return -EINVAL; 1193 + 1194 + tmp64 = (uint64_t)speed * duty100; 1195 + do_div(tmp64, 100); 1196 + duty = (uint32_t)tmp64; 1197 + 1198 + WREG32_SOC15(THM, 0, mmCG_FDO_CTRL0, 1199 + REG_SET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL0), 1200 + CG_FDO_CTRL0, FDO_STATIC_DUTY, duty)); 1201 + 1202 + return smu_v11_0_set_fan_static_mode(smu, FDO_PWM_MODE_STATIC); 1203 + } 1204 + 1205 + int 1177 1206 smu_v11_0_set_fan_control_mode(struct smu_context *smu, 1178 1207 uint32_t mode) 1179 1208 { ··· 1210 1181 1211 1182 switch (mode) { 1212 1183 case AMD_FAN_CTRL_NONE: 1213 - ret = smu_v11_0_set_fan_speed_rpm(smu, smu->fan_max_rpm); 1184 + ret = smu_v11_0_set_fan_speed_percent(smu, 100); 1214 1185 break; 1215 1186 case AMD_FAN_CTRL_MANUAL: 1216 1187 ret = smu_v11_0_auto_fan_control(smu, 0);