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

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Wed Jun 23 10:28:53 UTC 2021


On Wed, Jun 23, 2021 at 01:16:35PM +0300, Lionel Landwerlin wrote:
> 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

Why not to incorporate our current device selection? If you're afraid
of linking just take a look how intel_gpu_top does.

--
Zbigniew

> 
> 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",
                                                               ^^^^^^^ type btw
> +				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
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev


More information about the igt-dev mailing list