[igt-dev] [PATCH i-g-t 2/6] lib/igt_device_scan: Introduce codename for platform selection
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Tue Jul 12 09:08:09 UTC 2022
On Mon, Jul 11, 2022 at 04:26:24PM +0200, Kamil Konieczny wrote:
> Hi Zbigniew,
>
> On 2022-07-07 at 08:59:35 +0200, Zbigniew Kempczyński wrote:
> > Platform rare is defined by single pci device id. Adding platform group
> ---------- ^
> Maybe s/rare/rarely/ ? or maybe seldom ?
>
> > selection will make device selection more convenient. Now instead using
> >
> > pci:vendor=8086,device=0x1927
> >
> > we may pass:
> >
> > pci:vendor=8086,device=skylake
>
> As we are at this, even better would be:
> vendor=intel,device=skylake
>
> >
> > Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > ---
> > lib/igt_device_scan.c | 89 +++++++++++++++++++++++++++++++++++++++----
> > lib/igt_device_scan.h | 1 +
> > 2 files changed, 83 insertions(+), 7 deletions(-)
> >
> > diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> > index 83a488aa7c..afb6f07e18 100644
> > --- a/lib/igt_device_scan.c
> > +++ b/lib/igt_device_scan.c
> > @@ -85,7 +85,7 @@
> > *
> > * - pci: select device using PCI slot or vendor and device properties
> > * |[<!-- language="plain" -->
> > - * pci:[vendor=%04x/name][,device=%04x][,card=%d] | [slot=%04x:%02x:%02x.%x]
> > + * pci:[vendor=%04x/name][,device=%04x/codename][,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.
> > *
> > + * We may use device codename instead pci device id:
> > + *
> > + * |[<!-- language="plain" -->
> > + * pci:vendor=8086,device=skylake
> > + * ]|
> > + *
> > * Another possibility is to select device using a PCI slot:
> > *
> > * |[<!-- language="plain" -->
> > @@ -131,7 +137,7 @@
> > *
> > * - sriov: select pf or vf
> > * |[<!-- language="plain" -->
> > - * sriov:[vendor=%04x/name][,device=%04x][,card=%d][,pf=%d][,vf=%d]
> > + * sriov:[vendor=%04x/name][,device=%04x/codename][,card=%d][,pf=%d][,vf=%d]
> > * ]|
> > *
> > * Filter extends pci selector to allow pf/vf selection:
> > @@ -205,6 +211,9 @@ struct igt_device {
> > char *pci_slot_name;
> > int gpu_index; /* For more than one GPU with same vendor and device. */
> >
> > + /* For grouping by codename */
>
> Please put this comment after var name, just like above at
> gpu_index.
>
> > + char *codename;
> > +
> > struct igt_list_head link;
> > };
> >
> > @@ -248,13 +257,30 @@ static char *devname_intel(uint16_t vendor, uint16_t device)
> > return s;
> > }
> >
> > +static char *codename_intel(uint16_t vendor, uint16_t device)
> > +{
> > + const struct intel_device_info *info = intel_get_device_info(device);
> > + char *codename = NULL;
> > +
> > + if (info->codename) {
> > + codename = strdup(info->codename);
> > + igt_assert(codename);
> > + }
> > +
> > + if (!codename)
> > + codename = devname_hex(vendor, device);
> > +
> > + return codename;
> > +}
> > +
> > static struct {
> > const char *name;
> > const char *vendor_id;
> > devname_fn devname;
> > + devname_fn codename;
> > } pci_vendor_mapping[] = {
> > - { "intel", "8086", devname_intel },
> > - { "amd", "1002", devname_hex },
> > + { "intel", "8086", devname_intel, codename_intel },
> > + { "amd", "1002", devname_hex, devname_hex },
> > { NULL, },
> > };
> >
> > @@ -283,6 +309,20 @@ static devname_fn get_pci_vendor_device_fn(uint16_t vendor)
> > return devname_hex;
> > }
> >
> > +static devname_fn get_pci_vendor_device_codename_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->codename;
> > + }
> > +
> > + return devname_hex;
> > +}
> > +
> > static void get_pci_vendor_device(const struct igt_device *dev,
> > uint16_t *vendorp, uint16_t *devicep)
> > {
> > @@ -305,6 +345,18 @@ static char *__pci_pretty_name(uint16_t vendor, uint16_t device, bool numeric)
> > return fn(vendor, device);
> > }
> >
> > +static char *__pci_codename(uint16_t vendor, uint16_t device, bool numeric)
> --------------------------------------------------------------- ^
> imho you should drop this bool param here.
>
> > +{
> > + devname_fn fn;
> > +
> > + if (!numeric)
> > + fn = get_pci_vendor_device_codename_fn(vendor);
>
> Use this unconditionally for getting fn.
>
> > + else
> > + fn = devname_hex;
> > +
> > + return fn(vendor, device);
> > +}
> > +
> > /* Reading sysattr values can take time (even seconds),
> > * we want to avoid reading such keys.
> > */
> > @@ -514,8 +566,12 @@ static struct igt_device *igt_device_new_from_udev(struct udev_device *dev)
> > get_attrs(dev, idev);
> >
> > if (is_pci_subsystem(idev)) {
> > + uint16_t vendor, device;
> > +
> > set_vendor_device(idev);
> > set_pci_slot_name(idev);
> > + get_pci_vendor_device(idev, &vendor, &device);
> > + idev->codename = __pci_codename(vendor, device, false);
> -------------------------------------------------------------- ^
> This looks bad, imho you drop this param.
>
> > }
> >
> > return idev;
> > @@ -558,6 +614,19 @@ static bool is_vendor_matched(struct igt_device *dev, const char *vendor)
> > return !strcasecmp(dev->vendor, vendor_id);
> > }
> >
> > +static bool is_device_matched(struct igt_device *dev, const char *device)
> > +{
> > + if (!dev->device || !device)
> > + return false;
> > +
> > + /* First we compare device id, like 1926 */
> > + if (!strcasecmp(dev->device, device))
> > + return true;
> > +
> > + /* Try codename */
> > + return !strcasecmp(dev->codename, device);
> > +}
> > +
> > static char *safe_strncpy(char *dst, const char *src, int n)
> > {
> > char *s;
> > @@ -824,6 +893,7 @@ static void scan_drm_devices(void)
> >
> > static void igt_device_free(struct igt_device *dev)
> > {
> > + free(dev->codename);
> > free(dev->devnode);
> > free(dev->subsystem);
> > free(dev->syspath);
> > @@ -935,6 +1005,7 @@ igt_devs_print_simple(struct igt_list_head *view,
> > if (is_pci_subsystem(dev)) {
> > _pr_simple("vendor", dev->vendor);
> > _pr_simple("device", dev->device);
> > + _pr_simple("codename", dev->codename);
> > }
> > }
> > printf("\n");
> > @@ -1022,7 +1093,10 @@ igt_devs_print_user(struct igt_list_head *view,
> > char *devname;
> >
> > get_pci_vendor_device(pci_dev, &vendor, &device);
> > - devname = __pci_pretty_name(vendor, device, fmt->numeric);
> > + if (fmt->codename)
> > + devname = __pci_codename(vendor, device, fmt->numeric);
>
> This mixing codename and fmt->numeric looks bad. Is it OK to use
> both -c option and numeric here ? so imho this should be just
> devname = __pci_codename(vendor, device);
Agree, I will fix this in next series.
--
Zbigniew
>
> Regards,
> Kamil
>
> > + else
> > + devname = __pci_pretty_name(vendor, device, fmt->numeric);
> >
> > __print_filter(filter, sizeof(filter), fmt, pci_dev,
> > false);
> > @@ -1106,6 +1180,7 @@ igt_devs_print_detail(struct igt_list_head *view,
> > if (!is_drm_subsystem(dev)) {
> > _print_key_value("card device", dev->drm_card);
> > _print_key_value("render device", dev->drm_render);
> > + _print_key_value("codename", dev->codename);
> > }
> >
> > printf("\n[properties]\n");
> > @@ -1332,7 +1407,7 @@ static struct igt_list_head *filter_pci(const struct filter_class *fcls,
> > continue;
> >
> > /* Skip if 'device' doesn't match */
> > - if (filter->data.device && strcasecmp(filter->data.device, dev->device))
> > + if (filter->data.device && !is_device_matched(dev, filter->data.device))
> > continue;
> >
> > /* We get n-th card */
> > @@ -1412,7 +1487,7 @@ static struct igt_list_head *filter_sriov(const struct filter_class *fcls,
> > continue;
> >
> > /* Skip if 'device' doesn't match */
> > - if (filter->data.device && strcasecmp(filter->data.device, dev->device))
> > + if (filter->data.device && !is_device_matched(dev, filter->data.device))
> > continue;
> >
> > /* We get n-th card */
> > diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
> > index 5f583a0666..e6b0f1b90a 100644
> > --- a/lib/igt_device_scan.h
> > +++ b/lib/igt_device_scan.h
> > @@ -50,6 +50,7 @@ struct igt_devices_print_format {
> > enum igt_devices_print_type type;
> > enum igt_devices_print_option option;
> > bool numeric;
> > + bool codename;
> > };
> >
> > #define INTEGRATED_I915_GPU_PCI_ID "0000:00:02.0"
> > --
> > 2.34.1
> >
More information about the igt-dev
mailing list