aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3126-drm-amd-powerplay-minor-fixes-around-SW-SMU-power-an.patch
diff options
context:
space:
mode:
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.patch162
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
+