diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch new file mode 100644 index 00000000..1528b348 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch @@ -0,0 +1,96 @@ +From ed702d57676b439381f67d886edddf5c01ef4986 Mon Sep 17 00:00:00 2001 +From: Rex Zhu <Rex.Zhu@amd.com> +Date: Thu, 22 Mar 2018 15:12:59 +0800 +Subject: [PATCH 3953/4131] drm/amd/pp: Lock pm_funcs when set pp table + +unlock mutex until set pp table completely to avoid +conflict if other pp functions were called simultaneously. + +use hwmgr_handle_task instand of pp_dpm_dispatch_tasks. +It is not make sense that call pp_functions in ip_functions. + +Change-Id: Idcbe9456ef814a7ad17534c4bbe0d1b24c707b8e +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> +--- + drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 28 +++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +index 5c45048..e32d984 100644 +--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c ++++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +@@ -31,8 +31,6 @@ + #include "amdgpu.h" + #include "hwmgr.h" + +-static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_task task_id, +- enum amd_pm_state_type *user_state); + + static const struct amd_pm_funcs pp_dpm_funcs; + +@@ -146,10 +144,12 @@ static int pp_late_init(void *handle) + struct amdgpu_device *adev = handle; + struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; + +- if (hwmgr && hwmgr->pm_en) +- pp_dpm_dispatch_tasks(hwmgr, ++ if (hwmgr && hwmgr->pm_en) { ++ mutex_lock(&hwmgr->smu_lock); ++ hwmgr_handle_task(hwmgr, + AMD_PP_TASK_COMPLETE_INIT, NULL); +- ++ mutex_unlock(&hwmgr->smu_lock); ++ } + return 0; + } + +@@ -620,7 +620,7 @@ static int amd_powerplay_reset(void *handle) + static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size) + { + struct pp_hwmgr *hwmgr = handle; +- int ret = 0; ++ int ret = -ENOMEM; + + if (!hwmgr || !hwmgr->pm_en) + return -EINVAL; +@@ -630,28 +630,28 @@ static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size) + hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table, + hwmgr->soft_pp_table_size, + GFP_KERNEL); +- if (!hwmgr->hardcode_pp_table) { +- mutex_unlock(&hwmgr->smu_lock); +- return -ENOMEM; +- } ++ if (!hwmgr->hardcode_pp_table) ++ goto err; + } + + memcpy(hwmgr->hardcode_pp_table, buf, size); + + hwmgr->soft_pp_table = hwmgr->hardcode_pp_table; +- mutex_unlock(&hwmgr->smu_lock); + + ret = amd_powerplay_reset(handle); + if (ret) +- return ret; ++ goto err; + + if (hwmgr->hwmgr_func->avfs_control) { + ret = hwmgr->hwmgr_func->avfs_control(hwmgr, false); + if (ret) +- return ret; ++ goto err; + } +- ++ mutex_unlock(&hwmgr->smu_lock); + return 0; ++err: ++ mutex_unlock(&hwmgr->smu_lock); ++ return ret; + } + + static int pp_dpm_force_clock_level(void *handle, +-- +2.7.4 + |