Commit 6cc24d8d authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu/swsmu/vangogh: simplify sensor handling



Just query the metrics table directly rather than going through
an extra level of functions.

Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarHuang Rui <ray.huang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e408f2ba
Loading
Loading
Loading
Loading
+20 −94
Original line number Diff line number Diff line
@@ -396,95 +396,6 @@ static bool vangogh_is_dpm_running(struct smu_context *smu)
	return !!(feature_enabled & SMC_DPM_FEATURE);
}

static int vangogh_get_current_activity_percent(struct smu_context *smu,
					       enum amd_pp_sensors sensor,
					       uint32_t *value)
{
	int ret = 0;

	if (!value)
		return -EINVAL;

	switch (sensor) {
	case AMDGPU_PP_SENSOR_GPU_LOAD:
		ret = vangogh_get_smu_metrics_data(smu,
						  METRICS_AVERAGE_GFXACTIVITY,
						  value);
		if (ret)
			return ret;
		break;
	default:
		dev_err(smu->adev->dev, "Invalid sensor for retrieving clock activity\n");
		return -EINVAL;
	}

	return 0;
}

static int vangogh_get_gpu_power(struct smu_context *smu, uint32_t *value)
{
	if (!value)
		return -EINVAL;

	return vangogh_get_smu_metrics_data(smu,
					   METRICS_AVERAGE_SOCKETPOWER,
					   value);
}

static int vangogh_thermal_get_temperature(struct smu_context *smu,
					     enum amd_pp_sensors sensor,
					     uint32_t *value)
{
	int ret = 0;

	if (!value)
		return -EINVAL;

	switch (sensor) {
	case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
		ret = vangogh_get_smu_metrics_data(smu,
						  METRICS_TEMPERATURE_HOTSPOT,
						  value);
		break;
	case AMDGPU_PP_SENSOR_EDGE_TEMP:
		ret = vangogh_get_smu_metrics_data(smu,
						  METRICS_TEMPERATURE_EDGE,
						  value);
		break;
	default:
		dev_err(smu->adev->dev, "Invalid sensor for retrieving temp\n");
		return -EINVAL;
	}

	return ret;
}

static int vangogh_get_current_clk_freq_by_table(struct smu_context *smu,
				       enum smu_clk_type clk_type,
				       uint32_t *value)
{
	MetricsMember_t member_type;

	switch (clk_type) {
	case SMU_GFXCLK:
		member_type = METRICS_AVERAGE_GFXCLK;
		break;
	case SMU_MCLK:
	case SMU_UCLK:
		member_type = METRICS_AVERAGE_UCLK;
		break;
	case SMU_SOCCLK:
		member_type = METRICS_AVERAGE_SOCCLK;
		break;
	default:
		return -EINVAL;
	}

	return vangogh_get_smu_metrics_data(smu,
					   member_type,
					   value);
}

static int vangogh_print_fine_grain_clk(struct smu_context *smu,
			enum smu_clk_type clk_type, char *buf)
{
@@ -526,25 +437,40 @@ static int vangogh_read_sensor(struct smu_context *smu,
	mutex_lock(&smu->sensor_lock);
	switch (sensor) {
	case AMDGPU_PP_SENSOR_GPU_LOAD:
		ret = vangogh_get_current_activity_percent(smu, sensor, (uint32_t *)data);
		ret = vangogh_get_smu_metrics_data(smu,
						   METRICS_AVERAGE_GFXACTIVITY,
						   (uint32_t *)data);
		*size = 4;
		break;
	case AMDGPU_PP_SENSOR_GPU_POWER:
		ret = vangogh_get_gpu_power(smu, (uint32_t *)data);
		ret = vangogh_get_smu_metrics_data(smu,
						   METRICS_AVERAGE_SOCKETPOWER,
						   (uint32_t *)data);
		*size = 4;
		break;
	case AMDGPU_PP_SENSOR_EDGE_TEMP:
		ret = vangogh_get_smu_metrics_data(smu,
						   METRICS_TEMPERATURE_EDGE,
						   (uint32_t *)data);
		*size = 4;
		break;
	case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
		ret = vangogh_thermal_get_temperature(smu, sensor, (uint32_t *)data);
		ret = vangogh_get_smu_metrics_data(smu,
						   METRICS_TEMPERATURE_HOTSPOT,
						   (uint32_t *)data);
		*size = 4;
		break;
	case AMDGPU_PP_SENSOR_GFX_MCLK:
		ret = vangogh_get_current_clk_freq_by_table(smu, SMU_UCLK, (uint32_t *)data);
		ret = vangogh_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 = vangogh_get_current_clk_freq_by_table(smu, SMU_GFXCLK, (uint32_t *)data);
		ret = vangogh_get_smu_metrics_data(smu,
						    METRICS_AVERAGE_GFXCLK,
						    (uint32_t *)data);
		*(uint32_t *)data *= 100;
		*size = 4;
		break;