[PATCH v3 2/2] drm/amdgpu: expose GPU sensor related information
Samuel Pitoiset
samuel.pitoiset at gmail.com
Wed Feb 15 19:18:29 UTC 2017
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;
> };
> };
>
>
More information about the amd-gfx
mailing list