aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Huang <JinHuiEric.Huang@amd.com>2016-04-15 17:23:14 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-04 20:30:02 -0400
commita72d5604ead32d282fefbc018ca63a3bf878e2c2 (patch)
treee6ce16351b114c8d0f177914793d945b05a526bb
parent92dea67dd682e56c7a5deebeb7d99de5f4ffcedf (diff)
drm/amd/powerplay: revise reading/writing pptable on Polaris10
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>
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c31
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h3
2 files changed, 30 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c
index 79192c301d78..b146ec8a69bb 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c
@@ -2560,6 +2560,13 @@ int polaris10_reset_asic_tasks(struct pp_hwmgr *hwmgr)
2560 2560
2561int polaris10_hwmgr_backend_fini(struct pp_hwmgr *hwmgr) 2561int polaris10_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
2562{ 2562{
2563 struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
2564
2565 if (data->soft_pp_table) {
2566 kfree(data->soft_pp_table);
2567 data->soft_pp_table = NULL;
2568 }
2569
2563 return phm_hwmgr_backend_fini(hwmgr); 2570 return phm_hwmgr_backend_fini(hwmgr);
2564} 2571}
2565 2572
@@ -4750,18 +4757,34 @@ static int polaris10_get_pp_table(struct pp_hwmgr *hwmgr, char **table)
4750{ 4757{
4751 struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); 4758 struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
4752 4759
4753 *table = (char *)&data->smc_state_table; 4760 if (!data->soft_pp_table) {
4761 data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
4762 if (!data->soft_pp_table)
4763 return -ENOMEM;
4764 memcpy(data->soft_pp_table, hwmgr->soft_pp_table,
4765 hwmgr->soft_pp_table_size);
4766 }
4754 4767
4755 return sizeof(struct SMU74_Discrete_DpmTable); 4768 *table = (char *)&data->soft_pp_table;
4769
4770 return hwmgr->soft_pp_table_size;
4756} 4771}
4757 4772
4758static int polaris10_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size) 4773static int polaris10_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size)
4759{ 4774{
4760 struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); 4775 struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
4761 4776
4762 void *table = (void *)&data->smc_state_table; 4777 if (!data->soft_pp_table) {
4778 data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
4779 if (!data->soft_pp_table)
4780 return -ENOMEM;
4781 }
4782
4783 memcpy(data->soft_pp_table, buf, size);
4784
4785 hwmgr->soft_pp_table = data->soft_pp_table;
4763 4786
4764 memcpy(table, buf, size); 4787 /* TODO: re-init powerplay to implement modified pptable */
4765 4788
4766 return 0; 4789 return 0;
4767} 4790}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h
index 2507404fd51e..b02296444f2f 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h
@@ -309,6 +309,9 @@ struct polaris10_hwmgr {
309 uint32_t up_hyst; 309 uint32_t up_hyst;
310 uint32_t disable_dpm_mask; 310 uint32_t disable_dpm_mask;
311 bool apply_optimized_settings; 311 bool apply_optimized_settings;
312
313 /* soft pptable for re-uploading into smu */
314 void *soft_pp_table;
312}; 315};
313 316
314/* To convert to Q8.8 format for firmware */ 317/* To convert to Q8.8 format for firmware */