The implementation of /sys/bus/pci/devices/xxxxxx/modalias is in
drivers/pci/sys-fs.c:

static ssize_t modalias_show(struct device *dev, struct
device_attribute *attr, char *buf)
{
        struct pci_dev *pci_dev = to_pci_dev(dev);

        return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi
%02x\n",
                       pci_dev->vendor, pci_dev->device,
                       pci_dev->subsystem_vendor, pci_dev-
>subsystem_device,
                       (u8)(pci_dev->class >> 16), (u8)(pci_dev->class
>> 8),
                       (u8)(pci_dev->class));
}

and those of /sys/devices/pcixxxx/xxxxx/usb5/5-0:1.0/modalias is in
drivers/usb/core/sysfs.c:

static ssize_t show_modalias(struct device *dev,
                struct device_attribute *attr, char *buf)
{
        struct usb_interface *intf;
        struct usb_device *udev;
        struct usb_host_interface *alt;

        intf = to_usb_interface(dev);
        udev = interface_to_usbdev(intf);
        alt = intf->cur_altsetting;

        return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
                        "ic%02Xisc%02Xip%02X\n",
                        le16_to_cpu(udev->descriptor.idVendor),
                        le16_to_cpu(udev->descriptor.idProduct),
                        le16_to_cpu(udev->descriptor.bcdDevice),
                        udev->descriptor.bDeviceClass,
                        udev->descriptor.bDeviceSubClass,
                        udev->descriptor.bDeviceProtocol,
                        alt->desc.bInterfaceClass,
                        alt->desc.bInterfaceSubClass,
                        alt->desc.bInterfaceProtocol);
}

and so just for modalias alone, the output comes from different places
in the kernel source.


On Jun 27, 8:49 am, Peter Teoh <htmldevelo...@gmail.com> wrote:
> Looking into lspci via strace:
> strace lspci 2>/tmp/lspci.out
> and then extracting out all the "open" calls in lspci.out following that 
> searching for "sys":
> open("cmov/libresolv.so.2", O_RDONLY)   = -1 ENOENT (No such file or 
> directory)
> open("libresolv.so.2", O_RDONLY)        = -1 ENOENT (No such file or 
> directory)
> open("/lib/tls/i686/cmov/libresolv.so.2", O_RDONLY) = 3
> open("/dev/urandom", O_RDONLY)          = 3
> open("/sys/bus/pci/devices", 
> O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
> open("/sys/bus/pci/devices/0000:00:00.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:00.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:00.0/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:00.0/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:00.0/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:01.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:01.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:01.0/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:01.0/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:01.0/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.0/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.0/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.0/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.1/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.1/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.1/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.1/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.1/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.7/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.7/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.7/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.7/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1a.7/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1b.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1b.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1b.0/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1b.0/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1b.0/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.0/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.0/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.0/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.4/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.4/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.4/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.4/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.4/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.5/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.5/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.5/vendor", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.5/device", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1c.5/class", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1d.0/resource", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1d.0/irq", O_RDONLY) = 4
> open("/sys/bus/pci/devices/0000:00:1d.0/vendor", O_RDONLY) = 4
> From above we know that it enumerate all the devices via first reading the 
> directory /sys/bus/pci/devices and then searching for files like irq, vendor, 
> device, class, resource under each devices ID  found.
> Awesome!!!!

Reply via email to