aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/pci.h2
-rw-r--r--arch/powerpc/include/asm/ppc-pci.h1
-rw-r--r--arch/powerpc/kernel/of_platform.c2
-rw-r--r--arch/powerpc/kernel/pci-common.c49
-rw-r--r--arch/powerpc/kernel/pci_32.c25
-rw-r--r--arch/powerpc/kernel/pci_64.c46
-rw-r--r--arch/powerpc/platforms/pseries/pci_dlpar.c2
7 files changed, 61 insertions, 66 deletions
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h
index b856a837b4a3..7aca4839387b 100644
--- a/arch/powerpc/include/asm/pci.h
+++ b/arch/powerpc/include/asm/pci.h
@@ -233,6 +233,8 @@ extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
233 233
234extern void pcibios_setup_bus_devices(struct pci_bus *bus); 234extern void pcibios_setup_bus_devices(struct pci_bus *bus);
235extern void pcibios_setup_bus_self(struct pci_bus *bus); 235extern void pcibios_setup_bus_self(struct pci_bus *bus);
236extern void pcibios_setup_phb_io_space(struct pci_controller *hose);
237extern void pcibios_scan_phb(struct pci_controller *hose, void *sysdata);
236 238
237#endif /* __KERNEL__ */ 239#endif /* __KERNEL__ */
238#endif /* __ASM_POWERPC_PCI_H */ 240#endif /* __ASM_POWERPC_PCI_H */
diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h
index 854ab713f56c..2828f9d0f66d 100644
--- a/arch/powerpc/include/asm/ppc-pci.h
+++ b/arch/powerpc/include/asm/ppc-pci.h
@@ -39,7 +39,6 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
39 39
40extern void pci_devs_phb_init(void); 40extern void pci_devs_phb_init(void);
41extern void pci_devs_phb_init_dynamic(struct pci_controller *phb); 41extern void pci_devs_phb_init_dynamic(struct pci_controller *phb);
42extern void scan_phb(struct pci_controller *hose);
43 42
44/* From rtas_pci.h */ 43/* From rtas_pci.h */
45extern void init_pci_config_tokens (void); 44extern void init_pci_config_tokens (void);
diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c
index 87df428e3588..1a4fc0d11a03 100644
--- a/arch/powerpc/kernel/of_platform.c
+++ b/arch/powerpc/kernel/of_platform.c
@@ -276,7 +276,7 @@ static int __devinit of_pci_phb_probe(struct of_device *dev,
276#endif /* CONFIG_EEH */ 276#endif /* CONFIG_EEH */
277 277
278 /* Scan the bus */ 278 /* Scan the bus */
279 scan_phb(phb); 279 pcibios_scan_phb(phb, dev->node);
280 if (phb->bus == NULL) 280 if (phb->bus == NULL)
281 return -ENXIO; 281 return -ENXIO;
282 282
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 8f84a9a8428e..e9f4840096b3 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1688,3 +1688,52 @@ int early_find_capability(struct pci_controller *hose, int bus, int devfn,
1688{ 1688{
1689 return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap); 1689 return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
1690} 1690}
1691
1692/**
1693 * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
1694 * @hose: Pointer to the PCI host controller instance structure
1695 * @sysdata: value to use for sysdata pointer. ppc32 and ppc64 differ here
1696 *
1697 * Note: the 'data' pointer is a temporary measure. As 32 and 64 bit
1698 * pci code gets merged, this parameter should become unnecessary because
1699 * both will use the same value.
1700 */
1701void __devinit pcibios_scan_phb(struct pci_controller *hose, void *sysdata)
1702{
1703 struct pci_bus *bus;
1704 struct device_node *node = hose->dn;
1705 int mode;
1706
1707 pr_debug("PCI: Scanning PHB %s\n",
1708 node ? node->full_name : "<NO NAME>");
1709
1710 /* Create an empty bus for the toplevel */
1711 bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops,
1712 sysdata);
1713 if (bus == NULL) {
1714 pr_err("Failed to create bus for PCI domain %04x\n",
1715 hose->global_number);
1716 return;
1717 }
1718 bus->secondary = hose->first_busno;
1719 hose->bus = bus;
1720
1721 /* Get some IO space for the new PHB */
1722 pcibios_setup_phb_io_space(hose);
1723
1724 /* Wire up PHB bus resources */
1725 pcibios_setup_phb_resources(hose);
1726
1727 /* Get probe mode and perform scan */
1728 mode = PCI_PROBE_NORMAL;
1729 if (node && ppc_md.pci_probe_mode)
1730 mode = ppc_md.pci_probe_mode(bus);
1731 pr_debug(" probe mode: %d\n", mode);
1732 if (mode == PCI_PROBE_DEVTREE) {
1733 bus->subordinate = hose->last_busno;
1734 of_scan_bus(node, bus);
1735 }
1736
1737 if (mode == PCI_PROBE_NORMAL)
1738 hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
1739}
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c
index 8cf15d961c38..c13668cf36d9 100644
--- a/arch/powerpc/kernel/pci_32.c
+++ b/arch/powerpc/kernel/pci_32.c
@@ -354,36 +354,15 @@ pci_create_OF_bus_map(void)
354 } 354 }
355} 355}
356 356
357static void __devinit pcibios_scan_phb(struct pci_controller *hose) 357void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
358{ 358{
359 struct pci_bus *bus;
360 struct device_node *node = hose->dn;
361 unsigned long io_offset; 359 unsigned long io_offset;
362 struct resource *res = &hose->io_resource; 360 struct resource *res = &hose->io_resource;
363 361
364 pr_debug("PCI: Scanning PHB %s\n",
365 node ? node->full_name : "<NO NAME>");
366
367 /* Create an empty bus for the toplevel */
368 bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose);
369 if (bus == NULL) {
370 printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
371 hose->global_number);
372 return;
373 }
374 bus->secondary = hose->first_busno;
375 hose->bus = bus;
376
377 /* Fixup IO space offset */ 362 /* Fixup IO space offset */
378 io_offset = (unsigned long)hose->io_base_virt - isa_io_base; 363 io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
379 res->start = (res->start + io_offset) & 0xffffffffu; 364 res->start = (res->start + io_offset) & 0xffffffffu;
380 res->end = (res->end + io_offset) & 0xffffffffu; 365 res->end = (res->end + io_offset) & 0xffffffffu;
381
382 /* Wire up PHB bus resources */
383 pcibios_setup_phb_resources(hose);
384
385 /* Scan children */
386 hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
387} 366}
388 367
389static int __init pcibios_init(void) 368static int __init pcibios_init(void)
@@ -401,7 +380,7 @@ static int __init pcibios_init(void)
401 if (pci_assign_all_buses) 380 if (pci_assign_all_buses)
402 hose->first_busno = next_busno; 381 hose->first_busno = next_busno;
403 hose->last_busno = 0xff; 382 hose->last_busno = 0xff;
404 pcibios_scan_phb(hose); 383 pcibios_scan_phb(hose, hose);
405 pci_bus_add_devices(hose->bus); 384 pci_bus_add_devices(hose->bus);
406 if (pci_assign_all_buses || next_busno <= hose->last_busno) 385 if (pci_assign_all_buses || next_busno <= hose->last_busno)
407 next_busno = hose->last_busno + pcibios_assign_bus_offset; 386 next_busno = hose->last_busno + pcibios_assign_bus_offset;
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 4d5b4ced7e45..ba949a2c93ac 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -43,45 +43,6 @@ unsigned long pci_probe_only = 1;
43unsigned long pci_io_base = ISA_IO_BASE; 43unsigned long pci_io_base = ISA_IO_BASE;
44EXPORT_SYMBOL(pci_io_base); 44EXPORT_SYMBOL(pci_io_base);
45 45
46void __devinit scan_phb(struct pci_controller *hose)
47{
48 struct pci_bus *bus;
49 struct device_node *node = hose->dn;
50 int mode;
51
52 pr_debug("PCI: Scanning PHB %s\n",
53 node ? node->full_name : "<NO NAME>");
54
55 /* Create an empty bus for the toplevel */
56 bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
57 if (bus == NULL) {
58 printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
59 hose->global_number);
60 return;
61 }
62 bus->secondary = hose->first_busno;
63 hose->bus = bus;
64
65 /* Get some IO space for the new PHB */
66 pcibios_map_io_space(bus);
67
68 /* Wire up PHB bus resources */
69 pcibios_setup_phb_resources(hose);
70
71 /* Get probe mode and perform scan */
72 mode = PCI_PROBE_NORMAL;
73 if (node && ppc_md.pci_probe_mode)
74 mode = ppc_md.pci_probe_mode(bus);
75 pr_debug(" probe mode: %d\n", mode);
76 if (mode == PCI_PROBE_DEVTREE) {
77 bus->subordinate = hose->last_busno;
78 of_scan_bus(node, bus);
79 }
80
81 if (mode == PCI_PROBE_NORMAL)
82 hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
83}
84
85static int __init pcibios_init(void) 46static int __init pcibios_init(void)
86{ 47{
87 struct pci_controller *hose, *tmp; 48 struct pci_controller *hose, *tmp;
@@ -103,7 +64,7 @@ static int __init pcibios_init(void)
103 64
104 /* Scan all of the recorded PCI controllers. */ 65 /* Scan all of the recorded PCI controllers. */
105 list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { 66 list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
106 scan_phb(hose); 67 pcibios_scan_phb(hose, hose->dn);
107 pci_bus_add_devices(hose->bus); 68 pci_bus_add_devices(hose->bus);
108 } 69 }
109 70
@@ -237,6 +198,11 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)
237} 198}
238EXPORT_SYMBOL_GPL(pcibios_map_io_space); 199EXPORT_SYMBOL_GPL(pcibios_map_io_space);
239 200
201void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
202{
203 pcibios_map_io_space(hose->bus);
204}
205
240#define IOBASE_BRIDGE_NUMBER 0 206#define IOBASE_BRIDGE_NUMBER 0
241#define IOBASE_MEMORY 1 207#define IOBASE_MEMORY 1
242#define IOBASE_IO 2 208#define IOBASE_IO 2
diff --git a/arch/powerpc/platforms/pseries/pci_dlpar.c b/arch/powerpc/platforms/pseries/pci_dlpar.c
index ad152a0e3946..b6fa3e4b51b5 100644
--- a/arch/powerpc/platforms/pseries/pci_dlpar.c
+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
@@ -151,7 +151,7 @@ struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
151 if (dn->child) 151 if (dn->child)
152 eeh_add_device_tree_early(dn); 152 eeh_add_device_tree_early(dn);
153 153
154 scan_phb(phb); 154 pcibios_scan_phb(phb, dn);
155 pcibios_finish_adding_to_bus(phb->bus); 155 pcibios_finish_adding_to_bus(phb->bus);
156 156
157 return phb; 157 return phb;