Re: [Mesa-dev] [PATCH 1/2] r600g, radeonsi: add driver queries for GPU temperature and shader+memory clocks
On Mon, Apr 27, 2015 at 9:46 AM, Marek Olšák mar...@gmail.com wrote: From: Marek Olšák marek.ol...@amd.com --- src/gallium/drivers/radeon/r600_pipe_common.c | 13 +++-- src/gallium/drivers/radeon/r600_pipe_common.h | 3 +++ src/gallium/drivers/radeon/r600_query.c | 21 + src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 19 +++ src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 - 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index c6d7918..97eed13 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -665,12 +665,21 @@ static int r600_get_driver_query_info(struct pipe_screen *screen, {num-bytes-moved, R600_QUERY_NUM_BYTES_MOVED, 0, TRUE}, {VRAM-usage, R600_QUERY_VRAM_USAGE, rscreen-info.vram_size, TRUE}, {GTT-usage, R600_QUERY_GTT_USAGE, rscreen-info.gart_size, TRUE}, + {temperature, R600_QUERY_GPU_TEMPERATURE, 100, FALSE}, + {shader-clock, R600_QUERY_CURRENT_GPU_SCLK, 0, FALSE}, + {memory-clock, R600_QUERY_CURRENT_GPU_MCLK, 0, FALSE} }; + unsigned num_queries; + + if (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42) + num_queries = Elements(list); Would it makes sense to future-proof this a bit and allow for drm_major of 2? e.g. if (rscreen-0info.drm_major 2 || (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42)) --Aaron + else + num_queries = 8; if (!info) - return Elements(list); + return num_queries; - if (index = Elements(list)) + if (index = num_queries) return 0; *info = list[index]; diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 384a9a6..c23072c 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -55,6 +55,9 @@ #define R600_QUERY_NUM_BYTES_MOVED (PIPE_QUERY_DRIVER_SPECIFIC + 5) #define R600_QUERY_VRAM_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 6) #define R600_QUERY_GTT_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 7) +#define R600_QUERY_GPU_TEMPERATURE (PIPE_QUERY_DRIVER_SPECIFIC + 8) +#define R600_QUERY_CURRENT_GPU_SCLK(PIPE_QUERY_DRIVER_SPECIFIC + 9) +#define R600_QUERY_CURRENT_GPU_MCLK(PIPE_QUERY_DRIVER_SPECIFIC + 10) #define R600_CONTEXT_STREAMOUT_FLUSH (1u 0) #define R600_CONTEXT_PRIVATE_FLAG (1u 1) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 6a35ab8..758064a 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -86,6 +86,9 @@ static struct r600_resource *r600_new_query_buffer(struct r600_common_context *c case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: return NULL; } @@ -382,6 +385,9 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: skip_allocation = true; break; default: @@ -439,6 +445,9 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_REQUESTED_GTT: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: rquery-begin_result = 0; return; case R600_QUERY_BUFFER_WAIT_TIME: @@ -513,6 +522,15 @@ static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_GTT_USAGE: rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GTT_USAGE); return; + case R600_QUERY_GPU_TEMPERATURE: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GPU_TEMPERATURE) / 1000; + return; + case R600_QUERY_CURRENT_GPU_SCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_SCLK) * 100; + return; + case R600_QUERY_CURRENT_GPU_MCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_MCLK) * 100; +
Re: [Mesa-dev] [PATCH 1/2] r600g, radeonsi: add driver queries for GPU temperature and shader+memory clocks
DRM 3.0.0 (amdgpu) doesn't support all of these queries yet. I think it could only do the GPU load query if it was hooked up. Radeon will always be 2.x.x. Marek On Mon, Apr 27, 2015 at 10:53 PM, Aaron Watry awa...@gmail.com wrote: On Mon, Apr 27, 2015 at 9:46 AM, Marek Olšák mar...@gmail.com wrote: From: Marek Olšák marek.ol...@amd.com --- src/gallium/drivers/radeon/r600_pipe_common.c | 13 +++-- src/gallium/drivers/radeon/r600_pipe_common.h | 3 +++ src/gallium/drivers/radeon/r600_query.c | 21 + src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 19 +++ src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 - 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index c6d7918..97eed13 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -665,12 +665,21 @@ static int r600_get_driver_query_info(struct pipe_screen *screen, {num-bytes-moved, R600_QUERY_NUM_BYTES_MOVED, 0, TRUE}, {VRAM-usage, R600_QUERY_VRAM_USAGE, rscreen-info.vram_size, TRUE}, {GTT-usage, R600_QUERY_GTT_USAGE, rscreen-info.gart_size, TRUE}, + {temperature, R600_QUERY_GPU_TEMPERATURE, 100, FALSE}, + {shader-clock, R600_QUERY_CURRENT_GPU_SCLK, 0, FALSE}, + {memory-clock, R600_QUERY_CURRENT_GPU_MCLK, 0, FALSE} }; + unsigned num_queries; + + if (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42) + num_queries = Elements(list); Would it makes sense to future-proof this a bit and allow for drm_major of 2? e.g. if (rscreen-0info.drm_major 2 || (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42)) --Aaron + else + num_queries = 8; if (!info) - return Elements(list); + return num_queries; - if (index = Elements(list)) + if (index = num_queries) return 0; *info = list[index]; diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 384a9a6..c23072c 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -55,6 +55,9 @@ #define R600_QUERY_NUM_BYTES_MOVED (PIPE_QUERY_DRIVER_SPECIFIC + 5) #define R600_QUERY_VRAM_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 6) #define R600_QUERY_GTT_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 7) +#define R600_QUERY_GPU_TEMPERATURE (PIPE_QUERY_DRIVER_SPECIFIC + 8) +#define R600_QUERY_CURRENT_GPU_SCLK(PIPE_QUERY_DRIVER_SPECIFIC + 9) +#define R600_QUERY_CURRENT_GPU_MCLK(PIPE_QUERY_DRIVER_SPECIFIC + 10) #define R600_CONTEXT_STREAMOUT_FLUSH (1u 0) #define R600_CONTEXT_PRIVATE_FLAG (1u 1) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 6a35ab8..758064a 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -86,6 +86,9 @@ static struct r600_resource *r600_new_query_buffer(struct r600_common_context *c case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: return NULL; } @@ -382,6 +385,9 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: skip_allocation = true; break; default: @@ -439,6 +445,9 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_REQUESTED_GTT: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: rquery-begin_result = 0; return; case R600_QUERY_BUFFER_WAIT_TIME: @@ -513,6 +522,15 @@ static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_GTT_USAGE: rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GTT_USAGE); return; + case R600_QUERY_GPU_TEMPERATURE: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GPU_TEMPERATURE) / 1000; + return; + case R600_QUERY_CURRENT_GPU_SCLK: + rquery-end_result =
[Mesa-dev] [PATCH 1/2] r600g, radeonsi: add driver queries for GPU temperature and shader+memory clocks
From: Marek Olšák marek.ol...@amd.com --- src/gallium/drivers/radeon/r600_pipe_common.c | 13 +++-- src/gallium/drivers/radeon/r600_pipe_common.h | 3 +++ src/gallium/drivers/radeon/r600_query.c | 21 + src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 19 +++ src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 - 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index c6d7918..97eed13 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -665,12 +665,21 @@ static int r600_get_driver_query_info(struct pipe_screen *screen, {num-bytes-moved, R600_QUERY_NUM_BYTES_MOVED, 0, TRUE}, {VRAM-usage, R600_QUERY_VRAM_USAGE, rscreen-info.vram_size, TRUE}, {GTT-usage, R600_QUERY_GTT_USAGE, rscreen-info.gart_size, TRUE}, + {temperature, R600_QUERY_GPU_TEMPERATURE, 100, FALSE}, + {shader-clock, R600_QUERY_CURRENT_GPU_SCLK, 0, FALSE}, + {memory-clock, R600_QUERY_CURRENT_GPU_MCLK, 0, FALSE} }; + unsigned num_queries; + + if (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42) + num_queries = Elements(list); + else + num_queries = 8; if (!info) - return Elements(list); + return num_queries; - if (index = Elements(list)) + if (index = num_queries) return 0; *info = list[index]; diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 384a9a6..c23072c 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -55,6 +55,9 @@ #define R600_QUERY_NUM_BYTES_MOVED (PIPE_QUERY_DRIVER_SPECIFIC + 5) #define R600_QUERY_VRAM_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 6) #define R600_QUERY_GTT_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 7) +#define R600_QUERY_GPU_TEMPERATURE (PIPE_QUERY_DRIVER_SPECIFIC + 8) +#define R600_QUERY_CURRENT_GPU_SCLK(PIPE_QUERY_DRIVER_SPECIFIC + 9) +#define R600_QUERY_CURRENT_GPU_MCLK(PIPE_QUERY_DRIVER_SPECIFIC + 10) #define R600_CONTEXT_STREAMOUT_FLUSH (1u 0) #define R600_CONTEXT_PRIVATE_FLAG (1u 1) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 6a35ab8..758064a 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -86,6 +86,9 @@ static struct r600_resource *r600_new_query_buffer(struct r600_common_context *c case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: return NULL; } @@ -382,6 +385,9 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: skip_allocation = true; break; default: @@ -439,6 +445,9 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_REQUESTED_GTT: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: rquery-begin_result = 0; return; case R600_QUERY_BUFFER_WAIT_TIME: @@ -513,6 +522,15 @@ static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_GTT_USAGE: rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GTT_USAGE); return; + case R600_QUERY_GPU_TEMPERATURE: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GPU_TEMPERATURE) / 1000; + return; + case R600_QUERY_CURRENT_GPU_SCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_SCLK) * 100; + return; + case R600_QUERY_CURRENT_GPU_MCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_MCLK) * 100; + return; } r600_emit_query_end(rctx, rquery); @@ -570,6 +588,9 @@ static boolean r600_get_query_buffer_result(struct r600_common_context *ctx, case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case
Re: [Mesa-dev] [PATCH 1/2] r600g, radeonsi: add driver queries for GPU temperature and shader+memory clocks
On Mon, Apr 27, 2015 at 10:46 AM, Marek Olšák mar...@gmail.com wrote: From: Marek Olšák marek.ol...@amd.com For the series: Reviewed-by: Alex Deucher alexander.deuc...@amd.com --- src/gallium/drivers/radeon/r600_pipe_common.c | 13 +++-- src/gallium/drivers/radeon/r600_pipe_common.h | 3 +++ src/gallium/drivers/radeon/r600_query.c | 21 + src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 19 +++ src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 - 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index c6d7918..97eed13 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -665,12 +665,21 @@ static int r600_get_driver_query_info(struct pipe_screen *screen, {num-bytes-moved, R600_QUERY_NUM_BYTES_MOVED, 0, TRUE}, {VRAM-usage, R600_QUERY_VRAM_USAGE, rscreen-info.vram_size, TRUE}, {GTT-usage, R600_QUERY_GTT_USAGE, rscreen-info.gart_size, TRUE}, + {temperature, R600_QUERY_GPU_TEMPERATURE, 100, FALSE}, + {shader-clock, R600_QUERY_CURRENT_GPU_SCLK, 0, FALSE}, + {memory-clock, R600_QUERY_CURRENT_GPU_MCLK, 0, FALSE} }; + unsigned num_queries; + + if (rscreen-info.drm_major == 2 rscreen-info.drm_minor = 42) + num_queries = Elements(list); + else + num_queries = 8; if (!info) - return Elements(list); + return num_queries; - if (index = Elements(list)) + if (index = num_queries) return 0; *info = list[index]; diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 384a9a6..c23072c 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -55,6 +55,9 @@ #define R600_QUERY_NUM_BYTES_MOVED (PIPE_QUERY_DRIVER_SPECIFIC + 5) #define R600_QUERY_VRAM_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 6) #define R600_QUERY_GTT_USAGE (PIPE_QUERY_DRIVER_SPECIFIC + 7) +#define R600_QUERY_GPU_TEMPERATURE (PIPE_QUERY_DRIVER_SPECIFIC + 8) +#define R600_QUERY_CURRENT_GPU_SCLK(PIPE_QUERY_DRIVER_SPECIFIC + 9) +#define R600_QUERY_CURRENT_GPU_MCLK(PIPE_QUERY_DRIVER_SPECIFIC + 10) #define R600_CONTEXT_STREAMOUT_FLUSH (1u 0) #define R600_CONTEXT_PRIVATE_FLAG (1u 1) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 6a35ab8..758064a 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -86,6 +86,9 @@ static struct r600_resource *r600_new_query_buffer(struct r600_common_context *c case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: return NULL; } @@ -382,6 +385,9 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q case R600_QUERY_NUM_BYTES_MOVED: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: skip_allocation = true; break; default: @@ -439,6 +445,9 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_REQUESTED_GTT: case R600_QUERY_VRAM_USAGE: case R600_QUERY_GTT_USAGE: + case R600_QUERY_GPU_TEMPERATURE: + case R600_QUERY_CURRENT_GPU_SCLK: + case R600_QUERY_CURRENT_GPU_MCLK: rquery-begin_result = 0; return; case R600_QUERY_BUFFER_WAIT_TIME: @@ -513,6 +522,15 @@ static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query) case R600_QUERY_GTT_USAGE: rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GTT_USAGE); return; + case R600_QUERY_GPU_TEMPERATURE: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_GPU_TEMPERATURE) / 1000; + return; + case R600_QUERY_CURRENT_GPU_SCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_SCLK) * 100; + return; + case R600_QUERY_CURRENT_GPU_MCLK: + rquery-end_result = rctx-ws-query_value(rctx-ws, RADEON_CURRENT_MCLK) * 100; + return; } r600_emit_query_end(rctx, rquery); @@ -570,6 +588,9 @@ static boolean