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