diff options
| -rw-r--r-- | arch/powerpc/Kconfig | 4 | ||||
| -rw-r--r-- | arch/powerpc/boot/dts/mpc8641_hpcn.dts | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/86xx/mpc86xx.h | 6 | ||||
| -rw-r--r-- | arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/86xx/pci.c | 18 | ||||
| -rw-r--r-- | arch/powerpc/platforms/Kconfig | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/Makefile | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pcie.c | 171 |
8 files changed, 3 insertions, 202 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 7c1bae5c2204..cbfbd981cdcd 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -419,10 +419,6 @@ config SBUS | |||
| 419 | config FSL_SOC | 419 | config FSL_SOC |
| 420 | bool | 420 | bool |
| 421 | 421 | ||
| 422 | config FSL_PCIE | ||
| 423 | bool | ||
| 424 | depends on PPC_86xx | ||
| 425 | |||
| 426 | # Yes MCA RS/6000s exist but Linux-PPC does not currently support any | 422 | # Yes MCA RS/6000s exist but Linux-PPC does not currently support any |
| 427 | config MCA | 423 | config MCA |
| 428 | bool | 424 | bool |
diff --git a/arch/powerpc/boot/dts/mpc8641_hpcn.dts b/arch/powerpc/boot/dts/mpc8641_hpcn.dts index 260b264c869e..748f7b90f5db 100644 --- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts +++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts | |||
| @@ -186,7 +186,7 @@ | |||
| 186 | #size-cells = <2>; | 186 | #size-cells = <2>; |
| 187 | #address-cells = <3>; | 187 | #address-cells = <3>; |
| 188 | reg = <8000 1000>; | 188 | reg = <8000 1000>; |
| 189 | bus-range = <0 fe>; | 189 | bus-range = <0 ff>; |
| 190 | ranges = <02000000 0 80000000 80000000 0 20000000 | 190 | ranges = <02000000 0 80000000 80000000 0 20000000 |
| 191 | 01000000 0 00000000 e2000000 0 00100000>; | 191 | 01000000 0 00000000 e2000000 0 00100000>; |
| 192 | clock-frequency = <1fca055>; | 192 | clock-frequency = <1fca055>; |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx.h b/arch/powerpc/platforms/86xx/mpc86xx.h index 4c2789de045e..23f7ed2a7f88 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx.h +++ b/arch/powerpc/platforms/86xx/mpc86xx.h | |||
| @@ -20,12 +20,6 @@ extern int mpc86xx_add_bridge(struct device_node *dev); | |||
| 20 | extern int mpc86xx_exclude_device(struct pci_controller *hose, | 20 | extern int mpc86xx_exclude_device(struct pci_controller *hose, |
| 21 | u_char bus, u_char devfn); | 21 | u_char bus, u_char devfn); |
| 22 | 22 | ||
| 23 | extern void setup_indirect_pcie(struct pci_controller *hose, | ||
| 24 | u32 cfg_addr, u32 cfg_data); | ||
| 25 | extern void setup_indirect_pcie_nomap(struct pci_controller *hose, | ||
| 26 | void __iomem *cfg_addr, | ||
| 27 | void __iomem *cfg_data); | ||
| 28 | |||
| 29 | extern void __init mpc86xx_smp_init(void); | 23 | extern void __init mpc86xx_smp_init(void); |
| 30 | 24 | ||
| 31 | #endif /* __MPC86XX_H__ */ | 25 | #endif /* __MPC86XX_H__ */ |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c index 042dbce89771..afa82371979f 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
| @@ -358,8 +358,6 @@ mpc86xx_hpcn_setup_arch(void) | |||
| 358 | #ifdef CONFIG_PCI | 358 | #ifdef CONFIG_PCI |
| 359 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | 359 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) |
| 360 | mpc86xx_add_bridge(np); | 360 | mpc86xx_add_bridge(np); |
| 361 | |||
| 362 | ppc_md.pci_exclude_device = mpc86xx_exclude_device; | ||
| 363 | #endif | 361 | #endif |
| 364 | 362 | ||
| 365 | printk("MPC86xx HPCN board from Freescale Semiconductor\n"); | 363 | printk("MPC86xx HPCN board from Freescale Semiconductor\n"); |
diff --git a/arch/powerpc/platforms/86xx/pci.c b/arch/powerpc/platforms/86xx/pci.c index 7659259cc974..0db51e8ab5d4 100644 --- a/arch/powerpc/platforms/86xx/pci.c +++ b/arch/powerpc/platforms/86xx/pci.c | |||
| @@ -133,19 +133,6 @@ mpc86xx_setup_pcie(struct pci_controller *hose, u32 pcie_offset, u32 pcie_size) | |||
| 133 | early_write_config_word(hose, 0, 0, PCI_COMMAND, cmd); | 133 | early_write_config_word(hose, 0, 0, PCI_COMMAND, cmd); |
| 134 | 134 | ||
| 135 | early_write_config_byte(hose, 0, 0, PCI_LATENCY_TIMER, 0x80); | 135 | early_write_config_byte(hose, 0, 0, PCI_LATENCY_TIMER, 0x80); |
| 136 | |||
| 137 | /* PCIE Bus, Fix the MPC8641D host bridge's location to bus 0xFF. */ | ||
| 138 | early_read_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, &temps); | ||
| 139 | temps = (temps & 0xff000000) | (0xff) | (0x0 << 8) | (0xfe << 16); | ||
| 140 | early_write_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, temps); | ||
| 141 | } | ||
| 142 | |||
| 143 | int mpc86xx_exclude_device(struct pci_controller *hose, u_char bus, u_char devfn) | ||
| 144 | { | ||
| 145 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
| 146 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 147 | |||
| 148 | return PCIBIOS_SUCCESSFUL; | ||
| 149 | } | 136 | } |
| 150 | 137 | ||
| 151 | int __init mpc86xx_add_bridge(struct device_node *dev) | 138 | int __init mpc86xx_add_bridge(struct device_node *dev) |
| @@ -173,11 +160,10 @@ int __init mpc86xx_add_bridge(struct device_node *dev) | |||
| 173 | return -ENOMEM; | 160 | return -ENOMEM; |
| 174 | hose->arch_data = dev; | 161 | hose->arch_data = dev; |
| 175 | 162 | ||
| 176 | /* last_busno = 0xfe cause by MPC8641 PCIE bug */ | ||
| 177 | hose->first_busno = bus_range ? bus_range[0] : 0x0; | 163 | hose->first_busno = bus_range ? bus_range[0] : 0x0; |
| 178 | hose->last_busno = bus_range ? bus_range[1] : 0xfe; | 164 | hose->last_busno = bus_range ? bus_range[1] : 0xff; |
| 179 | 165 | ||
| 180 | setup_indirect_pcie(hose, rsrc.start, rsrc.start + 0x4); | 166 | setup_indirect_pci(hose, rsrc.start, rsrc.start + 0x4); |
| 181 | 167 | ||
| 182 | /* Setup the PCIE host controller. */ | 168 | /* Setup the PCIE host controller. */ |
| 183 | mpc86xx_setup_pcie(hose, rsrc.start, rsrc.end - rsrc.start + 1); | 169 | mpc86xx_setup_pcie(hose, rsrc.start, rsrc.end - rsrc.start + 1); |
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index df67ff50c0da..33545d352e92 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
| @@ -31,7 +31,6 @@ config PPC_86xx | |||
| 31 | bool "Freescale 86xx" | 31 | bool "Freescale 86xx" |
| 32 | depends on 6xx | 32 | depends on 6xx |
| 33 | select FSL_SOC | 33 | select FSL_SOC |
| 34 | select FSL_PCIE | ||
| 35 | select ALTIVEC | 34 | select ALTIVEC |
| 36 | help | 35 | help |
| 37 | The Freescale E600 SoCs have 74xx cores. | 36 | The Freescale E600 SoCs have 74xx cores. |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 337b56a73247..7d8ac1bfef84 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
| @@ -12,7 +12,6 @@ obj-$(CONFIG_PPC_PMI) += pmi.o | |||
| 12 | obj-$(CONFIG_U3_DART) += dart_iommu.o | 12 | obj-$(CONFIG_U3_DART) += dart_iommu.o |
| 13 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o | 13 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o |
| 14 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o | 14 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o |
| 15 | obj-$(CONFIG_FSL_PCIE) += fsl_pcie.o | ||
| 16 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 15 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o |
| 17 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ | 16 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ |
| 18 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o | 17 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o |
diff --git a/arch/powerpc/sysdev/fsl_pcie.c b/arch/powerpc/sysdev/fsl_pcie.c deleted file mode 100644 index ea3ec6bfd577..000000000000 --- a/arch/powerpc/sysdev/fsl_pcie.c +++ /dev/null | |||
| @@ -1,171 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Support for indirect PCI bridges. | ||
| 3 | * | ||
| 4 | * Copyright (C) 1998 Gabriel Paubert. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * "Temporary" MPC8548 Errata file - | ||
| 12 | * The standard indirect_pci code should work with future silicon versions. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/pci.h> | ||
| 17 | #include <linux/delay.h> | ||
| 18 | #include <linux/string.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | #include <linux/bootmem.h> | ||
| 21 | |||
| 22 | #include <asm/io.h> | ||
| 23 | #include <asm/prom.h> | ||
| 24 | #include <asm/pci-bridge.h> | ||
| 25 | #include <asm/machdep.h> | ||
| 26 | |||
| 27 | #define PCI_CFG_OUT out_be32 | ||
| 28 | |||
| 29 | /* ERRATA PCI-Ex 14 PCIE Controller timeout */ | ||
| 30 | #define PCIE_FIX out_be32(hose->cfg_addr+0x4, 0x0400ffff) | ||
| 31 | |||
| 32 | |||
| 33 | static int | ||
| 34 | indirect_read_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
| 35 | int len, u32 *val) | ||
| 36 | { | ||
| 37 | struct pci_controller *hose = bus->sysdata; | ||
| 38 | volatile void __iomem *cfg_data; | ||
| 39 | u32 temp; | ||
| 40 | |||
| 41 | if (ppc_md.pci_exclude_device) | ||
| 42 | if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) | ||
| 43 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 44 | |||
| 45 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
| 46 | if (devfn != 0x0 && bus->number == 0xff) | ||
| 47 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 48 | |||
| 49 | PCIE_FIX; | ||
| 50 | if (bus->number == 0xff) { | ||
| 51 | PCI_CFG_OUT(hose->cfg_addr, | ||
| 52 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
| 53 | (bus->number<< 16) | ||
| 54 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
| 55 | } else { | ||
| 56 | PCI_CFG_OUT(hose->cfg_addr, | ||
| 57 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
| 58 | (bus->number<< 16) | ||
| 59 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
| 60 | } | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Note: the caller has already checked that offset is | ||
| 64 | * suitably aligned and that len is 1, 2 or 4. | ||
| 65 | */ | ||
| 66 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
| 67 | cfg_data = hose->cfg_data; | ||
| 68 | PCIE_FIX; | ||
| 69 | temp = in_le32(cfg_data); | ||
| 70 | switch (len) { | ||
| 71 | case 1: | ||
| 72 | *val = (temp >> (((offset & 3))*8)) & 0xff; | ||
| 73 | break; | ||
| 74 | case 2: | ||
| 75 | *val = (temp >> (((offset & 3))*8)) & 0xffff; | ||
| 76 | break; | ||
| 77 | default: | ||
| 78 | *val = temp; | ||
| 79 | break; | ||
| 80 | } | ||
| 81 | return PCIBIOS_SUCCESSFUL; | ||
| 82 | } | ||
| 83 | |||
| 84 | static int | ||
| 85 | indirect_write_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
| 86 | int len, u32 val) | ||
| 87 | { | ||
| 88 | struct pci_controller *hose = bus->sysdata; | ||
| 89 | volatile void __iomem *cfg_data; | ||
| 90 | u32 temp; | ||
| 91 | |||
| 92 | if (ppc_md.pci_exclude_device) | ||
| 93 | if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) | ||
| 94 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 95 | |||
| 96 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
| 97 | if (devfn != 0x0 && bus->number == 0xff) | ||
| 98 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 99 | |||
| 100 | PCIE_FIX; | ||
| 101 | if (bus->number == 0xff) { | ||
| 102 | PCI_CFG_OUT(hose->cfg_addr, | ||
| 103 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
| 104 | (bus->number << 16) | ||
| 105 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
| 106 | } else { | ||
| 107 | PCI_CFG_OUT(hose->cfg_addr, | ||
| 108 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
| 109 | (bus->number << 16) | ||
| 110 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
| 111 | } | ||
| 112 | |||
| 113 | /* | ||
| 114 | * Note: the caller has already checked that offset is | ||
| 115 | * suitably aligned and that len is 1, 2 or 4. | ||
| 116 | */ | ||
| 117 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
| 118 | cfg_data = hose->cfg_data; | ||
| 119 | switch (len) { | ||
| 120 | case 1: | ||
| 121 | PCIE_FIX; | ||
| 122 | temp = in_le32(cfg_data); | ||
| 123 | temp = (temp & ~(0xff << ((offset & 3) * 8))) | | ||
| 124 | (val << ((offset & 3) * 8)); | ||
| 125 | PCIE_FIX; | ||
| 126 | out_le32(cfg_data, temp); | ||
| 127 | break; | ||
| 128 | case 2: | ||
| 129 | PCIE_FIX; | ||
| 130 | temp = in_le32(cfg_data); | ||
| 131 | temp = (temp & ~(0xffff << ((offset & 3) * 8))); | ||
| 132 | temp |= (val << ((offset & 3) * 8)) ; | ||
| 133 | PCIE_FIX; | ||
| 134 | out_le32(cfg_data, temp); | ||
| 135 | break; | ||
| 136 | default: | ||
| 137 | PCIE_FIX; | ||
| 138 | out_le32(cfg_data, val); | ||
| 139 | break; | ||
| 140 | } | ||
| 141 | PCIE_FIX; | ||
| 142 | return PCIBIOS_SUCCESSFUL; | ||
| 143 | } | ||
| 144 | |||
| 145 | static struct pci_ops indirect_pcie_ops = { | ||
| 146 | indirect_read_config_pcie, | ||
| 147 | indirect_write_config_pcie | ||
| 148 | }; | ||
| 149 | |||
| 150 | void __init | ||
| 151 | setup_indirect_pcie_nomap(struct pci_controller* hose, void __iomem * cfg_addr, | ||
| 152 | void __iomem * cfg_data) | ||
| 153 | { | ||
| 154 | hose->cfg_addr = cfg_addr; | ||
| 155 | hose->cfg_data = cfg_data; | ||
| 156 | hose->ops = &indirect_pcie_ops; | ||
| 157 | } | ||
| 158 | |||
| 159 | void __init | ||
| 160 | setup_indirect_pcie(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data) | ||
| 161 | { | ||
| 162 | unsigned long base = cfg_addr & PAGE_MASK; | ||
| 163 | void __iomem *mbase, *addr, *data; | ||
| 164 | |||
| 165 | mbase = ioremap(base, PAGE_SIZE); | ||
| 166 | addr = mbase + (cfg_addr & ~PAGE_MASK); | ||
| 167 | if ((cfg_data & PAGE_MASK) != base) | ||
| 168 | mbase = ioremap(cfg_data & PAGE_MASK, PAGE_SIZE); | ||
| 169 | data = mbase + (cfg_data & ~PAGE_MASK); | ||
| 170 | setup_indirect_pcie_nomap(hose, addr, data); | ||
| 171 | } | ||
