[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