[POWERPC] Added self_busno to indicate which bus number the PHB is
authorKumar Gala <galak@kernel.crashing.org>
Mon, 25 Jun 2007 18:09:42 +0000 (13:09 -0500)
committerKumar Gala <galak@kernel.crashing.org>
Fri, 29 Jun 2007 06:58:13 +0000 (01:58 -0500)
Added self_busno to pci_controller and indirect PCI ops to be set by
board code to indicate which bus number to use when talking to the PHB.
By default we use zero since the majority of controllers that have
implicit mechanisms to talk to the PHBs use a bus number of zero.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/sysdev/indirect_pci.c
include/asm-ppc/pci-bridge.h

index 3dedf8f5bfb41dde9ea2d8d417184e7543dc47c8..d490e71f05332f01fae238d9a9556d5eff1b70c3 100644 (file)
@@ -33,6 +33,7 @@ indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
        struct pci_controller *hose = bus->sysdata;
        volatile void __iomem *cfg_data;
        u8 cfg_type = 0;
+       u32 bus_no;
 
        if (ppc_md.pci_exclude_device)
                if (ppc_md.pci_exclude_device(hose, bus->number, devfn))
@@ -42,8 +43,11 @@ indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
                if (bus->number != hose->first_busno)
                        cfg_type = 1;
 
+       bus_no = (bus->number == hose->first_busno) ?
+                       hose->self_busno : bus->number - hose->bus_offset;
+
        PCI_CFG_OUT(hose->cfg_addr,
-                (0x80000000 | ((bus->number - hose->bus_offset) << 16)
+                (0x80000000 | (bus_no << 16)
                  | (devfn << 8) | ((offset & 0xfc) | cfg_type)));
 
        /*
@@ -72,6 +76,7 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
        struct pci_controller *hose = bus->sysdata;
        volatile void __iomem *cfg_data;
        u8 cfg_type = 0;
+       u32 bus_no;
 
        if (ppc_md.pci_exclude_device)
                if (ppc_md.pci_exclude_device(hose, bus->number, devfn))
@@ -81,8 +86,11 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
                if (bus->number != hose->first_busno)
                        cfg_type = 1;
 
+       bus_no = (bus->number == hose->first_busno) ?
+                       hose->self_busno : bus->number - hose->bus_offset;
+
        PCI_CFG_OUT(hose->cfg_addr,
-                (0x80000000 | ((bus->number - hose->bus_offset) << 16)
+                (0x80000000 | (bus_no << 16)
                  | (devfn << 8) | ((offset & 0xfc) | cfg_type)));
 
        /*
index 4d35b844bc58e8fd7e110bc3e620b65e691bf631..2c2abdaad42fed84cfca774d7cd8c2cde781996d 100644 (file)
@@ -47,6 +47,7 @@ struct pci_controller {
 
        int first_busno;
        int last_busno;
+       int self_busno;
        int bus_offset;
 
        void __iomem *io_base_virt;