[POWERPC] Make endianess of cfg_addr for indirect pci ops runtime
authorKumar Gala <galak@kernel.crashing.org>
Thu, 19 Jul 2007 21:07:35 +0000 (16:07 -0500)
committerKumar Gala <galak@kernel.crashing.org>
Tue, 24 Jul 2007 03:29:09 +0000 (22:29 -0500)
Make it so we do a runtime check to know if we need to write cfg_addr
as big or little endian.  This is needed if we want to allow 86xx support
to co-exist in the same kernel as other 6xx PPCs.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
12 files changed:
arch/powerpc/Kconfig
arch/powerpc/platforms/82xx/mpc82xx_ads.c
arch/powerpc/platforms/83xx/pci.c
arch/powerpc/platforms/85xx/Kconfig
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/chrp/pci.c
arch/powerpc/platforms/embedded6xx/linkstation.c
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/grackle.c
arch/powerpc/sysdev/indirect_pci.c
arch/powerpc/sysdev/mv64x60_pci.c
include/asm-powerpc/pci-bridge.h

index 3ff90f096bff337e88d2485d95854ec5740aaaf7..00099efe0e9f8e79c21d6eec9aae86858e6fb080 100644 (file)
@@ -411,11 +411,6 @@ config PPC_INDIRECT_PCI
        default y if 40x || 44x
        default n
 
-config PPC_INDIRECT_PCI_BE
-       bool
-       depends PPC_INDIRECT_PCI
-       default n
-
 config EISA
        bool
 
index da20832b27f1d0a0f3d38d238b72b1c8181aaaeb..2d1b05b9f8efa97e3326e4fe465d0eacb49f795d 100644 (file)
@@ -553,7 +553,8 @@ static void __init mpc82xx_add_bridge(struct device_node *np)
 
        setup_indirect_pci(hose,
                           r.start + offsetof(pci_cpm2_t, pci_cfg_addr),
-                          r.start + offsetof(pci_cpm2_t, pci_cfg_data));
+                          r.start + offsetof(pci_cpm2_t, pci_cfg_data),
+                          0);
 
        pci_process_bridge_OF_ranges(hose, np, 1);
 }
index c0e2b89154e540457aa9e1fbfacab905870e7d56..92069469de206ad2e72b0077fec55bc7ec82659d 100644 (file)
@@ -74,11 +74,11 @@ int __init mpc83xx_add_bridge(struct device_node *dev)
         */
        /* PCI 1 */
        if ((rsrc.start & 0xfffff) == 0x8500) {
-               setup_indirect_pci(hose, immr + 0x8300, immr + 0x8304);
+               setup_indirect_pci(hose, immr + 0x8300, immr + 0x8304, 0);
        }
        /* PCI 2 */
        if ((rsrc.start & 0xfffff) == 0x8600) {
-               setup_indirect_pci(hose, immr + 0x8380, immr + 0x8384);
+               setup_indirect_pci(hose, immr + 0x8380, immr + 0x8384, 0);
                primary = 0;
        }
 
index 526ddde2f1868b24f1d6efcc228682dfef923874..4661fccdaa5ab8e836534349aee6b68b4c64f783 100644 (file)
@@ -51,7 +51,6 @@ config MPC85xx
        bool
        select PPC_UDBG_16550
        select PPC_INDIRECT_PCI if PCI
-       select PPC_INDIRECT_PCI_BE if PCI
        select MPIC
        select FSL_PCI if PCI
        select SERIAL_8250_SHARE_IRQ if SERIAL_8250
index d1c8115200bc203d4f110024ca62e0bc805df79b..343b76d0d793378fd83f3354ac9ebf20dfc7fc20 100644 (file)
@@ -14,7 +14,6 @@ endchoice
 
 config MPC8641
        bool
-       select PPC_INDIRECT_PCI_BE if PCI
        select FSL_PCI if PCI
        select PPC_UDBG_16550
        select MPIC
index 3690624e49d4c0696290bd3005ffd9700deb8008..28d1647b204e70b2f91462463d05f8309c136a99 100644 (file)
@@ -181,7 +181,7 @@ setup_python(struct pci_controller *hose, struct device_node *dev)
        }
        iounmap(reg);
 
-       setup_indirect_pci(hose, r.start + 0xf8000, r.start + 0xf8010);
+       setup_indirect_pci(hose, r.start + 0xf8000, r.start + 0xf8010, 0);
 }
 
 /* Marvell Discovery II based Pegasos 2 */
@@ -277,13 +277,14 @@ chrp_find_bridges(void)
                        hose->cfg_data = p;
                        gg2_pci_config_base = p;
                } else if (is_pegasos == 1) {
-                       setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc);
+                       setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
                } else if (is_pegasos == 2) {
                        setup_peg2(hose, dev);
                } else if (!strncmp(model, "IBM,CPC710", 10)) {
                        setup_indirect_pci(hose,
                                           r.start + 0x000f8000,
-                                          r.start + 0x000f8010);
+                                          r.start + 0x000f8010,
+                                          0);
                        if (index == 0) {
                                dma = of_get_property(dev, "system-dma-base",
                                                        &len);
index f4d0a7a603f528a09b1ba16ef17161b63be3320e..bd5ca58345a1dc0e2bea91aecadd1f58ddced273 100644 (file)
@@ -73,7 +73,7 @@ static int __init linkstation_add_bridge(struct device_node *dev)
                return -ENOMEM;
        hose->first_busno = bus_range ? bus_range[0] : 0;
        hose->last_busno = bus_range ? bus_range[1] : 0xff;
-       setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
+       setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
 
        /* Interpret the "ranges" property */
        /* This also maps the I/O region and sets isa_io/mem_base */
index c6a30f9c2073488b5f27a423566f29478ac6c02b..d7747e05d1da858244d8128edc627fa8baa71e8d 100644 (file)
@@ -185,7 +185,8 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
        hose->first_busno = bus_range ? bus_range[0] : 0x0;
        hose->last_busno = bus_range ? bus_range[1] : 0xff;
 
-       setup_indirect_pci(hose, rsrc.start, rsrc.start + 0x4);
+       setup_indirect_pci(hose, rsrc.start, rsrc.start + 0x4,
+               PPC_INDIRECT_TYPE_BIG_ENDIAN);
        setup_pci_cmd(hose);
 
        /* check PCI express link status */
index 42053625f498d223896aebc2fdf8d58934eefc63..11ad5622eb760bd71ea49139f6eb62b7c7a6bfb3 100644 (file)
@@ -55,7 +55,7 @@ static inline void grackle_set_loop_snoop(struct pci_controller *bp, int enable)
 
 void __init setup_grackle(struct pci_controller *hose)
 {
-       setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
+       setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
        if (machine_is_compatible("PowerMac1,1"))
                pci_assign_all_buses = 1;
        if (machine_is_compatible("AAPL,PowerBook1998"))
index ad341f5ff94f56ac552e9d5c4ab1b9945cf43025..a8ac2dfdd3d477975db3e121148cd668cc2b1f0f 100644 (file)
 #include <asm/pci-bridge.h>
 #include <asm/machdep.h>
 
-#ifdef CONFIG_PPC_INDIRECT_PCI_BE
-#define PCI_CFG_OUT out_be32
-#else
-#define PCI_CFG_OUT out_le32
-#endif
-
 static int
 indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
                     int len, u32 *val)
@@ -58,9 +52,12 @@ indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
        else
                reg = offset & 0xfc;
 
-       PCI_CFG_OUT(hose->cfg_addr,
-                (0x80000000 | (bus_no << 16)
-                 | (devfn << 8) | reg | cfg_type));
+       if (hose->indirect_type & PPC_INDIRECT_TYPE_BIG_ENDIAN)
+               out_be32(hose->cfg_addr, (0x80000000 | (bus_no << 16) |
+                        (devfn << 8) | reg | cfg_type));
+       else
+               out_le32(hose->cfg_addr, (0x80000000 | (bus_no << 16) |
+                        (devfn << 8) | reg | cfg_type));
 
        /*
         * Note: the caller has already checked that offset is
@@ -113,9 +110,12 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
        else
                reg = offset & 0xfc;
 
-       PCI_CFG_OUT(hose->cfg_addr,
-                (0x80000000 | (bus_no << 16)
-                 | (devfn << 8) | reg | cfg_type));
+       if (hose->indirect_type & PPC_INDIRECT_TYPE_BIG_ENDIAN)
+               out_be32(hose->cfg_addr, (0x80000000 | (bus_no << 16) |
+                        (devfn << 8) | reg | cfg_type));
+       else
+               out_le32(hose->cfg_addr, (0x80000000 | (bus_no << 16) |
+                        (devfn << 8) | reg | cfg_type));
 
        /* surpress setting of PCI_PRIMARY_BUS */
        if (hose->indirect_type & PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS)
@@ -149,7 +149,7 @@ static struct pci_ops indirect_pci_ops =
 };
 
 void __init
-setup_indirect_pci(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data)
+setup_indirect_pci(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data, u32 flags)
 {
        unsigned long base = cfg_addr & PAGE_MASK;
        void __iomem *mbase;
index 45db86c2363c469a982a7e6cbefe3444e0c21391..9b3baa7317d749ea24e698995767b75b237ae36d 100644 (file)
@@ -144,7 +144,7 @@ static int __init mv64x60_add_bridge(struct device_node *dev)
        hose->first_busno = bus_range ? bus_range[0] : 0;
        hose->last_busno = bus_range ? bus_range[1] : 0xff;
 
-       setup_indirect_pci(hose, rsrc.start, rsrc.start + 4);
+       setup_indirect_pci(hose, rsrc.start, rsrc.start + 4, 0);
        hose->self_busno = hose->first_busno;
 
        printk(KERN_INFO "Found MV64x60 PCI host bridge at 0x%016llx. "
index 13cb0a9734789d2cd3f6352cdea49778576f8c6d..9ce8f2991acf935944e5d932bb731cf10587d38d 100644 (file)
@@ -49,11 +49,13 @@ struct pci_controller {
         *   hanging if we don't have link and try to do config cycles to
         *   anything but the PHB.  Only allow talking to the PHB if this is
         *   set.
+        *  BIG_ENDIAN - cfg_addr is a big endian register
         */
 #define PPC_INDIRECT_TYPE_SET_CFG_TYPE         (0x00000001)
 #define PPC_INDIRECT_TYPE_EXT_REG              (0x00000002)
 #define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004)
 #define PPC_INDIRECT_TYPE_NO_PCIE_LINK         (0x00000008)
+#define PPC_INDIRECT_TYPE_BIG_ENDIAN           (0x00000010)
        u32 indirect_type;
 
        /* Currently, we limit ourselves to 1 IO range and 3 mem
@@ -88,7 +90,7 @@ extern int early_find_capability(struct pci_controller *hose, int bus,
                                 int dev_fn, int cap);
 
 extern void setup_indirect_pci(struct pci_controller* hose,
-                              u32 cfg_addr, u32 cfg_data);
+                              u32 cfg_addr, u32 cfg_data, u32 flags);
 extern void setup_grackle(struct pci_controller *hose);
 
 #else