struct smu_table_cache *cache;
int ret;
+ ret = smu_table_cache_init(smu, SMU_TABLE_PMFW_SYSTEM_METRICS,
+ smu_v13_0_12_get_system_metrics_size(), 5);
+
+ if (ret)
+ return ret;
+
ret = smu_table_cache_init(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS,
sizeof(*baseboard_temp_metrics), 50);
if (ret)
ret = smu_table_cache_init(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS,
sizeof(*gpuboard_temp_metrics), 50);
if (ret) {
+ smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
return ret;
}
{
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
smu_table_cache_fini(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS);
+ smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
}
static int smu_v13_0_12_get_enabled_mask(struct smu_context *smu,
int smu_v13_0_12_get_max_metrics_size(void)
{
- return max3(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t),
- sizeof(SystemMetricsTable_t));
+ return max(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t));
+}
+
+size_t smu_v13_0_12_get_system_metrics_size(void)
+{
+ return sizeof(SystemMetricsTable_t);
}
static void smu_v13_0_12_init_xgmi_data(struct smu_context *smu,
return 0;
}
-static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu,
- void *metrics_table)
+static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu)
{
struct smu_table_context *smu_table = &smu->smu_table;
- uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
struct smu_table *table = &smu_table->driver_table;
+ struct smu_table *tables = smu_table->tables;
+ struct smu_table *sys_table;
int ret;
+ sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
+ if (smu_table_cache_is_valid(sys_table))
+ return 0;
+
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetSystemMetricsTable, NULL);
if (ret) {
dev_info(smu->adev->dev,
}
amdgpu_asic_invalidate_hdp(smu->adev, NULL);
- memcpy(smu_table->metrics_table, table->cpu_addr, table_size);
-
- if (metrics_table)
- memcpy(metrics_table, smu_table->metrics_table, sizeof(SystemMetricsTable_t));
+ smu_table_cache_update_time(sys_table, jiffies);
+ memcpy(sys_table->cache.buffer, table->cpu_addr,
+ smu_v13_0_12_get_system_metrics_size());
return 0;
}
struct amdgpu_baseboard_temp_metrics_v1_0 *baseboard_temp_metrics;
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
struct smu_table_context *smu_table = &smu->smu_table;
- SystemMetricsTable_t *metrics =
- (SystemMetricsTable_t *)smu_table->metrics_table;
-
+ struct smu_table *tables = smu_table->tables;
+ SystemMetricsTable_t *metrics;
struct smu_table *data_table;
+ struct smu_table *sys_table;
int ret, sensor_type;
u32 idx, sensors;
ssize_t size;
size = sizeof(*baseboard_temp_metrics);
}
- ret = smu_v13_0_12_get_system_metrics_table(smu, NULL);
+ ret = smu_v13_0_12_get_system_metrics_table(smu);
if (ret)
return ret;
+ sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
+ metrics = (SystemMetricsTable_t *)sys_table->cache.buffer;
smu_table_cache_update_time(data_table, jiffies);
if (type == SMU_TEMP_METRIC_GPUBOARD) {