diff options
Diffstat (limited to 'arch/powerpc/kernel/pci_64.c')
-rw-r--r-- | arch/powerpc/kernel/pci_64.c | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 9bae8a5bf671..6fa9a0a5c8db 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -42,11 +42,9 @@ | |||
42 | unsigned long pci_probe_only = 1; | 42 | unsigned long pci_probe_only = 1; |
43 | int pci_assign_all_buses = 0; | 43 | int pci_assign_all_buses = 0; |
44 | 44 | ||
45 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
46 | static void fixup_resource(struct resource *res, struct pci_dev *dev); | 45 | static void fixup_resource(struct resource *res, struct pci_dev *dev); |
47 | static void do_bus_setup(struct pci_bus *bus); | 46 | static void do_bus_setup(struct pci_bus *bus); |
48 | static void phbs_remap_io(void); | 47 | static void phbs_remap_io(void); |
49 | #endif | ||
50 | 48 | ||
51 | /* pci_io_base -- the base address from which io bars are offsets. | 49 | /* pci_io_base -- the base address from which io bars are offsets. |
52 | * This is the lowest I/O base address (so bar values are always positive), | 50 | * This is the lowest I/O base address (so bar values are always positive), |
@@ -63,7 +61,7 @@ void iSeries_pcibios_init(void); | |||
63 | 61 | ||
64 | LIST_HEAD(hose_list); | 62 | LIST_HEAD(hose_list); |
65 | 63 | ||
66 | struct dma_mapping_ops pci_dma_ops; | 64 | struct dma_mapping_ops *pci_dma_ops; |
67 | EXPORT_SYMBOL(pci_dma_ops); | 65 | EXPORT_SYMBOL(pci_dma_ops); |
68 | 66 | ||
69 | int global_phb_number; /* Global phb counter */ | 67 | int global_phb_number; /* Global phb counter */ |
@@ -212,6 +210,10 @@ struct pci_controller * pcibios_alloc_controller(struct device_node *dev) | |||
212 | 210 | ||
213 | void pcibios_free_controller(struct pci_controller *phb) | 211 | void pcibios_free_controller(struct pci_controller *phb) |
214 | { | 212 | { |
213 | spin_lock(&hose_spinlock); | ||
214 | list_del(&phb->list_node); | ||
215 | spin_unlock(&hose_spinlock); | ||
216 | |||
215 | if (phb->is_dynamic) | 217 | if (phb->is_dynamic) |
216 | kfree(phb); | 218 | kfree(phb); |
217 | } | 219 | } |
@@ -251,7 +253,6 @@ static void __init pcibios_claim_of_setup(void) | |||
251 | pcibios_claim_one_bus(b); | 253 | pcibios_claim_one_bus(b); |
252 | } | 254 | } |
253 | 255 | ||
254 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
255 | static u32 get_int_prop(struct device_node *np, const char *name, u32 def) | 256 | static u32 get_int_prop(struct device_node *np, const char *name, u32 def) |
256 | { | 257 | { |
257 | const u32 *prop; | 258 | const u32 *prop; |
@@ -329,7 +330,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node, | |||
329 | struct pci_dev *dev; | 330 | struct pci_dev *dev; |
330 | const char *type; | 331 | const char *type; |
331 | 332 | ||
332 | dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL); | 333 | dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL); |
333 | if (!dev) | 334 | if (!dev) |
334 | return NULL; | 335 | return NULL; |
335 | type = get_property(node, "device_type", NULL); | 336 | type = get_property(node, "device_type", NULL); |
@@ -338,7 +339,6 @@ struct pci_dev *of_create_pci_dev(struct device_node *node, | |||
338 | 339 | ||
339 | DBG(" create device, devfn: %x, type: %s\n", devfn, type); | 340 | DBG(" create device, devfn: %x, type: %s\n", devfn, type); |
340 | 341 | ||
341 | memset(dev, 0, sizeof(struct pci_dev)); | ||
342 | dev->bus = bus; | 342 | dev->bus = bus; |
343 | dev->sysdata = node; | 343 | dev->sysdata = node; |
344 | dev->dev.parent = bus->bridge; | 344 | dev->dev.parent = bus->bridge; |
@@ -506,7 +506,6 @@ void __devinit of_scan_pci_bridge(struct device_node *node, | |||
506 | pci_scan_child_bus(bus); | 506 | pci_scan_child_bus(bus); |
507 | } | 507 | } |
508 | EXPORT_SYMBOL(of_scan_pci_bridge); | 508 | EXPORT_SYMBOL(of_scan_pci_bridge); |
509 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||
510 | 509 | ||
511 | void __devinit scan_phb(struct pci_controller *hose) | 510 | void __devinit scan_phb(struct pci_controller *hose) |
512 | { | 511 | { |
@@ -517,7 +516,7 @@ void __devinit scan_phb(struct pci_controller *hose) | |||
517 | 516 | ||
518 | DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>"); | 517 | DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>"); |
519 | 518 | ||
520 | bus = pci_create_bus(NULL, hose->first_busno, hose->ops, node); | 519 | bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node); |
521 | if (bus == NULL) { | 520 | if (bus == NULL) { |
522 | printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", | 521 | printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", |
523 | hose->global_number); | 522 | hose->global_number); |
@@ -540,7 +539,7 @@ void __devinit scan_phb(struct pci_controller *hose) | |||
540 | } | 539 | } |
541 | 540 | ||
542 | mode = PCI_PROBE_NORMAL; | 541 | mode = PCI_PROBE_NORMAL; |
543 | #ifdef CONFIG_PPC_MULTIPLATFORM | 542 | |
544 | if (node && ppc_md.pci_probe_mode) | 543 | if (node && ppc_md.pci_probe_mode) |
545 | mode = ppc_md.pci_probe_mode(bus); | 544 | mode = ppc_md.pci_probe_mode(bus); |
546 | DBG(" probe mode: %d\n", mode); | 545 | DBG(" probe mode: %d\n", mode); |
@@ -548,7 +547,7 @@ void __devinit scan_phb(struct pci_controller *hose) | |||
548 | bus->subordinate = hose->last_busno; | 547 | bus->subordinate = hose->last_busno; |
549 | of_scan_bus(node, bus); | 548 | of_scan_bus(node, bus); |
550 | } | 549 | } |
551 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 550 | |
552 | if (mode == PCI_PROBE_NORMAL) | 551 | if (mode == PCI_PROBE_NORMAL) |
553 | hose->last_busno = bus->subordinate = pci_scan_child_bus(bus); | 552 | hose->last_busno = bus->subordinate = pci_scan_child_bus(bus); |
554 | } | 553 | } |
@@ -592,11 +591,9 @@ static int __init pcibios_init(void) | |||
592 | if (ppc64_isabridge_dev != NULL) | 591 | if (ppc64_isabridge_dev != NULL) |
593 | printk(KERN_DEBUG "ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); | 592 | printk(KERN_DEBUG "ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); |
594 | 593 | ||
595 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
596 | if (!firmware_has_feature(FW_FEATURE_ISERIES)) | 594 | if (!firmware_has_feature(FW_FEATURE_ISERIES)) |
597 | /* map in PCI I/O space */ | 595 | /* map in PCI I/O space */ |
598 | phbs_remap_io(); | 596 | phbs_remap_io(); |
599 | #endif | ||
600 | 597 | ||
601 | printk(KERN_DEBUG "PCI: Probing PCI hardware done\n"); | 598 | printk(KERN_DEBUG "PCI: Probing PCI hardware done\n"); |
602 | 599 | ||
@@ -873,8 +870,6 @@ void pcibios_add_platform_entries(struct pci_dev *pdev) | |||
873 | device_create_file(&pdev->dev, &dev_attr_devspec); | 870 | device_create_file(&pdev->dev, &dev_attr_devspec); |
874 | } | 871 | } |
875 | 872 | ||
876 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
877 | |||
878 | #define ISA_SPACE_MASK 0x1 | 873 | #define ISA_SPACE_MASK 0x1 |
879 | #define ISA_SPACE_IO 0x1 | 874 | #define ISA_SPACE_IO 0x1 |
880 | 875 | ||
@@ -975,11 +970,7 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose, | |||
975 | res = NULL; | 970 | res = NULL; |
976 | pci_space = ranges[0]; | 971 | pci_space = ranges[0]; |
977 | pci_addr = ((unsigned long)ranges[1] << 32) | ranges[2]; | 972 | pci_addr = ((unsigned long)ranges[1] << 32) | ranges[2]; |
978 | 973 | cpu_phys_addr = of_translate_address(dev, &ranges[3]); | |
979 | cpu_phys_addr = ranges[3]; | ||
980 | if (na >= 2) | ||
981 | cpu_phys_addr = (cpu_phys_addr << 32) | ranges[4]; | ||
982 | |||
983 | size = ((unsigned long)ranges[na+3] << 32) | ranges[na+4]; | 974 | size = ((unsigned long)ranges[na+3] << 32) | ranges[na+4]; |
984 | ranges += np; | 975 | ranges += np; |
985 | if (size == 0) | 976 | if (size == 0) |
@@ -1145,7 +1136,7 @@ int unmap_bus_range(struct pci_bus *bus) | |||
1145 | 1136 | ||
1146 | if (get_bus_io_range(bus, &start_phys, &start_virt, &size)) | 1137 | if (get_bus_io_range(bus, &start_phys, &start_virt, &size)) |
1147 | return 1; | 1138 | return 1; |
1148 | if (iounmap_explicit((void __iomem *) start_virt, size)) | 1139 | if (__iounmap_explicit((void __iomem *) start_virt, size)) |
1149 | return 1; | 1140 | return 1; |
1150 | 1141 | ||
1151 | return 0; | 1142 | return 0; |
@@ -1213,23 +1204,52 @@ void __devinit pcibios_fixup_device_resources(struct pci_dev *dev, | |||
1213 | } | 1204 | } |
1214 | EXPORT_SYMBOL(pcibios_fixup_device_resources); | 1205 | EXPORT_SYMBOL(pcibios_fixup_device_resources); |
1215 | 1206 | ||
1207 | void __devinit pcibios_setup_new_device(struct pci_dev *dev) | ||
1208 | { | ||
1209 | struct dev_archdata *sd = &dev->dev.archdata; | ||
1210 | |||
1211 | sd->of_node = pci_device_to_OF_node(dev); | ||
1212 | |||
1213 | DBG("PCI device %s OF node: %s\n", pci_name(dev), | ||
1214 | sd->of_node ? sd->of_node->full_name : "<none>"); | ||
1215 | |||
1216 | sd->dma_ops = pci_dma_ops; | ||
1217 | #ifdef CONFIG_NUMA | ||
1218 | sd->numa_node = pcibus_to_node(dev->bus); | ||
1219 | #else | ||
1220 | sd->numa_node = -1; | ||
1221 | #endif | ||
1222 | if (ppc_md.pci_dma_dev_setup) | ||
1223 | ppc_md.pci_dma_dev_setup(dev); | ||
1224 | } | ||
1225 | EXPORT_SYMBOL(pcibios_setup_new_device); | ||
1216 | 1226 | ||
1217 | static void __devinit do_bus_setup(struct pci_bus *bus) | 1227 | static void __devinit do_bus_setup(struct pci_bus *bus) |
1218 | { | 1228 | { |
1219 | struct pci_dev *dev; | 1229 | struct pci_dev *dev; |
1220 | 1230 | ||
1221 | ppc_md.iommu_bus_setup(bus); | 1231 | if (ppc_md.pci_dma_bus_setup) |
1232 | ppc_md.pci_dma_bus_setup(bus); | ||
1222 | 1233 | ||
1223 | list_for_each_entry(dev, &bus->devices, bus_list) | 1234 | list_for_each_entry(dev, &bus->devices, bus_list) |
1224 | ppc_md.iommu_dev_setup(dev); | 1235 | pcibios_setup_new_device(dev); |
1225 | 1236 | ||
1226 | if (ppc_md.irq_bus_setup) | 1237 | /* Read default IRQs and fixup if necessary */ |
1227 | ppc_md.irq_bus_setup(bus); | 1238 | list_for_each_entry(dev, &bus->devices, bus_list) { |
1239 | pci_read_irq_line(dev); | ||
1240 | if (ppc_md.pci_irq_fixup) | ||
1241 | ppc_md.pci_irq_fixup(dev); | ||
1242 | } | ||
1228 | } | 1243 | } |
1229 | 1244 | ||
1230 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 1245 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
1231 | { | 1246 | { |
1232 | struct pci_dev *dev = bus->self; | 1247 | struct pci_dev *dev = bus->self; |
1248 | struct device_node *np; | ||
1249 | |||
1250 | np = pci_bus_to_OF_node(bus); | ||
1251 | |||
1252 | DBG("pcibios_fixup_bus(%s)\n", np ? np->full_name : "<???>"); | ||
1233 | 1253 | ||
1234 | if (dev && pci_probe_only && | 1254 | if (dev && pci_probe_only && |
1235 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { | 1255 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { |
@@ -1343,8 +1363,6 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node) | |||
1343 | return NULL; | 1363 | return NULL; |
1344 | } | 1364 | } |
1345 | 1365 | ||
1346 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||
1347 | |||
1348 | unsigned long pci_address_to_pio(phys_addr_t address) | 1366 | unsigned long pci_address_to_pio(phys_addr_t address) |
1349 | { | 1367 | { |
1350 | struct pci_controller *hose, *tmp; | 1368 | struct pci_controller *hose, *tmp; |