@@ -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
181189static 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
223231int 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
229241static 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 ) {
0 commit comments