[Mesa-dev] [PATCH] gallium/radeon: add HUD queries for GPU temperature and clocks

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Feb 13 22:08:24 UTC 2017


Only the Radeon kernel driver exposed the GPU temperature and
the shader/memory clocks, this implements the same functionality
for the AMDGPU kernel driver.

These queries will return 0 if the DRM version is less than 3.10,
I don't explicitely check the version here because the query
codepath is already a bit messy.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/gallium/drivers/radeon/r600_query.c       | 12 ++++++------
 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 19 ++++++++++++++++++-
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
index 05741d33c9..4959621e11 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -1768,6 +1768,10 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
 	XG(GPIN, "GPIN_003",		GPIN_NUM_SPI,		UINT, AVERAGE),
 	XG(GPIN, "GPIN_004",		GPIN_NUM_SE,		UINT, AVERAGE),
 
+	X("temperature",		GPU_TEMPERATURE,	UINT64, AVERAGE),
+	X("shader-clock",		CURRENT_GPU_SCLK,	HZ, AVERAGE),
+	X("memory-clock",		CURRENT_GPU_MCLK,	HZ, AVERAGE),
+
 	/* The following queries must be at the end of the list because their
 	 * availability is adjusted dynamically based on the DRM version. */
 	X("GPU-load",			GPU_LOAD,		UINT64, AVERAGE),
@@ -1792,10 +1796,6 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
 	X("GPU-dma-busy",		GPU_DMA_BUSY,		UINT64, AVERAGE),
 	X("GPU-scratch-ram-busy",	GPU_SCRATCH_RAM_BUSY,	UINT64, AVERAGE),
 	X("GPU-ce-busy",		GPU_CE_BUSY,		UINT64, AVERAGE),
-
-	X("temperature",		GPU_TEMPERATURE,	UINT64, AVERAGE),
-	X("shader-clock",		CURRENT_GPU_SCLK,	HZ, AVERAGE),
-	X("memory-clock",		CURRENT_GPU_MCLK,	HZ, AVERAGE),
 };
 
 #undef X
@@ -1808,9 +1808,9 @@ static unsigned r600_get_num_queries(struct r600_common_screen *rscreen)
 		return ARRAY_SIZE(r600_driver_query_list);
 	else if (rscreen->info.drm_major == 3) {
 		if (rscreen->chip_class >= VI)
-			return ARRAY_SIZE(r600_driver_query_list) - 3;
+			return ARRAY_SIZE(r600_driver_query_list);
 		else
-			return ARRAY_SIZE(r600_driver_query_list) - 10;
+			return ARRAY_SIZE(r600_driver_query_list) - 7;
 	}
 	else
 		return ARRAY_SIZE(r600_driver_query_list) - 25;
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
index c3dfda53f0..d99df9e941 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
@@ -63,6 +63,18 @@
 #define AMDGPU_INFO_NUM_EVICTIONS		0x18
 #endif
 
+#ifndef AMDGPU_INFO_CURRENT_GPU_SCLK
+#define AMDGPU_INFO_CURRENT_GPU_SCLK   0x1c
+#endif
+
+#ifndef AMDGPU_INFO_CURRENT_GPU_MCLK
+#define AMDGPU_INFO_CURRENT_GPU_MCLK   0x1d
+#endif
+
+#ifndef AMDGPU_INFO_CURRENT_GPU_TEMP
+#define AMDGPU_INFO_CURRENT_GPU_TEMP   0x1e
+#endif
+
 static struct util_hash_table *dev_tab = NULL;
 pipe_static_mutex(dev_tab_mutex);
 
@@ -459,9 +471,14 @@ static uint64_t amdgpu_query_value(struct radeon_winsys *rws,
       amdgpu_query_heap_info(ws->dev, AMDGPU_GEM_DOMAIN_GTT, 0, &heap);
       return heap.heap_usage;
    case RADEON_GPU_TEMPERATURE:
+      amdgpu_query_info(ws->dev, AMDGPU_INFO_CURRENT_GPU_TEMP, 4, &retval);
+      return retval;
    case RADEON_CURRENT_SCLK:
+      amdgpu_query_info(ws->dev, AMDGPU_INFO_CURRENT_GPU_SCLK, 4, &retval);
+      return retval;
    case RADEON_CURRENT_MCLK:
-      return 0;
+      amdgpu_query_info(ws->dev, AMDGPU_INFO_CURRENT_GPU_MCLK, 4, &retval);
+      return retval;
    case RADEON_GPU_RESET_COUNTER:
       assert(0);
       return 0;
-- 
2.11.1



More information about the mesa-dev mailing list