Skip to content

Commit

Permalink
drm/amd/powerplay: avoid frequent metrics table export
Browse files Browse the repository at this point in the history
That's unnecessary. Also it makes more sense to show all the clocks
on one metrics table export.

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>
  • Loading branch information
Evan Quan authored and Alex Deucher committed Jan 25, 2019
1 parent 28e732d commit 9e75f70
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 13 deletions.
43 changes: 30 additions & 13 deletions drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1958,16 +1958,36 @@ static uint32_t vega20_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
return (mem_clk * 100);
}

static int vega20_get_metrics_table(struct pp_hwmgr *hwmgr, SmuMetrics_t *metrics_table)
{
struct vega20_hwmgr *data =
(struct vega20_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 vega20_get_gpu_power(struct pp_hwmgr *hwmgr,
uint32_t *query)
{
int ret = 0;
SmuMetrics_t metrics_table;

ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true);
PP_ASSERT_WITH_CODE(!ret,
"Failed to export SMU METRICS table!",
return ret);
ret = vega20_get_metrics_table(hwmgr, &metrics_table);
if (ret)
return ret;

*query = metrics_table.CurrSocketPower << 8;

Expand Down Expand Up @@ -1998,10 +2018,9 @@ static int vega20_get_current_activity_percent(struct pp_hwmgr *hwmgr,
int ret = 0;
SmuMetrics_t metrics_table;

ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true);
PP_ASSERT_WITH_CODE(!ret,
"Failed to export SMU METRICS table!",
return ret);
ret = vega20_get_metrics_table(hwmgr, &metrics_table);
if (ret)
return ret;

*activity_percent = metrics_table.AverageGfxActivity;

Expand All @@ -2019,11 +2038,9 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,

switch (idx) {
case AMDGPU_PP_SENSOR_GFX_SCLK:
ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table,
TABLE_SMU_METRICS, true);
PP_ASSERT_WITH_CODE(!ret,
"Failed to export SMU METRICS table!",
return ret);
ret = vega20_get_metrics_table(hwmgr, &metrics_table);
if (ret)
return ret;

*((uint32_t *)value) = metrics_table.AverageGfxclkFrequency * 100;
*size = 4;
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,9 @@ struct vega20_hwmgr {
/* ---- Gfxoff ---- */
bool gfxoff_allowed;
uint32_t counter_gfxoff;

unsigned long metrics_time;
SmuMetrics_t metrics_table;
};

#define VEGA20_DPM2_NEAR_TDP_DEC 10
Expand Down

0 comments on commit 9e75f70

Please sign in to comment.