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