[igt-dev] [PATCH i-g-t 2/2] lib/igt_device_scan: add card=all filter selector

Petri Latvala petri.latvala at intel.com
Tue Oct 18 10:56:50 UTC 2022


On Tue, Oct 18, 2022 at 11:10:01AM +0200, Kamil Konieczny wrote:
> Allow to select all discrete cards on system with the help of
> card=all or card=* filter, for example:
> 
> pci:vendor=intel,device=discrete,card=all
> 
> or
> 
> pci:vendor=intel,device=discrete,card=*
> 
> This will add max of 16 cards filters with card=0..15
> 
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
>  lib/igt_device_scan.c | 36 +++++++++++++++++++++++++++++++++---
>  1 file changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index 6f5b90e6..55840b4f 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -120,6 +120,13 @@
>   *
>   *   It selects the second one.
>   *
> + *   |[<!-- language="plain" -->
> + *   pci:vendor=8086,device=1234,card=all
> + *   pci:vendor=8086,device=1234,card=*
> + *   ]|
> + *
> + *   This will add 0..15 card selectors.
> + *
>   *   We may use device codename or pseudo-codename (integrated/discrete)
>   *   instead of pci device id:
>   *
> @@ -1753,6 +1760,8 @@ static bool is_filter_valid(const char *fstr)
>  	return true;
>  }
>  
> +#define MAX_PCI_CARDS 16
> +

>From an offline discussion:

16 is not enough. The limit for dri devices at this time is 64 and
it's being raised to 512k.

The current code does a blind filter splat to add 16 separate filters,
we could maybe enumerate all devices (with or without matching
anything) and use that as the loop limit. Then we get a number of
individual filters that is >= the matching amount, which works for all
cases. What do you think?


-- 
Petri Latvala




>  /**
>   * igt_device_filter_add
>   * @filters: filter(s) to be stored in filter array
> @@ -1776,14 +1785,35 @@ int igt_device_filter_add(const char *filters)
>  	while ((filter = strsep(&dup, ";"))) {
>  		bool is_valid = is_filter_valid(filter);
>  		struct device_filter *df;
> +		char *multi;
> +
>  		igt_warn_on(!is_valid);
>  		if (!is_valid)
>  			continue;
>  
>  		df = malloc(sizeof(*df));
> -		strncpy(df->filter, filter, sizeof(df->filter)-1);
> -		igt_list_add_tail(&df->link, &device_filters);
> -		count++;
> +		if (!strncmp(filter, "sriov:", 6)) {
> +			multi = NULL;
> +		} else {
> +			multi = strstr(filter, "card=all");
> +			if (!multi)
> +				multi = strstr(filter, "card=*");
> +		}
> +
> +		if (!multi) {
> +			strncpy(df->filter, filter, sizeof(df->filter)-1);
> +			igt_list_add_tail(&df->link, &device_filters);
> +			count++;
> +		} else {
> +			multi[5] = 0;
> +			for (int i = 0; i < MAX_PCI_CARDS; ++i) {
> +				if (i)
> +					df = malloc(sizeof(*df));
> +				snprintf(df->filter, sizeof(df->filter)-1, "%s%d", filter, i);
> +				igt_list_add_tail(&df->link, &device_filters);
> +				count++;
> +			}
> +		}
>  	}
>  
>  	free(dup_orig);
> -- 
> 2.34.1
> 


More information about the igt-dev mailing list