@@ -140,6 +140,42 @@ const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[SMU_MSG_MAX_COUNT] =
140140MSG_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+
143179static int smu_v13_0_12_get_enabled_mask (struct smu_context * smu ,
144180 uint64_t * feature_mask )
145181{
@@ -489,34 +525,40 @@ static bool smu_v13_0_12_is_temp_metrics_supported(struct smu_context *smu,
489525static ssize_t smu_v13_0_12_get_temp_metrics (struct smu_context * smu ,
490526 enum smu_temp_metric_type type , void * table )
491527{
492- struct amdgpu_gpuboard_temp_metrics_v1_0 * gpuboard_temp_metrics ;
493528struct amdgpu_baseboard_temp_metrics_v1_0 * baseboard_temp_metrics ;
494- SystemMetricsTable_t * metrics ;
529+ struct amdgpu_gpuboard_temp_metrics_v1_0 * gpuboard_temp_metrics ;
530+ struct smu_table_context * smu_table = & smu -> smu_table ;
531+ SystemMetricsTable_t * metrics =
532+ (SystemMetricsTable_t * )smu_table -> metrics_table ;
533+
534+ struct smu_table * data_table ;
495535int ret , sensor_type ;
496536u32 idx , sensors ;
497537ssize_t size ;
498538
499- size = (type == SMU_TEMP_METRIC_GPUBOARD ) ?
500- sizeof (* gpuboard_temp_metrics ) : sizeof (* baseboard_temp_metrics );
501-
502- if (!table )
503- goto out ;
504- metrics = kzalloc (sizeof (SystemMetricsTable_t ), GFP_KERNEL );
505- if (!metrics )
506- return - ENOMEM ;
507- gpuboard_temp_metrics = (struct amdgpu_gpuboard_temp_metrics_v1_0 * )table ;
508- baseboard_temp_metrics = (struct amdgpu_baseboard_temp_metrics_v1_0 * )table ;
509- if (type == SMU_TEMP_METRIC_GPUBOARD )
510- smu_cmn_init_gpuboard_temp_metrics (gpuboard_temp_metrics , 1 , 0 );
511- else if (type == SMU_TEMP_METRIC_BASEBOARD )
512- smu_cmn_init_baseboard_temp_metrics (baseboard_temp_metrics , 1 , 0 );
513-
514- ret = smu_v13_0_12_get_system_metrics_table (smu , metrics );
515- if (ret ) {
516- kfree (metrics );
517- return ret ;
539+ if (type == SMU_TEMP_METRIC_BASEBOARD ) {
540+ /* Initialize base board temperature metrics */
541+ data_table =
542+ & smu -> smu_table .tables [SMU_TABLE_BASEBOARD_TEMP_METRICS ];
543+ baseboard_temp_metrics =
544+ (struct amdgpu_baseboard_temp_metrics_v1_0 * )
545+ data_table -> cache .buffer ;
546+ size = sizeof (* baseboard_temp_metrics );
547+ } else {
548+ data_table =
549+ & smu -> smu_table .tables [SMU_TABLE_GPUBOARD_TEMP_METRICS ];
550+ gpuboard_temp_metrics =
551+ (struct amdgpu_gpuboard_temp_metrics_v1_0 * )
552+ data_table -> cache .buffer ;
553+ size = sizeof (* baseboard_temp_metrics );
518554}
519555
556+ ret = smu_v13_0_12_get_system_metrics_table (smu , NULL );
557+ if (ret )
558+ return ret ;
559+
560+ smu_table_cache_update_time (data_table , jiffies );
561+
520562if (type == SMU_TEMP_METRIC_GPUBOARD ) {
521563gpuboard_temp_metrics -> accumulation_counter = metrics -> AccumulationCounter ;
522564gpuboard_temp_metrics -> label_version = metrics -> LabelVersion ;
@@ -561,9 +603,8 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
561603}
562604}
563605
564- kfree ( metrics );
606+ memcpy ( table , data_table -> cache . buffer , size );
565607
566- out :
567608return size ;
568609}
569610
0 commit comments