[Intel-gfx] [igt-dev] [PATCH i-g-t 3/4] lsgpu: Add filter type print-out selection

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Nov 13 15:18:56 UTC 2020


On 13/11/2020 14:53, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> 
> In the previous patch we switched the lsgpu output to a short and user
> friendly format but some users will need a shorthand for getting other
> types of device selection filters than the defaut drm.
> 
> Add some command line switches to enable this:
> 
> $ lsgpu
> card0                   8086:193B    drm:/dev/dri/card0
> └─renderD128                         drm:/dev/dri/renderD128
> 
> $ lsgpu --sysfs
> card0                   8086:193B    sys:/sys/devices/pci0000:00/0000:00:02.0/drm/card0
> └─renderD128                         sys:/sys/devices/pci0000:00/0000:00:02.0/drm/renderD128
> 
> $ lsgpu --pci
> card0                   8086:193B    pci:/sys/devices/pci0000:00/0000:00:02.0
> └─renderD128
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Suggested-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Petri Latvala <petri.latvala at intel.com>
> ---
>   lib/igt_device_scan.c | 69 ++++++++++++++++++++++++++++++++-----------
>   lib/igt_device_scan.h | 15 ++++++++--
>   tools/intel_gpu_top.c |  6 +++-
>   tools/lsgpu.c         | 32 +++++++++++++++-----
>   4 files changed, 95 insertions(+), 27 deletions(-)
> 
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index c0cd6757fc27..d5163efbca71 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -748,7 +748,9 @@ static bool __check_empty(struct igt_list_head *view)
>   	return false;
>   }
>   
> -static void igt_devs_print_simple(struct igt_list_head *view)
> +static void
> +igt_devs_print_simple(struct igt_list_head *view,
> +		      const struct igt_devices_print_format *fmt)
>   {
>   	struct igt_device *dev;
>   
> @@ -792,7 +794,36 @@ __find_pci(struct igt_list_head *view, const char *drm)
>   	return NULL;
>   }
>   
> -static void igt_devs_print_user(struct igt_list_head *view)
> +static void __print_filter(char *buf, int len,
> +			   const struct igt_devices_print_format *fmt,
> +			   struct igt_device *dev,
> +			   bool render)
> +{
> +	int ret;
> +
> +	switch (fmt->option) {
> +	case IGT_PRINT_DRM:
> +		ret = snprintf(buf, len, "drm:%s",
> +			       render ? dev->drm_render : dev->drm_card);
> +		igt_assert(ret < len);
> +		break;
> +	case IGT_PRINT_SYSFS:
> +		ret = snprintf(buf, len, "sys:%s", dev->syspath);
> +		igt_assert(ret < len);
> +		break;
> +	case IGT_PRINT_PCI:
> +		if (!render) {
> +			ret = snprintf(buf, len, "pci:%s",
> +				       dev->parent->syspath);

This is wrong, prefix needs to be sys: or string not syspath but 
something which pci filter understands.

Regards,

Tvrtko

> +			igt_assert(ret < len);
> +		}
> +		break;
> +	};
> +}
> +
> +static void
> +igt_devs_print_user(struct igt_list_head *view,
> +		    const struct igt_devices_print_format *fmt)
>   {
>   	struct igt_device *dev;
>   
> @@ -805,7 +836,6 @@ static void igt_devs_print_user(struct igt_list_head *view)
>   		struct igt_device *dev2;
>   		char filter[256];
>   		char *drm_name;
> -		int ret;
>   
>   		if (!is_drm_subsystem(dev))
>   			continue;
> @@ -816,8 +846,7 @@ static void igt_devs_print_user(struct igt_list_head *view)
>   		if (!drm_name || !*++drm_name)
>   			continue;
>   
> -		ret = snprintf(filter, sizeof(filter), "drm:%s", dev->drm_card);
> -		igt_assert(ret < sizeof(filter));
> +		__print_filter(filter, sizeof(filter), fmt, dev, false);
>   
>   		pci_dev = __find_pci(view, dev->drm_card);
>   		if (pci_dev)
> @@ -848,13 +877,15 @@ static void igt_devs_print_user(struct igt_list_head *view)
>   			if (!drm_name || !*++drm_name)
>   				continue;
>   
> -			ret = snprintf(filter, sizeof(filter), "drm:%s",
> -				       dev2->drm_render);
> -			igt_assert(ret < sizeof(filter));
> -
> -			printf("%s%-22s             %s\n",
> -			       (++i == num_children) ? "└─" : "├─",
> -			       drm_name, filter);
> +			printf("%s%-22s",
> +				(++i == num_children) ? "└─" : "├─", drm_name);
> +			if (fmt->option != IGT_PRINT_PCI) {
> +				__print_filter(filter, sizeof(filter), fmt,
> +					       dev2, true);
> +				printf("             %s\n", filter);
> +			} else {
> +				printf("\n");
> +			}
>   		}
>   	}
>   }
> @@ -879,7 +910,10 @@ static void print_ht(GHashTable *ht)
>   	g_list_free(keys);
>   }
>   
> -static void igt_devs_print_detail(struct igt_list_head *view)
> +static void
> +igt_devs_print_detail(struct igt_list_head *view,
> +		      const struct igt_devices_print_format *fmt)
> +
>   {
>   	struct igt_device *dev;
>   
> @@ -903,7 +937,8 @@ static void igt_devs_print_detail(struct igt_list_head *view)
>   }
>   
>   static struct print_func {
> -	void (*prn)(struct igt_list_head *view);
> +	void (*prn)(struct igt_list_head *view,
> +		    const struct igt_devices_print_format *);
>   } print_functions[] = {
>   	[IGT_PRINT_SIMPLE] = { .prn = igt_devs_print_simple },
>   	[IGT_PRINT_DETAIL] = { .prn = igt_devs_print_detail },
> @@ -912,15 +947,15 @@ static struct print_func {
>   
>   /**
>    * igt_devices_print
> - * @printtype: IGT_PRINT_SIMPLE or IGT_PRINT_DETAIL
> + * @fmt: Print format as specified by struct igt_devices_print_format
>    *
>    * Function can be used by external tool to print device array in simple
>    * or detailed form. This function is added here to avoid exposing
>    * internal implementation data structures.
>    */
> -void igt_devices_print(enum igt_devices_print_type printtype)
> +void igt_devices_print(const struct igt_devices_print_format *fmt)
>   {
> -	print_functions[printtype].prn(&igt_devs.filtered);
> +	print_functions[fmt->type].prn(&igt_devs.filtered, fmt);
>   }
>   
>   /**
> diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
> index 9822c22cb69c..bb4be72345fb 100644
> --- a/lib/igt_device_scan.h
> +++ b/lib/igt_device_scan.h
> @@ -35,11 +35,22 @@
>   #include <unistd.h>
>   
>   enum igt_devices_print_type {
> -	IGT_PRINT_SIMPLE,
> +	IGT_PRINT_SIMPLE = 0,
>   	IGT_PRINT_DETAIL,
>   	IGT_PRINT_USER, /* End user friendly. */
>   };
>   
> +enum igt_devices_print_option {
> +	IGT_PRINT_DRM = 0,
> +	IGT_PRINT_SYSFS,
> +	IGT_PRINT_PCI,
> +};
> +
> +struct igt_devices_print_format {
> +	enum igt_devices_print_type   type;
> +	enum igt_devices_print_option option;
> +};
> +
>   #define INTEGRATED_I915_GPU_PCI_ID "0000:00:02.0"
>   #define PCI_SLOT_NAME_SIZE 12
>   struct igt_device_card {
> @@ -51,7 +62,7 @@ struct igt_device_card {
>   
>   void igt_devices_scan(bool force);
>   
> -void igt_devices_print(enum igt_devices_print_type printtype);
> +void igt_devices_print(const struct igt_devices_print_format *fmt);
>   void igt_devices_print_vendors(void);
>   void igt_device_print_filter_types(void);
>   
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 5230472d2af4..07f88d555dc8 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1387,7 +1387,11 @@ int main(int argc, char **argv)
>   	igt_devices_scan(false);
>   
>   	if (list_device) {
> -		igt_devices_print(IGT_PRINT_USER);
> +		struct igt_devices_print_format fmt = {
> +			.type = IGT_PRINT_USER
> +		};
> +
> +		igt_devices_print(&fmt);
>   		goto exit;
>   	}
>   
> diff --git a/tools/lsgpu.c b/tools/lsgpu.c
> index 3b234b73361a..169ab0c29e50 100644
> --- a/tools/lsgpu.c
> +++ b/tools/lsgpu.c
> @@ -91,7 +91,11 @@ static const char *usage_str =
>   	"  -v, --list-vendors          List recognized vendors\n"
>   	"  -l, --list-filter-types     List registered device filters types\n"
>   	"  -d, --device filter         Device filter, can be given multiple times\n"
> -	"  -h, --help                  Show this help message and exit\n";
> +	"  -h, --help                  Show this help message and exit\n"
> +	"\nOptions valid for default print out mode only:\n"
> +	"      --drm                   Show DRM filters (default) for each device\n"
> +	"      --sysfs                 Show sysfs filters for each device\n"
> +	"      --pci                   Show PCI filters for each device\n";
>   
>   static void test_device_open(struct igt_device_card *card)
>   {
> @@ -153,6 +157,9 @@ static char *get_device_from_rc(void)
>   int main(int argc, char *argv[])
>   {
>   	static struct option long_options[] = {
> +		{"drm",               no_argument,       NULL, 0},
> +		{"sysfs",             no_argument,       NULL, 1},
> +		{"pci",               no_argument,       NULL, 2},
>   		{"print-simple",      no_argument,       NULL, OPT_PRINT_SIMPLE},
>   		{"print-detail",      no_argument,       NULL, OPT_PRINT_DETAIL},
>   		{"list-vendors",      no_argument,       NULL, OPT_LIST_VENDORS},
> @@ -163,17 +170,19 @@ int main(int argc, char *argv[])
>   	};
>   	int c, index = 0;
>   	char *env_device = NULL, *opt_device = NULL, *rc_device = NULL;
> -	enum igt_devices_print_type printtype = IGT_PRINT_USER;
> +	struct igt_devices_print_format fmt = {
> +			.type = IGT_PRINT_USER,
> +	};
>   
>   	while ((c = getopt_long(argc, argv, "spvld:h",
>   				long_options, &index)) != -1) {
>   		switch(c) {
>   
>   		case OPT_PRINT_SIMPLE:
> -			printtype = IGT_PRINT_SIMPLE;
> +			fmt.type = IGT_PRINT_SIMPLE;
>   			break;
>   		case OPT_PRINT_DETAIL:
> -			printtype = IGT_PRINT_DETAIL;
> +			fmt.type = IGT_PRINT_DETAIL;
>   			break;
>   		case OPT_LIST_VENDORS:
>   			g_show_vendors = true;
> @@ -187,6 +196,15 @@ int main(int argc, char *argv[])
>   		case OPT_HELP:
>   			g_help = true;
>   			break;
> +		case 0:
> +			fmt.option = IGT_PRINT_DRM;
> +			break;
> +		case 1:
> +			fmt.option = IGT_PRINT_SYSFS;
> +			break;
> +		case 2:
> +			fmt.option = IGT_PRINT_PCI;
> +			break;
>   		}
>   	}
>   
> @@ -239,14 +257,14 @@ int main(int argc, char *argv[])
>   		printf("Device detail:\n");
>   		print_card(&card);
>   		test_device_open(&card);
> -		if (printtype == IGT_PRINT_DETAIL) {
> +		if (fmt.type == IGT_PRINT_DETAIL) {
>   			printf("\n");
> -			igt_devices_print(printtype);
> +			igt_devices_print(&fmt);
>   		}
>   		printf("-------------------------------------------\n");
>   
>   	} else {
> -		igt_devices_print(printtype);
> +		igt_devices_print(&fmt);
>   	}
>   
>   	free(rc_device);
> 


More information about the Intel-gfx mailing list