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.pitoi...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev