Re: [PATCH v3 2/2] drm/amdgpu: expose GPU sensor related information

2017-02-15 Thread Samuel Pitoiset



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 
---
 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 */
+  

[PATCH v3 2/2] drm/amdgpu: expose GPU sensor related information

2017-02-15 Thread Samuel Pitoiset
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 
---
 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)
+   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_P