[PATCH 2/2] drm/amd/powerplay: enable SW SMU power profile switch support in KFD
Kevin Wang
kevwa at amd.com
Wed Jul 31 04:02:58 UTC 2019
Reviewed-by: Kevin Wang <kevin1.wang at amd.com>
BR
Kevin
On 7/31/19 11:39 AM, Evan Quan wrote:
> Hook up the SW SMU power profile switch in KFD routine.
>
> Change-Id: I41e53762cdc7504285de89f30e3e6e2bb396b953
> Signed-off-by: Evan Quan <evan.quan at 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 43b11879713d..9c5dcaa8fa48 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -672,8 +672,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 d99a8aa0defb..55ccb4e6a6fb 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -1447,6 +1447,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 9c0a53ef93c4..1b44414cec3b 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> @@ -973,6 +973,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);
More information about the amd-gfx
mailing list