diff options
Diffstat (limited to 'arch')
-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 | } | ||