Commit ada2b8f1 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/powerplay: support SMU metrics table on Vega12

That should provide some necessary sensor information.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 901cb599
...@@ -1237,6 +1237,27 @@ static uint32_t vega12_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low) ...@@ -1237,6 +1237,27 @@ static uint32_t vega12_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
return (mem_clk * 100); 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) static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr, uint32_t *query)
{ {
#if 0 #if 0
......
...@@ -396,6 +396,9 @@ struct vega12_hwmgr { ...@@ -396,6 +396,9 @@ struct vega12_hwmgr {
/* ---- Gfxoff ---- */ /* ---- Gfxoff ---- */
bool gfxoff_controlled_by_driver; bool gfxoff_controlled_by_driver;
unsigned long metrics_time;
SmuMetrics_t metrics_table;
}; };
#define VEGA12_DPM2_NEAR_TDP_DEC 10 #define VEGA12_DPM2_NEAR_TDP_DEC 10
......
...@@ -287,8 +287,26 @@ static int vega12_smu_init(struct pp_hwmgr *hwmgr) ...@@ -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].version = 0x01;
priv->smu_tables.entry[TABLE_OVERDRIVE].size = sizeof(OverDriveTable_t); 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; 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: err3:
amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].handle, amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].handle,
&priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].mc_addr, &priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].mc_addr,
...@@ -334,6 +352,9 @@ static int vega12_smu_fini(struct pp_hwmgr *hwmgr) ...@@ -334,6 +352,9 @@ static int vega12_smu_fini(struct pp_hwmgr *hwmgr)
amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_OVERDRIVE].handle, 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].mc_addr,
&priv->smu_tables.entry[TABLE_OVERDRIVE].table); &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); kfree(hwmgr->smu_backend);
hwmgr->smu_backend = NULL; hwmgr->smu_backend = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment