[PATCH 1/2] drm/amdgpu: implement read_sensor() for pre-powerplay chips

Tom St Denis tom.stdenis at amd.com
Mon Feb 13 22:40:59 UTC 2017


On 02/13/2017 05:13 PM, Deucher, Alexander wrote:
>> -----Original Message-----
>> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
>> Of Samuel Pitoiset
>> Sent: Monday, February 13, 2017 5:02 PM
>> To: amd-gfx at lists.freedesktop.org
>> Cc: Samuel Pitoiset
>> Subject: [PATCH 1/2] drm/amdgpu: implement read_sensor() for pre-
>> powerplay chips
>>
>> Currently, only the GPU temperature, the shader clock and
>> eventually the memory clock are implemented. The main goal
>> is to expose this info to the userspace like Radeon.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h |  4 +++-
>>  drivers/gpu/drm/amd/amdgpu/ci_dpm.c     | 26 +++++++++++++++++++++
>>  drivers/gpu/drm/amd/amdgpu/kv_dpm.c     | 34
>> +++++++++++++++++++++++++++
>>  drivers/gpu/drm/amd/amdgpu/si_dpm.c     | 41
>> +++++++++++++++++++++++++++++++++
>>  4 files changed, 104 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
>> index 98698dcf15c7..f1876808ff58 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
>> @@ -270,6 +270,8 @@ struct amdgpu_dpm_funcs {
>>  				struct amdgpu_ps *cps,
>>  				struct amdgpu_ps *rps,
>>  				bool *equal);
>> +	int (*read_sensor)(struct amdgpu_device *adev, int idx, void *value,
>> +			   int *size);
>>
>>  	struct amd_vce_state* (*get_vce_clock_state)(struct
>> amdgpu_device *adev, unsigned idx);
>>  	int (*reset_power_profile_state)(struct amdgpu_device *adev,
>> @@ -293,7 +295,7 @@ struct amdgpu_dpm_funcs {
>>  #define amdgpu_dpm_read_sensor(adev, idx, value, size) \
>>  	((adev)->pp_enabled ? \
>>  		(adev)->powerplay.pp_funcs->read_sensor(adev-
>>> powerplay.pp_handle, (idx), (value), (size)) : \
>> -		-EINVAL)
>> +		(adev)->pm.funcs->read_sensor((adev), (idx), (value),
>> (size)))
>>
>>  #define amdgpu_dpm_get_temperature(adev) \
>>  	((adev)->pp_enabled ?						\
>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> index 578878d1d4c0..e3a06d6d9e99 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> @@ -6936,6 +6936,31 @@ static int ci_dpm_switch_power_profile(struct
>> amdgpu_device *adev,
>>  	return 0;
>>  }
>>
>> +static int ci_dpm_read_sensor(struct amdgpu_device *adev, int idx,
>> +			      void *value, int *size)
>> +{
>> +	/* size must be at least 4 bytes for all sensors */
>> +	if (*size < 4)
>> +		return -EINVAL;
>> +
>> +	switch (idx) {
>> +	case AMDGPU_PP_SENSOR_GFX_SCLK:
>> +		*((uint32_t *)value) = ci_get_average_sclk_freq(adev);
>> +		*size = 4;
>> +		return 0;
>> +	case AMDGPU_PP_SENSOR_GFX_MCLK:
>> +		*((uint32_t *)value) = ci_get_average_mclk_freq(adev);
>> +		*size = 4;
>> +		return 0;
>> +	case AMDGPU_PP_SENSOR_GPU_TEMP:
>> +		*((uint32_t *)value) = ci_dpm_get_temp(adev);
>> +		*size = 4;
>> +		return 0;
>
> While you are here you could add AMDGPU_PP_SENSOR_GPU_LOAD.  See ci_dpm_debugfs_print_current_performance_level() for the activity percent  calculations.
>
> Either way:
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

Once these land I can submit a patch to extend umr to read them.  Right 
now I only track sensors from ST/CZ and VI hardware.

Tom


More information about the amd-gfx mailing list