Skip to content

Commit 5bf93e1

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amd/pm: Add caching to SMUv13.0.12 temp metric
Add table caching logic to temperature metrics tables in SMUv13.0.12 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 4760600 commit 5bf93e1

File tree

3 files changed

+79
-24
lines changed

3 files changed

+79
-24
lines changed

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

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,42 @@ const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[SMU_MSG_MAX_COUNT] =
140140
MSG_MAP(GetSystemMetricsTable, PPSMC_MSG_GetSystemMetricsTable, 0),
141141
};
142142

143+
int smu_v13_0_12_tables_init(struct smu_context *smu)
144+
{
145+
struct amdgpu_baseboard_temp_metrics_v1_0 *baseboard_temp_metrics;
146+
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
147+
struct smu_table_context *smu_table = &smu->smu_table;
148+
struct smu_table *tables = smu_table->tables;
149+
struct smu_table_cache *cache;
150+
int ret;
151+
152+
ret = smu_table_cache_init(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS,
153+
sizeof(*baseboard_temp_metrics), 50);
154+
if (ret)
155+
return ret;
156+
/* Initialize base board temperature metrics */
157+
cache = &(tables[SMU_TABLE_BASEBOARD_TEMP_METRICS].cache);
158+
baseboard_temp_metrics =
159+
(struct amdgpu_baseboard_temp_metrics_v1_0 *) cache->buffer;
160+
smu_cmn_init_baseboard_temp_metrics(baseboard_temp_metrics, 1, 0);
161+
/* Initialize GPU board temperature metrics */
162+
ret = smu_table_cache_init(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS,
163+
sizeof(*gpuboard_temp_metrics), 50);
164+
if (ret)
165+
return ret;
166+
cache = &(tables[SMU_TABLE_GPUBOARD_TEMP_METRICS].cache);
167+
gpuboard_temp_metrics = (struct amdgpu_gpuboard_temp_metrics_v1_0 *)cache->buffer;
168+
smu_cmn_init_gpuboard_temp_metrics(gpuboard_temp_metrics, 1, 0);
169+
170+
return 0;
171+
}
172+
173+
void smu_v13_0_12_tables_fini(struct smu_context *smu)
174+
{
175+
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
176+
smu_table_cache_fini(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS);
177+
}
178+
143179
static int smu_v13_0_12_get_enabled_mask(struct smu_context *smu,
144180
uint64_t *feature_mask)
145181
{
@@ -514,34 +550,40 @@ static bool smu_v13_0_12_is_temp_metrics_supported(struct smu_context *smu,
514550
static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
515551
enum smu_temp_metric_type type, void *table)
516552
{
517-
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
518553
struct amdgpu_baseboard_temp_metrics_v1_0 *baseboard_temp_metrics;
519-
SystemMetricsTable_t *metrics;
554+
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
555+
struct smu_table_context *smu_table = &smu->smu_table;
556+
SystemMetricsTable_t *metrics =
557+
(SystemMetricsTable_t *)smu_table->metrics_table;
558+
559+
struct smu_table *data_table;
520560
int ret, sensor_type;
521561
u32 idx, sensors;
522562
ssize_t size;
523563

524-
size = (type == SMU_TEMP_METRIC_GPUBOARD) ?
525-
sizeof(*gpuboard_temp_metrics) : sizeof(*baseboard_temp_metrics);
526-
527-
if (!table)
528-
goto out;
529-
metrics = kzalloc(sizeof(SystemMetricsTable_t), GFP_KERNEL);
530-
if (!metrics)
531-
return -ENOMEM;
532-
gpuboard_temp_metrics = (struct amdgpu_gpuboard_temp_metrics_v1_0 *)table;
533-
baseboard_temp_metrics = (struct amdgpu_baseboard_temp_metrics_v1_0 *)table;
534-
if (type == SMU_TEMP_METRIC_GPUBOARD)
535-
smu_cmn_init_gpuboard_temp_metrics(gpuboard_temp_metrics, 1, 0);
536-
else if (type == SMU_TEMP_METRIC_BASEBOARD)
537-
smu_cmn_init_baseboard_temp_metrics(baseboard_temp_metrics, 1, 0);
538-
539-
ret = smu_v13_0_12_get_system_metrics_table(smu, metrics);
540-
if (ret) {
541-
kfree(metrics);
542-
return ret;
564+
if (type == SMU_TEMP_METRIC_BASEBOARD) {
565+
/* Initialize base board temperature metrics */
566+
data_table =
567+
&smu->smu_table.tables[SMU_TABLE_BASEBOARD_TEMP_METRICS];
568+
baseboard_temp_metrics =
569+
(struct amdgpu_baseboard_temp_metrics_v1_0 *)
570+
data_table->cache.buffer;
571+
size = sizeof(*baseboard_temp_metrics);
572+
} else {
573+
data_table =
574+
&smu->smu_table.tables[SMU_TABLE_GPUBOARD_TEMP_METRICS];
575+
gpuboard_temp_metrics =
576+
(struct amdgpu_gpuboard_temp_metrics_v1_0 *)
577+
data_table->cache.buffer;
578+
size = sizeof(*baseboard_temp_metrics);
543579
}
544580

581+
ret = smu_v13_0_12_get_system_metrics_table(smu, NULL);
582+
if (ret)
583+
return ret;
584+
585+
smu_table_cache_update_time(data_table, jiffies);
586+
545587
if (type == SMU_TEMP_METRIC_GPUBOARD) {
546588
gpuboard_temp_metrics->accumulation_counter = metrics->AccumulationCounter;
547589
gpuboard_temp_metrics->label_version = metrics->LabelVersion;
@@ -586,9 +628,8 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
586628
}
587629
}
588630

589-
kfree(metrics);
631+
memcpy(table, data_table->cache.buffer, size);
590632

591-
out:
592633
return size;
593634
}
594635

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ static void smu_v13_0_12_init_caps(struct smu_context *smu)
354354
if (fw_ver >= 0x04560700) {
355355
if (!amdgpu_sriov_vf(smu->adev))
356356
smu_v13_0_6_cap_set(smu, SMU_CAP(TEMP_METRICS));
357+
} else {
358+
smu_v13_0_12_tables_fini(smu);
357359
}
358360
}
359361

@@ -568,6 +570,9 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
568570
return -ENOMEM;
569571
}
570572

573+
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12))
574+
return smu_v13_0_12_tables_init(smu);
575+
571576
return 0;
572577
}
573578

@@ -696,6 +701,13 @@ static int smu_v13_0_6_init_smc_tables(struct smu_context *smu)
696701
return ret;
697702
}
698703

704+
static int smu_v13_0_6_fini_smc_tables(struct smu_context *smu)
705+
{
706+
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12))
707+
smu_v13_0_12_tables_fini(smu);
708+
return smu_v13_0_fini_smc_tables(smu);
709+
}
710+
699711
static int smu_v13_0_6_get_allowed_feature_mask(struct smu_context *smu,
700712
uint32_t *feature_mask,
701713
uint32_t num)
@@ -3833,7 +3845,7 @@ static const struct pptable_funcs smu_v13_0_6_ppt_funcs = {
38333845
.init_microcode = smu_v13_0_6_init_microcode,
38343846
.fini_microcode = smu_v13_0_fini_microcode,
38353847
.init_smc_tables = smu_v13_0_6_init_smc_tables,
3836-
.fini_smc_tables = smu_v13_0_fini_smc_tables,
3848+
.fini_smc_tables = smu_v13_0_6_fini_smc_tables,
38373849
.init_power = smu_v13_0_init_power,
38383850
.fini_power = smu_v13_0_fini_power,
38393851
.check_fw_status = smu_v13_0_6_check_fw_status,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, void
8888
ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
8989
struct amdgpu_xcp *xcp, void *table,
9090
void *smu_metrics);
91+
int smu_v13_0_12_tables_init(struct smu_context *smu);
92+
void smu_v13_0_12_tables_fini(struct smu_context *smu);
9193
extern const struct cmn2asic_mapping smu_v13_0_12_feature_mask_map[];
9294
extern const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[];
9395
extern const struct smu_temp_funcs smu_v13_0_12_temp_funcs;

0 commit comments

Comments
 (0)