[igt-dev] [PATCH i-g-t] tools/i915-perf-recorder: add ability to select device

Lionel Landwerlin lionel.g.landwerlin at intel.com
Wed Jun 23 10:16:35 UTC 2021


We're starting to have system with multiple Intel GPUs.

  $ i915-perf-recorder --device list
  Available devices:
     0: tigerlake (0x9a49)

  $ i915-perf-recorder --device 0

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 tools/i915-perf/i915_perf_recorder.c | 50 ++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 7 deletions(-)

diff --git a/tools/i915-perf/i915_perf_recorder.c b/tools/i915-perf/i915_perf_recorder.c
index 00195290b..3bf6dd693 100644
--- a/tools/i915-perf/i915_perf_recorder.c
+++ b/tools/i915-perf/i915_perf_recorder.c
@@ -250,16 +250,37 @@ find_intel_render_node(void)
 	return -1;
 }
 
+static void
+print_intel_devices(void)
+{
+	fprintf(stdout, "Available devices:\n");
+	for (int i = 0; i < 128; i++) {
+		if (read_device_param("card", i, "vendor") == 0x8086) {
+			uint32_t devid = read_device_param("card", i, "device");
+			const struct intel_device_info *devinfo =
+				intel_get_device_info(devid);
+			fprintf(stdout, "   %i: %s (0x%04hx)\n", i,
+				devinfo ? devinfo->codename : "unknwon",
+				devid);
+		}
+	}
+}
+
 static int
-open_render_node(uint32_t *devid)
+open_render_node(uint32_t *devid, int node_offset)
 {
 	char *name;
 	int ret;
 	int fd;
+        int render;
 
-	int render = find_intel_render_node();
-	if (render < 0)
-		return -1;
+        if (node_offset < 0) {
+                render = find_intel_render_node();
+                if (render < 0)
+                        return -1;
+	} else {
+                render = 128 + node_offset;
+        }
 
 	ret = asprintf(&name, "/dev/dri/renderD%u", render);
 	assert(ret != -1);
@@ -722,6 +743,9 @@ usage(const char *name)
 		"Recording tool for i915-perf.\n"
 		"\n"
 		"     --help,               -h          Print this screen\n"
+		"     --device,             -d <value>  Device to use\n"
+		"                                       (value=list to list devices\n"
+		"                                        value=1 to use /dev/dri/card1)\n"
 		"     --correlation-period, -c <value>  Time period of timestamp correlation in seconds\n"
 		"                                       (default = 1.0)\n"
 		"     --perf-period,        -p <value>  Time period of i915-perf reports in seconds\n"
@@ -772,6 +796,7 @@ main(int argc, char *argv[])
 {
 	const struct option long_options[] = {
 		{"help",                       no_argument, 0, 'h'},
+		{"device",               required_argument, 0, 'd'},
 		{"correlation-period",   required_argument, 0, 'c'},
 		{"perf-period",          required_argument, 0, 'p'},
 		{"metric",               required_argument, 0, 'm'},
@@ -798,7 +823,7 @@ main(int argc, char *argv[])
 	struct timespec now;
 	uint64_t corr_period_ns, poll_time_ns;
 	uint32_t circular_size = 0;
-	int opt;
+	int opt, dev_node_offset = -1;
 	bool list_counters = false;
 	FILE *output = NULL;
 	struct recording_context ctx = {
@@ -812,7 +837,7 @@ main(int argc, char *argv[])
 		.poll_period = 5 * 1000 * 1000,
 	};
 
-	while ((opt = getopt_long(argc, argv, "hc:p:m:Co:s:f:k:P:", long_options, NULL)) != -1) {
+	while ((opt = getopt_long(argc, argv, "hc:d:p:m:Co:s:f:k:P:", long_options, NULL)) != -1) {
 		switch (opt) {
 		case 'h':
 			usage(argv[0]);
@@ -820,6 +845,12 @@ main(int argc, char *argv[])
 		case 'c':
 			corr_period = atof(optarg);
 			break;
+		case 'd':
+			if (!strcmp(optarg, "list"))
+				dev_node_offset = -2;
+			else
+				dev_node_offset = atoi(optarg);
+			break;
 		case 'p':
 			perf_period = atof(optarg);
 			break;
@@ -865,7 +896,12 @@ main(int argc, char *argv[])
 		}
 	}
 
-	ctx.drm_fd = open_render_node(&ctx.devid);
+	if (dev_node_offset == -2) {
+		print_intel_devices();
+		return EXIT_SUCCESS;
+	}
+
+	ctx.drm_fd = open_render_node(&ctx.devid, dev_node_offset);
 	if (ctx.drm_fd < 0) {
 		fprintf(stderr, "Unable to open device.\n");
 		return EXIT_FAILURE;
-- 
2.30.2



More information about the igt-dev mailing list