summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
diff options
context:
space:
mode:
authorKevin Wang2018-12-17 12:48:59 +0100
committerAlex Deucher2019-03-19 21:03:55 +0100
commit142dec6266b24df2e56f87347471032922e40bc2 (patch)
treefc2db0b43fc1fef62767feb3b805c2617f2caddc /drivers/gpu/drm/amd/powerplay/smu_v11_0.c
parentdrm/amd/powerplay: implement smu_init[fini]_smc_tables for smu11 (diff)
downloadkernel-qcow2-linux-142dec6266b24df2e56f87347471032922e40bc2.tar.gz
kernel-qcow2-linux-142dec6266b24df2e56f87347471032922e40bc2.tar.xz
kernel-qcow2-linux-142dec6266b24df2e56f87347471032922e40bc2.zip
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> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/powerplay/smu_v11_0.c')
-rw-r--r--drivers/gpu/drm/amd/powerplay/smu_v11_0.c38
1 files changed, 38 insertions, 0 deletions
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;
}