Objective
I'm trying to programmatically find out on which physical slot a particular PCIe device is connected. The premise is that I have the PCI-ID of a card that is surely occupying a slot, and the solution would be finding out which one.
Note that I'm only interested in working on the PCI Express bus, although the device identification/enumeration process I think is the same as the old PCI.
Attempt
The SMBIOS contains information about the motherboard slots available. It is possible to examine this information from the linux command line:
$ sudo dmidecode -t slot
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x003A, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_1
Type: x16 PCI Express x16
Current Usage: In Use
Length: Short
ID: 1
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:03:02.0
Handle 0x003B, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_2
Type: x8 PCI Express x8
Current Usage: In Use
Length: Short
ID: 2
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:04:02.2
Handle 0x003C, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_3
Type: x16 PCI Express x16
Current Usage: In Use
Length: Short
ID: 3
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:05:03.0
However, I can't find any device in the PCI bus (lspci
) that has a PCI ID of 0000:03:02.0
, 0000:04:02.2
or 0000:05:03.0
. What I know by manual inspection is the following:
- Card
0000:03:00.0
is in the first slot. The PCI bridge appears to be0000:00:02.0
- Card
0000:04:00.0
is in the second slot. The PCI bridge appears to be0000:00:02.2
- Card
0000:05:00.0
is in the third slot. The PCI bridge appears to be0000:00:03.0
So a pattern emerges here. From the SMBIOS structure, the bus number is the one given to the card that is plugged in but the device/function numbers are the same as the corresponding PCI bridge.
Is this pattern just a coincidence in my motherboard or there is a rationale behind? It is an Asus motherboard, with an AMI BIOS. I've read that some BIOSes do not provide accurate information about their slots so I would like to know how much generality I can achieve.
Any hint or pointer to reference documentation is also greatly appreciated.