@@ -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+
143179static 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,
514550static 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
0 commit comments