aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch
new file mode 100644
index 00000000..1ec04d0b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2396-drm-amd-powerplay-fix-deadlock-issue-for-smu_force_p.patch
@@ -0,0 +1,64 @@
+From 325c8b433e9ad8431b3ce0afb1e34827f80ae7c4 Mon Sep 17 00:00:00 2001
+From: Kevin Wang <kevin1.wang@amd.com>
+Date: Wed, 15 May 2019 15:59:38 +0800
+Subject: [PATCH 2396/2940] drm/amd/powerplay: fix deadlock issue for
+ smu_force_performance_level
+
+the smu->mutex is internal lock resource in sw-smu, some functions will use
+it at the same time, so it maybe will cause deadlock issue.
+this patch fix this issue in smu_force_performance_level function.
+
+Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 9 ---------
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 5 ++++-
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+index 49f0539fbf6c..b854119db5c0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+@@ -370,18 +370,9 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,
+ }
+
+ if (is_support_sw_smu(adev)) {
+- mutex_lock(&adev->pm.mutex);
+- if (adev->pm.dpm.thermal_active) {
+- count = -EINVAL;
+- mutex_unlock(&adev->pm.mutex);
+- goto fail;
+- }
+ ret = smu_force_performance_level(&adev->smu, level);
+ if (ret)
+ count = -EINVAL;
+- else
+- adev->pm.dpm.forced_level = level;
+- mutex_unlock(&adev->pm.mutex);
+ } else if (adev->powerplay.pp_funcs->force_performance_level) {
+ mutex_lock(&adev->pm.mutex);
+ if (adev->pm.dpm.thermal_active) {
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index 9384c1a5c594..ca16ead46379 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -1459,12 +1459,15 @@ int smu_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_lev
+ break;
+ }
+
+- mutex_lock(&smu->mutex);
+
+ smu->adev->ip_blocks[i].version->funcs->enable_umd_pstate(smu, &level);
+ ret = smu_handle_task(smu, level,
+ AMD_PP_TASK_READJUST_POWER_STATE);
++ if (ret)
++ return ret;
+
++ mutex_lock(&smu->mutex);
++ smu_dpm_ctx->dpm_level = level;
+ mutex_unlock(&smu->mutex);
+
+ return ret;
+--
+2.17.1
+