[PATCH i-g-t v2] tools/lsgpu: Add switch to display gpu pci devices
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Wed Jun 19 08:41:15 UTC 2024
On Fri, Jun 14, 2024 at 05:16:28PM +0200, Kamil Konieczny wrote:
> Hi Zbigniew,
> On 2024-06-05 at 06:53:08 +0200, Zbigniew Kempczyński wrote:
> > Device scanning in IGT is based on iterating over udev drm devices. This
> > limits to display only to devices which have driver loaded.
> >
> > To remove this limitation add dedicated udev pci scanning in lsgpu which
> > displays all gpu devices (pci class 0x30000).
>
> This or class 0x38000. 0x30000 catches aspeed display card and others
> but I do not see ATS-M cards, after loading Xe driver:
>
> sudo build/tools/lsgpu
> card0 Intel Ats_m (Gen12) drm:/dev/dri/card0
> └─renderD128 drm:/dev/dri/renderD128
>
> sudo build/tools/lsgpu -pn |grep -i class
>
> ID_PCI_CLASS_FROM_DATABASE : Display controller
> ID_PCI_SUBCLASS_FROM_DATABASE : Display controller
> PCI_CLASS : 38000
> class : 0x038000
>
> >
> > Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > Cc: Jani Nikula <jani.nikula at intel.com>
> >
> > ---
> > v2: Remove unnecessary variable
> > Add pci-id and use codename only when is pretty
> > ---
> > tools/lsgpu.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++--
> > 1 file changed, 87 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/lsgpu.c b/tools/lsgpu.c
> > index da84e20505..23ea8ccdd7 100644
> > --- a/tools/lsgpu.c
> > +++ b/tools/lsgpu.c
> > @@ -30,6 +30,7 @@
> > #include <string.h>
> > #include <signal.h>
> > #include <glib.h>
> > +#include <libudev.h>
> >
> > /**
> > * SECTION:lsgpu
> > @@ -77,12 +78,14 @@ enum {
> > OPT_LIST_VENDORS = 'v',
> > OPT_LIST_FILTERS = 'l',
> > OPT_DEVICE = 'd',
> > - OPT_HELP = 'h'
> > + OPT_HELP = 'h',
> > + OPT_PCISCAN = 'P',
> > };
>
> I do not see description of 'P' option after --help?
Ok, I will add it.
>
> >
> > static bool g_show_vendors;
> > static bool g_list_filters;
> > static bool g_help;
> > +static bool g_pciscan;
> > static char *igt_device;
> >
> > static const char *usage_str =
> > @@ -158,6 +161,82 @@ static char *get_device_from_rc(void)
> > return rc_device;
> > }
> >
> > +static int pciscan(void)
> > +{
> > + struct udev *udev;
> > + struct udev_enumerate *enumerate;
> > + struct udev_list_entry *devices, *dev_list_entry;
> > + struct igt_device_card card;
> > + char pcistr[10];
> > + int ret;
> > +
> > + udev = udev_new();
> > + igt_assert(udev);
> > +
> > + enumerate = udev_enumerate_new(udev);
> > + igt_assert(enumerate);
> > +
> > + printf("Scanning pci subsystem\n");
> > + printf("----------------------\n");
> > + ret = udev_enumerate_add_match_subsystem(enumerate, "pci");
> > + igt_assert(!ret);
> > +
> > + ret = udev_enumerate_add_match_property(enumerate, "PCI_CLASS", "30000");
> > + igt_assert(!ret);
>
> I am not sure if assert is good here, why not gracefull return?
> Print info and return.
Assert is correct here. That's expected value here on successful call.
>
> > +
> > + ret = udev_enumerate_scan_devices(enumerate);
> > + igt_assert(!ret);
>
> Same here.
>
> > +
> > + devices = udev_enumerate_get_list_entry(enumerate);
> > + if (!devices) {
> > + printf("No pci devices with class 0x30000 found\n");
>
> Why not make class a param?
According to pci spec we're interested in 0x30000 and 0x38000 at
the moment. I think most users even are not aware of those pci
classes, so I see no reason to add some parameter. If any other
class will be used in the future we can simply add another property
match call.
--
Zbigniew
>
> Regards,
> Kamil
>
> > + return 0;
> > + }
> > +
> > + udev_list_entry_foreach(dev_list_entry, devices) {
> > + const char *path;
> > + struct udev_device *udev_dev;
> > + struct udev_list_entry *entry;
> > + char *codename;
> > +
> > + path = udev_list_entry_get_name(dev_list_entry);
> > + udev_dev = udev_device_new_from_syspath(udev, path);
> > + printf("[%s]\n", path);
> > +
> > + strcpy(card.pci_slot_name, "-");
> > + entry = udev_device_get_properties_list_entry(udev_dev);
> > + while (entry) {
> > + const char *name = udev_list_entry_get_name(entry);
> > + const char *value = udev_list_entry_get_value(entry);
> > +
> > + entry = udev_list_entry_get_next(entry);
> > + if (!strcmp(name, "ID_VENDOR_FROM_DATABASE"))
> > + printf(" vendor [db]: %s\n", value);
> > + else if (!strcmp(name, "ID_MODEL_FROM_DATABASE"))
> > + printf(" model [db]: %s\n", value);
> > + else if (!strcmp(name, "DRIVER"))
> > + printf(" driver : %s\n", value);
> > + else if (!strcmp(name, "PCI_ID"))
> > + igt_assert_eq(sscanf(value, "%hx:%hx",
> > + &card.pci_vendor, &card.pci_device), 2);
> > + }
> > + snprintf(pcistr, sizeof(pcistr), "%04x:%04x",
> > + card.pci_vendor, card.pci_device);
> > + printf(" pci id : %s\n", pcistr);
> > + codename = igt_device_get_pretty_name(&card, false);
> > + if (strcmp(pcistr, codename))
> > + printf(" codename : %s\n", codename);
> > + free(codename);
> > +
> > + udev_device_unref(udev_dev);
> > + }
> > +
> > + udev_enumerate_unref(enumerate);
> > + udev_unref(udev);
> > +
> > + return 0;
> > +}
> > +
> > int main(int argc, char *argv[])
> > {
> > static struct option long_options[] = {
> > @@ -180,7 +259,7 @@ int main(int argc, char *argv[])
> > .type = IGT_PRINT_USER,
> > };
> >
> > - while ((c = getopt_long(argc, argv, "ncspvld:h",
> > + while ((c = getopt_long(argc, argv, "ncspvld:hP",
> > long_options, &index)) != -1) {
> > switch(c) {
> >
> > @@ -208,6 +287,9 @@ int main(int argc, char *argv[])
> > case OPT_HELP:
> > g_help = true;
> > break;
> > + case OPT_PCISCAN:
> > + g_pciscan = true;
> > + break;
> > case 0:
> > fmt.option = IGT_PRINT_DRM;
> > break;
> > @@ -220,6 +302,9 @@ int main(int argc, char *argv[])
> > }
> > }
> >
> > + if (g_pciscan)
> > + return pciscan();
> > +
> > if (g_help) {
> > printf("%s\n", usage_str);
> > exit(0);
> > --
> > 2.34.1
> >
More information about the igt-dev
mailing list