aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch
new file mode 100644
index 00000000..87a93d8d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3258-drm-amd-powerplay-enable-SW-SMU-power-profile-switch.patch
@@ -0,0 +1,100 @@
+From 5bb0060dffd82183d4e8c537abfd2fda95a5a158 Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Wed, 31 Jul 2019 10:34:36 +0800
+Subject: [PATCH 3258/4256] drm/amd/powerplay: enable SW SMU power profile
+ switch support in KFD
+
+Hook up the SW SMU power profile switch in KFD routine.
+
+Change-Id: I41e53762cdc7504285de89f30e3e6e2bb396b953
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 8 +++--
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 36 +++++++++++++++++++
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 3 ++
+ 3 files changed, 45 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+index bb2374842b82..34529ee28d4d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+@@ -671,8 +671,12 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
+
+- if (adev->powerplay.pp_funcs &&
+- adev->powerplay.pp_funcs->switch_power_profile)
++ if (is_support_sw_smu(adev))
++ smu_switch_power_profile(&adev->smu,
++ PP_SMC_POWER_PROFILE_COMPUTE,
++ !idle);
++ else if (adev->powerplay.pp_funcs &&
++ adev->powerplay.pp_funcs->switch_power_profile)
+ amdgpu_dpm_switch_power_profile(adev,
+ PP_SMC_POWER_PROFILE_COMPUTE,
+ !idle);
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index 9ba24ac54502..f928c5f97d07 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -1679,6 +1679,42 @@ int smu_handle_task(struct smu_context *smu,
+ return ret;
+ }
+
++int smu_switch_power_profile(struct smu_context *smu,
++ enum PP_SMC_POWER_PROFILE type,
++ bool en)
++{
++ struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
++ long workload;
++ uint32_t index;
++
++ if (!smu->pm_enabled)
++ return -EINVAL;
++
++ if (!(type < PP_SMC_POWER_PROFILE_CUSTOM))
++ return -EINVAL;
++
++ mutex_lock(&smu->mutex);
++
++ if (!en) {
++ smu->workload_mask &= ~(1 << smu->workload_prority[type]);
++ index = fls(smu->workload_mask);
++ index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
++ workload = smu->workload_setting[index];
++ } else {
++ smu->workload_mask |= (1 << smu->workload_prority[type]);
++ index = fls(smu->workload_mask);
++ index = index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
++ workload = smu->workload_setting[index];
++ }
++
++ if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL)
++ smu_set_power_profile_mode(smu, &workload, 0);
++
++ mutex_unlock(&smu->mutex);
++
++ return 0;
++}
++
+ enum amd_dpm_forced_level smu_get_performance_level(struct smu_context *smu)
+ {
+ struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 2579b002616c..f813072ab9e4 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -788,6 +788,9 @@ extern int smu_dpm_set_power_gate(struct smu_context *smu,uint32_t block_type, b
+ extern int smu_handle_task(struct smu_context *smu,
+ enum amd_dpm_forced_level level,
+ enum amd_pp_task task_id);
++int smu_switch_power_profile(struct smu_context *smu,
++ enum PP_SMC_POWER_PROFILE type,
++ bool en);
+ int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t *smu_version);
+ int smu_get_dpm_freq_by_index(struct smu_context *smu, enum smu_clk_type clk_type,
+ uint16_t level, uint32_t *value);
+--
+2.17.1
+