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 <[email protected]> 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!!!!