diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2018-03-07 03:14:38 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-03-15 10:56:53 -0400 |
commit | 0d8a81d926ec76546d34efcb1fd104c117785000 (patch) | |
tree | 7cb36ec680f0da9f7b8ff9c12156955d7f5d3402 | |
parent | 56088be9afd5ae3bcf60232388751d0e58bd01e8 (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.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/smumgr.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c | 61 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h | 11 |
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 | ||
72 | enum SMU10_TABLE_ID { | ||
73 | SMU10_WMTABLE = 0, | ||
74 | SMU10_CLOCKTABLE, | ||
75 | }; | ||
76 | |||
72 | extern int smum_get_argument(struct pp_hwmgr *hwmgr); | 77 | extern int smum_get_argument(struct pp_hwmgr *hwmgr); |
73 | 78 | ||
74 | extern int smum_download_powerplay_table(struct pp_hwmgr *hwmgr, void **table); | 79 | extern 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 | ||
128 | int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr, | 128 | static 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 | ||
156 | int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr, | 156 | static 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 | ||
312 | err1: | 311 | err1: |
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); |
316 | err0: | 315 | err0: |
317 | kfree(priv); | 316 | kfree(priv); |
318 | return -EINVAL; | 317 | return -EINVAL; |
319 | } | 318 | } |
320 | 319 | ||
320 | static 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 | |||
321 | const struct pp_smumgr_func rv_smu_funcs = { | 333 | const 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 | ||
30 | enum SMU_TABLE_ID { | 30 | #define MAX_SMU_TABLE 2 |
31 | WMTABLE = 0, | ||
32 | CLOCKTABLE, | ||
33 | MAX_SMU_TABLE, | ||
34 | }; | ||
35 | 31 | ||
36 | struct smu_table_entry { | 32 | struct 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 | ||
53 | int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr, | ||
54 | uint8_t *table, int16_t table_id); | ||
55 | int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr, | ||
56 | uint8_t *table, int16_t table_id); | ||
57 | |||
58 | 49 | ||
59 | #endif | 50 | #endif |