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

drm/amd/pm: correct the checks for fan attributes support

On functionality unsupported, -EOPNOTSUPP will be returned. And we rely
on that to determine the fan attributes support.

Fixes: 79c65f3fcbb128 ("drm/amd/pm: do not expose power implementation details to amdgpu_pm.c")

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
685fae24 54c73b51

+160 -109
+2 -2
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 315 315 void *rps, 316 316 bool *equal); 317 317 /* export for sysfs */ 318 - void (*set_fan_control_mode)(void *handle, u32 mode); 319 - u32 (*get_fan_control_mode)(void *handle); 318 + int (*set_fan_control_mode)(void *handle, u32 mode); 319 + int (*get_fan_control_mode)(void *handle, u32 *fan_mode); 320 320 int (*set_fan_speed_pwm)(void *handle, u32 speed); 321 321 int (*get_fan_speed_pwm)(void *handle, u32 *speed); 322 322 int (*force_clock_level)(void *handle, enum pp_clock_type type, uint32_t mask);
+12 -9
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
··· 1087 1087 uint32_t *fan_mode) 1088 1088 { 1089 1089 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1090 + int ret = 0; 1090 1091 1091 1092 if (!pp_funcs->get_fan_control_mode) 1092 1093 return -EOPNOTSUPP; 1093 1094 1094 1095 mutex_lock(&adev->pm.mutex); 1095 - *fan_mode = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle); 1096 + ret = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle, 1097 + fan_mode); 1096 1098 mutex_unlock(&adev->pm.mutex); 1097 1099 1098 - return 0; 1100 + return ret; 1099 1101 } 1100 1102 1101 1103 int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev, ··· 1107 1105 int ret = 0; 1108 1106 1109 1107 if (!pp_funcs->set_fan_speed_pwm) 1110 - return -EINVAL; 1108 + return -EOPNOTSUPP; 1111 1109 1112 1110 mutex_lock(&adev->pm.mutex); 1113 1111 ret = pp_funcs->set_fan_speed_pwm(adev->powerplay.pp_handle, ··· 1124 1122 int ret = 0; 1125 1123 1126 1124 if (!pp_funcs->get_fan_speed_pwm) 1127 - return -EINVAL; 1125 + return -EOPNOTSUPP; 1128 1126 1129 1127 mutex_lock(&adev->pm.mutex); 1130 1128 ret = pp_funcs->get_fan_speed_pwm(adev->powerplay.pp_handle, ··· 1141 1139 int ret = 0; 1142 1140 1143 1141 if (!pp_funcs->get_fan_speed_rpm) 1144 - return -EINVAL; 1142 + return -EOPNOTSUPP; 1145 1143 1146 1144 mutex_lock(&adev->pm.mutex); 1147 1145 ret = pp_funcs->get_fan_speed_rpm(adev->powerplay.pp_handle, ··· 1158 1156 int ret = 0; 1159 1157 1160 1158 if (!pp_funcs->set_fan_speed_rpm) 1161 - return -EINVAL; 1159 + return -EOPNOTSUPP; 1162 1160 1163 1161 mutex_lock(&adev->pm.mutex); 1164 1162 ret = pp_funcs->set_fan_speed_rpm(adev->powerplay.pp_handle, ··· 1172 1170 uint32_t mode) 1173 1171 { 1174 1172 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1173 + int ret = 0; 1175 1174 1176 1175 if (!pp_funcs->set_fan_control_mode) 1177 1176 return -EOPNOTSUPP; 1178 1177 1179 1178 mutex_lock(&adev->pm.mutex); 1180 - pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle, 1181 - mode); 1179 + ret = pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle, 1180 + mode); 1182 1181 mutex_unlock(&adev->pm.mutex); 1183 1182 1184 - return 0; 1183 + return ret; 1185 1184 } 1186 1185 1187 1186 int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
+10 -11
drivers/gpu/drm/amd/pm/amdgpu_pm.c
··· 3147 3147 struct device *dev = kobj_to_dev(kobj); 3148 3148 struct amdgpu_device *adev = dev_get_drvdata(dev); 3149 3149 umode_t effective_mode = attr->mode; 3150 - uint32_t speed = 0; 3151 3150 3152 3151 /* under multi-vf mode, the hwmon attributes are all not supported */ 3153 3152 if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) ··· 3212 3213 return 0; 3213 3214 3214 3215 /* mask fan attributes if we have no bindings for this asic to expose */ 3215 - if (((amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL) && 3216 + if (((amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) && 3216 3217 attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't query fan */ 3217 - ((amdgpu_dpm_get_fan_control_mode(adev, &speed) == -EOPNOTSUPP) && 3218 + ((amdgpu_dpm_get_fan_control_mode(adev, NULL) == -EOPNOTSUPP) && 3218 3219 attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't query state */ 3219 3220 effective_mode &= ~S_IRUGO; 3220 3221 3221 - if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL) && 3222 + if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) && 3222 3223 attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't manage fan */ 3223 - ((amdgpu_dpm_set_fan_control_mode(adev, speed) == -EOPNOTSUPP) && 3224 + ((amdgpu_dpm_set_fan_control_mode(adev, U32_MAX) == -EOPNOTSUPP) && 3224 3225 attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't manage state */ 3225 3226 effective_mode &= ~S_IWUSR; 3226 3227 ··· 3240 3241 return 0; 3241 3242 3242 3243 /* hide max/min values if we can't both query and manage the fan */ 3243 - if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL) && 3244 - (amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL) && 3245 - (amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL) && 3246 - (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL)) && 3244 + if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) && 3245 + (amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) && 3246 + (amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) && 3247 + (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP)) && 3247 3248 (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || 3248 3249 attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) 3249 3250 return 0; 3250 3251 3251 - if ((amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL) && 3252 - (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL) && 3252 + if ((amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) && 3253 + (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP) && 3253 3254 (attr == &sensor_dev_attr_fan1_max.dev_attr.attr || 3254 3255 attr == &sensor_dev_attr_fan1_min.dev_attr.attr)) 3255 3256 return 0;
+16 -3
drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c
··· 6619 6619 u64 tmp64; 6620 6620 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 6621 6621 6622 + if (!speed) 6623 + return -EINVAL; 6624 + 6622 6625 if (adev->pm.no_fan) 6623 6626 return -ENOENT; 6624 6627 ··· 6672 6669 return 0; 6673 6670 } 6674 6671 6675 - static void si_dpm_set_fan_control_mode(void *handle, u32 mode) 6672 + static int si_dpm_set_fan_control_mode(void *handle, u32 mode) 6676 6673 { 6677 6674 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 6675 + 6676 + if (mode == U32_MAX) 6677 + return -EINVAL; 6678 6678 6679 6679 if (mode) { 6680 6680 /* stop auto-manage */ ··· 6691 6685 else 6692 6686 si_fan_ctrl_set_default_mode(adev); 6693 6687 } 6688 + 6689 + return 0; 6694 6690 } 6695 6691 6696 - static u32 si_dpm_get_fan_control_mode(void *handle) 6692 + static int si_dpm_get_fan_control_mode(void *handle, u32 *fan_mode) 6697 6693 { 6698 6694 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 6699 6695 struct si_power_info *si_pi = si_get_pi(adev); 6700 6696 u32 tmp; 6701 6697 6698 + if (!fan_mode) 6699 + return -EINVAL; 6700 + 6702 6701 if (si_pi->fan_is_controlled_by_smc) 6703 6702 return 0; 6704 6703 6705 6704 tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK; 6706 - return (tmp >> FDO_PWM_MODE_SHIFT); 6705 + *fan_mode = (tmp >> FDO_PWM_MODE_SHIFT); 6706 + 6707 + return 0; 6707 6708 } 6708 6709 6709 6710 #if 0
+42 -29
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
··· 488 488 return pm_type; 489 489 } 490 490 491 - static void pp_dpm_set_fan_control_mode(void *handle, uint32_t mode) 491 + static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode) 492 492 { 493 493 struct pp_hwmgr *hwmgr = handle; 494 494 495 495 if (!hwmgr || !hwmgr->pm_en) 496 - return; 496 + return -EOPNOTSUPP; 497 497 498 - if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) { 499 - pr_info_ratelimited("%s was not implemented.\n", __func__); 500 - return; 501 - } 498 + if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) 499 + return -EOPNOTSUPP; 500 + 501 + if (mode == U32_MAX) 502 + return -EINVAL; 503 + 502 504 mutex_lock(&hwmgr->smu_lock); 503 505 hwmgr->hwmgr_func->set_fan_control_mode(hwmgr, mode); 504 506 mutex_unlock(&hwmgr->smu_lock); 507 + 508 + return 0; 505 509 } 506 510 507 - static uint32_t pp_dpm_get_fan_control_mode(void *handle) 511 + static int pp_dpm_get_fan_control_mode(void *handle, uint32_t *fan_mode) 508 512 { 509 513 struct pp_hwmgr *hwmgr = handle; 510 - uint32_t mode = 0; 511 514 512 515 if (!hwmgr || !hwmgr->pm_en) 513 - return 0; 516 + return -EOPNOTSUPP; 514 517 515 - if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) { 516 - pr_info_ratelimited("%s was not implemented.\n", __func__); 517 - return 0; 518 - } 518 + if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) 519 + return -EOPNOTSUPP; 520 + 521 + if (!fan_mode) 522 + return -EINVAL; 523 + 519 524 mutex_lock(&hwmgr->smu_lock); 520 - mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr); 525 + *fan_mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr); 521 526 mutex_unlock(&hwmgr->smu_lock); 522 - return mode; 527 + return 0; 523 528 } 524 529 525 530 static int pp_dpm_set_fan_speed_pwm(void *handle, uint32_t speed) ··· 533 528 int ret = 0; 534 529 535 530 if (!hwmgr || !hwmgr->pm_en) 531 + return -EOPNOTSUPP; 532 + 533 + if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL) 534 + return -EOPNOTSUPP; 535 + 536 + if (speed == U32_MAX) 536 537 return -EINVAL; 537 538 538 - if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL) { 539 - pr_info_ratelimited("%s was not implemented.\n", __func__); 540 - return 0; 541 - } 542 539 mutex_lock(&hwmgr->smu_lock); 543 540 ret = hwmgr->hwmgr_func->set_fan_speed_pwm(hwmgr, speed); 544 541 mutex_unlock(&hwmgr->smu_lock); ··· 553 546 int ret = 0; 554 547 555 548 if (!hwmgr || !hwmgr->pm_en) 556 - return -EINVAL; 549 + return -EOPNOTSUPP; 557 550 558 - if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL) { 559 - pr_info_ratelimited("%s was not implemented.\n", __func__); 560 - return 0; 561 - } 551 + if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL) 552 + return -EOPNOTSUPP; 553 + 554 + if (!speed) 555 + return -EINVAL; 562 556 563 557 mutex_lock(&hwmgr->smu_lock); 564 558 ret = hwmgr->hwmgr_func->get_fan_speed_pwm(hwmgr, speed); ··· 573 565 int ret = 0; 574 566 575 567 if (!hwmgr || !hwmgr->pm_en) 576 - return -EINVAL; 568 + return -EOPNOTSUPP; 577 569 578 570 if (hwmgr->hwmgr_func->get_fan_speed_rpm == NULL) 571 + return -EOPNOTSUPP; 572 + 573 + if (!rpm) 579 574 return -EINVAL; 580 575 581 576 mutex_lock(&hwmgr->smu_lock); ··· 593 582 int ret = 0; 594 583 595 584 if (!hwmgr || !hwmgr->pm_en) 585 + return -EOPNOTSUPP; 586 + 587 + if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) 588 + return -EOPNOTSUPP; 589 + 590 + if (rpm == U32_MAX) 596 591 return -EINVAL; 597 592 598 - if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) { 599 - pr_info_ratelimited("%s was not implemented.\n", __func__); 600 - return 0; 601 - } 602 593 mutex_lock(&hwmgr->smu_lock); 603 594 ret = hwmgr->hwmgr_func->set_fan_speed_rpm(hwmgr, rpm); 604 595 mutex_unlock(&hwmgr->smu_lock);
+78 -55
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 59 59 bool lock_needed); 60 60 static int smu_reset(struct smu_context *smu); 61 61 static int smu_set_fan_speed_pwm(void *handle, u32 speed); 62 - static int smu_set_fan_control_mode(struct smu_context *smu, int value); 62 + static int smu_set_fan_control_mode(void *handle, u32 value); 63 63 static int smu_set_power_limit(void *handle, uint32_t limit); 64 64 static int smu_set_fan_speed_rpm(void *handle, uint32_t speed); 65 65 static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled); ··· 407 407 if (smu->user_dpm_profile.fan_mode == AMD_FAN_CTRL_MANUAL || 408 408 smu->user_dpm_profile.fan_mode == AMD_FAN_CTRL_NONE) { 409 409 ret = smu_set_fan_control_mode(smu, smu->user_dpm_profile.fan_mode); 410 - if (ret) { 410 + if (ret != -EOPNOTSUPP) { 411 411 smu->user_dpm_profile.fan_speed_pwm = 0; 412 412 smu->user_dpm_profile.fan_speed_rpm = 0; 413 413 smu->user_dpm_profile.fan_mode = AMD_FAN_CTRL_AUTO; ··· 416 416 417 417 if (smu->user_dpm_profile.fan_speed_pwm) { 418 418 ret = smu_set_fan_speed_pwm(smu, smu->user_dpm_profile.fan_speed_pwm); 419 - if (ret) 419 + if (ret != -EOPNOTSUPP) 420 420 dev_err(smu->adev->dev, "Failed to set manual fan speed in pwm\n"); 421 421 } 422 422 423 423 if (smu->user_dpm_profile.fan_speed_rpm) { 424 424 ret = smu_set_fan_speed_rpm(smu, smu->user_dpm_profile.fan_speed_rpm); 425 - if (ret) 425 + if (ret != -EOPNOTSUPP) 426 426 dev_err(smu->adev->dev, "Failed to set manual fan speed in rpm\n"); 427 427 } 428 428 } ··· 2218 2218 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2219 2219 return -EOPNOTSUPP; 2220 2220 2221 + if (!smu->ppt_funcs->set_fan_speed_rpm) 2222 + return -EOPNOTSUPP; 2223 + 2224 + if (speed == U32_MAX) 2225 + return -EINVAL; 2226 + 2221 2227 mutex_lock(&smu->mutex); 2222 2228 2223 - if (smu->ppt_funcs->set_fan_speed_rpm) { 2224 - ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed); 2225 - if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2226 - smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_RPM; 2227 - smu->user_dpm_profile.fan_speed_rpm = speed; 2229 + ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed); 2230 + if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2231 + smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_RPM; 2232 + smu->user_dpm_profile.fan_speed_rpm = speed; 2228 2233 2229 - /* Override custom PWM setting as they cannot co-exist */ 2230 - smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_PWM; 2231 - smu->user_dpm_profile.fan_speed_pwm = 0; 2232 - } 2234 + /* Override custom PWM setting as they cannot co-exist */ 2235 + smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_PWM; 2236 + smu->user_dpm_profile.fan_speed_pwm = 0; 2233 2237 } 2234 2238 2235 2239 mutex_unlock(&smu->mutex); ··· 2566 2562 } 2567 2563 2568 2564 2569 - static u32 smu_get_fan_control_mode(void *handle) 2565 + static int smu_get_fan_control_mode(void *handle, u32 *fan_mode) 2570 2566 { 2571 2567 struct smu_context *smu = handle; 2572 - u32 ret = 0; 2573 2568 2574 2569 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2575 - return AMD_FAN_CTRL_NONE; 2570 + return -EOPNOTSUPP; 2571 + 2572 + if (!smu->ppt_funcs->get_fan_control_mode) 2573 + return -EOPNOTSUPP; 2574 + 2575 + if (!fan_mode) 2576 + return -EINVAL; 2576 2577 2577 2578 mutex_lock(&smu->mutex); 2578 2579 2579 - if (smu->ppt_funcs->get_fan_control_mode) 2580 - ret = smu->ppt_funcs->get_fan_control_mode(smu); 2580 + *fan_mode = smu->ppt_funcs->get_fan_control_mode(smu); 2581 2581 2582 2582 mutex_unlock(&smu->mutex); 2583 2583 2584 - return ret; 2584 + return 0; 2585 2585 } 2586 2586 2587 - static int smu_set_fan_control_mode(struct smu_context *smu, int value) 2587 + static int smu_set_fan_control_mode(void *handle, u32 value) 2588 2588 { 2589 + struct smu_context *smu = handle; 2589 2590 int ret = 0; 2590 2591 2591 2592 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2592 - return -EOPNOTSUPP; 2593 + return -EOPNOTSUPP; 2594 + 2595 + if (!smu->ppt_funcs->set_fan_control_mode) 2596 + return -EOPNOTSUPP; 2597 + 2598 + if (value == U32_MAX) 2599 + return -EINVAL; 2593 2600 2594 2601 mutex_lock(&smu->mutex); 2595 2602 2596 - if (smu->ppt_funcs->set_fan_control_mode) { 2597 - ret = smu->ppt_funcs->set_fan_control_mode(smu, value); 2598 - if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) 2599 - smu->user_dpm_profile.fan_mode = value; 2603 + ret = smu->ppt_funcs->set_fan_control_mode(smu, value); 2604 + if (ret) 2605 + goto out; 2606 + 2607 + if (!(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2608 + smu->user_dpm_profile.fan_mode = value; 2609 + 2610 + /* reset user dpm fan speed */ 2611 + if (value != AMD_FAN_CTRL_MANUAL) { 2612 + smu->user_dpm_profile.fan_speed_pwm = 0; 2613 + smu->user_dpm_profile.fan_speed_rpm = 0; 2614 + smu->user_dpm_profile.flags &= ~(SMU_CUSTOM_FAN_SPEED_RPM | SMU_CUSTOM_FAN_SPEED_PWM); 2615 + } 2600 2616 } 2601 2617 2618 + out: 2602 2619 mutex_unlock(&smu->mutex); 2603 - 2604 - /* reset user dpm fan speed */ 2605 - if (!ret && value != AMD_FAN_CTRL_MANUAL && 2606 - !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2607 - smu->user_dpm_profile.fan_speed_pwm = 0; 2608 - smu->user_dpm_profile.fan_speed_rpm = 0; 2609 - smu->user_dpm_profile.flags &= ~(SMU_CUSTOM_FAN_SPEED_RPM | SMU_CUSTOM_FAN_SPEED_PWM); 2610 - } 2611 2620 2612 2621 return ret; 2613 2622 } 2614 - 2615 - static void smu_pp_set_fan_control_mode(void *handle, u32 value) 2616 - { 2617 - struct smu_context *smu = handle; 2618 - 2619 - smu_set_fan_control_mode(smu, value); 2620 - } 2621 - 2622 2623 2623 2624 static int smu_get_fan_speed_pwm(void *handle, u32 *speed) 2624 2625 { ··· 2633 2624 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2634 2625 return -EOPNOTSUPP; 2635 2626 2627 + if (!smu->ppt_funcs->get_fan_speed_pwm) 2628 + return -EOPNOTSUPP; 2629 + 2630 + if (!speed) 2631 + return -EINVAL; 2632 + 2636 2633 mutex_lock(&smu->mutex); 2637 2634 2638 - if (smu->ppt_funcs->get_fan_speed_pwm) 2639 - ret = smu->ppt_funcs->get_fan_speed_pwm(smu, speed); 2635 + ret = smu->ppt_funcs->get_fan_speed_pwm(smu, speed); 2640 2636 2641 2637 mutex_unlock(&smu->mutex); 2642 2638 ··· 2656 2642 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2657 2643 return -EOPNOTSUPP; 2658 2644 2645 + if (!smu->ppt_funcs->set_fan_speed_pwm) 2646 + return -EOPNOTSUPP; 2647 + 2648 + if (speed == U32_MAX) 2649 + return -EINVAL; 2650 + 2659 2651 mutex_lock(&smu->mutex); 2660 2652 2661 - if (smu->ppt_funcs->set_fan_speed_pwm) { 2662 - ret = smu->ppt_funcs->set_fan_speed_pwm(smu, speed); 2663 - if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2664 - smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_PWM; 2665 - smu->user_dpm_profile.fan_speed_pwm = speed; 2653 + ret = smu->ppt_funcs->set_fan_speed_pwm(smu, speed); 2654 + if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { 2655 + smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_PWM; 2656 + smu->user_dpm_profile.fan_speed_pwm = speed; 2666 2657 2667 - /* Override custom RPM setting as they cannot co-exist */ 2668 - smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_RPM; 2669 - smu->user_dpm_profile.fan_speed_rpm = 0; 2670 - } 2658 + /* Override custom RPM setting as they cannot co-exist */ 2659 + smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_RPM; 2660 + smu->user_dpm_profile.fan_speed_rpm = 0; 2671 2661 } 2672 2662 2673 2663 mutex_unlock(&smu->mutex); ··· 2687 2669 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) 2688 2670 return -EOPNOTSUPP; 2689 2671 2672 + if (!smu->ppt_funcs->get_fan_speed_rpm) 2673 + return -EOPNOTSUPP; 2674 + 2675 + if (!speed) 2676 + return -EINVAL; 2677 + 2690 2678 mutex_lock(&smu->mutex); 2691 2679 2692 - if (smu->ppt_funcs->get_fan_speed_rpm) 2693 - ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); 2680 + ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); 2694 2681 2695 2682 mutex_unlock(&smu->mutex); 2696 2683 ··· 3124 3101 3125 3102 static const struct amd_pm_funcs swsmu_pm_funcs = { 3126 3103 /* export for sysfs */ 3127 - .set_fan_control_mode = smu_pp_set_fan_control_mode, 3104 + .set_fan_control_mode = smu_set_fan_control_mode, 3128 3105 .get_fan_control_mode = smu_get_fan_control_mode, 3129 3106 .set_fan_speed_pwm = smu_set_fan_speed_pwm, 3130 3107 .get_fan_speed_pwm = smu_get_fan_speed_pwm,