diff options
Diffstat (limited to 'arch/powerpc/kernel/pci-common.c')
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 780db386c1f0..0eaabd41474f 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <asm/machdep.h> | 37 | #include <asm/machdep.h> |
38 | #include <asm/ppc-pci.h> | 38 | #include <asm/ppc-pci.h> |
39 | #include <asm/firmware.h> | 39 | #include <asm/firmware.h> |
40 | #include <asm/eeh.h> | ||
40 | 41 | ||
41 | static DEFINE_SPINLOCK(hose_spinlock); | 42 | static DEFINE_SPINLOCK(hose_spinlock); |
42 | 43 | ||
@@ -1074,31 +1075,17 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) | |||
1074 | } | 1075 | } |
1075 | } | 1076 | } |
1076 | 1077 | ||
1077 | static void __devinit __pcibios_fixup_bus(struct pci_bus *bus) | 1078 | void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) |
1078 | { | 1079 | { |
1079 | struct pci_dev *dev; | 1080 | struct pci_dev *dev; |
1080 | 1081 | ||
1081 | pr_debug("PCI: Fixup bus %d (%s)\n", | 1082 | pr_debug("PCI: Fixup bus %d (%s)\n", |
1082 | bus->number, bus->self ? pci_name(bus->self) : "PHB"); | 1083 | bus->number, bus->self ? pci_name(bus->self) : "PHB"); |
1083 | 1084 | ||
1084 | /* Fixup PCI<->PCI bridges. Host bridges are handled separately, for | ||
1085 | * now differently between 32 and 64 bits. | ||
1086 | */ | ||
1087 | if (bus->self != NULL) | ||
1088 | pcibios_fixup_bridge(bus); | ||
1089 | |||
1090 | /* Setup bus DMA mappings */ | ||
1091 | if (ppc_md.pci_dma_bus_setup) | ||
1092 | ppc_md.pci_dma_bus_setup(bus); | ||
1093 | |||
1094 | /* Setup DMA for all PCI devices on that bus */ | 1085 | /* Setup DMA for all PCI devices on that bus */ |
1095 | list_for_each_entry(dev, &bus->devices, bus_list) | 1086 | list_for_each_entry(dev, &bus->devices, bus_list) |
1096 | pcibios_setup_new_device(dev); | 1087 | pcibios_setup_new_device(dev); |
1097 | 1088 | ||
1098 | /* Platform specific bus fixups */ | ||
1099 | if (ppc_md.pcibios_fixup_bus) | ||
1100 | ppc_md.pcibios_fixup_bus(bus); | ||
1101 | |||
1102 | /* Read default IRQs and fixup if necessary */ | 1089 | /* Read default IRQs and fixup if necessary */ |
1103 | list_for_each_entry(dev, &bus->devices, bus_list) { | 1090 | list_for_each_entry(dev, &bus->devices, bus_list) { |
1104 | pci_read_irq_line(dev); | 1091 | pci_read_irq_line(dev); |
@@ -1107,25 +1094,39 @@ static void __devinit __pcibios_fixup_bus(struct pci_bus *bus) | |||
1107 | } | 1094 | } |
1108 | } | 1095 | } |
1109 | 1096 | ||
1097 | void __devinit pcibios_setup_bus_self(struct pci_bus *bus) | ||
1098 | { | ||
1099 | /* Fix up the bus resources */ | ||
1100 | if (bus->self != NULL) | ||
1101 | pcibios_fixup_bridge(bus); | ||
1102 | |||
1103 | /* Platform specific bus fixups. This is currently only used | ||
1104 | * by fsl_pci and I'm hoping getting rid of it at some point | ||
1105 | */ | ||
1106 | if (ppc_md.pcibios_fixup_bus) | ||
1107 | ppc_md.pcibios_fixup_bus(bus); | ||
1108 | |||
1109 | /* Setup bus DMA mappings */ | ||
1110 | if (ppc_md.pci_dma_bus_setup) | ||
1111 | ppc_md.pci_dma_bus_setup(bus); | ||
1112 | } | ||
1113 | |||
1110 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 1114 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
1111 | { | 1115 | { |
1112 | /* When called from the generic PCI probe, read PCI<->PCI bridge | 1116 | /* When called from the generic PCI probe, read PCI<->PCI bridge |
1113 | * bases before proceeding | 1117 | * bases. This isn't called when generating the PCI tree from |
1118 | * the OF device-tree. | ||
1114 | */ | 1119 | */ |
1115 | if (bus->self != NULL) | 1120 | if (bus->self != NULL) |
1116 | pci_read_bridge_bases(bus); | 1121 | pci_read_bridge_bases(bus); |
1117 | __pcibios_fixup_bus(bus); | ||
1118 | } | ||
1119 | EXPORT_SYMBOL(pcibios_fixup_bus); | ||
1120 | 1122 | ||
1121 | /* When building a bus from the OF tree rather than probing, we need a | 1123 | /* Now fixup the bus bus */ |
1122 | * slightly different version of the fixup which doesn't read the | 1124 | pcibios_setup_bus_self(bus); |
1123 | * bridge bases using config space accesses | 1125 | |
1124 | */ | 1126 | /* Now fixup devices on that bus */ |
1125 | void __devinit pcibios_fixup_of_probed_bus(struct pci_bus *bus) | 1127 | pcibios_setup_bus_devices(bus); |
1126 | { | ||
1127 | __pcibios_fixup_bus(bus); | ||
1128 | } | 1128 | } |
1129 | EXPORT_SYMBOL(pcibios_fixup_bus); | ||
1129 | 1130 | ||
1130 | static int skip_isa_ioresource_align(struct pci_dev *dev) | 1131 | static int skip_isa_ioresource_align(struct pci_dev *dev) |
1131 | { | 1132 | { |
@@ -1392,6 +1393,7 @@ void __init pcibios_resource_survey(void) | |||
1392 | } | 1393 | } |
1393 | 1394 | ||
1394 | #ifdef CONFIG_HOTPLUG | 1395 | #ifdef CONFIG_HOTPLUG |
1396 | |||
1395 | /* This is used by the pSeries hotplug driver to allocate resource | 1397 | /* This is used by the pSeries hotplug driver to allocate resource |
1396 | * of newly plugged busses. We can try to consolidate with the | 1398 | * of newly plugged busses. We can try to consolidate with the |
1397 | * rest of the code later, for now, keep it as-is | 1399 | * rest of the code later, for now, keep it as-is |