diff options
Diffstat (limited to 'arch/powerpc/kernel/rtas_pci.c')
-rw-r--r-- | arch/powerpc/kernel/rtas_pci.c | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index b4a0de79c060..ace9f4c86e67 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/rtas.h> | 38 | #include <asm/rtas.h> |
39 | #include <asm/mpic.h> | 39 | #include <asm/mpic.h> |
40 | #include <asm/ppc-pci.h> | 40 | #include <asm/ppc-pci.h> |
41 | #include <asm/eeh.h> | ||
41 | 42 | ||
42 | /* RTAS tokens */ | 43 | /* RTAS tokens */ |
43 | static int read_pci_config; | 44 | static int read_pci_config; |
@@ -231,32 +232,13 @@ void __init init_pci_config_tokens (void) | |||
231 | 232 | ||
232 | unsigned long __devinit get_phb_buid (struct device_node *phb) | 233 | unsigned long __devinit get_phb_buid (struct device_node *phb) |
233 | { | 234 | { |
234 | int addr_cells; | 235 | struct resource r; |
235 | const unsigned int *buid_vals; | ||
236 | unsigned int len; | ||
237 | unsigned long buid; | ||
238 | |||
239 | if (ibm_read_pci_config == -1) return 0; | ||
240 | 236 | ||
241 | /* PHB's will always be children of the root node, | 237 | if (ibm_read_pci_config == -1) |
242 | * or so it is promised by the current firmware. */ | ||
243 | if (phb->parent == NULL) | ||
244 | return 0; | 238 | return 0; |
245 | if (phb->parent->parent) | 239 | if (of_address_to_resource(phb, 0, &r)) |
246 | return 0; | ||
247 | |||
248 | buid_vals = get_property(phb, "reg", &len); | ||
249 | if (buid_vals == NULL) | ||
250 | return 0; | 240 | return 0; |
251 | 241 | return r.start; | |
252 | addr_cells = prom_n_addr_cells(phb); | ||
253 | if (addr_cells == 1) { | ||
254 | buid = (unsigned long) buid_vals[0]; | ||
255 | } else { | ||
256 | buid = (((unsigned long)buid_vals[0]) << 32UL) | | ||
257 | (((unsigned long)buid_vals[1]) & 0xffffffff); | ||
258 | } | ||
259 | return buid; | ||
260 | } | 242 | } |
261 | 243 | ||
262 | static int phb_set_bus_ranges(struct device_node *dev, | 244 | static int phb_set_bus_ranges(struct device_node *dev, |
@@ -276,8 +258,10 @@ static int phb_set_bus_ranges(struct device_node *dev, | |||
276 | return 0; | 258 | return 0; |
277 | } | 259 | } |
278 | 260 | ||
279 | int __devinit setup_phb(struct device_node *dev, struct pci_controller *phb) | 261 | int __devinit rtas_setup_phb(struct pci_controller *phb) |
280 | { | 262 | { |
263 | struct device_node *dev = phb->arch_data; | ||
264 | |||
281 | if (is_python(dev)) | 265 | if (is_python(dev)) |
282 | python_countermeasures(dev); | 266 | python_countermeasures(dev); |
283 | 267 | ||
@@ -309,7 +293,7 @@ unsigned long __init find_and_init_phbs(void) | |||
309 | phb = pcibios_alloc_controller(node); | 293 | phb = pcibios_alloc_controller(node); |
310 | if (!phb) | 294 | if (!phb) |
311 | continue; | 295 | continue; |
312 | setup_phb(node, phb); | 296 | rtas_setup_phb(phb); |
313 | pci_process_bridge_OF_ranges(phb, node, 0); | 297 | pci_process_bridge_OF_ranges(phb, node, 0); |
314 | pci_setup_phb_io(phb, index == 0); | 298 | pci_setup_phb_io(phb, index == 0); |
315 | index++; | 299 | index++; |
@@ -381,7 +365,6 @@ int pcibios_remove_root_bus(struct pci_controller *phb) | |||
381 | } | 365 | } |
382 | } | 366 | } |
383 | 367 | ||
384 | list_del(&phb->list_node); | ||
385 | pcibios_free_controller(phb); | 368 | pcibios_free_controller(phb); |
386 | 369 | ||
387 | return 0; | 370 | return 0; |