aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3953-drm-amd-pp-Lock-pm_funcs-when-set-pp-table.patch
diff options
context:
space:
mode:
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.patch96
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
+