diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch new file mode 100644 index 00000000..c284ba4e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch @@ -0,0 +1,162 @@ +From 9bd0a9e97f397623427fc5e449a73e935c76b926 Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Wed, 24 Jul 2019 14:06:09 +0800 +Subject: [PATCH 3126/4256] drm/amd/powerplay: minor fixes around SW SMU power + and fan setting + +Add checking for possible invalid input and null pointer. And +drop redundant code. + +Change-Id: I6ebd6acd944e821fb19af77ed1eaa8c4b1d407ce +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 22 ++++++++++----------- + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 24 +++++++++++------------ + 2 files changed, 21 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +index a68c25203518..d24eb6980ec1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +@@ -1613,20 +1613,16 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev, + (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) + return -EINVAL; + +- if (is_support_sw_smu(adev)) { +- err = kstrtoint(buf, 10, &value); +- if (err) +- return err; ++ err = kstrtoint(buf, 10, &value); ++ if (err) ++ return err; + ++ if (is_support_sw_smu(adev)) { + smu_set_fan_control_mode(&adev->smu, value); + } else { + if (!adev->powerplay.pp_funcs->set_fan_control_mode) + return -EINVAL; + +- err = kstrtoint(buf, 10, &value); +- if (err) +- return err; +- + amdgpu_dpm_set_fan_control_mode(adev, value); + } + +@@ -2046,16 +2042,18 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev, + return err; + + value = value / 1000000; /* convert to Watt */ ++ + if (is_support_sw_smu(adev)) { +- adev->smu.funcs->set_power_limit(&adev->smu, value); ++ err = smu_set_power_limit(&adev->smu, value); + } else if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->set_power_limit) { + err = adev->powerplay.pp_funcs->set_power_limit(adev->powerplay.pp_handle, value); +- if (err) +- return err; + } else { +- return -EINVAL; ++ err = -EINVAL; + } + ++ if (err) ++ return err; ++ + return count; + } + +diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +index 735802bb07b9..cee480b39ffc 100644 +--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c ++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +@@ -1097,6 +1097,8 @@ static int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n) + max_power_limit *= (100 + smu->smu_table.TDPODLimit); + max_power_limit /= 100; + } ++ if (n > max_power_limit) ++ return -EINVAL; + + if (smu_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, n); +@@ -1418,17 +1420,17 @@ smu_v11_0_get_fan_control_mode(struct smu_context *smu) + } + + static int +-smu_v11_0_smc_fan_control(struct smu_context *smu, bool start) ++smu_v11_0_auto_fan_control(struct smu_context *smu, bool auto_fan_control) + { + int ret = 0; + + if (smu_feature_is_supported(smu, SMU_FEATURE_FAN_CONTROL_BIT)) + return 0; + +- ret = smu_feature_set_enabled(smu, SMU_FEATURE_FAN_CONTROL_BIT, start); ++ ret = smu_feature_set_enabled(smu, SMU_FEATURE_FAN_CONTROL_BIT, auto_fan_control); + if (ret) + pr_err("[%s]%s smc FAN CONTROL feature failed!", +- __func__, (start ? "Start" : "Stop")); ++ __func__, (auto_fan_control ? "Start" : "Stop")); + + return ret; + } +@@ -1452,16 +1454,15 @@ static int + smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed) + { + struct amdgpu_device *adev = smu->adev; +- uint32_t duty100; +- uint32_t duty; ++ uint32_t duty100, duty; + uint64_t tmp64; +- bool stop = 0; + + if (speed > 100) + speed = 100; + +- if (smu_v11_0_smc_fan_control(smu, stop)) ++ if (smu_v11_0_auto_fan_control(smu, 0)) + return -EINVAL; ++ + duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1), + CG_FDO_CTRL1, FMAX_DUTY100); + if (!duty100) +@@ -1483,18 +1484,16 @@ smu_v11_0_set_fan_control_mode(struct smu_context *smu, + uint32_t mode) + { + int ret = 0; +- bool start = 1; +- bool stop = 0; + + switch (mode) { + case AMD_FAN_CTRL_NONE: + ret = smu_v11_0_set_fan_speed_percent(smu, 100); + break; + case AMD_FAN_CTRL_MANUAL: +- ret = smu_v11_0_smc_fan_control(smu, stop); ++ ret = smu_v11_0_auto_fan_control(smu, 0); + break; + case AMD_FAN_CTRL_AUTO: +- ret = smu_v11_0_smc_fan_control(smu, start); ++ ret = smu_v11_0_auto_fan_control(smu, 1); + break; + default: + break; +@@ -1514,13 +1513,12 @@ static int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu, + struct amdgpu_device *adev = smu->adev; + int ret; + uint32_t tach_period, crystal_clock_freq; +- bool stop = 0; + + if (!speed) + return -EINVAL; + + mutex_lock(&(smu->mutex)); +- ret = smu_v11_0_smc_fan_control(smu, stop); ++ ret = smu_v11_0_auto_fan_control(smu, 0); + if (ret) + goto set_fan_speed_rpm_failed; + +-- +2.17.1 + |