aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch
new file mode 100644
index 00000000..2f2e8afd
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1459-drm-amd-powerplay-adjust-power-state-when-set-od_clk.patch
@@ -0,0 +1,204 @@
+From d10759d37624110fd5a266ad230fe25f9960ad34 Mon Sep 17 00:00:00 2001
+From: Likun Gao <Likun.Gao@amd.com>
+Date: Wed, 23 Jan 2019 11:10:59 +0800
+Subject: [PATCH 1459/2940] drm/amd/powerplay: adjust power state when set
+ od_clk
+
+Expose the function of adjust_power_state_dynamic to make it common to
+other functions.
+Add the operate of adjust powet state when set od percentage or
+overdrive commit dpm table.
+
+Signed-off-by: Likun Gao <Likun.Gao@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 80 +++++++++++++++-------
+ 1 file changed, 56 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+index ff44ef89204a..2833bd8a8078 100644
+--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+@@ -1764,44 +1764,35 @@ static enum amd_dpm_forced_level vega20_get_performance_level(struct smu_context
+ return smu_dpm_ctx->dpm_level;
+ }
+
+-static int
+-vega20_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_level level)
++static int vega20_adjust_power_state_dynamic(struct smu_context *smu,
++ enum amd_dpm_forced_level level)
+ {
+ int ret = 0;
+ int index = 0;
+- int i = 0;
+ uint32_t sclk_mask, mclk_mask, soc_mask;
+ long workload;
+ struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
+- if (!smu_dpm_ctx->dpm_context)
+- return -EINVAL;
+
+- for (i = 0; i < smu->adev->num_ip_blocks; i++) {
+- if (smu->adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC)
+- break;
+- }
+- mutex_lock(&smu->mutex);
+- smu->adev->ip_blocks[i].version->funcs->enable_umd_pstate(smu, &level);
+ ret = vega20_display_config_changed(smu);
+ if (ret) {
+ pr_err("Failed to change display config!");
+- goto failed;
++ return ret;
+ }
+ ret = vega20_apply_clocks_adjust_rules(smu);
+ if (ret) {
+ pr_err("Failed to apply clocks adjust rules!");
+- goto failed;
++ return ret;
+ }
+ ret = vega20_notify_smc_dispaly_config(smu);
+ if (ret) {
+ pr_err("Failed to notify smc display config!");
+- goto failed;
++ return ret;
+ }
++
+ switch (level) {
+ case AMD_DPM_FORCED_LEVEL_HIGH:
+ ret = vega20_force_dpm_highest(smu);
+ break;
+-
+ case AMD_DPM_FORCED_LEVEL_LOW:
+ ret = vega20_force_dpm_lowest(smu);
+ break;
+@@ -1819,7 +1810,7 @@ vega20_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_leve
+ &mclk_mask,
+ &soc_mask);
+ if (ret)
+- goto failed;
++ return ret;
+ vega20_force_clk_levels(smu, PP_SCLK, 1 << sclk_mask);
+ vega20_force_clk_levels(smu, PP_MCLK, 1 << mclk_mask);
+ break;
+@@ -1842,8 +1833,31 @@ vega20_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_leve
+ smu->funcs->set_power_profile_mode(smu, &workload, 0);
+ }
+
+-failed:
++ return ret;
++}
++
++static int
++vega20_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_level level)
++{
++ int ret = 0;
++ int i;
++ struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
++
++ if (!smu_dpm_ctx->dpm_context)
++ return -EINVAL;
++
++ for (i = 0; i < smu->adev->num_ip_blocks; i++) {
++ if (smu->adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC)
++ break;
++ }
++
++ mutex_lock(&smu->mutex);
++
++ smu->adev->ip_blocks[i].version->funcs->enable_umd_pstate(smu, &level);
++ ret = vega20_adjust_power_state_dynamic(smu, level);
++
+ mutex_unlock(&smu->mutex);
++
+ return ret;
+ }
+
+@@ -1934,9 +1948,12 @@ static int vega20_set_od_percentage(struct smu_context *smu,
+ struct vega20_single_dpm_table *single_dpm_table;
+ struct vega20_single_dpm_table *golden_dpm_table;
+ uint32_t od_clk, index;
+- int ret, feature_enabled;
++ int ret = 0;
++ int feature_enabled;
+ PPCLK_e clk_id;
+
++ mutex_lock(&(smu->mutex));
++
+ dpm_table = smu_dpm->dpm_context;
+ golden_table = smu_dpm->golden_dpm_context;
+
+@@ -1956,10 +1973,13 @@ static int vega20_set_od_percentage(struct smu_context *smu,
+ index = OD8_SETTING_UCLK_FMAX;
+ break;
+ default:
+- return -EINVAL;
++ ret = -EINVAL;
+ break;
+ }
+
++ if (ret)
++ goto set_od_failed;
++
+ od_clk = golden_dpm_table->dpm_levels[golden_dpm_table->count - 1].value * value;
+ od_clk /= 100;
+ od_clk += golden_dpm_table->dpm_levels[golden_dpm_table->count - 1].value;
+@@ -1967,7 +1987,7 @@ static int vega20_set_od_percentage(struct smu_context *smu,
+ ret = smu_update_od8_settings(smu, index, od_clk);
+ if (ret) {
+ pr_err("[Setoverdrive] failed to set od clk!\n");
+- return ret;
++ goto set_od_failed;
+ }
+
+ if (feature_enabled) {
+@@ -1975,14 +1995,19 @@ static int vega20_set_od_percentage(struct smu_context *smu,
+ clk_id);
+ if (ret) {
+ pr_err("[Setoverdrive] failed to refresh dpm table!\n");
+- return ret;
++ goto set_od_failed;
+ }
+ } else {
+ single_dpm_table->count = 1;
+ single_dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.gfxclk / 100;
+ }
+
+- return 0;
++ ret = vega20_adjust_power_state_dynamic(smu, smu_dpm->dpm_level);
++
++set_od_failed:
++ mutex_unlock(&(smu->mutex));
++
++ return ret;
+ }
+
+ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
+@@ -1999,7 +2024,8 @@ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
+ (struct vega20_od8_settings *)table_context->od8_settings;
+ struct pp_clock_levels_with_latency clocks;
+ int32_t input_index, input_clk, input_vol, i;
+- int od8_id, ret;
++ int od8_id;
++ int ret = 0;
+
+ dpm_table = smu_dpm->dpm_context;
+
+@@ -2204,7 +2230,13 @@ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
+ return -EINVAL;
+ }
+
+- return 0;
++ if (type == PP_OD_COMMIT_DPM_TABLE) {
++ mutex_lock(&(smu->mutex));
++ ret = vega20_adjust_power_state_dynamic(smu, smu_dpm->dpm_level);
++ mutex_unlock(&(smu->mutex));
++ }
++
++ return ret;
+ }
+
+ static const struct pptable_funcs vega20_ppt_funcs = {
+--
+2.17.1
+