Dear Bjorn Helgaas, On Wed, 30 Jan 2013 11:52:15 -0700, Bjorn Helgaas wrote: > The secondary/subordinate registers effectively define a bus number > aperture that tells the bridge which transactions to claim and forward > downstream. When enumerating devices, we may update the subordinate > bus number to widen the aperture so we can enumerate an arbitrary tree > behind the bridge. When we're finished, we'll probably narrow it by > updating the subordinate again, so the unused bus number space can be > used for other bridges. I don't know the exact details of the > algorithm, and they're likely to change anyway, but pci_scan_bridge() > is where most of it happens. > > It looks like your current system doesn't support trees below the > bridges, but hopefully we can make it so the generic enumeration > algorithms still work. The PCI-to-PCI bridge specification says that the Primary Bus Number Register, Secondary Bus Number Register and Subordinate Bus Number Register of the PCI configuration space of a PCI-to-PCI bridge should all be set to 0 after reset. Until now, I was forcing a specific value of the Secondary Bus Number and Subordinate Bus Number (1 for my first bridge, 2 for my second bridge, etc.). Following you're recommendation, I've changed this, and left those values initialized to 0 by default, in order to let Linux set correct values. Yes, Linux does assign appropriate values in the Secondary Bus Number Register. But before that Linux also complains loudly that the bridge configuration is invalid: pci 0000:00:01.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:02.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:03.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:04.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:05.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:06.0: bridge configuration invalid ([bus 00-00]), reconfiguring Looking at the code, we have: /* Check if setup is sensible at all */ if (!pass && (primary != bus->number || secondary <= bus->number || secondary > subordinate)) { dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", secondary, subordinate); broken = 1; } Due to the default values of the Primary Bus Number Register, Secondary Bus Number Register and Subordinate Bus Number Register, we have: primary = 0 secondary = 0 subordinate = 0 We are enumerating the root bus, so bus->number = 0. Therefore: * The test primary != bus->number is false, so it's not the problem. * secondary <= bus->number is true, because secondary = 0, and bus->number = 0. It is the problem. * secondary > subordinate is false. So I'm not sure what to do with this... Thoas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html