On Fri, Oct 28, 2011 at 4:27 PM, Bjorn Helgaas wrote: > Convert from pci_create_bus() to pci_create_root_bus().  This way the root > bus resources are correct immediately.  This patch doesn't fix a problem > because powerpc fixed the resources before scanning the bus, but it makes > powerpc more consistent with other architectures. > > CC: Benjamin Herrenschmidt > Signed-off-by: Bjorn Helgaas > --- >  arch/powerpc/kernel/pci-common.c |   25 ++++++++++++++----------- >  1 files changed, 14 insertions(+), 11 deletions(-) > > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c > index 942ced2..8c47c57 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1554,14 +1554,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) >        return pci_enable_resources(dev, mask); >  } > > -static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) > +static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) >  { > -       struct pci_bus *bus = hose->bus; >        struct resource *res; >        int i; > >        /* Hookup PHB IO resource */ > -       bus->resource[0] = res = &hose->io_resource; > +       res = &hose->io_resource; > >        if (!res->flags) { >                printk(KERN_WARNING "PCI: I/O resource not set for host" > @@ -1579,6 +1578,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) >                 (unsigned long long)res->start, >                 (unsigned long long)res->end, >                 (unsigned long)res->flags); > +       pci_add_resource(resources, res); > >        /* Hookup PHB Memory resources */ >        for (i = 0; i < 3; ++i) { > @@ -1596,12 +1596,12 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) >                        res->flags = IORESOURCE_MEM; >  #endif /* CONFIG_PPC32 */ >                } > -               bus->resource[i+1] = res; > >                pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", i, >                         (unsigned long long)res->start, >                         (unsigned long long)res->end, >                         (unsigned long)res->flags); > +               pci_add_resource(resources, res); >        } > >        pr_debug("PCI: PHB MEM offset     = %016llx\n", > @@ -1695,6 +1695,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) >  */ >  void __devinit pcibios_scan_phb(struct pci_controller *hose) >  { > +       LIST_HEAD(resources); >        struct pci_bus *bus; >        struct device_node *node = hose->dn; >        int mode; > @@ -1702,22 +1703,24 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose) >        pr_debug("PCI: Scanning PHB %s\n", >                 node ? node->full_name : ""); > > +       /* Get some IO space for the new PHB */ > +       pcibios_setup_phb_io_space(hose); > + > +       /* Wire up PHB bus resources */ > +       pcibios_setup_phb_resources(hose, &resources); > + >        /* Create an empty bus for the toplevel */ > -       bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); > +       bus = pci_create_root_bus(hose->parent, hose->first_busno, > +                                 hose->ops, hose, resources); Typo here ("resources" should be "&resources") broke the build, corrected patch attached. (Also available at git://github.com/bjorn-helgaas/linux.git on the "pci-scan-v4" branch as 481c96ef546fd0a1ebd9254771f24d136aaff7cc)