drm/amd/powerplay: support SMU metrics table on Vega12
authorEvan Quan <evan.quan@amd.com>
Thu, 18 Apr 2019 05:28:12 +0000 (13:28 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 May 2019 17:20:47 +0000 (12:20 -0500)
That should provide some necessary sensor information.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c

index 60c9f9502e65d56d77dc588571ea462c7b47d3fa..aeeeaa79056c64983a9f48d22b49f2ca9ed3c03b 100644 (file)
@@ -1237,6 +1237,27 @@ static uint32_t vega12_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
        return (mem_clk * 100);
 }
 
+static int vega12_get_metrics_table(struct pp_hwmgr *hwmgr, SmuMetrics_t *metrics_table)
+{
+       struct vega12_hwmgr *data =
+                       (struct vega12_hwmgr *)(hwmgr->backend);
+       int ret = 0;
+
+       if (!data->metrics_time || time_after(jiffies, data->metrics_time + HZ / 2)) {
+               ret = smum_smc_table_manager(hwmgr, (uint8_t *)metrics_table,
+                               TABLE_SMU_METRICS, true);
+               if (ret) {
+                       pr_info("Failed to export SMU metrics table!\n");
+                       return ret;
+               }
+               memcpy(&data->metrics_table, metrics_table, sizeof(SmuMetrics_t));
+               data->metrics_time = jiffies;
+       } else
+               memcpy(metrics_table, &data->metrics_table, sizeof(SmuMetrics_t));
+
+       return ret;
+}
+
 static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr, uint32_t *query)
 {
 #if 0
index b3e424d289941aa85d741cc87d09aa541eb524ee..73875399666a826ff51d976091471069306c820a 100644 (file)
@@ -396,6 +396,9 @@ struct vega12_hwmgr {
 
        /* ---- Gfxoff ---- */
        bool                           gfxoff_controlled_by_driver;
+
+       unsigned long                  metrics_time;
+       SmuMetrics_t                   metrics_table;
 };
 
 #define VEGA12_DPM2_NEAR_TDP_DEC                      10
index ddb8015176677f7d8b24f3b739545dafa9a4480f..1eaf0fa28ef77f4865de3f5f651b54eae26d4b84 100644 (file)
@@ -287,8 +287,26 @@ static int vega12_smu_init(struct pp_hwmgr *hwmgr)
        priv->smu_tables.entry[TABLE_OVERDRIVE].version = 0x01;
        priv->smu_tables.entry[TABLE_OVERDRIVE].size = sizeof(OverDriveTable_t);
 
+       /* allocate space for SMU_METRICS table */
+       ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+                                     sizeof(SmuMetrics_t),
+                                     PAGE_SIZE,
+                                     AMDGPU_GEM_DOMAIN_VRAM,
+                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].handle,
+                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].mc_addr,
+                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].table);
+       if (ret)
+               goto err4;
+
+       priv->smu_tables.entry[TABLE_SMU_METRICS].version = 0x01;
+       priv->smu_tables.entry[TABLE_SMU_METRICS].size = sizeof(SmuMetrics_t);
+
        return 0;
 
+err4:
+       amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_OVERDRIVE].handle,
+                               &priv->smu_tables.entry[TABLE_OVERDRIVE].mc_addr,
+                               &priv->smu_tables.entry[TABLE_OVERDRIVE].table);
 err3:
        amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].handle,
                                &priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].mc_addr,
@@ -334,6 +352,9 @@ static int vega12_smu_fini(struct pp_hwmgr *hwmgr)
                amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_OVERDRIVE].handle,
                                      &priv->smu_tables.entry[TABLE_OVERDRIVE].mc_addr,
                                      &priv->smu_tables.entry[TABLE_OVERDRIVE].table);
+               amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_SMU_METRICS].handle,
+                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].mc_addr,
+                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].table);
                kfree(hwmgr->smu_backend);
                hwmgr->smu_backend = NULL;
        }