Re: PCIe bus enumeration

From: Bjorn Helgaas
Date: Tue Jul 08 2014 - 14:24:11 EST

On Tue, Jul 8, 2014 at 1:15 AM, Federico Vaga <federico.vaga@xxxxxxx> wrote:
>> > So, It looks like that some BIOS disable the bridge when there is
>> > nothing behind it. Why? Power save? :/
>> Could be power savings, or possibly to conserve bus numbers, which
>> are a limited resource.
> what is the maximum number of buses?


>> Well, it's true that it's hard to get constant *bus numbers*, but
>> it's never really been a good idea to rely on those, because
>> they're assigned at the discretion of the OS, and there are reasons
>> why the OS might want to reallocate them, e.g., to accommodate a
>> deep hot-plugged hierarchy. If you shift focus to *slot numbers*,
>> then I think there's a lot more we can do.
> At this point I'm a little bit confused about the definition "slot
> numbers" :) You mean the 22, 25, ...

Right. Bus numbers are under software control, to some degree (as a
general rule, an x86 BIOS assigns them and Linux leaves them alone,
but they *can* be changed so they aren't a good thing to rely on).
The bus number of a root bus is usually determined by hardware or by
an arch-specific host bridge driver. The bus number below a PCI-PCI
bridge is determined by the bridge's "secondary bus number" register,
which software can change.

Slot numbers are based on the Physical Slot Number in the PCIe Slot
Capability register. This is set by some hardware mechanism such as
pin strapping or a serial EEPROM. Software can't change it, so you
can rely on it to be constant. (There's also a mechanism for getting
a slot number from ACPI, but that should also return a constant
value). The problem is that I don't think the Linux slot number
support is very good, so I'm sure there's plenty of stuff that we
*should* be able to do that we can't do *yet*.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at