aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2018-03-07 03:14:38 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-03-15 10:56:53 -0400
commit0d8a81d926ec76546d34efcb1fd104c117785000 (patch)
tree7cb36ec680f0da9f7b8ff9c12156955d7f5d3402
parent56088be9afd5ae3bcf60232388751d0e58bd01e8 (diff)
drm/amd/pp: Add rv_copy_table_from/to_smc to smu backend function table
Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smumgr.h5
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c61
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h11
4 files changed, 44 insertions, 36 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
index 474612f2e864..4bdb28fd287a 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
@@ -34,7 +34,6 @@
34#include "rv_ppsmc.h" 34#include "rv_ppsmc.h"
35#include "rv_hwmgr.h" 35#include "rv_hwmgr.h"
36#include "power_state.h" 36#include "power_state.h"
37#include "rv_smumgr.h"
38#include "pp_soc15.h" 37#include "pp_soc15.h"
39 38
40#define RAVEN_MAX_DEEPSLEEP_DIVIDER_ID 5 39#define RAVEN_MAX_DEEPSLEEP_DIVIDER_ID 5
@@ -347,7 +346,7 @@ static int rv_populate_clock_table(struct pp_hwmgr *hwmgr)
347 DpmClocks_t *table = &(rv_data->clock_table); 346 DpmClocks_t *table = &(rv_data->clock_table);
348 struct rv_clock_voltage_information *pinfo = &(rv_data->clock_vol_info); 347 struct rv_clock_voltage_information *pinfo = &(rv_data->clock_vol_info);
349 348
350 result = rv_copy_table_from_smc(hwmgr, (uint8_t *)table, CLOCKTABLE); 349 result = smum_smc_table_manager(hwmgr, (uint8_t *)table, SMU10_CLOCKTABLE, true);
351 350
352 PP_ASSERT_WITH_CODE((0 == result), 351 PP_ASSERT_WITH_CODE((0 == result),
353 "Attempt to copy clock table from smc failed", 352 "Attempt to copy clock table from smc failed",
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
index c2199b8a1afb..fc3a2a533586 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
@@ -69,6 +69,11 @@ enum SMU_MAC_DEFINITION {
69 SMU_UVD_MCLK_HANDSHAKE_DISABLE, 69 SMU_UVD_MCLK_HANDSHAKE_DISABLE,
70}; 70};
71 71
72enum SMU10_TABLE_ID {
73 SMU10_WMTABLE = 0,
74 SMU10_CLOCKTABLE,
75};
76
72extern int smum_get_argument(struct pp_hwmgr *hwmgr); 77extern int smum_get_argument(struct pp_hwmgr *hwmgr);
73 78
74extern int smum_download_powerplay_table(struct pp_hwmgr *hwmgr, void **table); 79extern int smum_download_powerplay_table(struct pp_hwmgr *hwmgr, void **table);
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
index 867f0c1e202f..5dbef413b098 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
@@ -125,7 +125,7 @@ static int rv_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
125 return 0; 125 return 0;
126} 126}
127 127
128int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr, 128static int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
129 uint8_t *table, int16_t table_id) 129 uint8_t *table, int16_t table_id)
130{ 130{
131 struct rv_smumgr *priv = 131 struct rv_smumgr *priv =
@@ -153,7 +153,7 @@ int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
153 return 0; 153 return 0;
154} 154}
155 155
156int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr, 156static int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr,
157 uint8_t *table, int16_t table_id) 157 uint8_t *table, int16_t table_id)
158{ 158{
159 struct rv_smumgr *priv = 159 struct rv_smumgr *priv =
@@ -232,12 +232,12 @@ static int rv_smu_fini(struct pp_hwmgr *hwmgr)
232 if (priv) { 232 if (priv) {
233 rv_smc_disable_sdma(hwmgr); 233 rv_smc_disable_sdma(hwmgr);
234 rv_smc_disable_vcn(hwmgr); 234 rv_smc_disable_vcn(hwmgr);
235 amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle, 235 amdgpu_bo_free_kernel(&priv->smu_tables.entry[SMU10_WMTABLE].handle,
236 &priv->smu_tables.entry[WMTABLE].mc_addr, 236 &priv->smu_tables.entry[SMU10_WMTABLE].mc_addr,
237 priv->smu_tables.entry[WMTABLE].table); 237 priv->smu_tables.entry[SMU10_WMTABLE].table);
238 amdgpu_bo_free_kernel(&priv->smu_tables.entry[CLOCKTABLE].handle, 238 amdgpu_bo_free_kernel(&priv->smu_tables.entry[SMU10_CLOCKTABLE].handle,
239 &priv->smu_tables.entry[CLOCKTABLE].mc_addr, 239 &priv->smu_tables.entry[SMU10_CLOCKTABLE].mc_addr,
240 priv->smu_tables.entry[CLOCKTABLE].table); 240 priv->smu_tables.entry[SMU10_CLOCKTABLE].table);
241 kfree(hwmgr->smu_backend); 241 kfree(hwmgr->smu_backend);
242 hwmgr->smu_backend = NULL; 242 hwmgr->smu_backend = NULL;
243 } 243 }
@@ -279,45 +279,57 @@ static int rv_smu_init(struct pp_hwmgr *hwmgr)
279 sizeof(Watermarks_t), 279 sizeof(Watermarks_t),
280 PAGE_SIZE, 280 PAGE_SIZE,
281 AMDGPU_GEM_DOMAIN_VRAM, 281 AMDGPU_GEM_DOMAIN_VRAM,
282 &priv->smu_tables.entry[WMTABLE].handle, 282 &priv->smu_tables.entry[SMU10_WMTABLE].handle,
283 &priv->smu_tables.entry[WMTABLE].mc_addr, 283 &priv->smu_tables.entry[SMU10_WMTABLE].mc_addr,
284 &priv->smu_tables.entry[WMTABLE].table); 284 &priv->smu_tables.entry[SMU10_WMTABLE].table);
285 285
286 if (r) 286 if (r)
287 goto err0; 287 goto err0;
288 288
289 priv->smu_tables.entry[WMTABLE].version = 0x01; 289 priv->smu_tables.entry[SMU10_WMTABLE].version = 0x01;
290 priv->smu_tables.entry[WMTABLE].size = sizeof(Watermarks_t); 290 priv->smu_tables.entry[SMU10_WMTABLE].size = sizeof(Watermarks_t);
291 priv->smu_tables.entry[WMTABLE].table_id = TABLE_WATERMARKS; 291 priv->smu_tables.entry[SMU10_WMTABLE].table_id = TABLE_WATERMARKS;
292
293 292
294 /* allocate space for watermarks table */ 293 /* allocate space for watermarks table */
295 r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev, 294 r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
296 sizeof(DpmClocks_t), 295 sizeof(DpmClocks_t),
297 PAGE_SIZE, 296 PAGE_SIZE,
298 AMDGPU_GEM_DOMAIN_VRAM, 297 AMDGPU_GEM_DOMAIN_VRAM,
299 &priv->smu_tables.entry[CLOCKTABLE].handle, 298 &priv->smu_tables.entry[SMU10_CLOCKTABLE].handle,
300 &priv->smu_tables.entry[CLOCKTABLE].mc_addr, 299 &priv->smu_tables.entry[SMU10_CLOCKTABLE].mc_addr,
301 &priv->smu_tables.entry[CLOCKTABLE].table); 300 &priv->smu_tables.entry[SMU10_CLOCKTABLE].table);
302 301
303 if (r) 302 if (r)
304 goto err1; 303 goto err1;
305 304
306 priv->smu_tables.entry[CLOCKTABLE].version = 0x01; 305 priv->smu_tables.entry[SMU10_CLOCKTABLE].version = 0x01;
307 priv->smu_tables.entry[CLOCKTABLE].size = sizeof(DpmClocks_t); 306 priv->smu_tables.entry[SMU10_CLOCKTABLE].size = sizeof(DpmClocks_t);
308 priv->smu_tables.entry[CLOCKTABLE].table_id = TABLE_DPMCLOCKS; 307 priv->smu_tables.entry[SMU10_CLOCKTABLE].table_id = TABLE_DPMCLOCKS;
309 308
310 return 0; 309 return 0;
311 310
312err1: 311err1:
313 amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle, 312 amdgpu_bo_free_kernel(&priv->smu_tables.entry[SMU10_WMTABLE].handle,
314 &priv->smu_tables.entry[WMTABLE].mc_addr, 313 &priv->smu_tables.entry[SMU10_WMTABLE].mc_addr,
315 &priv->smu_tables.entry[WMTABLE].table); 314 &priv->smu_tables.entry[SMU10_WMTABLE].table);
316err0: 315err0:
317 kfree(priv); 316 kfree(priv);
318 return -EINVAL; 317 return -EINVAL;
319} 318}
320 319
320static int rv_smc_table_manager(struct pp_hwmgr *hwmgr, uint8_t *table, uint16_t table_id, bool rw)
321{
322 int ret;
323
324 if (rw)
325 ret = rv_copy_table_from_smc(hwmgr, table, table_id);
326 else
327 ret = rv_copy_table_to_smc(hwmgr, table, table_id);
328
329 return ret;
330}
331
332
321const struct pp_smumgr_func rv_smu_funcs = { 333const struct pp_smumgr_func rv_smu_funcs = {
322 .smu_init = &rv_smu_init, 334 .smu_init = &rv_smu_init,
323 .smu_fini = &rv_smu_fini, 335 .smu_fini = &rv_smu_fini,
@@ -328,6 +340,7 @@ const struct pp_smumgr_func rv_smu_funcs = {
328 .download_pptable_settings = NULL, 340 .download_pptable_settings = NULL,
329 .upload_pptable_settings = NULL, 341 .upload_pptable_settings = NULL,
330 .get_argument = rv_read_arg_from_smc, 342 .get_argument = rv_read_arg_from_smc,
343 .smc_table_manager = rv_smc_table_manager,
331}; 344};
332 345
333 346
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
index a3bfdee9d8f7..7b537981d0f6 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
@@ -27,11 +27,7 @@
27#include "rv_ppsmc.h" 27#include "rv_ppsmc.h"
28#include "smu10_driver_if.h" 28#include "smu10_driver_if.h"
29 29
30enum SMU_TABLE_ID { 30#define MAX_SMU_TABLE 2
31 WMTABLE = 0,
32 CLOCKTABLE,
33 MAX_SMU_TABLE,
34};
35 31
36struct smu_table_entry { 32struct smu_table_entry {
37 uint32_t version; 33 uint32_t version;
@@ -50,10 +46,5 @@ struct rv_smumgr {
50 struct smu_table_array smu_tables; 46 struct smu_table_array smu_tables;
51}; 47};
52 48
53int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
54 uint8_t *table, int16_t table_id);
55int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr,
56 uint8_t *table, int16_t table_id);
57
58 49
59#endif 50#endif