Recall: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
Feng, Kenneth would like to recall the message, "[PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute". ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
RE: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
Hi Alex, We have confirmed that the performance on Vega20 in the compute mode is expected and doesn't need the similar change. This is because that by default on Vega20 all the deep sleep features are disabled, and ulv feature doesn't involve reducing mclk in Vega20 while it does in Vega10. We then need this change on MI100/MI200 since these deep sleep features are enabled by default. Thanks. From: Deucher, Alexander Sent: Friday, November 8, 2019 10:45 PM To: Feng, Kenneth ; amd-gfx@lists.freedesktop.org Subject: Re: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute Do we need something similar for vega20? Alex From: amd-gfx mailto:amd-gfx-boun...@lists.freedesktop.org>> on behalf of Kenneth Feng mailto:kenneth.f...@amd.com>> Sent: Friday, November 8, 2019 12:42 AM To: amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> mailto:amd-gfx@lists.freedesktop.org>> Cc: Feng, Kenneth mailto:kenneth.f...@amd.com>> Subject: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute This is to improve the performance in the compute mode for vega10. For example, the original performance for a rocm bandwidth test: 2G internal GPU copy, is about 99GB/s. With the idle power features disabled dynamically, the porformance is promoted to about 215GB/s. Signed-off-by: Kenneth Feng mailto:kenneth.f...@amd.com>> --- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 7 +++ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 55 ++ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 + 3 files changed, 64 insertions(+) diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index 0314476..bd35f65 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -969,6 +969,13 @@ static int pp_dpm_switch_power_profile(void *handle, workload = hwmgr->workload_setting[index]; } + if (type == PP_SMC_POWER_PROFILE_COMPUTE && + hwmgr->hwmgr_func->disable_power_features_for_compute_performance) + if (hwmgr->hwmgr_func->disable_power_features_for_compute_performance(hwmgr, en)) { + mutex_unlock(>smu_lock); + return -EINVAL; + } + if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, , 0); mutex_unlock(>smu_lock); diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 4ea63a2..d3229c2 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -5263,6 +5263,59 @@ static int vega10_get_performance_level(struct pp_hwmgr *hwmgr, const struct pp_ return 0; } +static int vega10_disable_power_features_for_compute_performance(struct pp_hwmgr *hwmgr, bool disable) +{ + struct vega10_hwmgr *data = hwmgr->backend; + uint32_t feature_mask = 0; + + if (disable) { + feature_mask |= data->smu_features[GNLD_ULV].enabled ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_GFXCLK].enabled ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_SOCCLK].enabled ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_LCLK].enabled ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_DCEFCLK].enabled ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } else { + feature_mask |= (!data->smu_features[GNLD_ULV].enabled) ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_GFXCLK].enabled) ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_SOCCLK].enabled) ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_LCLK].enabled) ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_DCEFCLK].enabled) ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } + + if (fe
Re: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
Do we need something similar for vega20? Alex From: amd-gfx on behalf of Kenneth Feng Sent: Friday, November 8, 2019 12:42 AM To: amd-gfx@lists.freedesktop.org Cc: Feng, Kenneth Subject: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute This is to improve the performance in the compute mode for vega10. For example, the original performance for a rocm bandwidth test: 2G internal GPU copy, is about 99GB/s. With the idle power features disabled dynamically, the porformance is promoted to about 215GB/s. Signed-off-by: Kenneth Feng --- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 7 +++ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 55 ++ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 + 3 files changed, 64 insertions(+) diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index 0314476..bd35f65 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -969,6 +969,13 @@ static int pp_dpm_switch_power_profile(void *handle, workload = hwmgr->workload_setting[index]; } + if (type == PP_SMC_POWER_PROFILE_COMPUTE && + hwmgr->hwmgr_func->disable_power_features_for_compute_performance) + if (hwmgr->hwmgr_func->disable_power_features_for_compute_performance(hwmgr, en)) { + mutex_unlock(>smu_lock); + return -EINVAL; + } + if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, , 0); mutex_unlock(>smu_lock); diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 4ea63a2..d3229c2 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -5263,6 +5263,59 @@ static int vega10_get_performance_level(struct pp_hwmgr *hwmgr, const struct pp_ return 0; } +static int vega10_disable_power_features_for_compute_performance(struct pp_hwmgr *hwmgr, bool disable) +{ + struct vega10_hwmgr *data = hwmgr->backend; + uint32_t feature_mask = 0; + + if (disable) { + feature_mask |= data->smu_features[GNLD_ULV].enabled ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_GFXCLK].enabled ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_SOCCLK].enabled ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_LCLK].enabled ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_DCEFCLK].enabled ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } else { + feature_mask |= (!data->smu_features[GNLD_ULV].enabled) ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_GFXCLK].enabled) ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_SOCCLK].enabled) ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_LCLK].enabled) ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_DCEFCLK].enabled) ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } + + if (feature_mask) + PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr, + !disable, feature_mask), + "enable/disable power features for compute performance Failed!", + return -EINVAL); + + if (disable) { + data->smu_features[GNLD_ULV].enabled = false; + data->smu_features[GNLD_DS_GFXCLK].enabled = false; + data->smu_features[GNLD_DS_SOCCLK].enabled = false; + data->smu_features[GNLD_DS_LCLK].enabled = false; + data->smu_features[GNLD_DS_DCEFCLK].enabled = false; + } else { + data->smu_features[GNLD_ULV].enabled = true; + data->smu_features[GNLD_DS_GFXCLK].enabled = true; + data->smu_features[GNLD_DS_SOCC
RE: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
> -Original Message- > From: amd-gfx On Behalf Of > Kenneth Feng > Sent: Friday, November 8, 2019 1:43 PM > To: amd-gfx@lists.freedesktop.org > Cc: Feng, Kenneth > Subject: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for > compute > > This is to improve the performance in the compute mode > for vega10. For example, the original performance for a rocm > bandwidth test: 2G internal GPU copy, is about 99GB/s. > With the idle power features disabled dynamically, the porformance > is promoted to about 215GB/s. > > Signed-off-by: Kenneth Feng > --- > drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 7 +++ > drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 55 > ++ > drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 + > 3 files changed, 64 insertions(+) > > diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > index 0314476..bd35f65 100644 > --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > @@ -969,6 +969,13 @@ static int pp_dpm_switch_power_profile(void *handle, > workload = hwmgr->workload_setting[index]; > } > > + if (type == PP_SMC_POWER_PROFILE_COMPUTE && > + hwmgr->hwmgr_func- > >disable_power_features_for_compute_performance) > + if (hwmgr->hwmgr_func- > >disable_power_features_for_compute_performance(hwmgr, en)) { > + mutex_unlock(>smu_lock); > + return -EINVAL; > + } [Quan, Evan] Coding style here seems a little weird. Other than this, the patch is reviewed-by: Evan Quan > + > if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) > hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, > , 0); > mutex_unlock(>smu_lock); > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > index 4ea63a2..d3229c2 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > @@ -5263,6 +5263,59 @@ static int vega10_get_performance_level(struct > pp_hwmgr *hwmgr, const struct pp_ > return 0; > } > > +static int vega10_disable_power_features_for_compute_performance(struct > pp_hwmgr *hwmgr, bool disable) > +{ > + struct vega10_hwmgr *data = hwmgr->backend; > + uint32_t feature_mask = 0; > + > + if (disable) { > + feature_mask |= data->smu_features[GNLD_ULV].enabled ? > + data->smu_features[GNLD_ULV].smu_feature_bitmap : > 0; > + feature_mask |= data- > >smu_features[GNLD_DS_GFXCLK].enabled ? > + data- > >smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; > + feature_mask |= data- > >smu_features[GNLD_DS_SOCCLK].enabled ? > + data- > >smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; > + feature_mask |= data- > >smu_features[GNLD_DS_LCLK].enabled ? > + data- > >smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; > + feature_mask |= data- > >smu_features[GNLD_DS_DCEFCLK].enabled ? > + data- > >smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; > + } else { > + feature_mask |= (!data->smu_features[GNLD_ULV].enabled) ? > + data->smu_features[GNLD_ULV].smu_feature_bitmap : > 0; > + feature_mask |= (!data- > >smu_features[GNLD_DS_GFXCLK].enabled) ? > + data- > >smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; > + feature_mask |= (!data- > >smu_features[GNLD_DS_SOCCLK].enabled) ? > + data- > >smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; > + feature_mask |= (!data- > >smu_features[GNLD_DS_LCLK].enabled) ? > + data- > >smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; > + feature_mask |= (!data- > >smu_features[GNLD_DS_DCEFCLK].enabled) ? > + data- > >smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; > + } > + > + if (feature_mask) > + > PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr, > + !disable, feature_mask), > + "enable/disable power features for compute > performance Failed!", > + return -EINVAL); > + > + if (disable) { > + data->s
RE: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
Reviewed-by: Hawking Zhang Regards, Hawking -Original Message- From: amd-gfx On Behalf Of Kenneth Feng Sent: 2019年11月8日 13:43 To: amd-gfx@lists.freedesktop.org Cc: Feng, Kenneth Subject: [PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute This is to improve the performance in the compute mode for vega10. For example, the original performance for a rocm bandwidth test: 2G internal GPU copy, is about 99GB/s. With the idle power features disabled dynamically, the porformance is promoted to about 215GB/s. Signed-off-by: Kenneth Feng --- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 7 +++ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 55 ++ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 + 3 files changed, 64 insertions(+) diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index 0314476..bd35f65 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -969,6 +969,13 @@ static int pp_dpm_switch_power_profile(void *handle, workload = hwmgr->workload_setting[index]; } + if (type == PP_SMC_POWER_PROFILE_COMPUTE && + hwmgr->hwmgr_func->disable_power_features_for_compute_performance) + if (hwmgr->hwmgr_func->disable_power_features_for_compute_performance(hwmgr, en)) { + mutex_unlock(>smu_lock); + return -EINVAL; + } + if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, , 0); mutex_unlock(>smu_lock); diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 4ea63a2..d3229c2 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -5263,6 +5263,59 @@ static int vega10_get_performance_level(struct pp_hwmgr *hwmgr, const struct pp_ return 0; } +static int vega10_disable_power_features_for_compute_performance(struct +pp_hwmgr *hwmgr, bool disable) { + struct vega10_hwmgr *data = hwmgr->backend; + uint32_t feature_mask = 0; + + if (disable) { + feature_mask |= data->smu_features[GNLD_ULV].enabled ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_GFXCLK].enabled ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_SOCCLK].enabled ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_LCLK].enabled ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_DCEFCLK].enabled ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } else { + feature_mask |= (!data->smu_features[GNLD_ULV].enabled) ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_GFXCLK].enabled) ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_SOCCLK].enabled) ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_LCLK].enabled) ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_DCEFCLK].enabled) ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } + + if (feature_mask) + PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr, + !disable, feature_mask), + "enable/disable power features for compute performance Failed!", + return -EINVAL); + + if (disable) { + data->smu_features[GNLD_ULV].enabled = false; + data->smu_features[GNLD_DS_GFXCLK].enabled = false; + data->smu_features[GNLD_DS_SOCCLK].enabled = false; + data->smu_features[GNLD_DS_LCLK].enabled = false; + data->smu_features[GNLD_DS_DCEFCLK].enabled = false; + } else { + data->smu_features[GNLD_ULV].enabled = true; + data->smu_features[GNLD_DS_GFXCLK].enabled = true; + data->smu_features[GNLD_DS_SOCCLK].enabled = tr
[PATCH v2] drm/amd/powerplay: dynamically disable ds and ulv for compute
This is to improve the performance in the compute mode for vega10. For example, the original performance for a rocm bandwidth test: 2G internal GPU copy, is about 99GB/s. With the idle power features disabled dynamically, the porformance is promoted to about 215GB/s. Signed-off-by: Kenneth Feng --- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 7 +++ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 55 ++ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 + 3 files changed, 64 insertions(+) diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index 0314476..bd35f65 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -969,6 +969,13 @@ static int pp_dpm_switch_power_profile(void *handle, workload = hwmgr->workload_setting[index]; } + if (type == PP_SMC_POWER_PROFILE_COMPUTE && + hwmgr->hwmgr_func->disable_power_features_for_compute_performance) + if (hwmgr->hwmgr_func->disable_power_features_for_compute_performance(hwmgr, en)) { + mutex_unlock(>smu_lock); + return -EINVAL; + } + if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, , 0); mutex_unlock(>smu_lock); diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 4ea63a2..d3229c2 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -5263,6 +5263,59 @@ static int vega10_get_performance_level(struct pp_hwmgr *hwmgr, const struct pp_ return 0; } +static int vega10_disable_power_features_for_compute_performance(struct pp_hwmgr *hwmgr, bool disable) +{ + struct vega10_hwmgr *data = hwmgr->backend; + uint32_t feature_mask = 0; + + if (disable) { + feature_mask |= data->smu_features[GNLD_ULV].enabled ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_GFXCLK].enabled ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_SOCCLK].enabled ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_LCLK].enabled ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= data->smu_features[GNLD_DS_DCEFCLK].enabled ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } else { + feature_mask |= (!data->smu_features[GNLD_ULV].enabled) ? + data->smu_features[GNLD_ULV].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_GFXCLK].enabled) ? + data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_SOCCLK].enabled) ? + data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_LCLK].enabled) ? + data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap : 0; + feature_mask |= (!data->smu_features[GNLD_DS_DCEFCLK].enabled) ? + data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap : 0; + } + + if (feature_mask) + PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr, + !disable, feature_mask), + "enable/disable power features for compute performance Failed!", + return -EINVAL); + + if (disable) { + data->smu_features[GNLD_ULV].enabled = false; + data->smu_features[GNLD_DS_GFXCLK].enabled = false; + data->smu_features[GNLD_DS_SOCCLK].enabled = false; + data->smu_features[GNLD_DS_LCLK].enabled = false; + data->smu_features[GNLD_DS_DCEFCLK].enabled = false; + } else { + data->smu_features[GNLD_ULV].enabled = true; + data->smu_features[GNLD_DS_GFXCLK].enabled = true; + data->smu_features[GNLD_DS_SOCCLK].enabled = true; + data->smu_features[GNLD_DS_LCLK].enabled = true; + data->smu_features[GNLD_DS_DCEFCLK].enabled = true; + } + + return 0; + +} + static const struct pp_hwmgr_func vega10_hwmgr_funcs = { .backend_init = vega10_hwmgr_backend_init, .backend_fini = vega10_hwmgr_backend_fini, @@ -5330,6 +5383,8 @@ static const struct pp_hwmgr_func vega10_hwmgr_funcs = {