[igt-dev] [PATCH i-g-t] lib/igt_device_scan: Add slot selector

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Jan 4 13:33:05 UTC 2021


On Mon, Jan 04, 2021 at 10:34:41AM +0100, Łukasz Łaguna wrote:
> Add selector for direct device selection, based on hardware (PCIe) path.
> It allows to choose device in specified domain, bus, slot and function.
> 
> Example:
> gem_exec_basic --device "pci:slot=0000:01:00.0"
> 
> Signed-off-by: Łukasz Łaguna <lukasz.laguna at intel.com>
> ---
>  lib/igt_device_scan.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index b3b2bf4d..4704ba6f 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -83,9 +83,9 @@
>   *   device selection, e.g. in automated execution setting. In such scenarios
>   *   please consider using sys, pci or platform filters instead.
>   *
> - * - pci: select device using PCI vendor and device properties
> + * - pci: select device using PCI slot or vendor and device properties
>   *   |[<!-- language="plain" -->
> - *   pci:[vendor=%04x/name][,device=%04x][,card=%d]
> + *   pci:[vendor=%04x/name][,device=%04x][,card=%d] | [slot=%04x:%02x:%02x.%x]
>   *   ]|
>   *
>   *   Filter allows device selection using vendor (hex or name), device id
> @@ -117,6 +117,12 @@
>   *
>   *   It selects the second one.
>   *
> + *   Another possibility is to select device using a PCI slot:
> + *
> + *   |[<!-- language="plain" -->
> + *   pci:slot=0000:01:00.0
> + *   ]|
> + *
>   *   As order the on PCI bus doesn't change (unless you'll add new device or
>   *   reorder existing one) device selection using this filter will always
>   *   return you same device regardless the order of enumeration.
> @@ -1138,6 +1144,7 @@ struct filter {
>  		char *vendor;
>  		char *device;
>  		char *card;
> +		char *slot;
>  		char *drm;
>  		char *driver;
>  	} data;
> @@ -1154,6 +1161,7 @@ static void fill_filter_data(struct filter *filter, const char *key, const char
>  	__fill_key(vendor);
>  	__fill_key(device);
>  	__fill_key(card);
> +	__fill_key(slot);
>  	__fill_key(drm);
>  	__fill_key(driver);
>  #undef __fill_key
> @@ -1271,6 +1279,10 @@ static struct igt_list_head *filter_pci(const struct filter_class *fcls,
>  		if (!is_pci_subsystem(dev))
>  			continue;
>  
> +		/* Skip if 'slot' doesn't match */
> +		if (filter->data.slot && !strequal(filter->data.slot, dev->pci_slot_name))
> +			continue;
> +

selector - pci:[vendor=%04x/name][,device=%04x][,card=%d] | [slot=%04x:%02x:%02x.%x]

According to pci selector I assume you want to have:

1. pci:vendor=...,device=...
  
or 

2. pci:slot=xxxx:xx:xx.x 

So slot should be exclusive and no vendor/device/card parameters should be allowed
and vice versa. 

Now I'm able to pass:

pci:slot=0000:00:02.0,vendor=8081

but I expect vendor check shouldn't be processed here (passing slot gives you explicit
device and according to selector description these two are exclusive).

So - disable vendor/device/card if slot is used and slot when vendor/device/card
are used. I think you even should exit with an error in such case.

--
Zbigniew

>  		/* Skip if 'vendor' doesn't match (hex or name) */
>  		if (filter->data.vendor && !is_vendor_matched(dev, filter->data.vendor))
>  			continue;
> @@ -1325,7 +1337,7 @@ static struct filter_class filter_definition_list[] = {
>  	{
>  		.name = "pci",
>  		.filter_function = filter_pci,
> -		.help = "pci:[vendor=%04x/name][,device=%04x][,card=%d]",
> +		.help = "pci:[vendor=%04x/name][,device=%04x][,card=%d] | [slot=%04x:%02x:%02x.%x]",
>  		.detail = "vendor is hex number or vendor name\n",
>  	},
>  	{
> -- 
> 2.28.0
> 


More information about the igt-dev mailing list