On 02/15/2017 08:15 PM, Samuel Pitoiset wrote: > This includes shader/memory clocks, temperature, GPU load, etc. > > v2: - add sub-queries for AMDPGU_INFO_GPU_SENSOR_* > - do not break the ABI > v3: - return -ENOENT when amdgpu_dpm == 0 > - expose more sensor queries > > Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 75 +++++++++++++++++++++++++++++++++ > include/uapi/drm/amdgpu_drm.h | 20 +++++++++ > 3 files changed, 97 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > index f275a6b54e9f..e9d58aeb30fb 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > @@ -59,9 +59,10 @@ > * - 3.7.0 - Add support for VCE clock list packet > * - 3.8.0 - Add support raster config init in the kernel > * - 3.9.0 - Add support for memory query info about VRAM and GTT. > + * - 3.10.0 - Add support for sensor query info (clocks, temp, etc). > */ > #define KMS_DRIVER_MAJOR 3 > -#define KMS_DRIVER_MINOR 9 > +#define KMS_DRIVER_MINOR 10 > #define KMS_DRIVER_PATCHLEVEL 0 > > int amdgpu_vram_limit = 0; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > index d5f9d6a4b661..8de57db99449 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > @@ -241,6 +241,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > uint32_t ui32 = 0; > uint64_t ui64 = 0; > int i, found; > + int ui32_size = sizeof(ui32); > > if (!info->return_size || !info->return_pointer) > return -EINVAL; > @@ -597,6 +598,80 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > return -EINVAL; > } > } > + case AMDGPU_INFO_SENSOR: { > + struct pp_gpu_power query = {0}; > + int size = sizeof(query); > + > + if (amdgpu_dpm != 0) if (amdgpu_dpm == 0) return -ENOENT; Fixed locally. > + return -ENOENT; > + > + switch (info->sensor_info.type) { > + case AMDGPU_INFO_SENSOR_GFX_SCLK: > + /* get sclk in Mhz */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_GFX_SCLK, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + ui32 /= 100; > + break; > + case AMDGPU_INFO_SENSOR_GFX_MCLK: > + /* get mclk in Mhz */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_GFX_MCLK, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + ui32 /= 100; > + break; > + case AMDGPU_INFO_SENSOR_GPU_TEMP: > + /* get temperature in millidegrees C */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_GPU_TEMP, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + break; > + case AMDGPU_INFO_SENSOR_GPU_LOAD: > + /* get GPU load */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_GPU_LOAD, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + break; > + case AMDGPU_INFO_SENSOR_GPU_POWER: > + /* get average GPU power */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_GPU_POWER, > + (void *)&query, &size)) { > + return -EINVAL; > + } > + ui32 = query.average_gpu_power >> 8; > + break; > + case AMDGPU_INFO_SENSOR_VDDNB: > + /* get VDDNB in millivolts */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_VDDNB, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + break; > + case AMDGPU_INFO_SENSOR_VDDGFX: > + /* get VDDGFX in millivolts */ > + if (amdgpu_dpm_read_sensor(adev, > + AMDGPU_PP_SENSOR_VDDGFX, > + (void *)&ui32, &ui32_size)) { > + return -EINVAL; > + } > + break; > + default: > + DRM_DEBUG_KMS("Invalid request %d\n", > + info->sensor_info.type); > + return -EINVAL; > + } > + return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0; > + } > default: > DRM_DEBUG_KMS("Invalid request %d\n", info->query); > return -EINVAL; > diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h > index 07e3710f91cc..1a09d4f8cff5 100644 > --- a/include/uapi/drm/amdgpu_drm.h > +++ b/include/uapi/drm/amdgpu_drm.h > @@ -534,6 +534,22 @@ struct drm_amdgpu_cs_chunk_data { > #define AMDGPU_INFO_VBIOS_IMAGE 0x2 > /* Query UVD handles */ > #define AMDGPU_INFO_NUM_HANDLES 0x1C > +/* Query sensor related information */ > +#define AMDGPU_INFO_SENSOR 0x1D > + /* Subquery id: Query GPU shader clock */ > + #define AMDGPU_INFO_SENSOR_GFX_SCLK 0x1 > + /* Subquery id: Query GPU memory clock */ > + #define AMDGPU_INFO_SENSOR_GFX_MCLK 0x2 > + /* Subquery id: Query GPU temperature */ > + #define AMDGPU_INFO_SENSOR_GPU_TEMP 0x3 > + /* Subquery id: Query GPU load */ > + #define AMDGPU_INFO_SENSOR_GPU_LOAD 0x4 > + /* Subquery id: Query average GPU power */ > + #define AMDGPU_INFO_SENSOR_GPU_POWER 0x5 > + /* Subquery id: Query VDDNB */ > + #define AMDGPU_INFO_SENSOR_VDDNB 0x6 > + /* Subquery id: Query VDDGFX */ > + #define AMDGPU_INFO_SENSOR_VDDGFX 0x7 > > #define AMDGPU_INFO_MMR_SE_INDEX_SHIFT 0 > #define AMDGPU_INFO_MMR_SE_INDEX_MASK 0xff > @@ -597,6 +613,10 @@ struct drm_amdgpu_info { > __u32 type; > __u32 offset; > } vbios_info; > + > + struct { > + __u32 type; > + } sensor_info; > }; > }; > >