Skip to content

Commit caad261

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/powerplay: move table setting common code to smu_cmn.c
As they are shared by all ASICs. Signed-off-by: Evan Quan <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent e7a95ee commit caad261

File tree

11 files changed

+103
-81
lines changed

11 files changed

+103
-81
lines changed

drivers/gpu/drm/amd/powerplay/amdgpu_smu.c

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -221,47 +221,6 @@ int smu_get_power_num_states(struct smu_context *smu,
221221
return 0;
222222
}
223223

224-
int smu_update_table(struct smu_context *smu, enum smu_table_id table_index, int argument,
225-
void *table_data, bool drv2smu)
226-
{
227-
struct smu_table_context *smu_table = &smu->smu_table;
228-
struct amdgpu_device *adev = smu->adev;
229-
struct smu_table *table = &smu_table->driver_table;
230-
int table_id = smu_cmn_to_asic_specific_index(smu,
231-
CMN2ASIC_MAPPING_TABLE,
232-
table_index);
233-
uint32_t table_size;
234-
int ret = 0;
235-
if (!table_data || table_id >= SMU_TABLE_COUNT || table_id < 0)
236-
return -EINVAL;
237-
238-
table_size = smu_table->tables[table_index].size;
239-
240-
if (drv2smu) {
241-
memcpy(table->cpu_addr, table_data, table_size);
242-
/*
243-
* Flush hdp cache: to guard the content seen by
244-
* GPU is consitent with CPU.
245-
*/
246-
amdgpu_asic_flush_hdp(adev, NULL);
247-
}
248-
249-
ret = smu_send_smc_msg_with_param(smu, drv2smu ?
250-
SMU_MSG_TransferTableDram2Smu :
251-
SMU_MSG_TransferTableSmu2Dram,
252-
table_id | ((argument & 0xFFFF) << 16),
253-
NULL);
254-
if (ret)
255-
return ret;
256-
257-
if (!drv2smu) {
258-
amdgpu_asic_flush_hdp(adev, NULL);
259-
memcpy(table_data, table->cpu_addr, table_size);
260-
}
261-
262-
return ret;
263-
}
264-
265224
bool is_support_sw_smu(struct amdgpu_device *adev)
266225
{
267226
if (adev->asic_type >= CHIP_ARCTURUS)

drivers/gpu/drm/amd/powerplay/arcturus_ppt.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ static int arcturus_get_smu_metrics_data(struct smu_context *smu,
527527

528528
if (!smu_table->metrics_time ||
529529
time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
530-
ret = smu_update_table(smu,
530+
ret = smu_cmn_update_table(smu,
531531
SMU_TABLE_SMU_METRICS,
532532
0,
533533
smu_table->metrics_table,
@@ -1215,7 +1215,7 @@ static int arcturus_get_power_profile_mode(struct smu_context *smu,
12151215
continue;
12161216

12171217
if (smu_version >= 0x360d00) {
1218-
result = smu_update_table(smu,
1218+
result = smu_cmn_update_table(smu,
12191219
SMU_TABLE_ACTIVITY_MONITOR_COEFF,
12201220
workload_type,
12211221
(void *)(&activity_monitor),
@@ -1284,7 +1284,7 @@ static int arcturus_set_power_profile_mode(struct smu_context *smu,
12841284

12851285
if ((profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) &&
12861286
(smu_version >=0x360d00)) {
1287-
ret = smu_update_table(smu,
1287+
ret = smu_cmn_update_table(smu,
12881288
SMU_TABLE_ACTIVITY_MONITOR_COEFF,
12891289
WORKLOAD_PPLIB_CUSTOM_BIT,
12901290
(void *)(&activity_monitor),
@@ -1319,7 +1319,7 @@ static int arcturus_set_power_profile_mode(struct smu_context *smu,
13191319
break;
13201320
}
13211321

1322-
ret = smu_update_table(smu,
1322+
ret = smu_cmn_update_table(smu,
13231323
SMU_TABLE_ACTIVITY_MONITOR_COEFF,
13241324
WORKLOAD_PPLIB_CUSTOM_BIT,
13251325
(void *)(&activity_monitor),
@@ -1913,7 +1913,7 @@ static int arcturus_i2c_eeprom_read_data(struct i2c_adapter *control,
19131913

19141914
mutex_lock(&adev->smu.mutex);
19151915
/* Now read data starting with that address */
1916-
ret = smu_update_table(&adev->smu, SMU_TABLE_I2C_COMMANDS, 0, &req,
1916+
ret = smu_cmn_update_table(&adev->smu, SMU_TABLE_I2C_COMMANDS, 0, &req,
19171917
true);
19181918
mutex_unlock(&adev->smu.mutex);
19191919

@@ -1954,7 +1954,7 @@ static int arcturus_i2c_eeprom_write_data(struct i2c_adapter *control,
19541954
arcturus_fill_eeprom_i2c_req(&req, true, address, numbytes, data);
19551955

19561956
mutex_lock(&adev->smu.mutex);
1957-
ret = smu_update_table(&adev->smu, SMU_TABLE_I2C_COMMANDS, 0, &req, true);
1957+
ret = smu_cmn_update_table(&adev->smu, SMU_TABLE_I2C_COMMANDS, 0, &req, true);
19581958
mutex_unlock(&adev->smu.mutex);
19591959

19601960
if (!ret) {
@@ -2276,7 +2276,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
22762276
.setup_pptable = arcturus_setup_pptable,
22772277
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
22782278
.check_fw_version = smu_v11_0_check_fw_version,
2279-
.write_pptable = smu_v11_0_write_pptable,
2279+
.write_pptable = smu_cmn_write_pptable,
22802280
.set_driver_table_location = smu_v11_0_set_driver_table_location,
22812281
.set_tool_table_location = smu_v11_0_set_tool_table_location,
22822282
.notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,

drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -732,9 +732,6 @@ extern const struct amd_ip_funcs smu_ip_funcs;
732732
extern const struct amdgpu_ip_block_version smu_v11_0_ip_block;
733733
extern const struct amdgpu_ip_block_version smu_v12_0_ip_block;
734734

735-
int smu_update_table(struct smu_context *smu, enum smu_table_id table_index, int argument,
736-
void *table_data, bool drv2smu);
737-
738735
bool is_support_sw_smu(struct amdgpu_device *adev);
739736
int smu_reset(struct smu_context *smu);
740737
int smu_sys_get_pp_table(struct smu_context *smu, void **table);

drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,6 @@ int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu);
156156

157157
int smu_v11_0_check_fw_version(struct smu_context *smu);
158158

159-
int smu_v11_0_write_pptable(struct smu_context *smu);
160-
161159
int smu_v11_0_set_driver_table_location(struct smu_context *smu);
162160

163161
int smu_v11_0_set_tool_table_location(struct smu_context *smu);

drivers/gpu/drm/amd/powerplay/navi10_ppt.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ static int navi10_get_smu_metrics_data(struct smu_context *smu,
489489
mutex_lock(&smu->metrics_lock);
490490
if (!smu_table->metrics_time ||
491491
time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
492-
ret = smu_update_table(smu,
492+
ret = smu_cmn_update_table(smu,
493493
SMU_TABLE_SMU_METRICS,
494494
0,
495495
smu_table->metrics_table,
@@ -1398,7 +1398,7 @@ static int navi10_get_power_profile_mode(struct smu_context *smu, char *buf)
13981398
if (workload_type < 0)
13991399
return -EINVAL;
14001400

1401-
result = smu_update_table(smu,
1401+
result = smu_cmn_update_table(smu,
14021402
SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
14031403
(void *)(&activity_monitor), false);
14041404
if (result) {
@@ -1469,7 +1469,7 @@ static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, u
14691469

14701470
if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
14711471

1472-
ret = smu_update_table(smu,
1472+
ret = smu_cmn_update_table(smu,
14731473
SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
14741474
(void *)(&activity_monitor), false);
14751475
if (ret) {
@@ -1513,7 +1513,7 @@ static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, u
15131513
break;
15141514
}
15151515

1516-
ret = smu_update_table(smu,
1516+
ret = smu_cmn_update_table(smu,
15171517
SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
15181518
(void *)(&activity_monitor), true);
15191519
if (ret) {
@@ -1636,7 +1636,7 @@ static int navi10_set_watermarks_table(struct smu_context *smu,
16361636
/* pass data to smu controller */
16371637
if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
16381638
!(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
1639-
ret = smu_write_watermarks_table(smu);
1639+
ret = smu_cmn_write_watermarks_table(smu);
16401640
if (ret) {
16411641
dev_err(smu->adev->dev, "Failed to update WMTABLE!");
16421642
return ret;
@@ -1957,7 +1957,7 @@ static int navi10_set_default_od_settings(struct smu_context *smu)
19571957
(OverDriveTable_t *)smu->smu_table.boot_overdrive_table;
19581958
int ret = 0;
19591959

1960-
ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0, (void *)od_table, false);
1960+
ret = smu_cmn_update_table(smu, SMU_TABLE_OVERDRIVE, 0, (void *)od_table, false);
19611961
if (ret) {
19621962
dev_err(smu->adev->dev, "Failed to get overdrive table!\n");
19631963
return ret;
@@ -2091,7 +2091,7 @@ static int navi10_od_edit_dpm_table(struct smu_context *smu, enum PP_OD_DPM_TABL
20912091
break;
20922092
case PP_OD_COMMIT_DPM_TABLE:
20932093
navi10_dump_od_table(smu, od_table);
2094-
ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0, (void *)od_table, true);
2094+
ret = smu_cmn_update_table(smu, SMU_TABLE_OVERDRIVE, 0, (void *)od_table, true);
20952095
if (ret) {
20962096
dev_err(smu->adev->dev, "Failed to import overdrive table!\n");
20972097
return ret;
@@ -2289,7 +2289,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
22892289
.setup_pptable = navi10_setup_pptable,
22902290
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
22912291
.check_fw_version = smu_v11_0_check_fw_version,
2292-
.write_pptable = smu_v11_0_write_pptable,
2292+
.write_pptable = smu_cmn_write_pptable,
22932293
.set_driver_table_location = smu_v11_0_set_driver_table_location,
22942294
.set_tool_table_location = smu_v11_0_set_tool_table_location,
22952295
.notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,

drivers/gpu/drm/amd/powerplay/renoir_ppt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static int renoir_get_metrics_table(struct smu_context *smu,
135135

136136
mutex_lock(&smu->metrics_lock);
137137
if (!smu_table->metrics_time || time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(100))) {
138-
ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
138+
ret = smu_cmn_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
139139
(void *)smu_table->metrics_table, false);
140140
if (ret) {
141141
dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
@@ -893,7 +893,7 @@ static int renoir_set_watermarks_table(
893893
/* pass data to smu controller */
894894
if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
895895
!(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
896-
ret = smu_write_watermarks_table(smu);
896+
ret = smu_cmn_write_watermarks_table(smu);
897897
if (ret) {
898898
dev_err(smu->adev->dev, "Failed to update WMTABLE!");
899899
return ret;

drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
396396
mutex_lock(&smu->metrics_lock);
397397
if (!smu_table->metrics_time ||
398398
time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
399-
ret = smu_update_table(smu,
399+
ret = smu_cmn_update_table(smu,
400400
SMU_TABLE_SMU_METRICS,
401401
0,
402402
smu_table->metrics_table,
@@ -1201,7 +1201,7 @@ static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *
12011201
if (workload_type < 0)
12021202
return -EINVAL;
12031203

1204-
result = smu_update_table(smu,
1204+
result = smu_cmn_update_table(smu,
12051205
SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
12061206
(void *)(&activity_monitor), false);
12071207
if (result) {
@@ -1272,7 +1272,7 @@ static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *
12721272

12731273
if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
12741274

1275-
ret = smu_update_table(smu,
1275+
ret = smu_cmn_update_table(smu,
12761276
SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
12771277
(void *)(&activity_monitor), false);
12781278
if (ret) {
@@ -1316,7 +1316,7 @@ static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *
13161316
break;
13171317
}
13181318

1319-
ret = smu_update_table(smu,
1319+
ret = smu_cmn_update_table(smu,
13201320
SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
13211321
(void *)(&activity_monitor), true);
13221322
if (ret) {
@@ -1439,7 +1439,7 @@ static int sienna_cichlid_set_watermarks_table(struct smu_context *smu,
14391439

14401440
if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
14411441
!(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
1442-
ret = smu_write_watermarks_table(smu);
1442+
ret = smu_cmn_write_watermarks_table(smu);
14431443
if (ret) {
14441444
dev_err(smu->adev->dev, "Failed to update WMTABLE!");
14451445
return ret;
@@ -2441,7 +2441,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
24412441
.setup_pptable = sienna_cichlid_setup_pptable,
24422442
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
24432443
.check_fw_version = smu_v11_0_check_fw_version,
2444-
.write_pptable = smu_v11_0_write_pptable,
2444+
.write_pptable = smu_cmn_write_pptable,
24452445
.set_driver_table_location = smu_v11_0_set_driver_table_location,
24462446
.set_tool_table_location = smu_v11_0_set_tool_table_location,
24472447
.notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,

drivers/gpu/drm/amd/powerplay/smu_cmn.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,3 +440,72 @@ int smu_cmn_get_smc_version(struct smu_context *smu,
440440

441441
return ret;
442442
}
443+
444+
int smu_cmn_update_table(struct smu_context *smu,
445+
enum smu_table_id table_index,
446+
int argument,
447+
void *table_data,
448+
bool drv2smu)
449+
{
450+
struct smu_table_context *smu_table = &smu->smu_table;
451+
struct amdgpu_device *adev = smu->adev;
452+
struct smu_table *table = &smu_table->driver_table;
453+
int table_id = smu_cmn_to_asic_specific_index(smu,
454+
CMN2ASIC_MAPPING_TABLE,
455+
table_index);
456+
uint32_t table_size;
457+
int ret = 0;
458+
if (!table_data || table_id >= SMU_TABLE_COUNT || table_id < 0)
459+
return -EINVAL;
460+
461+
table_size = smu_table->tables[table_index].size;
462+
463+
if (drv2smu) {
464+
memcpy(table->cpu_addr, table_data, table_size);
465+
/*
466+
* Flush hdp cache: to guard the content seen by
467+
* GPU is consitent with CPU.
468+
*/
469+
amdgpu_asic_flush_hdp(adev, NULL);
470+
}
471+
472+
ret = smu_send_smc_msg_with_param(smu, drv2smu ?
473+
SMU_MSG_TransferTableDram2Smu :
474+
SMU_MSG_TransferTableSmu2Dram,
475+
table_id | ((argument & 0xFFFF) << 16),
476+
NULL);
477+
if (ret)
478+
return ret;
479+
480+
if (!drv2smu) {
481+
amdgpu_asic_flush_hdp(adev, NULL);
482+
memcpy(table_data, table->cpu_addr, table_size);
483+
}
484+
485+
return ret;
486+
}
487+
488+
int smu_cmn_write_watermarks_table(struct smu_context *smu)
489+
{
490+
void *watermarks_table = smu->smu_table.watermarks_table;
491+
492+
if (!watermarks_table)
493+
return -EINVAL;
494+
495+
return smu_cmn_update_table(smu,
496+
SMU_TABLE_WATERMARKS,
497+
0,
498+
watermarks_table,
499+
true);
500+
}
501+
502+
int smu_cmn_write_pptable(struct smu_context *smu)
503+
{
504+
void *pptable = smu->smu_table.driver_pptable;
505+
506+
return smu_cmn_update_table(smu,
507+
SMU_TABLE_PPTABLE,
508+
0,
509+
pptable,
510+
true);
511+
}

drivers/gpu/drm/amd/powerplay/smu_cmn.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,14 @@ int smu_cmn_get_smc_version(struct smu_context *smu,
5959
uint32_t *if_version,
6060
uint32_t *smu_version);
6161

62+
int smu_cmn_update_table(struct smu_context *smu,
63+
enum smu_table_id table_index,
64+
int argument,
65+
void *table_data,
66+
bool drv2smu);
67+
68+
int smu_cmn_write_watermarks_table(struct smu_context *smu);
69+
70+
int smu_cmn_write_pptable(struct smu_context *smu);
71+
6272
#endif

drivers/gpu/drm/amd/powerplay/smu_v11_0.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -764,17 +764,6 @@ int smu_v11_0_notify_memory_pool_location(struct smu_context *smu)
764764
return ret;
765765
}
766766

767-
int smu_v11_0_write_pptable(struct smu_context *smu)
768-
{
769-
struct smu_table_context *table_context = &smu->smu_table;
770-
int ret = 0;
771-
772-
ret = smu_update_table(smu, SMU_TABLE_PPTABLE, 0,
773-
table_context->driver_pptable, true);
774-
775-
return ret;
776-
}
777-
778767
int smu_v11_0_set_min_deep_sleep_dcefclk(struct smu_context *smu, uint32_t clk)
779768
{
780769
int ret;

0 commit comments

Comments
 (0)