aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch
new file mode 100644
index 00000000..7a99a798
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4354-drm-amd-powerplay-fix-deadlock-on-setting-power_dpm_.patch
@@ -0,0 +1,62 @@
+From 78141a8d63f703a2b0cfd29654c6a884f971fb92 Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Wed, 6 Nov 2019 12:40:12 +0800
+Subject: [PATCH 4354/4736] drm/amd/powerplay: fix deadlock on setting
+ power_dpm_force_performance_level
+
+smu_enable_umd_pstate() will try to get the smu->mutex which was already
+hold by its parent API smu_force_performance_level() on the call path.
+Thus deadlock happens.
+
+Change-Id: Ic4d3c7d06eb47eab2ea42b98f399cd95ab320f0c
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index facc19cae7e5..c21fe7ac5df8 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -383,14 +383,25 @@ bool smu_clk_dpm_is_enabled(struct smu_context *smu, enum smu_clk_type clk_type)
+ return true;
+ }
+
+-
++/**
++ * smu_dpm_set_power_gate - power gate/ungate the specific IP block
++ *
++ * @smu: smu_context pointer
++ * @block_type: the IP block to power gate/ungate
++ * @gate: to power gate if true, ungate otherwise
++ *
++ * This API uses no smu->mutex lock protection due to:
++ * 1. It is either called by other IP block(gfx/sdma/vcn/uvd/vce).
++ * This is guarded to be race condition free by the caller.
++ * 2. Or get called on user setting request of power_dpm_force_performance_level.
++ * Under this case, the smu->mutex lock protection is already enforced on
++ * the parent API smu_force_performance_level of the call path.
++ */
+ int smu_dpm_set_power_gate(struct smu_context *smu, uint32_t block_type,
+ bool gate)
+ {
+ int ret = 0;
+
+- mutex_lock(&smu->mutex);
+-
+ switch (block_type) {
+ case AMD_IP_BLOCK_TYPE_UVD:
+ ret = smu_dpm_set_uvd_enable(smu, gate);
+@@ -408,8 +419,6 @@ int smu_dpm_set_power_gate(struct smu_context *smu, uint32_t block_type,
+ break;
+ }
+
+- mutex_unlock(&smu->mutex);
+-
+ return ret;
+ }
+
+--
+2.17.1
+