aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch154
1 files changed, 154 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch
new file mode 100644
index 00000000..36700ad4
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1365-drm-amd-powerplay-implement-smu-dpm-context-function.patch
@@ -0,0 +1,154 @@
+From 83e22aa76b1cc757236796d3786c2b6b73e94a1b Mon Sep 17 00:00:00 2001
+From: Kevin Wang <Kevin1.Wang@amd.com>
+Date: Mon, 17 Dec 2018 19:48:59 +0800
+Subject: [PATCH 1365/2940] drm/amd/powerplay: implement smu dpm context
+ functions for smu11
+
+This patch implements smu dpm context functions for smu v11.
+
+Signed-off-by: Kevin Wang <Kevin1.Wang@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 +++
+ drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 26 +++++++++++++
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 38 +++++++++++++++++++
+ 3 files changed, 70 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 16f11a41eac6..0fce87c99b41 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -49,6 +49,11 @@ struct smu_table_context
+ uint32_t table_count;
+ };
+
++struct smu_dpm_context {
++ void *dpm_context;
++ uint32_t dpm_context_size;
++};
++
+ struct smu_context
+ {
+ struct amdgpu_device *adev;
+@@ -57,6 +62,7 @@ struct smu_context
+ struct mutex mutex;
+
+ struct smu_table_context smu_table;
++ struct smu_dpm_context smu_dpm;
+ };
+
+ struct smu_funcs
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+index 6ba5bde134a0..c7fccce244fc 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+@@ -36,6 +36,32 @@
+ #define smnMP0_FW_INTF 0x30101c0
+ #define smnMP1_PUB_CTRL 0x3010b14
+
++
++struct smu_11_0_dpm_table {
++ uint32_t min; /* MHz */
++ uint32_t max; /* MHz */
++};
++
++struct smu_11_0_dpm_tables {
++ struct smu_11_0_dpm_table soc_table;
++ struct smu_11_0_dpm_table gfx_table;
++ struct smu_11_0_dpm_table uclk_table;
++ struct smu_11_0_dpm_table eclk_table;
++ struct smu_11_0_dpm_table vclk_table;
++ struct smu_11_0_dpm_table dclk_table;
++ struct smu_11_0_dpm_table dcef_table;
++ struct smu_11_0_dpm_table pixel_table;
++ struct smu_11_0_dpm_table display_table;
++ struct smu_11_0_dpm_table phy_table;
++ struct smu_11_0_dpm_table fclk_table;
++};
++
++struct smu_11_0_dpm_context {
++ struct smu_11_0_dpm_tables dpm_tables;
++ uint32_t workload_policy_mask;
++ uint32_t dcef_min_ds_clk;
++};
++
+ void smu_v11_0_set_smu_funcs(struct smu_context *smu);
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+index a2794ce0be0d..64125ee792bf 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -234,10 +234,40 @@ static int smu_v11_0_read_pptable_from_vbios(struct smu_context *smu)
+ return 0;
+ }
+
++static int smu_v11_0_init_dpm_context(struct smu_context *smu)
++{
++ struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
++
++ if (smu_dpm->dpm_context || smu_dpm->dpm_context_size != 0)
++ return -EINVAL;
++
++ smu_dpm->dpm_context = kzalloc(sizeof(struct smu_11_0_dpm_context), GFP_KERNEL);
++ if (!smu_dpm->dpm_context)
++ return -ENOMEM;
++ smu_dpm->dpm_context_size = sizeof(struct smu_11_0_dpm_context);
++
++ return 0;
++}
++
++static int smu_v11_0_fini_dpm_context(struct smu_context *smu)
++{
++ struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
++
++ if (!smu_dpm->dpm_context || smu_dpm->dpm_context_size == 0)
++ return -EINVAL;
++
++ kfree(smu_dpm->dpm_context);
++ smu_dpm->dpm_context = NULL;
++ smu_dpm->dpm_context_size = 0;
++
++ return 0;
++}
++
+ static int smu_v11_0_init_smc_tables(struct smu_context *smu)
+ {
+ struct smu_table_context *smu_table = &smu->smu_table;
+ struct smu_table *tables = NULL;
++ int ret = 0;
+
+ if (smu_table->tables || smu_table->table_count != 0)
+ return -EINVAL;
+@@ -258,12 +288,17 @@ static int smu_v11_0_init_smc_tables(struct smu_context *smu)
+ SMU_TABLE_INIT(tables, TABLE_OVERDRIVE, sizeof(OverDriveTable_t),
+ PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
+
++ ret = smu_v11_0_init_dpm_context(smu);
++ if (ret)
++ return ret;
++
+ return 0;
+ }
+
+ static int smu_v11_0_fini_smc_tables(struct smu_context *smu)
+ {
+ struct smu_table_context *smu_table = &smu->smu_table;
++ int ret = 0;
+
+ if (!smu_table->tables || smu_table->table_count == 0)
+ return -EINVAL;
+@@ -272,6 +307,9 @@ static int smu_v11_0_fini_smc_tables(struct smu_context *smu)
+ smu_table->tables = NULL;
+ smu_table->table_count = 0;
+
++ ret = smu_v11_0_fini_dpm_context(smu);
++ if (ret)
++ return ret;
+ return 0;
+
+ }
+--
+2.17.1
+