[igt-dev] [PATCH i-g-t v2 5/6] lib/igt_device_scan: Add discrete/integrated pseudo-codenames
Kamil Konieczny
kamil.konieczny at linux.intel.com
Tue Jul 12 15:02:29 UTC 2022
Hi Zbigniew,
On 2022-07-12 at 11:57:06 +0200, Zbigniew Kempczyński wrote:
> For simply selection where test should just run on dedicated card type
> pci + sriov selectors can now use:
>
> pci:vendor=8086,device=integrated
> pci:vendor=intel,device=integrated
>
> or
>
> pci:vendor=8086,device=discrete
> pci:vendor=intel,device=discrete
>
> or (when there're more discrete cards)
>
> pci:vendor=8086,device=discrete,card=n
> pci:vendor=intel,device=discrete,card=n
>
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> ---
> lib/igt_device_scan.c | 75 +++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 72 insertions(+), 3 deletions(-)
>
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index 044bb75c6a..5566e028d1 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -118,12 +118,19 @@
> *
> * It selects the second one.
> *
> - * We may use device codename instead pci device id:
> + * We may use device codename or pseudo-codename (integrated/discrete)
> + * instead pci device id:
-------------- ^
s/instead pci/instead of pci/
With that fixed
Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
Regards,
Kamil
> *
> * |[<!-- language="plain" -->
> * pci:vendor=8086,device=skylake
> * ]|
> *
> + * or
> + *
> + * |[<!-- language="plain" -->
> + * pci:vendor=8086,device=integrated
> + * ]|
> + *
> * Another possibility is to select device using a PCI slot:
> *
> * |[<!-- language="plain" -->
> @@ -179,6 +186,15 @@
> #define DBG(...) {}
> #endif
>
> +enum dev_type {
> + DEVTYPE_ALL,
> + DEVTYPE_INTEGRATED,
> + DEVTYPE_DISCRETE,
> +};
> +
> +#define STR_INTEGRATED "integrated"
> +#define STR_DISCRETE "discrete"
> +
> static inline bool strequal(const char *a, const char *b)
> {
> if (a == NULL || b == NULL)
> @@ -213,6 +229,7 @@ struct igt_device {
> int gpu_index; /* For more than one GPU with same vendor and device. */
>
> char *codename; /* For grouping by codename */
> + enum dev_type dev_type; /* For grouping by integrated/discrete */
>
> struct igt_list_head link;
> };
> @@ -225,6 +242,7 @@ static struct {
> } igt_devs;
>
> typedef char *(*devname_fn)(uint16_t, uint16_t);
> +typedef enum dev_type (*devtype_fn)(uint16_t, uint16_t, const char *);
>
> static char *devname_hex(uint16_t vendor, uint16_t device)
> {
> @@ -273,14 +291,35 @@ static char *codename_intel(uint16_t vendor, uint16_t device)
> return codename;
> }
>
> +static enum dev_type devtype_intel(uint16_t vendor, uint16_t device, const char *pci_slot)
> +{
> + (void) vendor;
> + (void) device;
> +
> + if (!strncmp(pci_slot, INTEGRATED_I915_GPU_PCI_ID, PCI_SLOT_NAME_SIZE))
> + return DEVTYPE_INTEGRATED;
> +
> + return DEVTYPE_DISCRETE;
> +}
> +
> +static enum dev_type devtype_all(uint16_t vendor, uint16_t device, const char *pci_slot)
> +{
> + (void) vendor;
> + (void) device;
> + (void) pci_slot;
> +
> + return DEVTYPE_ALL;
> +}
> +
> static struct {
> const char *name;
> const char *vendor_id;
> devname_fn devname;
> devname_fn codename;
> + devtype_fn devtype;
> } pci_vendor_mapping[] = {
> - { "intel", "8086", devname_intel, codename_intel },
> - { "amd", "1002", devname_hex, devname_hex },
> + { "intel", "8086", devname_intel, codename_intel, devtype_intel },
> + { "amd", "1002", devname_hex, devname_hex, devtype_all },
> { NULL, },
> };
>
> @@ -323,6 +362,20 @@ static devname_fn get_pci_vendor_device_codename_fn(uint16_t vendor)
> return devname_hex;
> }
>
> +static devtype_fn get_pci_vendor_device_devtype_fn(uint16_t vendor)
> +{
> + char vendorstr[5];
> +
> + snprintf(vendorstr, sizeof(vendorstr), "%04x", vendor);
> +
> + for (typeof(*pci_vendor_mapping) *vm = pci_vendor_mapping; vm->name; vm++) {
> + if (!strcasecmp(vendorstr, vm->vendor_id))
> + return vm->devtype;
> + }
> +
> + return devtype_all;
> +}
> +
> static void get_pci_vendor_device(const struct igt_device *dev,
> uint16_t *vendorp, uint16_t *devicep)
> {
> @@ -354,6 +407,15 @@ static char *__pci_codename(uint16_t vendor, uint16_t device)
> return fn(vendor, device);
> }
>
> +static enum dev_type __pci_devtype(uint16_t vendor, uint16_t device, const char *pci_slot)
> +{
> + devtype_fn fn;
> +
> + fn = get_pci_vendor_device_devtype_fn(vendor);
> +
> + return fn(vendor, device, pci_slot);
> +}
> +
> /* Reading sysattr values can take time (even seconds),
> * we want to avoid reading such keys.
> */
> @@ -569,6 +631,7 @@ static struct igt_device *igt_device_new_from_udev(struct udev_device *dev)
> set_pci_slot_name(idev);
> get_pci_vendor_device(idev, &vendor, &device);
> idev->codename = __pci_codename(vendor, device);
> + idev->dev_type = __pci_devtype(vendor, device, idev->pci_slot_name);
> }
>
> return idev;
> @@ -620,6 +683,12 @@ static bool is_device_matched(struct igt_device *dev, const char *device)
> if (!strcasecmp(dev->device, device))
> return true;
>
> + /* Try "integrated" and "discrete" */
> + if (dev->dev_type == DEVTYPE_INTEGRATED && !strcasecmp(device, STR_INTEGRATED))
> + return true;
> + else if (dev->dev_type == DEVTYPE_DISCRETE && !strcasecmp(device, STR_DISCRETE))
> + return true;
> +
> /* Try codename */
> return !strcasecmp(dev->codename, device);
> }
> --
> 2.34.1
>
More information about the igt-dev
mailing list