the soft gpu metrics is not asic related data structure.
unify them to reduce duplicate code.
Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
 
 int smu_v11_0_get_current_pcie_link_speed(struct smu_context *smu);
 
-void smu_v11_0_init_gpu_metrics_v1_0(struct gpu_metrics_v1_0 *gpu_metrics);
-
-void smu_v11_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics);
-
 int smu_v11_0_gfx_ulv_control(struct smu_context *smu,
                              bool enablement);
 
 
 
 int smu_v12_0_set_driver_table_location(struct smu_context *smu);
 
-void smu_v12_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics);
-
 #endif
 #endif
 
        if (ret)
                return ret;
 
-       smu_v11_0_init_gpu_metrics_v1_0(gpu_metrics);
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 0);
 
        gpu_metrics->temperature_edge = metrics.TemperatureEdge;
        gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot;
        gpu_metrics->pcie_link_speed =
                        arcturus_get_current_pcie_link_speed(smu);
 
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
        *table = (void *)gpu_metrics;
 
        return sizeof(struct gpu_metrics_v1_0);
 
 
        mutex_unlock(&smu->metrics_lock);
 
-       smu_v11_0_init_gpu_metrics_v1_0(gpu_metrics);
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 0);
 
        gpu_metrics->temperature_edge = metrics.TemperatureEdge;
        gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot;
        gpu_metrics->pcie_link_speed =
                        smu_v11_0_get_current_pcie_link_speed(smu);
 
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
        *table = (void *)gpu_metrics;
 
        return sizeof(struct gpu_metrics_v1_0);
 
        if (ret)
                return ret;
 
-       smu_v11_0_init_gpu_metrics_v1_0(gpu_metrics);
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 0);
 
        gpu_metrics->temperature_edge = metrics->TemperatureEdge;
        gpu_metrics->temperature_hotspot = metrics->TemperatureHotspot;
        gpu_metrics->pcie_link_speed =
                        smu_v11_0_get_current_pcie_link_speed(smu);
 
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
        *table = (void *)gpu_metrics;
 
        return sizeof(struct gpu_metrics_v1_0);
 
        return link_speed[speed_level];
 }
 
-void smu_v11_0_init_gpu_metrics_v1_0(struct gpu_metrics_v1_0 *gpu_metrics)
-{
-       memset(gpu_metrics, 0xFF, sizeof(struct gpu_metrics_v1_0));
-
-       gpu_metrics->common_header.structure_size =
-                               sizeof(struct gpu_metrics_v1_0);
-       gpu_metrics->common_header.format_revision = 1;
-       gpu_metrics->common_header.content_revision = 0;
-
-       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
-}
-
-void smu_v11_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics)
-{
-       memset(gpu_metrics, 0xFF, sizeof(struct gpu_metrics_v2_0));
-
-       gpu_metrics->common_header.structure_size =
-                               sizeof(struct gpu_metrics_v2_0);
-       gpu_metrics->common_header.format_revision = 2;
-       gpu_metrics->common_header.content_revision = 0;
-
-       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
-}
-
 int smu_v11_0_gfx_ulv_control(struct smu_context *smu,
                              bool enablement)
 {
 
        if (ret)
                return ret;
 
-       smu_v11_0_init_gpu_metrics_v2_0(gpu_metrics);
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 2, 0);
 
        gpu_metrics->temperature_gfx = metrics.GfxTemperature;
        gpu_metrics->temperature_soc = metrics.SocTemperature;
 
        gpu_metrics->throttle_status = metrics.ThrottlerStatus;
 
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
        *table = (void *)gpu_metrics;
 
        return sizeof(struct gpu_metrics_v2_0);
 
        if (ret)
                return ret;
 
-       smu_v12_0_init_gpu_metrics_v2_0(gpu_metrics);
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 2, 0);
 
        gpu_metrics->temperature_gfx = metrics.GfxTemperature;
        gpu_metrics->temperature_soc = metrics.SocTemperature;
 
        gpu_metrics->fan_pwm = metrics.FanPwm;
 
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
        *table = (void *)gpu_metrics;
 
        return sizeof(struct gpu_metrics_v2_0);
 
 
        return ret;
 }
-
-void smu_v12_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics)
-{
-       memset(gpu_metrics, 0xFF, sizeof(struct gpu_metrics_v2_0));
-
-       gpu_metrics->common_header.structure_size =
-                               sizeof(struct gpu_metrics_v2_0);
-       gpu_metrics->common_header.format_revision = 2;
-       gpu_metrics->common_header.content_revision = 0;
-
-       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
-}
 
 
        return ret;
 }
+
+void smu_cmn_init_soft_gpu_metrics(void *table, uint8_t frev, uint8_t crev)
+{
+       struct metrics_table_header *header = (struct metrics_table_header *)table;
+       uint16_t structure_size;
+
+#define METRICS_VERSION(a, b)  ((a << 16) | b )
+
+       switch (METRICS_VERSION(frev, crev)) {
+       case METRICS_VERSION(1, 0):
+               structure_size = sizeof(struct gpu_metrics_v1_0);
+               break;
+       case METRICS_VERSION(2, 0):
+               structure_size = sizeof(struct gpu_metrics_v2_0);
+               break;
+       default:
+               break;
+       }
+
+#undef METRICS_VERSION
+
+       memset(header, 0xFF, structure_size);
+
+       header->format_revision = frev;
+       header->content_revision = crev;
+       header->structure_size = structure_size;
+
+}
 
                              void *metrics_table,
                              bool bypass_cache);
 
+void smu_cmn_init_soft_gpu_metrics(void *table, uint8_t frev, uint8_t crev);
+
 #endif
 #endif