[AMD Official Use Only - Internal Distribution Only] Series is reviewed-by: Evan Quan <evan.quan@xxxxxxx> -----Original Message----- From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Alex Deucher Sent: Wednesday, December 2, 2020 11:05 AM To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx> Subject: [PATCH 4/4] drm/amdgpu/swsmu/renoir: simplify sensor handling (v2) Just query the metrics table directly rather than going through an extra level of functions. v2: use proper enum Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> --- .../gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 205 ++++++++---------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c index d3641a8ed99c..dc75db8af371 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c @@ -492,28 +492,6 @@ static int renoir_dpm_set_jpeg_enable(struct smu_context *smu, bool enable) return ret; } -static int renoir_get_current_clk_freq_by_table(struct smu_context *smu, - enum smu_clk_type clk_type, - uint32_t *value) -{ -int ret = 0, clk_id = 0; -SmuMetrics_t metrics; - -ret = smu_cmn_get_metrics_table(smu, &metrics, false); -if (ret) -return ret; - -clk_id = smu_cmn_to_asic_specific_index(smu, -CMN2ASIC_MAPPING_CLK, -clk_type); -if (clk_id < 0) -return clk_id; - -*value = metrics.ClockFrequency[clk_id]; - -return ret; -} - static int renoir_force_dpm_limit_value(struct smu_context *smu, bool highest) { int ret = 0, i = 0; @@ -574,88 +552,6 @@ static int renoir_unforce_dpm_levels(struct smu_context *smu) { return ret; } -static int renoir_get_gpu_temperature(struct smu_context *smu, uint32_t *value) -{ -int ret = 0; -SmuMetrics_t metrics; - -if (!value) -return -EINVAL; - -ret = smu_cmn_get_metrics_table(smu, &metrics, false); -if (ret) -return ret; - -*value = (metrics.GfxTemperature / 100) * -SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; - -return 0; -} - -static int renoir_get_current_activity_percent(struct smu_context *smu, - enum amd_pp_sensors sensor, - uint32_t *value) -{ -int ret = 0; -SmuMetrics_t metrics; - -if (!value) -return -EINVAL; - -ret = smu_cmn_get_metrics_table(smu, &metrics, false); -if (ret) -return ret; - -switch (sensor) { -case AMDGPU_PP_SENSOR_GPU_LOAD: -*value = metrics.AverageGfxActivity / 100; -break; -default: -dev_err(smu->adev->dev, "Invalid sensor for retrieving clock activity\n"); -return -EINVAL; -} - -return 0; -} - -static int renoir_get_vddc(struct smu_context *smu, uint32_t *value, - unsigned int index) -{ -int ret = 0; -SmuMetrics_t metrics; - -if (index >= 2) -return -EINVAL; - -if (!value) -return -EINVAL; - -ret = smu_cmn_get_metrics_table(smu, &metrics, false); -if (ret) -return ret; - -*value = metrics.Voltage[index]; - -return 0; -} - -static int renoir_get_power(struct smu_context *smu, uint32_t *value) -{ -int ret = 0; -SmuMetrics_t metrics; - -if (!value) -return -EINVAL; - -ret = smu_cmn_get_metrics_table(smu, &metrics, false); -if (ret) -return ret; - -*value = metrics.CurrentSocketPower << 8; - -return 0; -} - /* * This interface get dpm clock table for dc */ @@ -1011,6 +907,71 @@ static int renoir_get_power_profile_mode(struct smu_context *smu, return size; } +static int renoir_get_smu_metrics_data(struct smu_context *smu, + MetricsMember_t member, + uint32_t *value) +{ +struct smu_table_context *smu_table = &smu->smu_table; + +SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table; +int ret = 0; + +mutex_lock(&smu->metrics_lock); + +ret = smu_cmn_get_metrics_table_locked(smu, + NULL, + false); +if (ret) { +mutex_unlock(&smu->metrics_lock); +return ret; +} + +switch (member) { +case METRICS_AVERAGE_GFXCLK: +*value = metrics->ClockFrequency[CLOCK_GFXCLK]; +break; +case METRICS_AVERAGE_SOCCLK: +*value = metrics->ClockFrequency[CLOCK_SOCCLK]; +break; +case METRICS_AVERAGE_UCLK: +*value = metrics->ClockFrequency[CLOCK_FCLK]; +break; +case METRICS_AVERAGE_GFXACTIVITY: +*value = metrics->AverageGfxActivity / 100; +break; +case METRICS_AVERAGE_VCNACTIVITY: +*value = metrics->AverageUvdActivity / 100; +break; +case METRICS_AVERAGE_SOCKETPOWER: +*value = metrics->CurrentSocketPower << 8; +break; +case METRICS_TEMPERATURE_EDGE: +*value = (metrics->GfxTemperature / 100) * +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +break; +case METRICS_TEMPERATURE_HOTSPOT: +*value = (metrics->SocTemperature / 100) * +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +break; +case METRICS_THROTTLER_STATUS: +*value = metrics->ThrottlerStatus; +break; +case METRICS_VOLTAGE_VDDGFX: +*value = metrics->Voltage[0]; +break; +case METRICS_VOLTAGE_VDDSOC: +*value = metrics->Voltage[1]; +break; +default: +*value = UINT_MAX; +break; +} + +mutex_unlock(&smu->metrics_lock); + +return ret; +} + static int renoir_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor, void *data, uint32_t *size) @@ -1023,33 +984,53 @@ static int renoir_read_sensor(struct smu_context *smu, mutex_lock(&smu->sensor_lock); switch (sensor) { case AMDGPU_PP_SENSOR_GPU_LOAD: -ret = renoir_get_current_activity_percent(smu, sensor, (uint32_t *)data); +ret = renoir_get_smu_metrics_data(smu, + METRICS_AVERAGE_GFXACTIVITY, + (uint32_t *)data); +*size = 4; +break; +case AMDGPU_PP_SENSOR_EDGE_TEMP: +ret = renoir_get_smu_metrics_data(smu, + METRICS_TEMPERATURE_EDGE, + (uint32_t *)data); *size = 4; break; -case AMDGPU_PP_SENSOR_GPU_TEMP: -ret = renoir_get_gpu_temperature(smu, (uint32_t *)data); +case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: +ret = renoir_get_smu_metrics_data(smu, + METRICS_TEMPERATURE_HOTSPOT, + (uint32_t *)data); *size = 4; break; case AMDGPU_PP_SENSOR_GFX_MCLK: -ret = renoir_get_current_clk_freq_by_table(smu, SMU_UCLK, (uint32_t *)data); +ret = renoir_get_smu_metrics_data(smu, + METRICS_AVERAGE_UCLK, + (uint32_t *)data); *(uint32_t *)data *= 100; *size = 4; break; case AMDGPU_PP_SENSOR_GFX_SCLK: -ret = renoir_get_current_clk_freq_by_table(smu, SMU_GFXCLK, (uint32_t *)data); +ret = renoir_get_smu_metrics_data(smu, + METRICS_AVERAGE_GFXCLK, + (uint32_t *)data); *(uint32_t *)data *= 100; *size = 4; break; case AMDGPU_PP_SENSOR_VDDGFX: -ret = renoir_get_vddc(smu, (uint32_t *)data, 0); +ret = renoir_get_smu_metrics_data(smu, + METRICS_VOLTAGE_VDDGFX, + (uint32_t *)data); *size = 4; break; case AMDGPU_PP_SENSOR_VDDNB: -ret = renoir_get_vddc(smu, (uint32_t *)data, 1); +ret = renoir_get_smu_metrics_data(smu, + METRICS_VOLTAGE_VDDSOC, + (uint32_t *)data); *size = 4; break; case AMDGPU_PP_SENSOR_GPU_POWER: -ret = renoir_get_power(smu, (uint32_t *)data); +ret = renoir_get_smu_metrics_data(smu, + METRICS_AVERAGE_SOCKETPOWER, + (uint32_t *)data); *size = 4; break; default: -- 2.25.4 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=04%7C01%7Cevan.quan%40amd.com%7C096746aedf0c4c44c27308d8966f1afd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637424751225267833%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=KojdAXTZ9XnM55pOoR8djuoKWMYBY7iDucfFuLp6wGA%3D&reserved=0 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx