powerpc/PCI: register busn_res for root buses
authorYinghai Lu <yinghai@kernel.org>
Fri, 18 May 2012 01:51:12 +0000 (18:51 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 13 Jun 2012 21:42:24 +0000 (15:42 -0600)
Add the host bridge bus number aperture to the resource list.
Like the MMIO and I/O port apertures, this is used when assigning
resources to hot-added devices or in the case of conflicts.

[bhelgaas: changelog]
CC: Paul Mackerras <paulus@samba.org>
CC: linuxppc-dev@lists.ozlabs.org
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
arch/powerpc/include/asm/pci-bridge.h
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/pci_of_scan.c

index ac39e6a..8cccbee 100644 (file)
@@ -30,6 +30,7 @@ struct pci_controller {
        int first_busno;
        int last_busno;
        int self_busno;
+       struct resource busn;
 
        void __iomem *io_base_virt;
 #ifdef CONFIG_PPC64
index 3532b53..7320f36 100644 (file)
@@ -1637,6 +1637,11 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
        /* Wire up PHB bus resources */
        pcibios_setup_phb_resources(hose, &resources);
 
+       hose->busn.start = hose->first_busno;
+       hose->busn.end   = hose->last_busno;
+       hose->busn.flags = IORESOURCE_BUS;
+       pci_add_resource(&resources, &hose->busn);
+
        /* Create an empty bus for the toplevel */
        bus = pci_create_root_bus(hose->parent, hose->first_busno,
                                  hose->ops, hose, &resources);
@@ -1646,7 +1651,6 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
                pci_free_resource_list(&resources);
                return;
        }
-       bus->busn_res.start = hose->first_busno;
        hose->bus = bus;
 
        /* Get probe mode and perform scan */
@@ -1654,13 +1658,14 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
        if (node && ppc_md.pci_probe_mode)
                mode = ppc_md.pci_probe_mode(bus);
        pr_debug("    probe mode: %d\n", mode);
-       if (mode == PCI_PROBE_DEVTREE) {
-               bus->busn_res.end = hose->last_busno;
+       if (mode == PCI_PROBE_DEVTREE)
                of_scan_bus(node, bus);
-       }
 
-       if (mode == PCI_PROBE_NORMAL)
-               hose->last_busno = bus->busn_res.end = pci_scan_child_bus(bus);
+       if (mode == PCI_PROBE_NORMAL) {
+               pci_bus_update_busn_res_end(bus, 255);
+               hose->last_busno = pci_scan_child_bus(bus);
+               pci_bus_update_busn_res_end(bus, hose->last_busno);
+       }
 
        /* Platform gets a chance to do some global fixups before
         * we proceed to resource allocation
index a36281a..ae5ea5e 100644 (file)
@@ -240,7 +240,7 @@ void __devinit of_scan_pci_bridge(struct pci_dev *dev)
        }
 
        bus->primary = dev->bus->number;
-       bus->busn_res.end = busrange[1];
+       pci_bus_insert_busn_res(bus, busrange[0], busrange[1]);
        bus->bridge_ctl = 0;
 
        /* parse ranges property */