diff options
author | Evan Quan <evan.quan@amd.com> | 2019-01-24 04:55:39 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-01-25 16:15:37 -0500 |
commit | 9e75f709fa2bc38aa77247aa58e5c7141f27a108 (patch) | |
tree | 505b75d2b259578b2e3c23a1446bacf1803ed88e | |
parent | 28e732dcd46b235c0242b9ec76964f17e6b00d1e (diff) |
drm/amd/powerplay: avoid frequent metrics table export
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>
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 43 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h | 3 |
2 files changed, 33 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 13f124125f5a..7b49a9a13a4a 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -1958,16 +1958,36 @@ static uint32_t vega20_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low) | |||
1958 | return (mem_clk * 100); | 1958 | return (mem_clk * 100); |
1959 | } | 1959 | } |
1960 | 1960 | ||
1961 | static int vega20_get_metrics_table(struct pp_hwmgr *hwmgr, SmuMetrics_t *metrics_table) | ||
1962 | { | ||
1963 | struct vega20_hwmgr *data = | ||
1964 | (struct vega20_hwmgr *)(hwmgr->backend); | ||
1965 | int ret = 0; | ||
1966 | |||
1967 | if (!data->metrics_time || time_after(jiffies, data->metrics_time + HZ / 2)) { | ||
1968 | ret = smum_smc_table_manager(hwmgr, (uint8_t *)metrics_table, | ||
1969 | TABLE_SMU_METRICS, true); | ||
1970 | if (ret) { | ||
1971 | pr_info("Failed to export SMU metrics table!\n"); | ||
1972 | return ret; | ||
1973 | } | ||
1974 | memcpy(&data->metrics_table, metrics_table, sizeof(SmuMetrics_t)); | ||
1975 | data->metrics_time = jiffies; | ||
1976 | } else | ||
1977 | memcpy(metrics_table, &data->metrics_table, sizeof(SmuMetrics_t)); | ||
1978 | |||
1979 | return ret; | ||
1980 | } | ||
1981 | |||
1961 | static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr, | 1982 | static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr, |
1962 | uint32_t *query) | 1983 | uint32_t *query) |
1963 | { | 1984 | { |
1964 | int ret = 0; | 1985 | int ret = 0; |
1965 | SmuMetrics_t metrics_table; | 1986 | SmuMetrics_t metrics_table; |
1966 | 1987 | ||
1967 | ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true); | 1988 | ret = vega20_get_metrics_table(hwmgr, &metrics_table); |
1968 | PP_ASSERT_WITH_CODE(!ret, | 1989 | if (ret) |
1969 | "Failed to export SMU METRICS table!", | 1990 | return ret; |
1970 | return ret); | ||
1971 | 1991 | ||
1972 | *query = metrics_table.CurrSocketPower << 8; | 1992 | *query = metrics_table.CurrSocketPower << 8; |
1973 | 1993 | ||
@@ -1998,10 +2018,9 @@ static int vega20_get_current_activity_percent(struct pp_hwmgr *hwmgr, | |||
1998 | int ret = 0; | 2018 | int ret = 0; |
1999 | SmuMetrics_t metrics_table; | 2019 | SmuMetrics_t metrics_table; |
2000 | 2020 | ||
2001 | ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true); | 2021 | ret = vega20_get_metrics_table(hwmgr, &metrics_table); |
2002 | PP_ASSERT_WITH_CODE(!ret, | 2022 | if (ret) |
2003 | "Failed to export SMU METRICS table!", | 2023 | return ret; |
2004 | return ret); | ||
2005 | 2024 | ||
2006 | *activity_percent = metrics_table.AverageGfxActivity; | 2025 | *activity_percent = metrics_table.AverageGfxActivity; |
2007 | 2026 | ||
@@ -2019,11 +2038,9 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx, | |||
2019 | 2038 | ||
2020 | switch (idx) { | 2039 | switch (idx) { |
2021 | case AMDGPU_PP_SENSOR_GFX_SCLK: | 2040 | case AMDGPU_PP_SENSOR_GFX_SCLK: |
2022 | ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, | 2041 | ret = vega20_get_metrics_table(hwmgr, &metrics_table); |
2023 | TABLE_SMU_METRICS, true); | 2042 | if (ret) |
2024 | PP_ASSERT_WITH_CODE(!ret, | 2043 | return ret; |
2025 | "Failed to export SMU METRICS table!", | ||
2026 | return ret); | ||
2027 | 2044 | ||
2028 | *((uint32_t *)value) = metrics_table.AverageGfxclkFrequency * 100; | 2045 | *((uint32_t *)value) = metrics_table.AverageGfxclkFrequency * 100; |
2029 | *size = 4; | 2046 | *size = 4; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h index 25faaa5c5b10..37f5f5e657da 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h | |||
@@ -520,6 +520,9 @@ struct vega20_hwmgr { | |||
520 | /* ---- Gfxoff ---- */ | 520 | /* ---- Gfxoff ---- */ |
521 | bool gfxoff_allowed; | 521 | bool gfxoff_allowed; |
522 | uint32_t counter_gfxoff; | 522 | uint32_t counter_gfxoff; |
523 | |||
524 | unsigned long metrics_time; | ||
525 | SmuMetrics_t metrics_table; | ||
523 | }; | 526 | }; |
524 | 527 | ||
525 | #define VEGA20_DPM2_NEAR_TDP_DEC 10 | 528 | #define VEGA20_DPM2_NEAR_TDP_DEC 10 |