aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch
new file mode 100644
index 00000000..2106c43d
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1452-drm-amd-powerplay-add-vega20_find-force_higest-lowes.patch
@@ -0,0 +1,144 @@
+From 04422afa38edc1287d24f6dadb90db2279cdc193 Mon Sep 17 00:00:00 2001
+From: Chengming Gui <Jack.Gui@amd.com>
+Date: Fri, 18 Jan 2019 10:09:46 +0800
+Subject: [PATCH 1452/2940] drm/amd/powerplay: add
+ vega20_find/force_higest/lowest_dpm for SMU11 (v2)
+
+add vega20_find_highest_dpm_level, vega20_find_lowest_dpm_level,
+ vega20_force_highest_dpm and vega20_force_lowest_dpm functions
+ to support sys interface for SMU11.
+
+v2: fix highest/lowest implementation changes error.
+
+Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 111 +++++++++++++++++++++
+ 1 file changed, 111 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+index 0440e5c7a66e..15fc30fe75dd 100644
+--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+@@ -1614,6 +1614,117 @@ vega20_notify_smc_dispaly_config(struct smu_context *smu)
+ return 0;
+ }
+
++static uint32_t vega20_find_lowest_dpm_level(struct vega20_single_dpm_table *table)
++{
++ uint32_t i;
++
++ for (i = 0; i < table->count; i++) {
++ if (table->dpm_levels[i].enabled)
++ break;
++ }
++ if (i >= table->count) {
++ i = 0;
++ table->dpm_levels[i].enabled = true;
++ }
++
++ return i;
++}
++
++static uint32_t vega20_find_highest_dpm_level(struct vega20_single_dpm_table *table)
++{
++ int i = 0;
++
++ if (!table) {
++ pr_err("[%s] DPM Table does not exist!", __func__);
++ return 0;
++ }
++ if (table->count <= 0) {
++ pr_err("[%s] DPM Table has no entry!", __func__);
++ return 0;
++ }
++ if (table->count > MAX_REGULAR_DPM_NUMBER) {
++ pr_err("[%s] DPM Table has too many entries!", __func__);
++ return MAX_REGULAR_DPM_NUMBER - 1;
++ }
++
++ for (i = table->count - 1; i >= 0; i--) {
++ if (table->dpm_levels[i].enabled)
++ break;
++ }
++ if (i < 0) {
++ i = 0;
++ table->dpm_levels[i].enabled = true;
++ }
++
++ return i;
++}
++
++static int vega20_force_dpm_highest(struct smu_context *smu)
++{
++ uint32_t soft_level;
++ int ret = 0;
++ struct vega20_dpm_table *dpm_table = (struct vega20_dpm_table *)smu->smu_dpm.dpm_context;
++
++ soft_level = vega20_find_highest_dpm_level(&(dpm_table->gfx_table));
++
++ dpm_table->gfx_table.dpm_state.soft_min_level =
++ dpm_table->gfx_table.dpm_state.soft_max_level =
++ dpm_table->gfx_table.dpm_levels[soft_level].value;
++
++ soft_level = vega20_find_highest_dpm_level(&(dpm_table->mem_table));
++
++ dpm_table->mem_table.dpm_state.soft_min_level =
++ dpm_table->mem_table.dpm_state.soft_max_level =
++ dpm_table->mem_table.dpm_levels[soft_level].value;
++
++ ret = vega20_upload_dpm_min_level(smu);
++ if (ret) {
++ pr_err("Failed to upload boot level to highest!");
++ return ret;
++ }
++
++ ret = vega20_upload_dpm_max_level(smu);
++ if (ret) {
++ pr_err("Failed to upload dpm max level to highest!");
++ return ret;
++ }
++
++ return ret;
++}
++
++static int vega20_force_dpm_lowest(struct smu_context *smu)
++{
++ uint32_t soft_level;
++ int ret = 0;
++ struct vega20_dpm_table *dpm_table = (struct vega20_dpm_table *)smu->smu_dpm.dpm_context;
++
++ soft_level = vega20_find_lowest_dpm_level(&(dpm_table->gfx_table));
++
++ dpm_table->gfx_table.dpm_state.soft_min_level =
++ dpm_table->gfx_table.dpm_state.soft_max_level =
++ dpm_table->gfx_table.dpm_levels[soft_level].value;
++
++ soft_level = vega20_find_lowest_dpm_level(&(dpm_table->mem_table));
++
++ dpm_table->mem_table.dpm_state.soft_min_level =
++ dpm_table->mem_table.dpm_state.soft_max_level =
++ dpm_table->mem_table.dpm_levels[soft_level].value;
++
++ ret = vega20_upload_dpm_min_level(smu);
++ if (ret) {
++ pr_err("Failed to upload boot level to lowest!");
++ return ret;
++ }
++
++ ret = vega20_upload_dpm_max_level(smu);
++ if (ret) {
++ pr_err("Failed to upload dpm max level to lowest!");
++ return ret;
++ }
++
++ return ret;
++}
++
+ static const struct pptable_funcs vega20_ppt_funcs = {
+ .alloc_dpm_context = vega20_allocate_dpm_context,
+ .store_powerplay_table = vega20_store_powerplay_table,
+--
+2.17.1
+