aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch155
1 files changed, 155 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch
new file mode 100644
index 00000000..ea93edfd
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1366-drm-amd-powerplay-implement-smu_init-fini-_power-fun.patch
@@ -0,0 +1,155 @@
+From 7c494d1b1d1cca531f46ba5279a45ec345464450 Mon Sep 17 00:00:00 2001
+From: Kevin Wang <Kevin1.Wang@amd.com>
+Date: Sat, 15 Dec 2018 10:50:03 +0800
+Subject: [PATCH 1366/2940] drm/amd/powerplay: implement smu_init[fini]_power
+ function for smu11
+
+This patch implements smu_init[fini]_power function 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>
+---
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 6 ++++
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 9 +++++
+ drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 14 ++++++++
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 33 +++++++++++++++++++
+ 4 files changed, 62 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index f79a125a91bc..b275139ae96b 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -167,6 +167,12 @@ static int smu_sw_fini(void *handle)
+ return ret;
+ }
+
++ ret = smu_fini_power(smu);
++ if (ret) {
++ pr_err("Failed to init smu_fini_power!\n");
++ return ret;
++ }
++
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 0fce87c99b41..a12af78a2b9c 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -54,6 +54,11 @@ struct smu_dpm_context {
+ uint32_t dpm_context_size;
+ };
+
++struct smu_power_context {
++ void *power_context;
++ uint32_t power_context_size;
++};
++
+ struct smu_context
+ {
+ struct amdgpu_device *adev;
+@@ -63,6 +68,7 @@ struct smu_context
+
+ struct smu_table_context smu_table;
+ struct smu_dpm_context smu_dpm;
++ struct smu_power_context smu_power;
+ };
+
+ struct smu_funcs
+@@ -71,6 +77,7 @@ struct smu_funcs
+ int (*init_smc_tables)(struct smu_context *smu);
+ int (*fini_smc_tables)(struct smu_context *smu);
+ int (*init_power)(struct smu_context *smu);
++ int (*fini_power)(struct smu_context *smu);
+ int (*load_microcode)(struct smu_context *smu);
+ int (*check_fw_status)(struct smu_context *smu);
+ int (*read_pptable_from_vbios)(struct smu_context *smu);
+@@ -99,6 +106,8 @@ struct smu_funcs
+ ((smu)->funcs->fini_smc_tables ? (smu)->funcs->fini_smc_tables((smu)) : 0)
+ #define smu_init_power(smu) \
+ ((smu)->funcs->init_power ? (smu)->funcs->init_power((smu)) : 0)
++#define smu_fini_power(smu) \
++ ((smu)->funcs->fini_power ? (smu)->funcs->fini_power((smu)) : 0)
+ #define smu_load_microcode(smu) \
+ ((smu)->funcs->load_microcode ? (smu)->funcs->load_microcode((smu)) : 0)
+ #define smu_check_fw_status(smu) \
+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 c7fccce244fc..2853ab717d80 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+@@ -62,6 +62,20 @@ struct smu_11_0_dpm_context {
+ uint32_t dcef_min_ds_clk;
+ };
+
++enum smu_11_0_power_state {
++ SMU_11_0_POWER_STATE__D0 = 0,
++ SMU_11_0_POWER_STATE__D1,
++ SMU_11_0_POWER_STATE__D3, /* Sleep*/
++ SMU_11_0_POWER_STATE__D4, /* Hibernate*/
++ SMU_11_0_POWER_STATE__D5, /* Power off*/
++};
++
++struct smu_11_0_power_context {
++ uint32_t power_source;
++ uint8_t in_power_limit_boost_mode;
++ enum smu_11_0_power_state power_state;
++};
++
+ 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 64125ee792bf..ff8a32d37c51 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -313,6 +313,37 @@ static int smu_v11_0_fini_smc_tables(struct smu_context *smu)
+ return 0;
+
+ }
++
++static int smu_v11_0_init_power(struct smu_context *smu)
++{
++ struct smu_power_context *smu_power = &smu->smu_power;
++
++ if (smu_power->power_context || smu_power->power_context_size != 0)
++ return -EINVAL;
++
++ smu_power->power_context = kzalloc(sizeof(struct smu_11_0_dpm_context),
++ GFP_KERNEL);
++ if (!smu_power->power_context)
++ return -ENOMEM;
++ smu_power->power_context_size = sizeof(struct smu_11_0_dpm_context);
++
++ return 0;
++}
++
++static int smu_v11_0_fini_power(struct smu_context *smu)
++{
++ struct smu_power_context *smu_power = &smu->smu_power;
++
++ if (!smu_power->power_context || smu_power->power_context_size == 0)
++ return -EINVAL;
++
++ kfree(smu_power->power_context);
++ smu_power->power_context = NULL;
++ smu_power->power_context_size = 0;
++
++ return 0;
++}
++
+ static const struct smu_funcs smu_v11_0_funcs = {
+ .init_microcode = smu_v11_0_init_microcode,
+ .load_microcode = smu_v11_0_load_microcode,
+@@ -323,6 +354,8 @@ static const struct smu_funcs smu_v11_0_funcs = {
+ .read_pptable_from_vbios = smu_v11_0_read_pptable_from_vbios,
+ .init_smc_tables = smu_v11_0_init_smc_tables,
+ .fini_smc_tables = smu_v11_0_fini_smc_tables,
++ .init_power = smu_v11_0_init_power,
++ .fini_power = smu_v11_0_fini_power,
+ };
+
+ void smu_v11_0_set_smu_funcs(struct smu_context *smu)
+--
+2.17.1
+