Skip to content

Commit b842b99

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amd/pm: Add caching for SystemMetrics table
Implement caching separately for SystemMetrics table from PMFW. The same table could be used for multiple interfaces. Hence, cache it internally to avoid multiple queries to the firmware. For SystemMetrics table, 5ms cache interval is sufficient. Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Asad Kamal <asad.kamal@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent cf32515 commit b842b99

4 files changed

Lines changed: 36 additions & 13 deletions

File tree

drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ enum smu_table_id {
333333
SMU_TABLE_WIFIBAND,
334334
SMU_TABLE_GPUBOARD_TEMP_METRICS,
335335
SMU_TABLE_BASEBOARD_TEMP_METRICS,
336+
SMU_TABLE_PMFW_SYSTEM_METRICS,
336337
SMU_TABLE_COUNT,
337338
};
338339

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ int smu_v13_0_12_tables_init(struct smu_context *smu)
149149
struct smu_table_cache *cache;
150150
int ret;
151151

152+
ret = smu_table_cache_init(smu, SMU_TABLE_PMFW_SYSTEM_METRICS,
153+
smu_v13_0_12_get_system_metrics_size(), 5);
154+
155+
if (ret)
156+
return ret;
157+
152158
ret = smu_table_cache_init(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS,
153159
sizeof(*baseboard_temp_metrics), 50);
154160
if (ret)
@@ -162,6 +168,7 @@ int smu_v13_0_12_tables_init(struct smu_context *smu)
162168
ret = smu_table_cache_init(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS,
163169
sizeof(*gpuboard_temp_metrics), 50);
164170
if (ret) {
171+
smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
165172
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
166173
return ret;
167174
}
@@ -176,6 +183,7 @@ void smu_v13_0_12_tables_fini(struct smu_context *smu)
176183
{
177184
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
178185
smu_table_cache_fini(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS);
186+
smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
179187
}
180188

181189
static int smu_v13_0_12_get_enabled_mask(struct smu_context *smu,
@@ -222,8 +230,12 @@ static int smu_v13_0_12_fru_get_product_info(struct smu_context *smu,
222230

223231
int smu_v13_0_12_get_max_metrics_size(void)
224232
{
225-
return max3(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t),
226-
sizeof(SystemMetricsTable_t));
233+
return max(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t));
234+
}
235+
236+
size_t smu_v13_0_12_get_system_metrics_size(void)
237+
{
238+
return sizeof(SystemMetricsTable_t);
227239
}
228240

229241
static void smu_v13_0_12_init_xgmi_data(struct smu_context *smu,
@@ -414,14 +426,18 @@ int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
414426
return 0;
415427
}
416428

417-
static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu,
418-
void *metrics_table)
429+
static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu)
419430
{
420431
struct smu_table_context *smu_table = &smu->smu_table;
421-
uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
422432
struct smu_table *table = &smu_table->driver_table;
433+
struct smu_table *tables = smu_table->tables;
434+
struct smu_table *sys_table;
423435
int ret;
424436

437+
sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
438+
if (smu_table_cache_is_valid(sys_table))
439+
return 0;
440+
425441
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetSystemMetricsTable, NULL);
426442
if (ret) {
427443
dev_info(smu->adev->dev,
@@ -430,10 +446,9 @@ static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu,
430446
}
431447

432448
amdgpu_asic_invalidate_hdp(smu->adev, NULL);
433-
memcpy(smu_table->metrics_table, table->cpu_addr, table_size);
434-
435-
if (metrics_table)
436-
memcpy(metrics_table, smu_table->metrics_table, sizeof(SystemMetricsTable_t));
449+
smu_table_cache_update_time(sys_table, jiffies);
450+
memcpy(sys_table->cache.buffer, table->cpu_addr,
451+
smu_v13_0_12_get_system_metrics_size());
437452

438453
return 0;
439454
}
@@ -571,10 +586,10 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
571586
struct amdgpu_baseboard_temp_metrics_v1_0 *baseboard_temp_metrics;
572587
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
573588
struct smu_table_context *smu_table = &smu->smu_table;
574-
SystemMetricsTable_t *metrics =
575-
(SystemMetricsTable_t *)smu_table->metrics_table;
576-
589+
struct smu_table *tables = smu_table->tables;
590+
SystemMetricsTable_t *metrics;
577591
struct smu_table *data_table;
592+
struct smu_table *sys_table;
578593
int ret, sensor_type;
579594
u32 idx, sensors;
580595
ssize_t size;
@@ -596,10 +611,12 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
596611
size = sizeof(*baseboard_temp_metrics);
597612
}
598613

599-
ret = smu_v13_0_12_get_system_metrics_table(smu, NULL);
614+
ret = smu_v13_0_12_get_system_metrics_table(smu);
600615
if (ret)
601616
return ret;
602617

618+
sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
619+
metrics = (SystemMetricsTable_t *)sys_table->cache.buffer;
603620
smu_table_cache_update_time(data_table, jiffies);
604621

605622
if (type == SMU_TEMP_METRIC_GPUBOARD) {

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,10 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
559559
PAGE_SIZE,
560560
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
561561

562+
SMU_TABLE_INIT(tables, SMU_TABLE_PMFW_SYSTEM_METRICS,
563+
smu_v13_0_12_get_system_metrics_size(), PAGE_SIZE,
564+
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
565+
562566
metrics_table = kzalloc(METRICS_TABLE_SIZE, GFP_KERNEL);
563567
if (!metrics_table)
564568
return -ENOMEM;

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table,
8282

8383
bool smu_v13_0_12_is_dpm_running(struct smu_context *smu);
8484
int smu_v13_0_12_get_max_metrics_size(void);
85+
size_t smu_v13_0_12_get_system_metrics_size(void);
8586
int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu);
8687
int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
8788
MetricsMember_t member, uint32_t *value);

0 commit comments

Comments
 (0)