aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2007-12-19 22:54:53 -0500
committerPaul Mackerras <paulus@samba.org>2007-12-20 00:18:09 -0500
commit3fd94c6b1a1158d3e0e505b0a00c3a707b5fcd40 (patch)
treead542ce91f44a5aeacf095d2100a831ab6ebf23e
parentbf5e2ba28f24f82a64524ef4772c9ebe12e2cd2a (diff)
[POWERPC] Merge PCI resource allocation & assignment
The 32 bits PCI code now uses the generic code for assigning unassigned resources and an algorithm similar to x86 for claiming existing ones. This works far better than the 64 bits code which basically can only claim existing ones (pci_probe_only=1) or would fall apart completely. This merges them so that the new 32 bits implementation is used for both. 64 bits now gets the new PCI flags for controlling the behaviour, though the old pci_probe_only global is still there for now to be cleared if you want to. I kept a pcibios_claim_one_bus() function mostly based on the old 64 bits code for use by the DLPAR hotplug. This will have to be cleaned up, thought I hope it will work in the meantime. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--arch/powerpc/kernel/pci-common.c292
-rw-r--r--arch/powerpc/kernel/pci_32.c246
-rw-r--r--arch/powerpc/kernel/pci_64.c118
-rw-r--r--arch/powerpc/platforms/powermac/pci.c3
-rw-r--r--include/asm-powerpc/pci.h8
5 files changed, 311 insertions, 356 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index c61e9324f770..d804c8d0be00 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -53,6 +53,8 @@ static int global_phb_number; /* Global phb counter */
53/* ISA Memory physical address */ 53/* ISA Memory physical address */
54resource_size_t isa_mem_base; 54resource_size_t isa_mem_base;
55 55
56/* Default PCI flags is 0 */
57unsigned int ppc_pci_flags;
56 58
57struct pci_controller *pcibios_alloc_controller(struct device_node *dev) 59struct pci_controller *pcibios_alloc_controller(struct device_node *dev)
58{ 60{
@@ -821,3 +823,293 @@ void __devinit pcibios_fixup_of_probed_bus(struct pci_bus *bus)
821{ 823{
822 __pcibios_fixup_bus(bus); 824 __pcibios_fixup_bus(bus);
823} 825}
826
827static int skip_isa_ioresource_align(struct pci_dev *dev)
828{
829 if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
830 !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
831 return 1;
832 return 0;
833}
834
835/*
836 * We need to avoid collisions with `mirrored' VGA ports
837 * and other strange ISA hardware, so we always want the
838 * addresses to be allocated in the 0x000-0x0ff region
839 * modulo 0x400.
840 *
841 * Why? Because some silly external IO cards only decode
842 * the low 10 bits of the IO address. The 0x00-0xff region
843 * is reserved for motherboard devices that decode all 16
844 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
845 * but we want to try to avoid allocating at 0x2900-0x2bff
846 * which might have be mirrored at 0x0100-0x03ff..
847 */
848void pcibios_align_resource(void *data, struct resource *res,
849 resource_size_t size, resource_size_t align)
850{
851 struct pci_dev *dev = data;
852
853 if (res->flags & IORESOURCE_IO) {
854 resource_size_t start = res->start;
855
856 if (skip_isa_ioresource_align(dev))
857 return;
858 if (start & 0x300) {
859 start = (start + 0x3ff) & ~0x3ff;
860 res->start = start;
861 }
862 }
863}
864EXPORT_SYMBOL(pcibios_align_resource);
865
866/*
867 * Reparent resource children of pr that conflict with res
868 * under res, and make res replace those children.
869 */
870static int __init reparent_resources(struct resource *parent,
871 struct resource *res)
872{
873 struct resource *p, **pp;
874 struct resource **firstpp = NULL;
875
876 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
877 if (p->end < res->start)
878 continue;
879 if (res->end < p->start)
880 break;
881 if (p->start < res->start || p->end > res->end)
882 return -1; /* not completely contained */
883 if (firstpp == NULL)
884 firstpp = pp;
885 }
886 if (firstpp == NULL)
887 return -1; /* didn't find any conflicting entries? */
888 res->parent = parent;
889 res->child = *firstpp;
890 res->sibling = *pp;
891 *firstpp = res;
892 *pp = NULL;
893 for (p = res->child; p != NULL; p = p->sibling) {
894 p->parent = res;
895 DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
896 p->name,
897 (unsigned long long)p->start,
898 (unsigned long long)p->end, res->name);
899 }
900 return 0;
901}
902
903/*
904 * Handle resources of PCI devices. If the world were perfect, we could
905 * just allocate all the resource regions and do nothing more. It isn't.
906 * On the other hand, we cannot just re-allocate all devices, as it would
907 * require us to know lots of host bridge internals. So we attempt to
908 * keep as much of the original configuration as possible, but tweak it
909 * when it's found to be wrong.
910 *
911 * Known BIOS problems we have to work around:
912 * - I/O or memory regions not configured
913 * - regions configured, but not enabled in the command register
914 * - bogus I/O addresses above 64K used
915 * - expansion ROMs left enabled (this may sound harmless, but given
916 * the fact the PCI specs explicitly allow address decoders to be
917 * shared between expansion ROMs and other resource regions, it's
918 * at least dangerous)
919 *
920 * Our solution:
921 * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
922 * This gives us fixed barriers on where we can allocate.
923 * (2) Allocate resources for all enabled devices. If there is
924 * a collision, just mark the resource as unallocated. Also
925 * disable expansion ROMs during this step.
926 * (3) Try to allocate resources for disabled devices. If the
927 * resources were assigned correctly, everything goes well,
928 * if they weren't, they won't disturb allocation of other
929 * resources.
930 * (4) Assign new addresses to resources which were either
931 * not configured at all or misconfigured. If explicitly
932 * requested by the user, configure expansion ROM address
933 * as well.
934 */
935
936static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
937{
938 struct pci_bus *bus;
939 int i;
940 struct resource *res, *pr;
941
942 /* Depth-First Search on bus tree */
943 list_for_each_entry(bus, bus_list, node) {
944 for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
945 if ((res = bus->resource[i]) == NULL || !res->flags
946 || res->start > res->end)
947 continue;
948 if (bus->parent == NULL)
949 pr = (res->flags & IORESOURCE_IO)?
950 &ioport_resource : &iomem_resource;
951 else {
952 /* Don't bother with non-root busses when
953 * re-assigning all resources. We clear the
954 * resource flags as if they were colliding
955 * and as such ensure proper re-allocation
956 * later.
957 */
958 if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
959 goto clear_resource;
960 pr = pci_find_parent_resource(bus->self, res);
961 if (pr == res) {
962 /* this happens when the generic PCI
963 * code (wrongly) decides that this
964 * bridge is transparent -- paulus
965 */
966 continue;
967 }
968 }
969
970 DBG("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx "
971 "[0x%x], parent %p (%s)\n",
972 bus->self ? pci_name(bus->self) : "PHB",
973 bus->number, i,
974 (unsigned long long)res->start,
975 (unsigned long long)res->end,
976 (unsigned int)res->flags,
977 pr, (pr && pr->name) ? pr->name : "nil");
978
979 if (pr && !(pr->flags & IORESOURCE_UNSET)) {
980 if (request_resource(pr, res) == 0)
981 continue;
982 /*
983 * Must be a conflict with an existing entry.
984 * Move that entry (or entries) under the
985 * bridge resource and try again.
986 */
987 if (reparent_resources(pr, res) == 0)
988 continue;
989 }
990 printk(KERN_WARNING
991 "PCI: Cannot allocate resource region "
992 "%d of PCI bridge %d, will remap\n",
993 i, bus->number);
994clear_resource:
995 res->flags = 0;
996 }
997 pcibios_allocate_bus_resources(&bus->children);
998 }
999}
1000
1001static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
1002{
1003 struct resource *pr, *r = &dev->resource[idx];
1004
1005 DBG("PCI: Allocating %s: Resource %d: %016llx..%016llx [%x]\n",
1006 pci_name(dev), idx,
1007 (unsigned long long)r->start,
1008 (unsigned long long)r->end,
1009 (unsigned int)r->flags);
1010
1011 pr = pci_find_parent_resource(dev, r);
1012 if (!pr || (pr->flags & IORESOURCE_UNSET) ||
1013 request_resource(pr, r) < 0) {
1014 printk(KERN_WARNING "PCI: Cannot allocate resource region %d"
1015 " of device %s, will remap\n", idx, pci_name(dev));
1016 if (pr)
1017 DBG("PCI: parent is %p: %016llx-%016llx [%x]\n", pr,
1018 (unsigned long long)pr->start,
1019 (unsigned long long)pr->end,
1020 (unsigned int)pr->flags);
1021 /* We'll assign a new address later */
1022 r->flags |= IORESOURCE_UNSET;
1023 r->end -= r->start;
1024 r->start = 0;
1025 }
1026}
1027
1028static void __init pcibios_allocate_resources(int pass)
1029{
1030 struct pci_dev *dev = NULL;
1031 int idx, disabled;
1032 u16 command;
1033 struct resource *r;
1034
1035 for_each_pci_dev(dev) {
1036 pci_read_config_word(dev, PCI_COMMAND, &command);
1037 for (idx = 0; idx < 6; idx++) {
1038 r = &dev->resource[idx];
1039 if (r->parent) /* Already allocated */
1040 continue;
1041 if (!r->flags || (r->flags & IORESOURCE_UNSET))
1042 continue; /* Not assigned at all */
1043 if (r->flags & IORESOURCE_IO)
1044 disabled = !(command & PCI_COMMAND_IO);
1045 else
1046 disabled = !(command & PCI_COMMAND_MEMORY);
1047 if (pass == disabled)
1048 alloc_resource(dev, idx);
1049 }
1050 if (pass)
1051 continue;
1052 r = &dev->resource[PCI_ROM_RESOURCE];
1053 if (r->flags & IORESOURCE_ROM_ENABLE) {
1054 /* Turn the ROM off, leave the resource region,
1055 * but keep it unregistered.
1056 */
1057 u32 reg;
1058 DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
1059 r->flags &= ~IORESOURCE_ROM_ENABLE;
1060 pci_read_config_dword(dev, dev->rom_base_reg, &reg);
1061 pci_write_config_dword(dev, dev->rom_base_reg,
1062 reg & ~PCI_ROM_ADDRESS_ENABLE);
1063 }
1064 }
1065}
1066
1067void __init pcibios_resource_survey(void)
1068{
1069 /* Allocate and assign resources. If we re-assign everything, then
1070 * we skip the allocate phase
1071 */
1072 pcibios_allocate_bus_resources(&pci_root_buses);
1073
1074 if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
1075 pcibios_allocate_resources(0);
1076 pcibios_allocate_resources(1);
1077 }
1078
1079 if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
1080 DBG("PCI: Assigning unassigned resouces...\n");
1081 pci_assign_unassigned_resources();
1082 }
1083
1084 /* Call machine dependent fixup */
1085 if (ppc_md.pcibios_fixup)
1086 ppc_md.pcibios_fixup();
1087}
1088
1089#ifdef CONFIG_HOTPLUG
1090/* This is used by the pSeries hotplug driver to allocate resource
1091 * of newly plugged busses. We can try to consolidate with the
1092 * rest of the code later, for now, keep it as-is
1093 */
1094void __devinit pcibios_claim_one_bus(struct pci_bus *bus)
1095{
1096 struct pci_dev *dev;
1097 struct pci_bus *child_bus;
1098
1099 list_for_each_entry(dev, &bus->devices, bus_list) {
1100 int i;
1101
1102 for (i = 0; i < PCI_NUM_RESOURCES; i++) {
1103 struct resource *r = &dev->resource[i];
1104
1105 if (r->parent || !r->start || !r->flags)
1106 continue;
1107 pci_claim_resource(dev, i);
1108 }
1109 }
1110
1111 list_for_each_entry(child_bus, &bus->children, node)
1112 pcibios_claim_one_bus(child_bus);
1113}
1114EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
1115#endif /* CONFIG_HOTPLUG */
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c
index 717c554d4658..ce7c20c8191f 100644
--- a/arch/powerpc/kernel/pci_32.c
+++ b/arch/powerpc/kernel/pci_32.c
@@ -35,13 +35,9 @@ unsigned long isa_io_base = 0;
35unsigned long pci_dram_offset = 0; 35unsigned long pci_dram_offset = 0;
36int pcibios_assign_bus_offset = 1; 36int pcibios_assign_bus_offset = 1;
37 37
38/* Default PCI flags is 0 */
39unsigned int ppc_pci_flags;
40
41void pcibios_make_OF_bus_map(void); 38void pcibios_make_OF_bus_map(void);
42 39
43static void fixup_broken_pcnet32(struct pci_dev* dev); 40static void fixup_broken_pcnet32(struct pci_dev* dev);
44static int reparent_resources(struct resource *parent, struct resource *res);
45static void fixup_cpc710_pci64(struct pci_dev* dev); 41static void fixup_cpc710_pci64(struct pci_dev* dev);
46#ifdef CONFIG_PPC_OF 42#ifdef CONFIG_PPC_OF
47static u8* pci_to_OF_bus_map; 43static u8* pci_to_OF_bus_map;
@@ -97,170 +93,6 @@ fixup_cpc710_pci64(struct pci_dev* dev)
97} 93}
98DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64); 94DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64);
99 95
100static int skip_isa_ioresource_align(struct pci_dev *dev)
101{
102 if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
103 !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
104 return 1;
105 return 0;
106}
107
108/*
109 * We need to avoid collisions with `mirrored' VGA ports
110 * and other strange ISA hardware, so we always want the
111 * addresses to be allocated in the 0x000-0x0ff region
112 * modulo 0x400.
113 *
114 * Why? Because some silly external IO cards only decode
115 * the low 10 bits of the IO address. The 0x00-0xff region
116 * is reserved for motherboard devices that decode all 16
117 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
118 * but we want to try to avoid allocating at 0x2900-0x2bff
119 * which might have be mirrored at 0x0100-0x03ff..
120 */
121void pcibios_align_resource(void *data, struct resource *res,
122 resource_size_t size, resource_size_t align)
123{
124 struct pci_dev *dev = data;
125
126 if (res->flags & IORESOURCE_IO) {
127 resource_size_t start = res->start;
128
129 if (skip_isa_ioresource_align(dev))
130 return;
131 if (start & 0x300) {
132 start = (start + 0x3ff) & ~0x3ff;
133 res->start = start;
134 }
135 }
136}
137EXPORT_SYMBOL(pcibios_align_resource);
138
139/*
140 * Handle resources of PCI devices. If the world were perfect, we could
141 * just allocate all the resource regions and do nothing more. It isn't.
142 * On the other hand, we cannot just re-allocate all devices, as it would
143 * require us to know lots of host bridge internals. So we attempt to
144 * keep as much of the original configuration as possible, but tweak it
145 * when it's found to be wrong.
146 *
147 * Known BIOS problems we have to work around:
148 * - I/O or memory regions not configured
149 * - regions configured, but not enabled in the command register
150 * - bogus I/O addresses above 64K used
151 * - expansion ROMs left enabled (this may sound harmless, but given
152 * the fact the PCI specs explicitly allow address decoders to be
153 * shared between expansion ROMs and other resource regions, it's
154 * at least dangerous)
155 *
156 * Our solution:
157 * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
158 * This gives us fixed barriers on where we can allocate.
159 * (2) Allocate resources for all enabled devices. If there is
160 * a collision, just mark the resource as unallocated. Also
161 * disable expansion ROMs during this step.
162 * (3) Try to allocate resources for disabled devices. If the
163 * resources were assigned correctly, everything goes well,
164 * if they weren't, they won't disturb allocation of other
165 * resources.
166 * (4) Assign new addresses to resources which were either
167 * not configured at all or misconfigured. If explicitly
168 * requested by the user, configure expansion ROM address
169 * as well.
170 */
171
172static void __init
173pcibios_allocate_bus_resources(struct list_head *bus_list)
174{
175 struct pci_bus *bus;
176 int i;
177 struct resource *res, *pr;
178
179 /* Depth-First Search on bus tree */
180 list_for_each_entry(bus, bus_list, node) {
181 for (i = 0; i < 4; ++i) {
182 if ((res = bus->resource[i]) == NULL || !res->flags
183 || res->start > res->end)
184 continue;
185 if (bus->parent == NULL)
186 pr = (res->flags & IORESOURCE_IO)?
187 &ioport_resource : &iomem_resource;
188 else {
189 /* Don't bother with non-root busses when
190 * re-assigning all resources.
191 */
192 if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
193 continue;
194 pr = pci_find_parent_resource(bus->self, res);
195 if (pr == res) {
196 /* this happens when the generic PCI
197 * code (wrongly) decides that this
198 * bridge is transparent -- paulus
199 */
200 continue;
201 }
202 }
203
204 DBG("PCI: dev %s (bus 0x%02x) bridge rsrc %d: %016llx..%016llx "
205 "(f:0x%08lx), parent %p\n",
206 bus->self ? pci_name(bus->self) : "PHB", bus->number, i,
207 (u64)res->start, (u64)res->end, res->flags, pr);
208
209 if (pr && !(pr->flags & IORESOURCE_UNSET)) {
210 if (request_resource(pr, res) == 0)
211 continue;
212 /*
213 * Must be a conflict with an existing entry.
214 * Move that entry (or entries) under the
215 * bridge resource and try again.
216 */
217 if (reparent_resources(pr, res) == 0)
218 continue;
219 }
220 printk(KERN_WARNING
221 "PCI: Cannot allocate resource region "
222 "%d of PCI bridge %d, will remap\n",
223 i, bus->number);
224 res->flags |= IORESOURCE_UNSET;
225 }
226 pcibios_allocate_bus_resources(&bus->children);
227 }
228}
229
230/*
231 * Reparent resource children of pr that conflict with res
232 * under res, and make res replace those children.
233 */
234static int __init
235reparent_resources(struct resource *parent, struct resource *res)
236{
237 struct resource *p, **pp;
238 struct resource **firstpp = NULL;
239
240 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
241 if (p->end < res->start)
242 continue;
243 if (res->end < p->start)
244 break;
245 if (p->start < res->start || p->end > res->end)
246 return -1; /* not completely contained */
247 if (firstpp == NULL)
248 firstpp = pp;
249 }
250 if (firstpp == NULL)
251 return -1; /* didn't find any conflicting entries? */
252 res->parent = parent;
253 res->child = *firstpp;
254 res->sibling = *pp;
255 *firstpp = res;
256 *pp = NULL;
257 for (p = res->child; p != NULL; p = p->sibling) {
258 p->parent = res;
259 DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
260 p->name, (u64)p->start, (u64)p->end, res->name);
261 }
262 return 0;
263}
264 96
265void __init 97void __init
266update_bridge_resource(struct pci_dev *dev, struct resource *res) 98update_bridge_resource(struct pci_dev *dev, struct resource *res)
@@ -318,63 +150,6 @@ update_bridge_resource(struct pci_dev *dev, struct resource *res)
318 pci_write_config_word(dev, PCI_COMMAND, cmd); 150 pci_write_config_word(dev, PCI_COMMAND, cmd);
319} 151}
320 152
321static inline void alloc_resource(struct pci_dev *dev, int idx)
322{
323 struct resource *pr, *r = &dev->resource[idx];
324
325 DBG("PCI: Allocating %s: Resource %d: %016llx..%016llx (f=%lx)\n",
326 pci_name(dev), idx, (u64)r->start, (u64)r->end, r->flags);
327 pr = pci_find_parent_resource(dev, r);
328 if (!pr || (pr->flags & IORESOURCE_UNSET) || request_resource(pr, r) < 0) {
329 printk(KERN_WARNING "PCI: Cannot allocate resource region %d"
330 " of device %s, will remap\n", idx, pci_name(dev));
331 if (pr)
332 DBG("PCI: parent is %p: %016llx-%016llx (f=%lx)\n",
333 pr, (u64)pr->start, (u64)pr->end, pr->flags);
334 /* We'll assign a new address later */
335 r->flags |= IORESOURCE_UNSET;
336 r->end -= r->start;
337 r->start = 0;
338 }
339}
340
341static void __init
342pcibios_allocate_resources(int pass)
343{
344 struct pci_dev *dev = NULL;
345 int idx, disabled;
346 u16 command;
347 struct resource *r;
348
349 for_each_pci_dev(dev) {
350 pci_read_config_word(dev, PCI_COMMAND, &command);
351 for (idx = 0; idx < 6; idx++) {
352 r = &dev->resource[idx];
353 if (r->parent) /* Already allocated */
354 continue;
355 if (!r->flags || (r->flags & IORESOURCE_UNSET))
356 continue; /* Not assigned at all */
357 if (r->flags & IORESOURCE_IO)
358 disabled = !(command & PCI_COMMAND_IO);
359 else
360 disabled = !(command & PCI_COMMAND_MEMORY);
361 if (pass == disabled)
362 alloc_resource(dev, idx);
363 }
364 if (pass)
365 continue;
366 r = &dev->resource[PCI_ROM_RESOURCE];
367 if (r->flags & IORESOURCE_ROM_ENABLE) {
368 /* Turn the ROM off, leave the resource region, but keep it unregistered. */
369 u32 reg;
370 DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
371 r->flags &= ~IORESOURCE_ROM_ENABLE;
372 pci_read_config_dword(dev, dev->rom_base_reg, &reg);
373 pci_write_config_dword(dev, dev->rom_base_reg,
374 reg & ~PCI_ROM_ADDRESS_ENABLE);
375 }
376 }
377}
378 153
379#ifdef CONFIG_PPC_OF 154#ifdef CONFIG_PPC_OF
380/* 155/*
@@ -649,8 +424,7 @@ void pcibios_make_OF_bus_map(void)
649} 424}
650#endif /* CONFIG_PPC_OF */ 425#endif /* CONFIG_PPC_OF */
651 426
652static int __init 427static int __init pcibios_init(void)
653pcibios_init(void)
654{ 428{
655 struct pci_controller *hose, *tmp; 429 struct pci_controller *hose, *tmp;
656 struct pci_bus *bus; 430 struct pci_bus *bus;
@@ -683,22 +457,8 @@ pcibios_init(void)
683 if (pci_assign_all_buses && have_of) 457 if (pci_assign_all_buses && have_of)
684 pcibios_make_OF_bus_map(); 458 pcibios_make_OF_bus_map();
685 459
686 /* Call machine dependent fixup */ 460 /* Call common code to handle resource allocation */
687 if (ppc_md.pcibios_fixup) 461 pcibios_resource_survey();
688 ppc_md.pcibios_fixup();
689
690 /* Allocate and assign resources. If we re-assign everything, then
691 * we skip the allocate phase
692 */
693 pcibios_allocate_bus_resources(&pci_root_buses);
694 if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
695 pcibios_allocate_resources(0);
696 pcibios_allocate_resources(1);
697 }
698 if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
699 DBG("PCI: Assigning unassigned resouces...\n");
700 pci_assign_unassigned_resources();
701 }
702 462
703 /* Call machine dependent post-init code */ 463 /* Call machine dependent post-init code */
704 if (ppc_md.pcibios_after_init) 464 if (ppc_md.pcibios_after_init)
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index b9619b9e5e02..794359d8686b 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -91,85 +91,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev)
91DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); 91DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
92 92
93 93
94/*
95 * We need to avoid collisions with `mirrored' VGA ports
96 * and other strange ISA hardware, so we always want the
97 * addresses to be allocated in the 0x000-0x0ff region
98 * modulo 0x400.
99 *
100 * Why? Because some silly external IO cards only decode
101 * the low 10 bits of the IO address. The 0x00-0xff region
102 * is reserved for motherboard devices that decode all 16
103 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
104 * but we want to try to avoid allocating at 0x2900-0x2bff
105 * which might have be mirrored at 0x0100-0x03ff..
106 */
107void pcibios_align_resource(void *data, struct resource *res,
108 resource_size_t size, resource_size_t align)
109{
110 struct pci_dev *dev = data;
111 struct pci_controller *hose = pci_bus_to_host(dev->bus);
112 resource_size_t start = res->start;
113 unsigned long alignto;
114
115 if (res->flags & IORESOURCE_IO) {
116 unsigned long offset = (unsigned long)hose->io_base_virt -
117 _IO_BASE;
118 /* Make sure we start at our min on all hoses */
119 if (start - offset < PCIBIOS_MIN_IO)
120 start = PCIBIOS_MIN_IO + offset;
121
122 /*
123 * Put everything into 0x00-0xff region modulo 0x400
124 */
125 if (start & 0x300)
126 start = (start + 0x3ff) & ~0x3ff;
127
128 } else if (res->flags & IORESOURCE_MEM) {
129 /* Make sure we start at our min on all hoses */
130 if (start - hose->pci_mem_offset < PCIBIOS_MIN_MEM)
131 start = PCIBIOS_MIN_MEM + hose->pci_mem_offset;
132
133 /* Align to multiple of size of minimum base. */
134 alignto = max(0x1000UL, align);
135 start = ALIGN(start, alignto);
136 }
137
138 res->start = start;
139}
140
141void __devinit pcibios_claim_one_bus(struct pci_bus *b)
142{
143 struct pci_dev *dev;
144 struct pci_bus *child_bus;
145
146 list_for_each_entry(dev, &b->devices, bus_list) {
147 int i;
148
149 for (i = 0; i < PCI_NUM_RESOURCES; i++) {
150 struct resource *r = &dev->resource[i];
151
152 if (r->parent || !r->start || !r->flags)
153 continue;
154 pci_claim_resource(dev, i);
155 }
156 }
157
158 list_for_each_entry(child_bus, &b->children, node)
159 pcibios_claim_one_bus(child_bus);
160}
161#ifdef CONFIG_HOTPLUG
162EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
163#endif
164
165static void __init pcibios_claim_of_setup(void)
166{
167 struct pci_bus *b;
168
169 list_for_each_entry(b, &pci_root_buses, node)
170 pcibios_claim_one_bus(b);
171}
172
173static u32 get_int_prop(struct device_node *np, const char *name, u32 def) 94static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
174{ 95{
175 const u32 *prop; 96 const u32 *prop;
@@ -440,6 +361,7 @@ void __devinit scan_phb(struct pci_controller *hose)
440 361
441 DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>"); 362 DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
442 363
364 /* Create an empty bus for the toplevel */
443 bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node); 365 bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
444 if (bus == NULL) { 366 if (bus == NULL) {
445 printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", 367 printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
@@ -449,26 +371,16 @@ void __devinit scan_phb(struct pci_controller *hose)
449 bus->secondary = hose->first_busno; 371 bus->secondary = hose->first_busno;
450 hose->bus = bus; 372 hose->bus = bus;
451 373
374 /* Get some IO space for the new PHB */
452 pcibios_map_io_space(bus); 375 pcibios_map_io_space(bus);
453 376
377 /* Wire up PHB bus resources */
454 bus->resource[0] = res = &hose->io_resource; 378 bus->resource[0] = res = &hose->io_resource;
455 if (res->flags && request_resource(&ioport_resource, res)) { 379 for (i = 0; i < 3; ++i)
456 printk(KERN_ERR "Failed to request PCI IO region " 380 bus->resource[i+1] = &hose->mem_resources[i];
457 "on PCI domain %04x\n", hose->global_number);
458 DBG("res->start = 0x%016lx, res->end = 0x%016lx\n",
459 res->start, res->end);
460 }
461
462 for (i = 0; i < 3; ++i) {
463 res = &hose->mem_resources[i];
464 bus->resource[i+1] = res;
465 if (res->flags && request_resource(&iomem_resource, res))
466 printk(KERN_ERR "Failed to request PCI memory region "
467 "on PCI domain %04x\n", hose->global_number);
468 }
469 381
382 /* Get probe mode and perform scan */
470 mode = PCI_PROBE_NORMAL; 383 mode = PCI_PROBE_NORMAL;
471
472 if (node && ppc_md.pci_probe_mode) 384 if (node && ppc_md.pci_probe_mode)
473 mode = ppc_md.pci_probe_mode(bus); 385 mode = ppc_md.pci_probe_mode(bus);
474 DBG(" probe mode: %d\n", mode); 386 DBG(" probe mode: %d\n", mode);
@@ -485,12 +397,15 @@ static int __init pcibios_init(void)
485{ 397{
486 struct pci_controller *hose, *tmp; 398 struct pci_controller *hose, *tmp;
487 399
400 printk(KERN_INFO "PCI: Probing PCI hardware\n");
401
488 /* For now, override phys_mem_access_prot. If we need it, 402 /* For now, override phys_mem_access_prot. If we need it,
489 * later, we may move that initialization to each ppc_md 403 * later, we may move that initialization to each ppc_md
490 */ 404 */
491 ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot; 405 ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
492 406
493 printk(KERN_DEBUG "PCI: Probing PCI hardware\n"); 407 if (pci_probe_only)
408 ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
494 409
495 /* Scan all of the recorded PCI controllers. */ 410 /* Scan all of the recorded PCI controllers. */
496 list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { 411 list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
@@ -498,17 +413,8 @@ static int __init pcibios_init(void)
498 pci_bus_add_devices(hose->bus); 413 pci_bus_add_devices(hose->bus);
499 } 414 }
500 415
501 if (pci_probe_only) 416 /* Call common code to handle resource allocation */
502 pcibios_claim_of_setup(); 417 pcibios_resource_survey();
503 else
504 /* FIXME: `else' will be removed when
505 pci_assign_unassigned_resources() is able to work
506 correctly with [partially] allocated PCI tree. */
507 pci_assign_unassigned_resources();
508
509 /* Call machine dependent final fixup */
510 if (ppc_md.pcibios_fixup)
511 ppc_md.pcibios_fixup();
512 418
513 printk(KERN_DEBUG "PCI: Probing PCI hardware done\n"); 419 printk(KERN_DEBUG "PCI: Probing PCI hardware done\n");
514 420
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c
index a2e9b36f61ef..6bbf3c881711 100644
--- a/arch/powerpc/platforms/powermac/pci.c
+++ b/arch/powerpc/platforms/powermac/pci.c
@@ -994,9 +994,8 @@ void __init pmac_pci_init(void)
994 struct device_node *np, *root; 994 struct device_node *np, *root;
995 struct device_node *ht = NULL; 995 struct device_node *ht = NULL;
996 996
997#ifdef CONFIG_PPC32
998 ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN; 997 ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN;
999#endif 998
1000 root = of_find_node_by_path("/"); 999 root = of_find_node_by_path("/");
1001 if (root == NULL) { 1000 if (root == NULL) {
1002 printk(KERN_CRIT "pmac_pci_init: can't find root " 1001 printk(KERN_CRIT "pmac_pci_init: can't find root "
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h
index 9899d893c162..a05a942b1c25 100644
--- a/include/asm-powerpc/pci.h
+++ b/include/asm-powerpc/pci.h
@@ -36,14 +36,10 @@ struct pci_dev;
36 36
37/* 37/*
38 * Set this to 1 if you want the kernel to re-assign all PCI 38 * Set this to 1 if you want the kernel to re-assign all PCI
39 * bus numbers 39 * bus numbers (don't do that on ppc64 yet !)
40 */ 40 */
41#ifdef CONFIG_PPC64
42#define pcibios_assign_all_busses() 0
43#else
44#define pcibios_assign_all_busses() (ppc_pci_flags & \ 41#define pcibios_assign_all_busses() (ppc_pci_flags & \
45 PPC_PCI_REASSIGN_ALL_BUS) 42 PPC_PCI_REASSIGN_ALL_BUS)
46#endif
47#define pcibios_scan_all_fns(a, b) 0 43#define pcibios_scan_all_fns(a, b) 0
48 44
49static inline void pcibios_set_master(struct pci_dev *dev) 45static inline void pcibios_set_master(struct pci_dev *dev)
@@ -200,6 +196,8 @@ extern void pcibios_setup_new_device(struct pci_dev *dev);
200 196
201extern void pcibios_claim_one_bus(struct pci_bus *b); 197extern void pcibios_claim_one_bus(struct pci_bus *b);
202 198
199extern void pcibios_resource_survey(void);
200
203extern struct pci_controller *init_phb_dynamic(struct device_node *dn); 201extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
204 202
205extern struct pci_dev *of_create_pci_dev(struct device_node *node, 203extern struct pci_dev *of_create_pci_dev(struct device_node *node,