drm/amd/powerplay: revise reading/writing pptable on Tonga
authorEric Huang <JinHuiEric.Huang@amd.com>
Fri, 15 Apr 2016 21:14:53 +0000 (17:14 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 May 2016 00:29:59 +0000 (20:29 -0400)
Change the way we store pptables in the driver to better
facilitate eventual runtime updates for debugging.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.h

index 9040225bec906771ecfba0d136781f61e327d1fd..28f5c65b7b4e1f1c1ab53af47e5a2eae301e60e4 100644 (file)
@@ -4443,17 +4443,14 @@ int tonga_reset_asic_tasks(struct pp_hwmgr *hwmgr)
 
 int tonga_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
 {
-       if (NULL != hwmgr->dyn_state.vddc_dep_on_dal_pwrl) {
-               kfree(hwmgr->dyn_state.vddc_dep_on_dal_pwrl);
-               hwmgr->dyn_state.vddc_dep_on_dal_pwrl = NULL;
-       }
+       struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       if (NULL != hwmgr->backend) {
-               kfree(hwmgr->backend);
-               hwmgr->backend = NULL;
+       if (data->soft_pp_table) {
+               kfree(data->soft_pp_table);
+               data->soft_pp_table = NULL;
        }
 
-       return 0;
+       return phm_hwmgr_backend_fini(hwmgr);
 }
 
 /**
@@ -6058,18 +6055,34 @@ static int tonga_get_pp_table(struct pp_hwmgr *hwmgr, char **table)
 {
        struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       *table = (char *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+               memcpy(data->soft_pp_table, hwmgr->soft_pp_table,
+                               hwmgr->soft_pp_table_size);
+       }
+
+       *table = (char *)&data->soft_pp_table;
 
-       return sizeof(struct SMU72_Discrete_DpmTable);
+       return hwmgr->soft_pp_table_size;
 }
 
 static int tonga_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size)
 {
        struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       void *table = (void *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+       }
+
+       memcpy(data->soft_pp_table, buf, size);
+
+       hwmgr->soft_pp_table = data->soft_pp_table;
 
-       memcpy(table, buf, size);
+       /* TODO: re-init powerplay to implement modified pptable */
 
        return 0;
 }
index f88d3bbe667120b2319c68b5287eb47ec6d31cb4..c6a6b4006dc1ee43b7e911266057cbbd16437763 100644 (file)
@@ -353,6 +353,8 @@ struct tonga_hwmgr {
        bool                           acp_power_gated;  /* 1: gated, 0:not gated */
        bool                           pg_acp_init;
 
+       /* soft pptable for re-uploading into smu */
+       void *soft_pp_table;
 };
 
 typedef struct tonga_hwmgr tonga_hwmgr;