[Mesa-dev] [PATCH 2/2] gallium/radeon: add HUD queries for monitoring some hw blocks

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Jan 20 19:19:26 UTC 2017


It's also possible to monitor them via performance counters but
the hardware can only use two counters simultaneously. It seems
easier to re-use the existing code which reads from MMIO instead
of writing a multi-pass approach.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/gallium/drivers/radeon/r600_gpu_load.c    | 36 +++++++++++++++++++++++++
 src/gallium/drivers/radeon/r600_pipe_common.h | 12 +++++++++
 src/gallium/drivers/radeon/r600_query.c       | 39 ++++++++++++++++++++++++++-
 src/gallium/drivers/radeon/r600_query.h       | 12 +++++++++
 4 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/r600_gpu_load.c b/src/gallium/drivers/radeon/r600_gpu_load.c
index 38ddda1652..8f5568c2dc 100644
--- a/src/gallium/drivers/radeon/r600_gpu_load.c
+++ b/src/gallium/drivers/radeon/r600_gpu_load.c
@@ -43,7 +43,19 @@
 #define SAMPLES_PER_SEC 10000
 
 #define GRBM_STATUS		0x8010
+#define TA_BUSY(x)		(((x) >> 14) & 0x1)
+#define GDS_BUSY(x)		(((x) >> 15) & 0x1)
+#define VGT_BUSY(x)		(((x) >> 17) & 0x1)
+#define IA_BUSY(x)		(((x) >> 19) & 0x1)
+#define SX_BUSY(x)		(((x) >> 20) & 0x1)
+#define WD_BUSY(x)		(((x) >> 21) & 0x1)
 #define SPI_BUSY(x)		(((x) >> 22) & 0x1)
+#define BCI_BUSY(x)		(((x) >> 23) & 0x1)
+#define SC_BUSY(x)		(((x) >> 24) & 0x1)
+#define PA_BUSY(x)		(((x) >> 25) & 0x1)
+#define DB_BUSY(x)		(((x) >> 26) & 0x1)
+#define CP_BUSY(x)		(((x) >> 29) & 0x1)
+#define CB_BUSY(x)		(((x) >> 30) & 0x1)
 #define GUI_ACTIVE(x)		(((x) >> 31) & 0x1)
 
 #define UPDATE_COUNTER(field, mask)				\
@@ -59,7 +71,19 @@ static void r600_update_grbm_counters(struct r600_common_screen *rscreen,
 
 	rscreen->ws->read_registers(rscreen->ws, GRBM_STATUS, 1, &value);
 
+	UPDATE_COUNTER(ta, TA_BUSY);
+	UPDATE_COUNTER(gds, GDS_BUSY);
+	UPDATE_COUNTER(vgt, VGT_BUSY);
+	UPDATE_COUNTER(ia, IA_BUSY);
+	UPDATE_COUNTER(sx, SX_BUSY);
+	UPDATE_COUNTER(wd, WD_BUSY);
 	UPDATE_COUNTER(spi, SPI_BUSY);
+	UPDATE_COUNTER(bci, BCI_BUSY);
+	UPDATE_COUNTER(sc, SC_BUSY);
+	UPDATE_COUNTER(pa, PA_BUSY);
+	UPDATE_COUNTER(db, DB_BUSY);
+	UPDATE_COUNTER(cp, CP_BUSY);
+	UPDATE_COUNTER(cb, CB_BUSY);
 	UPDATE_COUNTER(gui, GUI_ACTIVE);
 }
 
@@ -156,6 +180,18 @@ static unsigned busy_index_from_type(struct r600_common_screen *rscreen,
 	switch (type) {
 	case R600_QUERY_GPU_LOAD: return BUSY_INDEX(rscreen, gui);
 	case R600_QUERY_GPU_SHADERS_BUSY: return BUSY_INDEX(rscreen, spi);
+	case R600_QUERY_GPU_TA_BUSY: return BUSY_INDEX(rscreen, ta);
+	case R600_QUERY_GPU_GDS_BUSY: return BUSY_INDEX(rscreen, gds);
+	case R600_QUERY_GPU_VGT_BUSY: return BUSY_INDEX(rscreen, vgt);
+	case R600_QUERY_GPU_IA_BUSY: return BUSY_INDEX(rscreen, ia);
+	case R600_QUERY_GPU_SX_BUSY: return BUSY_INDEX(rscreen, sx);
+	case R600_QUERY_GPU_WD_BUSY: return BUSY_INDEX(rscreen, wd);
+	case R600_QUERY_GPU_BCI_BUSY: return BUSY_INDEX(rscreen, bci);
+	case R600_QUERY_GPU_SC_BUSY: return BUSY_INDEX(rscreen, sc);
+	case R600_QUERY_GPU_PA_BUSY: return BUSY_INDEX(rscreen, pa);
+	case R600_QUERY_GPU_DB_BUSY: return BUSY_INDEX(rscreen, db);
+	case R600_QUERY_GPU_CP_BUSY: return BUSY_INDEX(rscreen, cp);
+	case R600_QUERY_GPU_CB_BUSY: return BUSY_INDEX(rscreen, cb);
 	default: unreachable("query type does not correspond to grbm id");
 	}
 }
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
index e340e6f7f1..afb1385f97 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -361,6 +361,18 @@ union r600_grbm_counters {
 	struct {
 		struct r600_grbm_counter spi;
 		struct r600_grbm_counter gui;
+		struct r600_grbm_counter ta;
+		struct r600_grbm_counter gds;
+		struct r600_grbm_counter vgt;
+		struct r600_grbm_counter ia;
+		struct r600_grbm_counter sx;
+		struct r600_grbm_counter wd;
+		struct r600_grbm_counter bci;
+		struct r600_grbm_counter sc;
+		struct r600_grbm_counter pa;
+		struct r600_grbm_counter db;
+		struct r600_grbm_counter cp;
+		struct r600_grbm_counter cb;
 	} named;
 	unsigned array[0];
 };
diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
index 1f9f191049..25e7f5bb23 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -146,6 +146,18 @@ static bool r600_query_sw_begin(struct r600_common_context *rctx,
 	}
 	case R600_QUERY_GPU_LOAD:
 	case R600_QUERY_GPU_SHADERS_BUSY:
+	case R600_QUERY_GPU_TA_BUSY:
+	case R600_QUERY_GPU_GDS_BUSY:
+	case R600_QUERY_GPU_VGT_BUSY:
+	case R600_QUERY_GPU_IA_BUSY:
+	case R600_QUERY_GPU_SX_BUSY:
+	case R600_QUERY_GPU_WD_BUSY:
+	case R600_QUERY_GPU_BCI_BUSY:
+	case R600_QUERY_GPU_SC_BUSY:
+	case R600_QUERY_GPU_PA_BUSY:
+	case R600_QUERY_GPU_DB_BUSY:
+	case R600_QUERY_GPU_CP_BUSY:
+	case R600_QUERY_GPU_CB_BUSY:
 		query->begin_result = r600_begin_counter(rctx->screen,
 							 query->b.type);
 		break;
@@ -239,6 +251,18 @@ static bool r600_query_sw_end(struct r600_common_context *rctx,
 	}
 	case R600_QUERY_GPU_LOAD:
 	case R600_QUERY_GPU_SHADERS_BUSY:
+	case R600_QUERY_GPU_TA_BUSY:
+	case R600_QUERY_GPU_GDS_BUSY:
+	case R600_QUERY_GPU_VGT_BUSY:
+	case R600_QUERY_GPU_IA_BUSY:
+	case R600_QUERY_GPU_SX_BUSY:
+	case R600_QUERY_GPU_WD_BUSY:
+	case R600_QUERY_GPU_BCI_BUSY:
+	case R600_QUERY_GPU_SC_BUSY:
+	case R600_QUERY_GPU_PA_BUSY:
+	case R600_QUERY_GPU_DB_BUSY:
+	case R600_QUERY_GPU_CP_BUSY:
+	case R600_QUERY_GPU_CB_BUSY:
 		query->end_result = r600_end_counter(rctx->screen,
 						     query->b.type,
 						     query->begin_result);
@@ -1721,6 +1745,19 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
 	 * availability is adjusted dynamically based on the DRM version. */
 	X("GPU-load",			GPU_LOAD,		UINT64, AVERAGE),
 	X("GPU-shaders-busy",		GPU_SHADERS_BUSY,	UINT64, AVERAGE),
+	X("GPU-ta-busy",		GPU_TA_BUSY,		UINT64, AVERAGE),
+	X("GPU-gds-busy",		GPU_GDS_BUSY,		UINT64, AVERAGE),
+	X("GPU-vgt-busy",		GPU_VGT_BUSY,		UINT64, AVERAGE),
+	X("GPU-ia-busy",		GPU_IA_BUSY,		UINT64, AVERAGE),
+	X("GPU-sx-busy",		GPU_SX_BUSY,		UINT64, AVERAGE),
+	X("GPU-wd-busy",		GPU_WD_BUSY,		UINT64, AVERAGE),
+	X("GPU-bci-busy",		GPU_BCI_BUSY,		UINT64, AVERAGE),
+	X("GPU-sc-busy",		GPU_SC_BUSY,		UINT64, AVERAGE),
+	X("GPU-pa-busy",		GPU_PA_BUSY,		UINT64, AVERAGE),
+	X("GPU-db-busy",		GPU_DB_BUSY,		UINT64, AVERAGE),
+	X("GPU-cp-busy",		GPU_CP_BUSY,		UINT64, AVERAGE),
+	X("GPU-cb-busy",		GPU_CB_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),
@@ -1737,7 +1774,7 @@ static unsigned r600_get_num_queries(struct r600_common_screen *rscreen)
 	else if (rscreen->info.drm_major == 3)
 		return ARRAY_SIZE(r600_driver_query_list) - 3;
 	else
-		return ARRAY_SIZE(r600_driver_query_list) - 5;
+		return ARRAY_SIZE(r600_driver_query_list) - 17;
 }
 
 static int r600_get_driver_query_info(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/radeon/r600_query.h b/src/gallium/drivers/radeon/r600_query.h
index 43bca2bab9..1e4554d009 100644
--- a/src/gallium/drivers/radeon/r600_query.h
+++ b/src/gallium/drivers/radeon/r600_query.h
@@ -71,6 +71,18 @@ enum {
 	R600_QUERY_CURRENT_GPU_MCLK,
 	R600_QUERY_GPU_LOAD,
 	R600_QUERY_GPU_SHADERS_BUSY,
+	R600_QUERY_GPU_TA_BUSY,
+	R600_QUERY_GPU_GDS_BUSY,
+	R600_QUERY_GPU_VGT_BUSY,
+	R600_QUERY_GPU_IA_BUSY,
+	R600_QUERY_GPU_SX_BUSY,
+	R600_QUERY_GPU_WD_BUSY,
+	R600_QUERY_GPU_BCI_BUSY,
+	R600_QUERY_GPU_SC_BUSY,
+	R600_QUERY_GPU_PA_BUSY,
+	R600_QUERY_GPU_DB_BUSY,
+	R600_QUERY_GPU_CP_BUSY,
+	R600_QUERY_GPU_CB_BUSY,
 	R600_QUERY_NUM_COMPILATIONS,
 	R600_QUERY_NUM_SHADERS_CREATED,
 	R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO,
-- 
2.11.0



More information about the mesa-dev mailing list