diff options
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_.patch | 62 |
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 + |