[+cc Matthew for "lspci -P"] On Wed, Jul 14, 2021 at 02:33:37PM +0800, Wenchao Hao wrote: > Since linux identify PCI peripheral by [domain:bus:device:function] number > like following, > > # lspci -D > 0000:00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge > 0000:00:01.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92) > 0000:00:02.0 PCI bridge: Intel Corporation 7500/5520/5500/X58 I/O Hub PCI > Express Root Port 0 (rev 02) > 0000:00:02.1 PCI bridge: Intel Corporation 7500/5520/5500/X58 I/O Hub PCI > Express Root Port 0 (rev 02) > 0000:00:02.2 PCI bridge: Intel Corporation 7500/5520/5500/X58 I/O Hub PCI > Express Root Port 0 (rev 02) > 0000:00:02.3 PCI bridge: Intel Corporation 7500/5520/5500/X58 I/O Hub PCI > Express Root Port 0 (rev 02) > 0000:01:00.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge > 0000:02:01.0 USB controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) > USB2 EHCI Controller (rev 10) > 0000:02:02.0 Unclassified device [00ff]: Virtio: Virtio memory balloon > 0000:02:03.0 SCSI storage controller: Virtio: Virtio SCSI > 0000:02:04.0 Display controller: Virtio: Virtio GPU (rev 01) > 0000:03:00.0 Ethernet controller: Virtio: Virtio network device (rev 01) > > Here are my questions: Are these [domain:bus:device:function] number > come from hardware's physical connection or allocated by software > dynamic? The device and function numbers are completely determined by the hardware and are not programmable. Bus numbers are programmable and are determined by the Secondary Bus Number of the bridge leading to the device. These bus numbers are generally programmed by the BIOS on x86. It's possible for Linux to reprogram them, but it generally leaves them alone if they are valid. On x86 with ACPI, the domain number comes from the _SEG method of the PNP0A03 device that describes the host bridge. This may correspond to a programmable hardware register, but that isn't visible to the OS and Linux has no way to change it. > If hardware do not change, can we guarantee these number do not > change after system reboot? For the typical x86 system with ACPI, this is really a question for the BIOS. If the hardware doesn't change, I would *expect* the domain/bus/device/function numbers to stay the same, but only BIOS folks can answer this definitively. > If they are not fixed, then is there anyway I can get a fixed ID > which can indicate physical connection. You can look at the "lspci -P" option. I'm not really familiar with this, but I think Matthew (cc'd) implemented it. Bjorn