Root/target/linux/brcm47xx/patches-3.2/0000-pci-backport.patch

1--- a/Documentation/feature-removal-schedule.txt
2+++ b/Documentation/feature-removal-schedule.txt
3@@ -551,3 +551,15 @@ When: 3.5
4 Why: The iwlagn module has been renamed iwlwifi. The alias will be around
5     for backward compatibility for several cycles and then dropped.
6 Who: Don Fry <donald.h.fry@intel.com>
7+
8+----------------------------
9+
10+What: pci_scan_bus_parented()
11+When: 3.5
12+Why: The pci_scan_bus_parented() interface creates a new root bus. The
13+ bus is created with default resources (ioport_resource and
14+ iomem_resource) that are always wrong, so we rely on arch code to
15+ correct them later. Callers of pci_scan_bus_parented() should
16+ convert to using pci_scan_root_bus() so they can supply a list of
17+ bus resources when the bus is created.
18+Who: Bjorn Helgaas <bhelgaas@google.com>
19--- a/arch/alpha/kernel/pci.c
20+++ b/arch/alpha/kernel/pci.c
21@@ -281,27 +281,9 @@ pcibios_fixup_device_resources(struct pc
22 void __devinit
23 pcibios_fixup_bus(struct pci_bus *bus)
24 {
25- /* Propagate hose info into the subordinate devices. */
26-
27- struct pci_controller *hose = bus->sysdata;
28     struct pci_dev *dev = bus->self;
29 
30- if (!dev) {
31- /* Root bus. */
32- u32 pci_mem_end;
33- u32 sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0;
34- unsigned long end;
35-
36- bus->resource[0] = hose->io_space;
37- bus->resource[1] = hose->mem_space;
38-
39- /* Adjust hose mem_space limit to prevent PCI allocations
40- in the iommu windows. */
41- pci_mem_end = min((u32)__direct_map_base, sg_base) - 1;
42- end = hose->mem_space->start + pci_mem_end;
43- if (hose->mem_space->end > end)
44- hose->mem_space->end = end;
45- } else if (pci_probe_only &&
46+ if (pci_probe_only && dev &&
47             (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
48          pci_read_bridge_bases(bus);
49          pcibios_fixup_device_resources(dev, bus);
50@@ -414,13 +396,31 @@ void __init
51 common_init_pci(void)
52 {
53     struct pci_controller *hose;
54+ struct list_head resources;
55     struct pci_bus *bus;
56     int next_busno;
57     int need_domain_info = 0;
58+ u32 pci_mem_end;
59+ u32 sg_base;
60+ unsigned long end;
61 
62     /* Scan all of the recorded PCI controllers. */
63     for (next_busno = 0, hose = hose_head; hose; hose = hose->next) {
64- bus = pci_scan_bus(next_busno, alpha_mv.pci_ops, hose);
65+ sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0;
66+
67+ /* Adjust hose mem_space limit to prevent PCI allocations
68+ in the iommu windows. */
69+ pci_mem_end = min((u32)__direct_map_base, sg_base) - 1;
70+ end = hose->mem_space->start + pci_mem_end;
71+ if (hose->mem_space->end > end)
72+ hose->mem_space->end = end;
73+
74+ INIT_LIST_HEAD(&resources);
75+ pci_add_resource(&resources, hose->io_space);
76+ pci_add_resource(&resources, hose->mem_space);
77+
78+ bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
79+ hose, &resources);
80         hose->bus = bus;
81         hose->need_domain_info = need_domain_info;
82         next_busno = bus->subordinate + 1;
83--- a/arch/arm/common/it8152.c
84+++ b/arch/arm/common/it8152.c
85@@ -299,8 +299,8 @@ int __init it8152_pci_setup(int nr, stru
86         goto err1;
87     }
88 
89- sys->resource[0] = &it8152_io;
90- sys->resource[1] = &it8152_mem;
91+ pci_add_resource(&sys->resources, &it8152_io);
92+ pci_add_resource(&sys->resources, &it8152_mem);
93 
94     if (platform_notify || platform_notify_remove) {
95         printk(KERN_ERR "PCI: Can't use platform_notify\n");
96@@ -352,7 +352,7 @@ void pcibios_set_master(struct pci_dev *
97 
98 struct pci_bus * __init it8152_pci_scan_bus(int nr, struct pci_sys_data *sys)
99 {
100- return pci_scan_bus(nr, &it8152_ops, sys);
101+ return pci_scan_root_bus(NULL, nr, &it8152_ops, sys, &sys->resources);
102 }
103 
104 EXPORT_SYMBOL(dma_set_coherent_mask);
105--- a/arch/arm/common/via82c505.c
106+++ b/arch/arm/common/via82c505.c
107@@ -86,7 +86,8 @@ int __init via82c505_setup(int nr, struc
108 struct pci_bus * __init via82c505_scan_bus(int nr, struct pci_sys_data *sysdata)
109 {
110     if (nr == 0)
111- return pci_scan_bus(0, &via82c505_ops, sysdata);
112+ return pci_scan_root_bus(NULL, 0, &via82c505_ops, sysdata,
113+ &sysdata->resources);
114 
115     return NULL;
116 }
117--- a/arch/arm/include/asm/mach/pci.h
118+++ b/arch/arm/include/asm/mach/pci.h
119@@ -40,7 +40,7 @@ struct pci_sys_data {
120     u64 mem_offset; /* bus->cpu memory mapping offset */
121     unsigned long io_offset; /* bus->cpu IO mapping offset */
122     struct pci_bus *bus; /* PCI bus */
123- struct resource *resource[3]; /* Primary PCI bus resources */
124+ struct list_head resources; /* root bus resources (apertures) */
125                     /* Bridge swizzling */
126     u8 (*swizzle)(struct pci_dev *, u8 *);
127                     /* IRQ mapping */
128--- a/arch/arm/kernel/bios32.c
129+++ b/arch/arm/kernel/bios32.c
130@@ -316,21 +316,6 @@ pdev_fixup_device_resources(struct pci_s
131     }
132 }
133 
134-static void __devinit
135-pbus_assign_bus_resources(struct pci_bus *bus, struct pci_sys_data *root)
136-{
137- struct pci_dev *dev = bus->self;
138- int i;
139-
140- if (!dev) {
141- /*
142- * Assign root bus resources.
143- */
144- for (i = 0; i < 3; i++)
145- bus->resource[i] = root->resource[i];
146- }
147-}
148-
149 /*
150  * pcibios_fixup_bus - Called after each bus is probed,
151  * but before its children are examined.
152@@ -341,8 +326,6 @@ void pcibios_fixup_bus(struct pci_bus *b
153     struct pci_dev *dev;
154     u16 features = PCI_COMMAND_SERR | PCI_COMMAND_PARITY | PCI_COMMAND_FAST_BACK;
155 
156- pbus_assign_bus_resources(bus, root);
157-
158     /*
159      * Walk the devices on this bus, working out what we can
160      * and can't support.
161@@ -508,12 +491,18 @@ static void __init pcibios_init_hw(struc
162         sys->busnr = busnr;
163         sys->swizzle = hw->swizzle;
164         sys->map_irq = hw->map_irq;
165- sys->resource[0] = &ioport_resource;
166- sys->resource[1] = &iomem_resource;
167+ INIT_LIST_HEAD(&sys->resources);
168 
169         ret = hw->setup(nr, sys);
170 
171         if (ret > 0) {
172+ if (list_empty(&sys->resources)) {
173+ pci_add_resource(&sys->resources,
174+ &ioport_resource);
175+ pci_add_resource(&sys->resources,
176+ &iomem_resource);
177+ }
178+
179             sys->bus = hw->scan(nr, sys);
180 
181             if (!sys->bus)
182--- a/arch/arm/mach-cns3xxx/pcie.c
183+++ b/arch/arm/mach-cns3xxx/pcie.c
184@@ -151,13 +151,12 @@ static int cns3xxx_pci_setup(int nr, str
185     struct cns3xxx_pcie *cnspci = sysdata_to_cnspci(sys);
186     struct resource *res_io = &cnspci->res_io;
187     struct resource *res_mem = &cnspci->res_mem;
188- struct resource **sysres = sys->resource;
189 
190     BUG_ON(request_resource(&iomem_resource, res_io) ||
191            request_resource(&iomem_resource, res_mem));
192 
193- sysres[0] = res_io;
194- sysres[1] = res_mem;
195+ pci_add_resource(&sys->resources, res_io);
196+ pci_add_resource(&sys->resources, res_mem);
197 
198     return 1;
199 }
200@@ -169,7 +168,8 @@ static struct pci_ops cns3xxx_pcie_ops =
201 
202 static struct pci_bus *cns3xxx_pci_scan_bus(int nr, struct pci_sys_data *sys)
203 {
204- return pci_scan_bus(sys->busnr, &cns3xxx_pcie_ops, sys);
205+ return pci_scan_root_bus(NULL, sys->busnr, &cns3xxx_pcie_ops, sys,
206+ &sys->resources);
207 }
208 
209 static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
210--- a/arch/arm/mach-dove/pcie.c
211+++ b/arch/arm/mach-dove/pcie.c
212@@ -69,7 +69,7 @@ static int __init dove_pcie_setup(int nr
213     pp->res[0].flags = IORESOURCE_IO;
214     if (request_resource(&ioport_resource, &pp->res[0]))
215         panic("Request PCIe IO resource failed\n");
216- sys->resource[0] = &pp->res[0];
217+ pci_add_resource(&sys->resources, &pp->res[0]);
218 
219     /*
220      * IORESOURCE_MEM
221@@ -88,9 +88,7 @@ static int __init dove_pcie_setup(int nr
222     pp->res[1].flags = IORESOURCE_MEM;
223     if (request_resource(&iomem_resource, &pp->res[1]))
224         panic("Request PCIe Memory resource failed\n");
225- sys->resource[1] = &pp->res[1];
226-
227- sys->resource[2] = NULL;
228+ pci_add_resource(&sys->resources, &pp->res[1]);
229 
230     return 1;
231 }
232@@ -184,7 +182,8 @@ dove_pcie_scan_bus(int nr, struct pci_sy
233     struct pci_bus *bus;
234 
235     if (nr < num_pcie_ports) {
236- bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
237+ bus = pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
238+ &sys->resources);
239     } else {
240         bus = NULL;
241         BUG();
242--- a/arch/arm/mach-footbridge/dc21285.c
243+++ b/arch/arm/mach-footbridge/dc21285.c
244@@ -275,9 +275,9 @@ int __init dc21285_setup(int nr, struct
245     allocate_resource(&iomem_resource, &res[0], 0x40000000,
246               0x80000000, 0xffffffff, 0x40000000, NULL, NULL);
247 
248- sys->resource[0] = &ioport_resource;
249- sys->resource[1] = &res[0];
250- sys->resource[2] = &res[1];
251+ pci_add_resource(&sys->resources, &ioport_resource);
252+ pci_add_resource(&sys->resources, &res[0]);
253+ pci_add_resource(&sys->resources, &res[1]);
254     sys->mem_offset = DC21285_PCI_MEM;
255 
256     return 1;
257@@ -285,7 +285,7 @@ int __init dc21285_setup(int nr, struct
258 
259 struct pci_bus * __init dc21285_scan_bus(int nr, struct pci_sys_data *sys)
260 {
261- return pci_scan_bus(0, &dc21285_ops, sys);
262+ return pci_scan_root_bus(NULL, 0, &dc21285_ops, sys, &sys->resources);
263 }
264 
265 #define dc21285_request_irq(_a, _b, _c, _d, _e) \
266--- a/arch/arm/mach-integrator/pci_v3.c
267+++ b/arch/arm/mach-integrator/pci_v3.c
268@@ -359,7 +359,7 @@ static struct resource pre_mem = {
269     .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH,
270 };
271 
272-static int __init pci_v3_setup_resources(struct resource **resource)
273+static int __init pci_v3_setup_resources(struct pci_sys_data *sys)
274 {
275     if (request_resource(&iomem_resource, &non_mem)) {
276         printk(KERN_ERR "PCI: unable to allocate non-prefetchable "
277@@ -374,13 +374,13 @@ static int __init pci_v3_setup_resources
278     }
279 
280     /*
281- * bus->resource[0] is the IO resource for this bus
282- * bus->resource[1] is the mem resource for this bus
283- * bus->resource[2] is the prefetch mem resource for this bus
284+ * the IO resource for this bus
285+ * the mem resource for this bus
286+ * the prefetch mem resource for this bus
287      */
288- resource[0] = &ioport_resource;
289- resource[1] = &non_mem;
290- resource[2] = &pre_mem;
291+ pci_add_resource(&sys->resources, &ioport_resource);
292+ pci_add_resource(&sys->resources, &non_mem);
293+ pci_add_resource(&sys->resources, &pre_mem);
294 
295     return 1;
296 }
297@@ -481,7 +481,7 @@ int __init pci_v3_setup(int nr, struct p
298 
299     if (nr == 0) {
300         sys->mem_offset = PHYS_PCI_MEM_BASE;
301- ret = pci_v3_setup_resources(sys->resource);
302+ ret = pci_v3_setup_resources(sys);
303     }
304 
305     return ret;
306@@ -489,7 +489,8 @@ int __init pci_v3_setup(int nr, struct p
307 
308 struct pci_bus * __init pci_v3_scan_bus(int nr, struct pci_sys_data *sys)
309 {
310- return pci_scan_bus(sys->busnr, &pci_v3_ops, sys);
311+ return pci_scan_root_bus(NULL, sys->busnr, &pci_v3_ops, sys,
312+ &sys->resources);
313 }
314 
315 /*
316--- a/arch/arm/mach-iop13xx/pci.c
317+++ b/arch/arm/mach-iop13xx/pci.c
318@@ -537,14 +537,14 @@ struct pci_bus *iop13xx_scan_bus(int nr,
319             while(time_before(jiffies, atux_trhfa_timeout))
320                 udelay(100);
321 
322- bus = pci_bus_atux = pci_scan_bus(sys->busnr,
323- &iop13xx_atux_ops,
324- sys);
325+ bus = pci_bus_atux = pci_scan_root_bus(NULL, sys->busnr,
326+ &iop13xx_atux_ops,
327+ sys, &sys->resources);
328         break;
329     case IOP13XX_INIT_ATU_ATUE:
330- bus = pci_bus_atue = pci_scan_bus(sys->busnr,
331- &iop13xx_atue_ops,
332- sys);
333+ bus = pci_bus_atue = pci_scan_root_bus(NULL, sys->busnr,
334+ &iop13xx_atue_ops,
335+ sys, &sys->resources);
336         break;
337     }
338 
339@@ -1084,9 +1084,8 @@ int iop13xx_pci_setup(int nr, struct pci
340     request_resource(&ioport_resource, &res[0]);
341     request_resource(&iomem_resource, &res[1]);
342 
343- sys->resource[0] = &res[0];
344- sys->resource[1] = &res[1];
345- sys->resource[2] = NULL;
346+ pci_add_resource(&sys->resources, &res[0]);
347+ pci_add_resource(&sys->resources, &res[1]);
348 
349     return 1;
350 }
351--- a/arch/arm/mach-ixp2000/enp2611.c
352+++ b/arch/arm/mach-ixp2000/enp2611.c
353@@ -145,7 +145,8 @@ static struct pci_ops enp2611_pci_ops =
354 static struct pci_bus * __init enp2611_pci_scan_bus(int nr,
355                         struct pci_sys_data *sys)
356 {
357- return pci_scan_bus(sys->busnr, &enp2611_pci_ops, sys);
358+ return pci_scan_root_bus(NULL, sys->busnr, &enp2611_pci_ops, sys,
359+ &sys->resources);
360 }
361 
362 static int __init enp2611_pci_map_irq(const struct pci_dev *dev, u8 slot,
363--- a/arch/arm/mach-ixp2000/pci.c
364+++ b/arch/arm/mach-ixp2000/pci.c
365@@ -132,7 +132,8 @@ static struct pci_ops ixp2000_pci_ops =
366 
367 struct pci_bus *ixp2000_pci_scan_bus(int nr, struct pci_sys_data *sysdata)
368 {
369- return pci_scan_bus(sysdata->busnr, &ixp2000_pci_ops, sysdata);
370+ return pci_scan_root_bus(NULL, sysdata->busnr, &ixp2000_pci_ops,
371+ sysdata, &sysdata->resources);
372 }
373 
374 
375@@ -242,9 +243,8 @@ int ixp2000_pci_setup(int nr, struct pci
376     if (nr >= 1)
377         return 0;
378 
379- sys->resource[0] = &ixp2000_pci_io_space;
380- sys->resource[1] = &ixp2000_pci_mem_space;
381- sys->resource[2] = NULL;
382+ pci_add_resource(&sys->resources, &ixp2000_pci_io_space);
383+ pci_add_resource(&sys->resources, &ixp2000_pci_mem_space);
384 
385     return 1;
386 }
387--- a/arch/arm/mach-ixp23xx/pci.c
388+++ b/arch/arm/mach-ixp23xx/pci.c
389@@ -143,7 +143,8 @@ struct pci_ops ixp23xx_pci_ops = {
390 
391 struct pci_bus *ixp23xx_pci_scan_bus(int nr, struct pci_sys_data *sysdata)
392 {
393- return pci_scan_bus(sysdata->busnr, &ixp23xx_pci_ops, sysdata);
394+ return pci_scan_root_bus(NULL, sysdata->busnr, &ixp23xx_pci_ops,
395+ sysdata, &sysdata->resources);
396 }
397 
398 int ixp23xx_pci_abort_handler(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
399@@ -280,9 +281,8 @@ int ixp23xx_pci_setup(int nr, struct pci
400     if (nr >= 1)
401         return 0;
402 
403- sys->resource[0] = &ixp23xx_pci_io_space;
404- sys->resource[1] = &ixp23xx_pci_mem_space;
405- sys->resource[2] = NULL;
406+ pci_add_resource(&sys->resources, &ixp23xx_pci_io_space);
407+ pci_add_resource(&sys->resources, &ixp23xx_pci_mem_space);
408 
409     return 1;
410 }
411--- a/arch/arm/mach-ixp4xx/common-pci.c
412+++ b/arch/arm/mach-ixp4xx/common-pci.c
413@@ -472,9 +472,8 @@ int ixp4xx_setup(int nr, struct pci_sys_
414     request_resource(&ioport_resource, &res[0]);
415     request_resource(&iomem_resource, &res[1]);
416 
417- sys->resource[0] = &res[0];
418- sys->resource[1] = &res[1];
419- sys->resource[2] = NULL;
420+ pci_add_resource(&sys->resources, &res[0]);
421+ pci_add_resource(&sys->resources, &res[1]);
422 
423     platform_notify = ixp4xx_pci_platform_notify;
424     platform_notify_remove = ixp4xx_pci_platform_notify_remove;
425@@ -484,7 +483,8 @@ int ixp4xx_setup(int nr, struct pci_sys_
426 
427 struct pci_bus * __devinit ixp4xx_scan_bus(int nr, struct pci_sys_data *sys)
428 {
429- return pci_scan_bus(sys->busnr, &ixp4xx_ops, sys);
430+ return pci_scan_root_bus(NULL, sys->busnr, &ixp4xx_ops, sys,
431+ &sys->resources);
432 }
433 
434 int dma_set_coherent_mask(struct device *dev, u64 mask)
435--- a/arch/arm/mach-kirkwood/pcie.c
436+++ b/arch/arm/mach-kirkwood/pcie.c
437@@ -198,9 +198,8 @@ static int __init kirkwood_pcie_setup(in
438     if (request_resource(&iomem_resource, &pp->res[1]))
439         panic("Request PCIe%d Memory resource failed\n", index);
440 
441- sys->resource[0] = &pp->res[0];
442- sys->resource[1] = &pp->res[1];
443- sys->resource[2] = NULL;
444+ pci_add_resource(&sys->resources, &pp->res[0]);
445+ pci_add_resource(&sys->resources, &pp->res[1]);
446     sys->io_offset = 0;
447 
448     /*
449@@ -236,7 +235,8 @@ kirkwood_pcie_scan_bus(int nr, struct pc
450     struct pci_bus *bus;
451 
452     if (nr < num_pcie_ports) {
453- bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
454+ bus = pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
455+ &sys->resources);
456     } else {
457         bus = NULL;
458         BUG();
459--- a/arch/arm/mach-ks8695/pci.c
460+++ b/arch/arm/mach-ks8695/pci.c
461@@ -143,7 +143,8 @@ static struct pci_ops ks8695_pci_ops = {
462 
463 static struct pci_bus* __init ks8695_pci_scan_bus(int nr, struct pci_sys_data *sys)
464 {
465- return pci_scan_bus(sys->busnr, &ks8695_pci_ops, sys);
466+ return pci_scan_root_bus(NULL, sys->busnr, &ks8695_pci_ops, sys,
467+ &sys->resources);
468 }
469 
470 static struct resource pci_mem = {
471@@ -168,9 +169,8 @@ static int __init ks8695_pci_setup(int n
472     request_resource(&iomem_resource, &pci_mem);
473     request_resource(&ioport_resource, &pci_io);
474 
475- sys->resource[0] = &pci_io;
476- sys->resource[1] = &pci_mem;
477- sys->resource[2] = NULL;
478+ pci_add_resource(&sys->resources, &pci_io);
479+ pci_add_resource(&sys->resources, &pci_mem);
480 
481     /* Assign and enable processor bridge */
482     ks8695_local_writeconfig(PCI_BASE_ADDRESS_0, KS8695_PCIMEM_PA);
483--- a/arch/arm/mach-mv78xx0/pcie.c
484+++ b/arch/arm/mach-mv78xx0/pcie.c
485@@ -155,9 +155,8 @@ static int __init mv78xx0_pcie_setup(int
486     orion_pcie_set_local_bus_nr(pp->base, sys->busnr);
487     orion_pcie_setup(pp->base, &mv78xx0_mbus_dram_info);
488 
489- sys->resource[0] = &pp->res[0];
490- sys->resource[1] = &pp->res[1];
491- sys->resource[2] = NULL;
492+ pci_add_resource(&sys->resources, &pp->res[0]);
493+ pci_add_resource(&sys->resources, &pp->res[1]);
494 
495     return 1;
496 }
497@@ -251,7 +250,8 @@ mv78xx0_pcie_scan_bus(int nr, struct pci
498     struct pci_bus *bus;
499 
500     if (nr < num_pcie_ports) {
501- bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
502+ bus = pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
503+ &sys->resources);
504     } else {
505         bus = NULL;
506         BUG();
507--- a/arch/arm/mach-orion5x/pci.c
508+++ b/arch/arm/mach-orion5x/pci.c
509@@ -176,7 +176,7 @@ static int __init pcie_setup(struct pci_
510     res[0].end = res[0].start + ORION5X_PCIE_IO_SIZE - 1;
511     if (request_resource(&ioport_resource, &res[0]))
512         panic("Request PCIe IO resource failed\n");
513- sys->resource[0] = &res[0];
514+ pci_add_resource(&sys->resources, &res[0]);
515 
516     /*
517      * IORESOURCE_MEM
518@@ -187,9 +187,8 @@ static int __init pcie_setup(struct pci_
519     res[1].end = res[1].start + ORION5X_PCIE_MEM_SIZE - 1;
520     if (request_resource(&iomem_resource, &res[1]))
521         panic("Request PCIe Memory resource failed\n");
522- sys->resource[1] = &res[1];
523+ pci_add_resource(&sys->resources, &res[1]);
524 
525- sys->resource[2] = NULL;
526     sys->io_offset = 0;
527 
528     return 1;
529@@ -505,7 +504,7 @@ static int __init pci_setup(struct pci_s
530     res[0].end = res[0].start + ORION5X_PCI_IO_SIZE - 1;
531     if (request_resource(&ioport_resource, &res[0]))
532         panic("Request PCI IO resource failed\n");
533- sys->resource[0] = &res[0];
534+ pci_add_resource(&sys->resources, &res[0]);
535 
536     /*
537      * IORESOURCE_MEM
538@@ -516,9 +515,8 @@ static int __init pci_setup(struct pci_s
539     res[1].end = res[1].start + ORION5X_PCI_MEM_SIZE - 1;
540     if (request_resource(&iomem_resource, &res[1]))
541         panic("Request PCI Memory resource failed\n");
542- sys->resource[1] = &res[1];
543+ pci_add_resource(&sys->resources, &res[1]);
544 
545- sys->resource[2] = NULL;
546     sys->io_offset = 0;
547 
548     return 1;
549@@ -579,9 +577,11 @@ struct pci_bus __init *orion5x_pci_sys_s
550     struct pci_bus *bus;
551 
552     if (nr == 0) {
553- bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
554+ bus = pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
555+ &sys->resources);
556     } else if (nr == 1 && !orion5x_pci_disabled) {
557- bus = pci_scan_bus(sys->busnr, &pci_ops, sys);
558+ bus = pci_scan_root_bus(NULL, sys->busnr, &pci_ops, sys,
559+ &sys->resources);
560     } else {
561         bus = NULL;
562         BUG();
563--- a/arch/arm/mach-sa1100/pci-nanoengine.c
564+++ b/arch/arm/mach-sa1100/pci-nanoengine.c
565@@ -131,7 +131,8 @@ static int __init pci_nanoengine_map_irq
566 
567 struct pci_bus * __init pci_nanoengine_scan_bus(int nr, struct pci_sys_data *sys)
568 {
569- return pci_scan_bus(sys->busnr, &pci_nano_ops, sys);
570+ return pci_scan_root_bus(NULL, sys->busnr, &pci_nano_ops, sys,
571+ &sys->resources);
572 }
573 
574 static struct resource pci_io_ports = {
575@@ -226,7 +227,7 @@ static struct resource pci_prefetchable_
576     .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH,
577 };
578 
579-static int __init pci_nanoengine_setup_resources(struct resource **resource)
580+static int __init pci_nanoengine_setup_resources(struct pci_sys_data *sys)
581 {
582     if (request_resource(&ioport_resource, &pci_io_ports)) {
583         printk(KERN_ERR "PCI: unable to allocate io port region\n");
584@@ -243,9 +244,9 @@ static int __init pci_nanoengine_setup_r
585         printk(KERN_ERR "PCI: unable to allocate prefetchable\n");
586         return -EBUSY;
587     }
588- resource[0] = &pci_io_ports;
589- resource[1] = &pci_non_prefetchable_memory;
590- resource[2] = &pci_prefetchable_memory;
591+ pci_add_resource(&sys->resources, &pci_io_ports);
592+ pci_add_resource(&sys->resources, &pci_non_prefetchable_memory);
593+ pci_add_resource(&sys->resources, &pci_prefetchable_memory);
594 
595     return 1;
596 }
597@@ -260,7 +261,7 @@ int __init pci_nanoengine_setup(int nr,
598     if (nr == 0) {
599         sys->mem_offset = NANO_PCI_MEM_RW_PHYS;
600         sys->io_offset = 0x400;
601- ret = pci_nanoengine_setup_resources(sys->resource);
602+ ret = pci_nanoengine_setup_resources(sys);
603         /* Enable alternate memory bus master mode, see
604          * "Intel StrongARM SA1110 Developer's Manual",
605          * section 10.8, "Alternate Memory Bus Master Mode". */
606--- a/arch/arm/mach-tegra/pcie.c
607+++ b/arch/arm/mach-tegra/pcie.c
608@@ -409,7 +409,7 @@ static int tegra_pcie_setup(int nr, stru
609     pp->res[0].flags = IORESOURCE_IO;
610     if (request_resource(&ioport_resource, &pp->res[0]))
611         panic("Request PCIe IO resource failed\n");
612- sys->resource[0] = &pp->res[0];
613+ pci_add_resource(&sys->resources, &pp->res[0]);
614 
615     /*
616      * IORESOURCE_MEM
617@@ -428,7 +428,7 @@ static int tegra_pcie_setup(int nr, stru
618     pp->res[1].flags = IORESOURCE_MEM;
619     if (request_resource(&iomem_resource, &pp->res[1]))
620         panic("Request PCIe Memory resource failed\n");
621- sys->resource[1] = &pp->res[1];
622+ pci_add_resource(&sys->resources, &pp->res[1]);
623 
624     /*
625      * IORESOURCE_MEM | IORESOURCE_PREFETCH
626@@ -447,7 +447,7 @@ static int tegra_pcie_setup(int nr, stru
627     pp->res[2].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
628     if (request_resource(&iomem_resource, &pp->res[2]))
629         panic("Request PCIe Prefetch Memory resource failed\n");
630- sys->resource[2] = &pp->res[2];
631+ pci_add_resource(&sys->resources, &pp->res[2]);
632 
633     return 1;
634 }
635@@ -468,7 +468,8 @@ static struct pci_bus __init *tegra_pcie
636     pp = tegra_pcie.port + nr;
637     pp->root_bus_nr = sys->busnr;
638 
639- return pci_scan_bus(sys->busnr, &tegra_pcie_ops, sys);
640+ return pci_scan_root_bus(NULL, sys->busnr, &tegra_pcie_ops, sys,
641+ &sys->resources);
642 }
643 
644 static struct hw_pci tegra_pcie_hw __initdata = {
645--- a/arch/arm/mach-versatile/pci.c
646+++ b/arch/arm/mach-versatile/pci.c
647@@ -191,7 +191,7 @@ static struct resource pre_mem = {
648     .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH,
649 };
650 
651-static int __init pci_versatile_setup_resources(struct resource **resource)
652+static int __init pci_versatile_setup_resources(struct list_head *resources)
653 {
654     int ret = 0;
655 
656@@ -215,13 +215,13 @@ static int __init pci_versatile_setup_re
657     }
658 
659     /*
660- * bus->resource[0] is the IO resource for this bus
661- * bus->resource[1] is the mem resource for this bus
662- * bus->resource[2] is the prefetch mem resource for this bus
663+ * the IO resource for this bus
664+ * the mem resource for this bus
665+ * the prefetch mem resource for this bus
666      */
667- resource[0] = &io_mem;
668- resource[1] = &non_mem;
669- resource[2] = &pre_mem;
670+ pci_add_resource(resources, &io_mem);
671+ pci_add_resource(resources, &non_mem);
672+ pci_add_resource(resources, &pre_mem);
673 
674     goto out;
675 
676@@ -250,7 +250,7 @@ int __init pci_versatile_setup(int nr, s
677 
678     if (nr == 0) {
679         sys->mem_offset = 0;
680- ret = pci_versatile_setup_resources(sys->resource);
681+ ret = pci_versatile_setup_resources(&sys->resources);
682         if (ret < 0) {
683             printk("pci_versatile_setup: resources... oops?\n");
684             goto out;
685@@ -306,7 +306,8 @@ int __init pci_versatile_setup(int nr, s
686 
687 struct pci_bus * __init pci_versatile_scan_bus(int nr, struct pci_sys_data *sys)
688 {
689- return pci_scan_bus(sys->busnr, &pci_versatile_ops, sys);
690+ return pci_scan_root_bus(NULL, sys->busnr, &pci_versatile_ops, sys,
691+ &sys->resources);
692 }
693 
694 void __init pci_versatile_preinit(void)
695--- a/arch/arm/plat-iop/pci.c
696+++ b/arch/arm/plat-iop/pci.c
697@@ -215,16 +215,16 @@ int iop3xx_pci_setup(int nr, struct pci_
698     sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0;
699     sys->io_offset = IOP3XX_PCI_LOWER_IO_PA - *IOP3XX_OIOWTVR;
700 
701- sys->resource[0] = &res[0];
702- sys->resource[1] = &res[1];
703- sys->resource[2] = NULL;
704+ pci_add_resource(&sys->resources, &res[0]);
705+ pci_add_resource(&sys->resources, &res[1]);
706 
707     return 1;
708 }
709 
710 struct pci_bus *iop3xx_pci_scan_bus(int nr, struct pci_sys_data *sys)
711 {
712- return pci_scan_bus(sys->busnr, &iop3xx_ops, sys);
713+ return pci_scan_root_bus(NULL, sys->busnr, &iop3xx_ops, sys,
714+ &sys->resources);
715 }
716 
717 void __init iop3xx_atu_setup(void)
718--- a/arch/frv/mb93090-mb00/pci-vdk.c
719+++ b/arch/frv/mb93090-mb00/pci-vdk.c
720@@ -327,11 +327,6 @@ void __init pcibios_fixup_bus(struct pci
721     printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number);
722 #endif
723 
724- if (bus->number == 0) {
725- bus->resource[0] = &pci_ioport_resource;
726- bus->resource[1] = &pci_iomem_resource;
727- }
728-
729     pci_read_bridge_bases(bus);
730 
731     if (bus->number == 0) {
732@@ -357,6 +352,7 @@ void __init pcibios_fixup_bus(struct pci
733 int __init pcibios_init(void)
734 {
735     struct pci_ops *dir = NULL;
736+ LIST_HEAD(resources);
737 
738     if (!mb93090_mb00_detected)
739         return -ENXIO;
740@@ -420,7 +416,10 @@ int __init pcibios_init(void)
741     }
742 
743     printk("PCI: Probing PCI hardware\n");
744- pci_root_bus = pci_scan_bus(0, pci_root_ops, NULL);
745+ pci_add_resource(&resources, &pci_ioport_resource);
746+ pci_add_resource(&resources, &pci_iomem_resource);
747+ pci_root_bus = pci_scan_root_bus(NULL, 0, pci_root_ops, NULL,
748+ &resources);
749 
750     pcibios_irq_init();
751     pcibios_fixup_peer_bridges();
752--- a/arch/ia64/pci/pci.c
753+++ b/arch/ia64/pci/pci.c
754@@ -134,6 +134,7 @@ alloc_pci_controller (int seg)
755 struct pci_root_info {
756     struct acpi_device *bridge;
757     struct pci_controller *controller;
758+ struct list_head resources;
759     char *name;
760 };
761 
762@@ -315,24 +316,13 @@ static __devinit acpi_status add_window(
763                  &window->resource);
764     }
765 
766- return AE_OK;
767-}
768+ /* HP's firmware has a hack to work around a Windows bug.
769+ * Ignore these tiny memory ranges */
770+ if (!((window->resource.flags & IORESOURCE_MEM) &&
771+ (window->resource.end - window->resource.start < 16)))
772+ pci_add_resource(&info->resources, &window->resource);
773 
774-static void __devinit
775-pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
776-{
777- int i;
778-
779- pci_bus_remove_resources(bus);
780- for (i = 0; i < ctrl->windows; i++) {
781- struct resource *res = &ctrl->window[i].resource;
782- /* HP's firmware has a hack to work around a Windows bug.
783- * Ignore these tiny memory ranges */
784- if ((res->flags & IORESOURCE_MEM) &&
785- (res->end - res->start < 16))
786- continue;
787- pci_bus_add_resource(bus, res, 0);
788- }
789+ return AE_OK;
790 }
791 
792 struct pci_bus * __devinit
793@@ -343,6 +333,7 @@ pci_acpi_scan_root(struct acpi_pci_root
794     int bus = root->secondary.start;
795     struct pci_controller *controller;
796     unsigned int windows = 0;
797+ struct pci_root_info info;
798     struct pci_bus *pbus;
799     char *name;
800     int pxm;
801@@ -359,11 +350,10 @@ pci_acpi_scan_root(struct acpi_pci_root
802         controller->node = pxm_to_node(pxm);
803 #endif
804 
805+ INIT_LIST_HEAD(&info.resources);
806     acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
807             &windows);
808     if (windows) {
809- struct pci_root_info info;
810-
811         controller->window =
812             kmalloc_node(sizeof(*controller->window) * windows,
813                      GFP_KERNEL, controller->node);
814@@ -387,8 +377,14 @@ pci_acpi_scan_root(struct acpi_pci_root
815      * should handle the case here, but it appears that IA64 hasn't
816      * such quirk. So we just ignore the case now.
817      */
818- pbus = pci_scan_bus_parented(NULL, bus, &pci_root_ops, controller);
819+ pbus = pci_create_root_bus(NULL, bus, &pci_root_ops, controller,
820+ &info.resources);
821+ if (!pbus) {
822+ pci_free_resource_list(&info.resources);
823+ return NULL;
824+ }
825 
826+ pbus->subordinate = pci_scan_child_bus(pbus);
827     return pbus;
828 
829 out3:
830@@ -504,14 +500,10 @@ pcibios_fixup_bus (struct pci_bus *b)
831     if (b->self) {
832         pci_read_bridge_bases(b);
833         pcibios_fixup_bridge_resources(b->self);
834- } else {
835- pcibios_setup_root_windows(b, b->sysdata);
836     }
837     list_for_each_entry(dev, &b->devices, bus_list)
838         pcibios_fixup_device_resources(dev);
839     platform_pci_fixup_bus(b);
840-
841- return;
842 }
843 
844 void __devinit
845--- a/arch/microblaze/include/asm/pci-bridge.h
846+++ b/arch/microblaze/include/asm/pci-bridge.h
847@@ -140,7 +140,6 @@ extern void pci_process_bridge_OF_ranges
848 /* Allocate & free a PCI host bridge structure */
849 extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
850 extern void pcibios_free_controller(struct pci_controller *phb);
851-extern void pcibios_setup_phb_resources(struct pci_controller *hose);
852 
853 #endif /* __KERNEL__ */
854 #endif /* _ASM_MICROBLAZE_PCI_BRIDGE_H */
855--- a/arch/microblaze/pci/pci-common.c
856+++ b/arch/microblaze/pci/pci-common.c
857@@ -1019,7 +1019,6 @@ static void __devinit pcibios_fixup_brid
858     struct pci_dev *dev = bus->self;
859 
860     pci_bus_for_each_resource(bus, res, i) {
861- res = bus->resource[i];
862         if (!res)
863             continue;
864         if (!res->flags)
865@@ -1219,7 +1218,6 @@ void pcibios_allocate_bus_resources(stru
866          pci_domain_nr(bus), bus->number);
867 
868     pci_bus_for_each_resource(bus, res, i) {
869- res = bus->resource[i];
870         if (!res || !res->flags
871             || res->start > res->end || res->parent)
872             continue;
873@@ -1510,14 +1508,18 @@ int pcibios_enable_device(struct pci_dev
874     return pci_enable_resources(dev, mask);
875 }
876 
877-void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)
878+static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
879 {
880- struct pci_bus *bus = hose->bus;
881     struct resource *res;
882     int i;
883 
884     /* Hookup PHB IO resource */
885- bus->resource[0] = res = &hose->io_resource;
886+ res = &hose->io_resource;
887+
888+ /* Fixup IO space offset */
889+ io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
890+ res->start = (res->start + io_offset) & 0xffffffffu;
891+ res->end = (res->end + io_offset) & 0xffffffffu;
892 
893     if (!res->flags) {
894         printk(KERN_WARNING "PCI: I/O resource not set for host"
895@@ -1528,6 +1530,7 @@ void __devinit pcibios_setup_phb_resourc
896         res->end = res->start + IO_SPACE_LIMIT;
897         res->flags = IORESOURCE_IO;
898     }
899+ pci_add_resource(resources, res);
900 
901     pr_debug("PCI: PHB IO resource = %016llx-%016llx [%lx]\n",
902          (unsigned long long)res->start,
903@@ -1550,7 +1553,7 @@ void __devinit pcibios_setup_phb_resourc
904             res->flags = IORESOURCE_MEM;
905 
906         }
907- bus->resource[i+1] = res;
908+ pci_add_resource(resources, res);
909 
910         pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n",
911             i, (unsigned long long)res->start,
912@@ -1573,34 +1576,27 @@ struct device_node *pcibios_get_phb_of_n
913 
914 static void __devinit pcibios_scan_phb(struct pci_controller *hose)
915 {
916+ LIST_HEAD(resources);
917     struct pci_bus *bus;
918     struct device_node *node = hose->dn;
919- unsigned long io_offset;
920- struct resource *res = &hose->io_resource;
921 
922     pr_debug("PCI: Scanning PHB %s\n",
923          node ? node->full_name : "<NO NAME>");
924 
925- /* Create an empty bus for the toplevel */
926- bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose);
927+ pcibios_setup_phb_resources(hose, &resources);
928+
929+ bus = pci_scan_root_bus(hose->parent, hose->first_busno,
930+ hose->ops, hose, &resources);
931     if (bus == NULL) {
932         printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
933                hose->global_number);
934+ pci_free_resource_list(&resources);
935         return;
936     }
937     bus->secondary = hose->first_busno;
938     hose->bus = bus;
939 
940- /* Fixup IO space offset */
941- io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
942- res->start = (res->start + io_offset) & 0xffffffffu;
943- res->end = (res->end + io_offset) & 0xffffffffu;
944-
945- /* Wire up PHB bus resources */
946- pcibios_setup_phb_resources(hose);
947-
948- /* Scan children */
949- hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
950+ hose->last_busno = bus->subordinate;
951 }
952 
953 static int __init pcibios_init(void)
954@@ -1614,8 +1610,6 @@ static int __init pcibios_init(void)
955     list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
956         hose->last_busno = 0xff;
957         pcibios_scan_phb(hose);
958- printk(KERN_INFO "calling pci_bus_add_devices()\n");
959- pci_bus_add_devices(hose->bus);
960         if (next_busno <= hose->last_busno)
961             next_busno = hose->last_busno + 1;
962     }
963--- a/arch/mips/pci/pci.c
964+++ b/arch/mips/pci/pci.c
965@@ -81,6 +81,7 @@ static void __devinit pcibios_scanbus(st
966 {
967     static int next_busno;
968     static int need_domain_info;
969+ LIST_HEAD(resources);
970     struct pci_bus *bus;
971 
972     if (!hose->iommu)
973@@ -89,7 +90,13 @@ static void __devinit pcibios_scanbus(st
974     if (hose->get_busno && pci_probe_only)
975         next_busno = (*hose->get_busno)();
976 
977- bus = pci_scan_bus(next_busno, hose->pci_ops, hose);
978+ pci_add_resource(&resources, hose->mem_resource);
979+ pci_add_resource(&resources, hose->io_resource);
980+ bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
981+ &resources);
982+ if (!bus)
983+ pci_free_resource_list(&resources);
984+
985     hose->bus = bus;
986 
987     need_domain_info = need_domain_info || hose->index;
988@@ -266,15 +273,11 @@ void __devinit pcibios_fixup_bus(struct
989 {
990     /* Propagate hose info into the subordinate devices. */
991 
992- struct pci_controller *hose = bus->sysdata;
993     struct list_head *ln;
994     struct pci_dev *dev = bus->self;
995 
996- if (!dev) {
997- bus->resource[0] = hose->io_resource;
998- bus->resource[1] = hose->mem_resource;
999- } else if (pci_probe_only &&
1000- (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
1001+ if (pci_probe_only && dev &&
1002+ (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
1003         pci_read_bridge_bases(bus);
1004         pcibios_fixup_device_resources(dev, bus);
1005     }
1006--- a/arch/mn10300/unit-asb2305/pci.c
1007+++ b/arch/mn10300/unit-asb2305/pci.c
1008@@ -380,11 +380,6 @@ void __devinit pcibios_fixup_bus(struct
1009 {
1010     struct pci_dev *dev;
1011 
1012- if (bus->number == 0) {
1013- bus->resource[0] = &pci_ioport_resource;
1014- bus->resource[1] = &pci_iomem_resource;
1015- }
1016-
1017     if (bus->self) {
1018         pci_read_bridge_bases(bus);
1019         pcibios_fixup_device_resources(bus->self);
1020@@ -402,6 +397,8 @@ void __devinit pcibios_fixup_bus(struct
1021  */
1022 static int __init pcibios_init(void)
1023 {
1024+ LIST_HEAD(resources);
1025+
1026     ioport_resource.start = 0xA0000000;
1027     ioport_resource.end = 0xDFFFFFFF;
1028     iomem_resource.start = 0xA0000000;
1029@@ -423,7 +420,10 @@ static int __init pcibios_init(void)
1030     printk(KERN_INFO "PCI: Probing PCI hardware [mempage %08x]\n",
1031            MEM_PAGING_REG);
1032 
1033- pci_root_bus = pci_scan_bus(0, &pci_direct_ampci, NULL);
1034+ pci_add_resource(&resources, &pci_ioport_resource);
1035+ pci_add_resource(&resources, &pci_iomem_resource);
1036+ pci_root_bus = pci_scan_root_bus(NULL, 0, &pci_direct_ampci, NULL,
1037+ &resources);
1038 
1039     pcibios_irq_init();
1040     pcibios_fixup_irqs();
1041--- a/arch/powerpc/include/asm/pci-bridge.h
1042+++ b/arch/powerpc/include/asm/pci-bridge.h
1043@@ -222,7 +222,6 @@ extern void pci_process_bridge_OF_ranges
1044 /* Allocate & free a PCI host bridge structure */
1045 extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
1046 extern void pcibios_free_controller(struct pci_controller *phb);
1047-extern void pcibios_setup_phb_resources(struct pci_controller *hose);
1048 
1049 #ifdef CONFIG_PCI
1050 extern int pcibios_vaddr_is_ioport(void __iomem *address);
1051--- a/arch/powerpc/kernel/pci-common.c
1052+++ b/arch/powerpc/kernel/pci-common.c
1053@@ -1555,14 +1555,13 @@ int pcibios_enable_device(struct pci_dev
1054     return pci_enable_resources(dev, mask);
1055 }
1056 
1057-void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)
1058+static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
1059 {
1060- struct pci_bus *bus = hose->bus;
1061     struct resource *res;
1062     int i;
1063 
1064     /* Hookup PHB IO resource */
1065- bus->resource[0] = res = &hose->io_resource;
1066+ res = &hose->io_resource;
1067 
1068     if (!res->flags) {
1069         printk(KERN_WARNING "PCI: I/O resource not set for host"
1070@@ -1580,6 +1579,7 @@ void __devinit pcibios_setup_phb_resourc
1071          (unsigned long long)res->start,
1072          (unsigned long long)res->end,
1073          (unsigned long)res->flags);
1074+ pci_add_resource(resources, res);
1075 
1076     /* Hookup PHB Memory resources */
1077     for (i = 0; i < 3; ++i) {
1078@@ -1597,12 +1597,12 @@ void __devinit pcibios_setup_phb_resourc
1079             res->flags = IORESOURCE_MEM;
1080 #endif /* CONFIG_PPC32 */
1081         }
1082- bus->resource[i+1] = res;
1083 
1084         pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", i,
1085              (unsigned long long)res->start,
1086              (unsigned long long)res->end,
1087              (unsigned long)res->flags);
1088+ pci_add_resource(resources, res);
1089     }
1090 
1091     pr_debug("PCI: PHB MEM offset = %016llx\n",
1092@@ -1696,6 +1696,7 @@ struct device_node *pcibios_get_phb_of_n
1093  */
1094 void __devinit pcibios_scan_phb(struct pci_controller *hose)
1095 {
1096+ LIST_HEAD(resources);
1097     struct pci_bus *bus;
1098     struct device_node *node = hose->dn;
1099     int mode;
1100@@ -1703,22 +1704,24 @@ void __devinit pcibios_scan_phb(struct p
1101     pr_debug("PCI: Scanning PHB %s\n",
1102          node ? node->full_name : "<NO NAME>");
1103 
1104+ /* Get some IO space for the new PHB */
1105+ pcibios_setup_phb_io_space(hose);
1106+
1107+ /* Wire up PHB bus resources */
1108+ pcibios_setup_phb_resources(hose, &resources);
1109+
1110     /* Create an empty bus for the toplevel */
1111- bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose);
1112+ bus = pci_create_root_bus(hose->parent, hose->first_busno,
1113+ hose->ops, hose, &resources);
1114     if (bus == NULL) {
1115         pr_err("Failed to create bus for PCI domain %04x\n",
1116             hose->global_number);
1117+ pci_free_resource_list(&resources);
1118         return;
1119     }
1120     bus->secondary = hose->first_busno;
1121     hose->bus = bus;
1122 
1123- /* Get some IO space for the new PHB */
1124- pcibios_setup_phb_io_space(hose);
1125-
1126- /* Wire up PHB bus resources */
1127- pcibios_setup_phb_resources(hose);
1128-
1129     /* Get probe mode and perform scan */
1130     mode = PCI_PROBE_NORMAL;
1131     if (node && ppc_md.pci_probe_mode)
1132--- a/arch/powerpc/kernel/pci_64.c
1133+++ b/arch/powerpc/kernel/pci_64.c
1134@@ -131,30 +131,13 @@ EXPORT_SYMBOL_GPL(pcibios_unmap_io_space
1135 
1136 #endif /* CONFIG_HOTPLUG */
1137 
1138-int __devinit pcibios_map_io_space(struct pci_bus *bus)
1139+static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)
1140 {
1141     struct vm_struct *area;
1142     unsigned long phys_page;
1143     unsigned long size_page;
1144     unsigned long io_virt_offset;
1145- struct pci_controller *hose;
1146-
1147- WARN_ON(bus == NULL);
1148 
1149- /* If this not a PHB, nothing to do, page tables still exist and
1150- * thus HPTEs will be faulted in when needed
1151- */
1152- if (bus->self) {
1153- pr_debug("IO mapping for PCI-PCI bridge %s\n",
1154- pci_name(bus->self));
1155- pr_debug(" virt=0x%016llx...0x%016llx\n",
1156- bus->resource[0]->start + _IO_BASE,
1157- bus->resource[0]->end + _IO_BASE);
1158- return 0;
1159- }
1160-
1161- /* Get the host bridge */
1162- hose = pci_bus_to_host(bus);
1163     phys_page = _ALIGN_DOWN(hose->io_base_phys, PAGE_SIZE);
1164     size_page = _ALIGN_UP(hose->pci_io_size, PAGE_SIZE);
1165 
1166@@ -198,11 +181,30 @@ int __devinit pcibios_map_io_space(struc
1167 
1168     return 0;
1169 }
1170+
1171+int __devinit pcibios_map_io_space(struct pci_bus *bus)
1172+{
1173+ WARN_ON(bus == NULL);
1174+
1175+ /* If this not a PHB, nothing to do, page tables still exist and
1176+ * thus HPTEs will be faulted in when needed
1177+ */
1178+ if (bus->self) {
1179+ pr_debug("IO mapping for PCI-PCI bridge %s\n",
1180+ pci_name(bus->self));
1181+ pr_debug(" virt=0x%016llx...0x%016llx\n",
1182+ bus->resource[0]->start + _IO_BASE,
1183+ bus->resource[0]->end + _IO_BASE);
1184+ return 0;
1185+ }
1186+
1187+ return pcibios_map_phb_io_space(pci_bus_to_host(bus));
1188+}
1189 EXPORT_SYMBOL_GPL(pcibios_map_io_space);
1190 
1191 void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
1192 {
1193- pcibios_map_io_space(hose->bus);
1194+ pcibios_map_phb_io_space(hose);
1195 }
1196 
1197 #define IOBASE_BRIDGE_NUMBER 0
1198--- a/arch/sh/drivers/pci/pci.c
1199+++ b/arch/sh/drivers/pci/pci.c
1200@@ -36,9 +36,15 @@ static void __devinit pcibios_scanbus(st
1201 {
1202     static int next_busno;
1203     static int need_domain_info;
1204+ LIST_HEAD(resources);
1205+ int i;
1206     struct pci_bus *bus;
1207 
1208- bus = pci_scan_bus(next_busno, hose->pci_ops, hose);
1209+ for (i = 0; i < hose->nr_resources; i++)
1210+ pci_add_resource(&resources, hose->resources + i);
1211+
1212+ bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
1213+ &resources);
1214     hose->bus = bus;
1215 
1216     need_domain_info = need_domain_info || hose->index;
1217@@ -55,6 +61,8 @@ static void __devinit pcibios_scanbus(st
1218         pci_bus_size_bridges(bus);
1219         pci_bus_assign_resources(bus);
1220         pci_enable_bridges(bus);
1221+ } else {
1222+ pci_free_resource_list(&resources);
1223     }
1224 }
1225 
1226@@ -162,16 +170,8 @@ static void pcibios_fixup_device_resourc
1227  */
1228 void __devinit pcibios_fixup_bus(struct pci_bus *bus)
1229 {
1230- struct pci_dev *dev = bus->self;
1231+ struct pci_dev *dev;
1232     struct list_head *ln;
1233- struct pci_channel *hose = bus->sysdata;
1234-
1235- if (!dev) {
1236- int i;
1237-
1238- for (i = 0; i < hose->nr_resources; i++)
1239- bus->resource[i] = hose->resources + i;
1240- }
1241 
1242     for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) {
1243         dev = pci_dev_b(ln);
1244--- a/arch/sparc/kernel/leon_pci.c
1245+++ b/arch/sparc/kernel/leon_pci.c
1246@@ -19,22 +19,22 @@
1247  */
1248 void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)
1249 {
1250+ LIST_HEAD(resources);
1251     struct pci_bus *root_bus;
1252 
1253- root_bus = pci_scan_bus_parented(&ofdev->dev, 0, info->ops, info);
1254- if (root_bus) {
1255- root_bus->resource[0] = &info->io_space;
1256- root_bus->resource[1] = &info->mem_space;
1257- root_bus->resource[2] = NULL;
1258-
1259- /* Init all PCI devices into PCI tree */
1260- pci_bus_add_devices(root_bus);
1261+ pci_add_resource(&resources, &info->io_space);
1262+ pci_add_resource(&resources, &info->mem_space);
1263 
1264+ root_bus = pci_scan_root_bus(&ofdev->dev, 0, info->ops, info,
1265+ &resources);
1266+ if (root_bus) {
1267         /* Setup IRQs of all devices using custom routines */
1268         pci_fixup_irqs(pci_common_swizzle, info->map_irq);
1269 
1270         /* Assign devices with resources */
1271         pci_assign_unassigned_resources();
1272+ } else {
1273+ pci_free_resource_list(&resources);
1274     }
1275 }
1276 
1277@@ -83,15 +83,6 @@ void __devinit pcibios_fixup_bus(struct
1278     int i, has_io, has_mem;
1279     u16 cmd;
1280 
1281- /* Generic PCI bus probing sets these to point at
1282- * &io{port,mem}_resouce which is wrong for us.
1283- */
1284- if (pbus->self == NULL) {
1285- pbus->resource[0] = &info->io_space;
1286- pbus->resource[1] = &info->mem_space;
1287- pbus->resource[2] = NULL;
1288- }
1289-
1290     list_for_each_entry(dev, &pbus->devices, bus_list) {
1291         /*
1292          * We can not rely on that the bootloader has enabled I/O
1293--- a/arch/sparc/kernel/pci.c
1294+++ b/arch/sparc/kernel/pci.c
1295@@ -685,23 +685,25 @@ static void __devinit pci_bus_register_o
1296 struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,
1297                         struct device *parent)
1298 {
1299+ LIST_HEAD(resources);
1300     struct device_node *node = pbm->op->dev.of_node;
1301     struct pci_bus *bus;
1302 
1303     printk("PCI: Scanning PBM %s\n", node->full_name);
1304 
1305- bus = pci_create_bus(parent, pbm->pci_first_busno, pbm->pci_ops, pbm);
1306+ pci_add_resource(&resources, &pbm->io_space);
1307+ pci_add_resource(&resources, &pbm->mem_space);
1308+ bus = pci_create_root_bus(parent, pbm->pci_first_busno, pbm->pci_ops,
1309+ pbm, &resources);
1310     if (!bus) {
1311         printk(KERN_ERR "Failed to create bus for %s\n",
1312                node->full_name);
1313+ pci_free_resource_list(&resources);
1314         return NULL;
1315     }
1316     bus->secondary = pbm->pci_first_busno;
1317     bus->subordinate = pbm->pci_last_busno;
1318 
1319- bus->resource[0] = &pbm->io_space;
1320- bus->resource[1] = &pbm->mem_space;
1321-
1322     pci_of_scan_bus(pbm, node, bus);
1323     pci_bus_add_devices(bus);
1324     pci_bus_register_of_sysfs(bus);
1325@@ -711,13 +713,6 @@ struct pci_bus * __devinit pci_scan_one_
1326 
1327 void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
1328 {
1329- struct pci_pbm_info *pbm = pbus->sysdata;
1330-
1331- /* Generic PCI bus probing sets these to point at
1332- * &io{port,mem}_resouce which is wrong for us.
1333- */
1334- pbus->resource[0] = &pbm->io_space;
1335- pbus->resource[1] = &pbm->mem_space;
1336 }
1337 
1338 void pcibios_update_irq(struct pci_dev *pdev, int irq)
1339--- a/arch/x86/include/asm/topology.h
1340+++ b/arch/x86/include/asm/topology.h
1341@@ -174,7 +174,7 @@ static inline void arch_fix_phys_package
1342 }
1343 
1344 struct pci_bus;
1345-void x86_pci_root_bus_res_quirks(struct pci_bus *b);
1346+void x86_pci_root_bus_resources(int bus, struct list_head *resources);
1347 
1348 #ifdef CONFIG_SMP
1349 #define mc_capable() ((boot_cpu_data.x86_max_cores > 1) && \
1350--- a/arch/x86/pci/acpi.c
1351+++ b/arch/x86/pci/acpi.c
1352@@ -12,7 +12,7 @@ struct pci_root_info {
1353     char *name;
1354     unsigned int res_num;
1355     struct resource *res;
1356- struct pci_bus *bus;
1357+ struct list_head *resources;
1358     int busnum;
1359 };
1360 
1361@@ -275,23 +275,20 @@ static void add_resources(struct pci_roo
1362                  "ignoring host bridge window %pR (conflicts with %s %pR)\n",
1363                  res, conflict->name, conflict);
1364         else
1365- pci_bus_add_resource(info->bus, res, 0);
1366+ pci_add_resource(info->resources, res);
1367     }
1368 }
1369 
1370 static void
1371 get_current_resources(struct acpi_device *device, int busnum,
1372- int domain, struct pci_bus *bus)
1373+ int domain, struct list_head *resources)
1374 {
1375     struct pci_root_info info;
1376     size_t size;
1377 
1378- if (pci_use_crs)
1379- pci_bus_remove_resources(bus);
1380-
1381     info.bridge = device;
1382- info.bus = bus;
1383     info.res_num = 0;
1384+ info.resources = resources;
1385     acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_resource,
1386                 &info);
1387     if (!info.res_num)
1388@@ -300,7 +297,7 @@ get_current_resources(struct acpi_device
1389     size = sizeof(*info.res) * info.res_num;
1390     info.res = kmalloc(size, GFP_KERNEL);
1391     if (!info.res)
1392- goto res_alloc_fail;
1393+ return;
1394 
1395     info.name = kasprintf(GFP_KERNEL, "PCI Bus %04x:%02x", domain, busnum);
1396     if (!info.name)
1397@@ -315,8 +312,6 @@ get_current_resources(struct acpi_device
1398 
1399 name_alloc_fail:
1400     kfree(info.res);
1401-res_alloc_fail:
1402- return;
1403 }
1404 
1405 struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
1406@@ -324,6 +319,7 @@ struct pci_bus * __devinit pci_acpi_scan
1407     struct acpi_device *device = root->device;
1408     int domain = root->segment;
1409     int busnum = root->secondary.start;
1410+ LIST_HEAD(resources);
1411     struct pci_bus *bus;
1412     struct pci_sysdata *sd;
1413     int node;
1414@@ -378,11 +374,15 @@ struct pci_bus * __devinit pci_acpi_scan
1415         memcpy(bus->sysdata, sd, sizeof(*sd));
1416         kfree(sd);
1417     } else {
1418- bus = pci_create_bus(NULL, busnum, &pci_root_ops, sd);
1419- if (bus) {
1420- get_current_resources(device, busnum, domain, bus);
1421+ get_current_resources(device, busnum, domain, &resources);
1422+ if (list_empty(&resources))
1423+ x86_pci_root_bus_resources(busnum, &resources);
1424+ bus = pci_create_root_bus(NULL, busnum, &pci_root_ops, sd,
1425+ &resources);
1426+ if (bus)
1427             bus->subordinate = pci_scan_child_bus(bus);
1428- }
1429+ else
1430+ pci_free_resource_list(&resources);
1431     }
1432 
1433     /* After the PCI-E bus has been walked and all devices discovered,
1434--- a/arch/x86/pci/broadcom_bus.c
1435+++ b/arch/x86/pci/broadcom_bus.c
1436@@ -15,10 +15,11 @@
1437 #include <linux/pci.h>
1438 #include <linux/init.h>
1439 #include <asm/pci_x86.h>
1440+#include <asm/pci-direct.h>
1441 
1442 #include "bus_numa.h"
1443 
1444-static void __devinit cnb20le_res(struct pci_dev *dev)
1445+static void __init cnb20le_res(u8 bus, u8 slot, u8 func)
1446 {
1447     struct pci_root_info *info;
1448     struct resource res;
1449@@ -26,21 +27,12 @@ static void __devinit cnb20le_res(struct
1450     u8 fbus, lbus;
1451     int i;
1452 
1453-#ifdef CONFIG_ACPI
1454- /*
1455- * We should get host bridge information from ACPI unless the BIOS
1456- * doesn't support it.
1457- */
1458- if (acpi_os_get_root_pointer())
1459- return;
1460-#endif
1461-
1462     info = &pci_root_info[pci_root_num];
1463     pci_root_num++;
1464 
1465     /* read the PCI bus numbers */
1466- pci_read_config_byte(dev, 0x44, &fbus);
1467- pci_read_config_byte(dev, 0x45, &lbus);
1468+ fbus = read_pci_config_byte(bus, slot, func, 0x44);
1469+ lbus = read_pci_config_byte(bus, slot, func, 0x45);
1470     info->bus_min = fbus;
1471     info->bus_max = lbus;
1472 
1473@@ -59,8 +51,8 @@ static void __devinit cnb20le_res(struct
1474     }
1475 
1476     /* read the non-prefetchable memory window */
1477- pci_read_config_word(dev, 0xc0, &word1);
1478- pci_read_config_word(dev, 0xc2, &word2);
1479+ word1 = read_pci_config_16(bus, slot, func, 0xc0);
1480+ word2 = read_pci_config_16(bus, slot, func, 0xc2);
1481     if (word1 != word2) {
1482         res.start = (word1 << 16) | 0x0000;
1483         res.end = (word2 << 16) | 0xffff;
1484@@ -69,8 +61,8 @@ static void __devinit cnb20le_res(struct
1485     }
1486 
1487     /* read the prefetchable memory window */
1488- pci_read_config_word(dev, 0xc4, &word1);
1489- pci_read_config_word(dev, 0xc6, &word2);
1490+ word1 = read_pci_config_16(bus, slot, func, 0xc4);
1491+ word2 = read_pci_config_16(bus, slot, func, 0xc6);
1492     if (word1 != word2) {
1493         res.start = (word1 << 16) | 0x0000;
1494         res.end = (word2 << 16) | 0xffff;
1495@@ -79,8 +71,8 @@ static void __devinit cnb20le_res(struct
1496     }
1497 
1498     /* read the IO port window */
1499- pci_read_config_word(dev, 0xd0, &word1);
1500- pci_read_config_word(dev, 0xd2, &word2);
1501+ word1 = read_pci_config_16(bus, slot, func, 0xd0);
1502+ word2 = read_pci_config_16(bus, slot, func, 0xd2);
1503     if (word1 != word2) {
1504         res.start = word1;
1505         res.end = word2;
1506@@ -92,13 +84,37 @@ static void __devinit cnb20le_res(struct
1507     res.start = fbus;
1508     res.end = lbus;
1509     res.flags = IORESOURCE_BUS;
1510- dev_info(&dev->dev, "CNB20LE PCI Host Bridge (domain %04x %pR)\n",
1511- pci_domain_nr(dev->bus), &res);
1512+ printk(KERN_INFO "CNB20LE PCI Host Bridge (domain 0000 %pR)\n", &res);
1513 
1514     for (i = 0; i < info->res_num; i++)
1515- dev_info(&dev->dev, "host bridge window %pR\n", &info->res[i]);
1516+ printk(KERN_INFO "host bridge window %pR\n", &info->res[i]);
1517 }
1518 
1519-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE,
1520- cnb20le_res);
1521+static int __init broadcom_postcore_init(void)
1522+{
1523+ u8 bus = 0, slot = 0;
1524+ u32 id;
1525+ u16 vendor, device;
1526+
1527+#ifdef CONFIG_ACPI
1528+ /*
1529+ * We should get host bridge information from ACPI unless the BIOS
1530+ * doesn't support it.
1531+ */
1532+ if (acpi_os_get_root_pointer())
1533+ return 0;
1534+#endif
1535+
1536+ id = read_pci_config(bus, slot, 0, PCI_VENDOR_ID);
1537+ vendor = id & 0xffff;
1538+ device = (id >> 16) & 0xffff;
1539+
1540+ if (vendor == PCI_VENDOR_ID_SERVERWORKS &&
1541+ device == PCI_DEVICE_ID_SERVERWORKS_LE) {
1542+ cnb20le_res(bus, slot, 0);
1543+ cnb20le_res(bus, slot, 1);
1544+ }
1545+ return 0;
1546+}
1547 
1548+postcore_initcall(broadcom_postcore_init);
1549--- a/arch/x86/pci/bus_numa.c
1550+++ b/arch/x86/pci/bus_numa.c
1551@@ -7,45 +7,50 @@
1552 int pci_root_num;
1553 struct pci_root_info pci_root_info[PCI_ROOT_NR];
1554 
1555-void x86_pci_root_bus_res_quirks(struct pci_bus *b)
1556+void x86_pci_root_bus_resources(int bus, struct list_head *resources)
1557 {
1558     int i;
1559     int j;
1560     struct pci_root_info *info;
1561 
1562- /* don't go for it if _CRS is used already */
1563- if (b->resource[0] != &ioport_resource ||
1564- b->resource[1] != &iomem_resource)
1565- return;
1566-
1567     if (!pci_root_num)
1568- return;
1569+ goto default_resources;
1570 
1571     for (i = 0; i < pci_root_num; i++) {
1572- if (pci_root_info[i].bus_min == b->number)
1573+ if (pci_root_info[i].bus_min == bus)
1574             break;
1575     }
1576 
1577     if (i == pci_root_num)
1578- return;
1579+ goto default_resources;
1580 
1581- printk(KERN_DEBUG "PCI: peer root bus %02x res updated from pci conf\n",
1582- b->number);
1583+ printk(KERN_DEBUG "PCI: root bus %02x: hardware-probed resources\n",
1584+ bus);
1585 
1586- pci_bus_remove_resources(b);
1587     info = &pci_root_info[i];
1588     for (j = 0; j < info->res_num; j++) {
1589         struct resource *res;
1590         struct resource *root;
1591 
1592         res = &info->res[j];
1593- pci_bus_add_resource(b, res, 0);
1594+ pci_add_resource(resources, res);
1595         if (res->flags & IORESOURCE_IO)
1596             root = &ioport_resource;
1597         else
1598             root = &iomem_resource;
1599         insert_resource(root, res);
1600     }
1601+ return;
1602+
1603+default_resources:
1604+ /*
1605+ * We don't have any host bridge aperture information from the
1606+ * "native host bridge drivers," e.g., amd_bus or broadcom_bus,
1607+ * so fall back to the defaults historically used by pci_create_bus().
1608+ */
1609+ printk(KERN_DEBUG "PCI: root bus %02x: using default resources\n", bus);
1610+ pci_add_resource(resources, &ioport_resource);
1611+ pci_add_resource(resources, &iomem_resource);
1612 }
1613 
1614 void __devinit update_res(struct pci_root_info *info, resource_size_t start,
1615--- a/arch/x86/pci/common.c
1616+++ b/arch/x86/pci/common.c
1617@@ -164,9 +164,6 @@ void __devinit pcibios_fixup_bus(struct
1618 {
1619     struct pci_dev *dev;
1620 
1621- /* root bus? */
1622- if (!b->parent)
1623- x86_pci_root_bus_res_quirks(b);
1624     pci_read_bridge_bases(b);
1625     list_for_each_entry(dev, &b->devices, bus_list)
1626         pcibios_fixup_device_resources(dev);
1627@@ -433,6 +430,7 @@ void __init dmi_check_pciprobe(void)
1628 
1629 struct pci_bus * __devinit pcibios_scan_root(int busnum)
1630 {
1631+ LIST_HEAD(resources);
1632     struct pci_bus *bus = NULL;
1633     struct pci_sysdata *sd;
1634 
1635@@ -456,9 +454,12 @@ struct pci_bus * __devinit pcibios_scan_
1636     sd->node = get_mp_bus_to_node(busnum);
1637 
1638     printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
1639- bus = pci_scan_bus_parented(NULL, busnum, &pci_root_ops, sd);
1640- if (!bus)
1641+ x86_pci_root_bus_resources(busnum, &resources);
1642+ bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources);
1643+ if (!bus) {
1644+ pci_free_resource_list(&resources);
1645         kfree(sd);
1646+ }
1647 
1648     return bus;
1649 }
1650@@ -639,6 +640,7 @@ int pci_ext_cfg_avail(struct pci_dev *de
1651 
1652 struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)
1653 {
1654+ LIST_HEAD(resources);
1655     struct pci_bus *bus = NULL;
1656     struct pci_sysdata *sd;
1657 
1658@@ -653,9 +655,12 @@ struct pci_bus * __devinit pci_scan_bus_
1659         return NULL;
1660     }
1661     sd->node = node;
1662- bus = pci_scan_bus(busno, ops, sd);
1663- if (!bus)
1664+ x86_pci_root_bus_resources(busno, &resources);
1665+ bus = pci_scan_root_bus(NULL, busno, ops, sd, &resources);
1666+ if (!bus) {
1667+ pci_free_resource_list(&resources);
1668         kfree(sd);
1669+ }
1670 
1671     return bus;
1672 }
1673--- a/arch/x86/pci/legacy.c
1674+++ b/arch/x86/pci/legacy.c
1675@@ -31,9 +31,6 @@ int __init pci_legacy_init(void)
1676 
1677     printk("PCI: Probing PCI hardware\n");
1678     pci_root_bus = pcibios_scan_root(0);
1679- if (pci_root_bus)
1680- pci_bus_add_devices(pci_root_bus);
1681-
1682     return 0;
1683 }
1684 
1685--- a/arch/x86/pci/numaq_32.c
1686+++ b/arch/x86/pci/numaq_32.c
1687@@ -153,8 +153,6 @@ int __init pci_numaq_init(void)
1688     raw_pci_ops = &pci_direct_conf1_mq;
1689 
1690     pci_root_bus = pcibios_scan_root(0);
1691- if (pci_root_bus)
1692- pci_bus_add_devices(pci_root_bus);
1693     if (num_online_nodes() > 1)
1694         for_each_online_node(quad) {
1695             if (quad == 0)
1696--- a/arch/xtensa/kernel/pci.c
1697+++ b/arch/xtensa/kernel/pci.c
1698@@ -134,9 +134,46 @@ struct pci_controller * __init pcibios_a
1699     return pci_ctrl;
1700 }
1701 
1702+static void __init pci_controller_apertures(struct pci_controller *pci_ctrl,
1703+ struct list_head *resources)
1704+{
1705+ struct resource *res;
1706+ unsigned long io_offset;
1707+ int i;
1708+
1709+ io_offset = (unsigned long)pci_ctrl->io_space.base;
1710+ res = &pci_ctrl->io_resource;
1711+ if (!res->flags) {
1712+ if (io_offset)
1713+ printk (KERN_ERR "I/O resource not set for host"
1714+ " bridge %d\n", pci_ctrl->index);
1715+ res->start = 0;
1716+ res->end = IO_SPACE_LIMIT;
1717+ res->flags = IORESOURCE_IO;
1718+ }
1719+ res->start += io_offset;
1720+ res->end += io_offset;
1721+ pci_add_resource(resources, res);
1722+
1723+ for (i = 0; i < 3; i++) {
1724+ res = &pci_ctrl->mem_resources[i];
1725+ if (!res->flags) {
1726+ if (i > 0)
1727+ continue;
1728+ printk(KERN_ERR "Memory resource not set for "
1729+ "host bridge %d\n", pci_ctrl->index);
1730+ res->start = 0;
1731+ res->end = ~0U;
1732+ res->flags = IORESOURCE_MEM;
1733+ }
1734+ pci_add_resource(resources, res);
1735+ }
1736+}
1737+
1738 static int __init pcibios_init(void)
1739 {
1740     struct pci_controller *pci_ctrl;
1741+ struct list_head resources;
1742     struct pci_bus *bus;
1743     int next_busno = 0, i;
1744 
1745@@ -145,19 +182,10 @@ static int __init pcibios_init(void)
1746     /* Scan all of the recorded PCI controllers. */
1747     for (pci_ctrl = pci_ctrl_head; pci_ctrl; pci_ctrl = pci_ctrl->next) {
1748         pci_ctrl->last_busno = 0xff;
1749- bus = pci_scan_bus(pci_ctrl->first_busno, pci_ctrl->ops,
1750- pci_ctrl);
1751- if (pci_ctrl->io_resource.flags) {
1752- unsigned long offs;
1753-
1754- offs = (unsigned long)pci_ctrl->io_space.base;
1755- pci_ctrl->io_resource.start += offs;
1756- pci_ctrl->io_resource.end += offs;
1757- bus->resource[0] = &pci_ctrl->io_resource;
1758- }
1759- for (i = 0; i < 3; ++i)
1760- if (pci_ctrl->mem_resources[i].flags)
1761- bus->resource[i+1] =&pci_ctrl->mem_resources[i];
1762+ INIT_LIST_HEAD(&resources);
1763+ pci_controller_apertures(pci_ctrl, &resources);
1764+ bus = pci_scan_root_bus(NULL, pci_ctrl->first_busno,
1765+ pci_ctrl->ops, pci_ctrl, &resources);
1766         pci_ctrl->bus = bus;
1767         pci_ctrl->last_busno = bus->subordinate;
1768         if (next_busno <= pci_ctrl->last_busno)
1769@@ -178,36 +206,7 @@ void __init pcibios_fixup_bus(struct pci
1770     int i;
1771 
1772     io_offset = (unsigned long)pci_ctrl->io_space.base;
1773- if (bus->parent == NULL) {
1774- /* this is a host bridge - fill in its resources */
1775- pci_ctrl->bus = bus;
1776-
1777- bus->resource[0] = res = &pci_ctrl->io_resource;
1778- if (!res->flags) {
1779- if (io_offset)
1780- printk (KERN_ERR "I/O resource not set for host"
1781- " bridge %d\n", pci_ctrl->index);
1782- res->start = 0;
1783- res->end = IO_SPACE_LIMIT;
1784- res->flags = IORESOURCE_IO;
1785- }
1786- res->start += io_offset;
1787- res->end += io_offset;
1788-
1789- for (i = 0; i < 3; i++) {
1790- res = &pci_ctrl->mem_resources[i];
1791- if (!res->flags) {
1792- if (i > 0)
1793- continue;
1794- printk(KERN_ERR "Memory resource not set for "
1795- "host bridge %d\n", pci_ctrl->index);
1796- res->start = 0;
1797- res->end = ~0U;
1798- res->flags = IORESOURCE_MEM;
1799- }
1800- bus->resource[i+1] = res;
1801- }
1802- } else {
1803+ if (bus->parent) {
1804         /* This is a subordinate bridge */
1805         pci_read_bridge_bases(bus);
1806 
1807--- a/drivers/parisc/dino.c
1808+++ b/drivers/parisc/dino.c
1809@@ -562,19 +562,6 @@ dino_fixup_bus(struct pci_bus *bus)
1810     /* Firmware doesn't set up card-mode dino, so we have to */
1811     if (is_card_dino(&dino_dev->hba.dev->id)) {
1812         dino_card_setup(bus, dino_dev->hba.base_addr);
1813- } else if(bus->parent == NULL) {
1814- /* must have a dino above it, reparent the resources
1815- * into the dino window */
1816- int i;
1817- struct resource *res = &dino_dev->hba.lmmio_space;
1818-
1819- bus->resource[0] = &(dino_dev->hba.io_space);
1820- for(i = 0; i < DINO_MAX_LMMIO_RESOURCES; i++) {
1821- if(res[i].flags == 0)
1822- break;
1823- bus->resource[i+1] = &res[i];
1824- }
1825-
1826     } else if (bus->parent) {
1827         int i;
1828 
1829@@ -927,6 +914,7 @@ static int __init dino_probe(struct pari
1830     const char *version = "unknown";
1831     char *name;
1832     int is_cujo = 0;
1833+ LIST_HEAD(resources);
1834     struct pci_bus *bus;
1835     unsigned long hpa = dev->hpa.start;
1836 
1837@@ -1003,26 +991,37 @@ static int __init dino_probe(struct pari
1838 
1839     dev->dev.platform_data = dino_dev;
1840 
1841+ pci_add_resource(&resources, &dino_dev->hba.io_space);
1842+ if (dino_dev->hba.lmmio_space.flags)
1843+ pci_add_resource(&resources, &dino_dev->hba.lmmio_space);
1844+ if (dino_dev->hba.elmmio_space.flags)
1845+ pci_add_resource(&resources, &dino_dev->hba.elmmio_space);
1846+ if (dino_dev->hba.gmmio_space.flags)
1847+ pci_add_resource(&resources, &dino_dev->hba.gmmio_space);
1848+
1849     /*
1850     ** It's not used to avoid chicken/egg problems
1851     ** with configuration accessor functions.
1852     */
1853- dino_dev->hba.hba_bus = bus = pci_scan_bus_parented(&dev->dev,
1854- dino_current_bus, &dino_cfg_ops, NULL);
1855-
1856- if(bus) {
1857- /* This code *depends* on scanning being single threaded
1858- * if it isn't, this global bus number count will fail
1859- */
1860- dino_current_bus = bus->subordinate + 1;
1861- pci_bus_assign_resources(bus);
1862- pci_bus_add_devices(bus);
1863- } else {
1864+ dino_dev->hba.hba_bus = bus = pci_create_root_bus(&dev->dev,
1865+ dino_current_bus, &dino_cfg_ops, NULL, &resources);
1866+ if (!bus) {
1867         printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (duplicate bus number %d?)\n",
1868                dev_name(&dev->dev), dino_current_bus);
1869+ pci_free_resource_list(&resources);
1870         /* increment the bus number in case of duplicates */
1871         dino_current_bus++;
1872+ return 0;
1873     }
1874+
1875+ bus->subordinate = pci_scan_child_bus(bus);
1876+
1877+ /* This code *depends* on scanning being single threaded
1878+ * if it isn't, this global bus number count will fail
1879+ */
1880+ dino_current_bus = bus->subordinate + 1;
1881+ pci_bus_assign_resources(bus);
1882+ pci_bus_add_devices(bus);
1883     return 0;
1884 }
1885 
1886--- a/drivers/parisc/lba_pci.c
1887+++ b/drivers/parisc/lba_pci.c
1888@@ -653,7 +653,7 @@ lba_fixup_bus(struct pci_bus *bus)
1889         }
1890     } else {
1891         /* Host-PCI Bridge */
1892- int err, i;
1893+ int err;
1894 
1895         DBG("lba_fixup_bus() %s [%lx/%lx]/%lx\n",
1896             ldev->hba.io_space.name,
1897@@ -669,9 +669,6 @@ lba_fixup_bus(struct pci_bus *bus)
1898             lba_dump_res(&ioport_resource, 2);
1899             BUG();
1900         }
1901- /* advertize Host bridge resources to PCI bus */
1902- bus->resource[0] = &(ldev->hba.io_space);
1903- i = 1;
1904 
1905         if (ldev->hba.elmmio_space.start) {
1906             err = request_resource(&iomem_resource,
1907@@ -685,35 +682,17 @@ lba_fixup_bus(struct pci_bus *bus)
1908 
1909                 /* lba_dump_res(&iomem_resource, 2); */
1910                 /* BUG(); */
1911- } else
1912- bus->resource[i++] = &(ldev->hba.elmmio_space);
1913+ }
1914         }
1915 
1916-
1917- /* Overlaps with elmmio can (and should) fail here.
1918- * We will prune (or ignore) the distributed range.
1919- *
1920- * FIXME: SBA code should register all elmmio ranges first.
1921- * that would take care of elmmio ranges routed
1922- * to a different rope (already discovered) from
1923- * getting registered *after* LBA code has already
1924- * registered it's distributed lmmio range.
1925- */
1926- if (truncate_pat_collision(&iomem_resource,
1927- &(ldev->hba.lmmio_space))) {
1928-
1929- printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n",
1930- (long)ldev->hba.lmmio_space.start,
1931- (long)ldev->hba.lmmio_space.end);
1932- } else {
1933+ if (ldev->hba.lmmio_space.flags) {
1934             err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space));
1935             if (err < 0) {
1936                 printk(KERN_ERR "FAILED: lba_fixup_bus() request for "
1937                     "lmmio_space [%lx/%lx]\n",
1938                     (long)ldev->hba.lmmio_space.start,
1939                     (long)ldev->hba.lmmio_space.end);
1940- } else
1941- bus->resource[i++] = &(ldev->hba.lmmio_space);
1942+ }
1943         }
1944 
1945 #ifdef CONFIG_64BIT
1946@@ -728,7 +707,6 @@ lba_fixup_bus(struct pci_bus *bus)
1947                 lba_dump_res(&iomem_resource, 2);
1948                 BUG();
1949             }
1950- bus->resource[i++] = &(ldev->hba.gmmio_space);
1951         }
1952 #endif
1953 
1954@@ -1404,6 +1382,7 @@ static int __init
1955 lba_driver_probe(struct parisc_device *dev)
1956 {
1957     struct lba_device *lba_dev;
1958+ LIST_HEAD(resources);
1959     struct pci_bus *lba_bus;
1960     struct pci_ops *cfg_ops;
1961     u32 func_class;
1962@@ -1518,10 +1497,41 @@ lba_driver_probe(struct parisc_device *d
1963     if (lba_dev->hba.bus_num.start < lba_next_bus)
1964         lba_dev->hba.bus_num.start = lba_next_bus;
1965 
1966+ /* Overlaps with elmmio can (and should) fail here.
1967+ * We will prune (or ignore) the distributed range.
1968+ *
1969+ * FIXME: SBA code should register all elmmio ranges first.
1970+ * that would take care of elmmio ranges routed
1971+ * to a different rope (already discovered) from
1972+ * getting registered *after* LBA code has already
1973+ * registered it's distributed lmmio range.
1974+ */
1975+ if (truncate_pat_collision(&iomem_resource,
1976+ &(lba_dev->hba.lmmio_space))) {
1977+ printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n",
1978+ (long)lba_dev->hba.lmmio_space.start,
1979+ (long)lba_dev->hba.lmmio_space.end);
1980+ lba_dev->hba.lmmio_space.flags = 0;
1981+ }
1982+
1983+ pci_add_resource(&resources, &lba_dev->hba.io_space);
1984+ if (lba_dev->hba.elmmio_space.start)
1985+ pci_add_resource(&resources, &lba_dev->hba.elmmio_space);
1986+ if (lba_dev->hba.lmmio_space.flags)
1987+ pci_add_resource(&resources, &lba_dev->hba.lmmio_space);
1988+ if (lba_dev->hba.gmmio_space.flags)
1989+ pci_add_resource(&resources, &lba_dev->hba.gmmio_space);
1990+
1991     dev->dev.platform_data = lba_dev;
1992     lba_bus = lba_dev->hba.hba_bus =
1993- pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
1994- cfg_ops, NULL);
1995+ pci_create_root_bus(&dev->dev, lba_dev->hba.bus_num.start,
1996+ cfg_ops, NULL, &resources);
1997+ if (!lba_bus) {
1998+ pci_free_resource_list(&resources);
1999+ return 0;
2000+ }
2001+
2002+ lba_bus->subordinate = pci_scan_child_bus(lba_bus);
2003 
2004     /* This is in lieu of calling pci_assign_unassigned_resources() */
2005     if (is_pdc_pat()) {
2006@@ -1551,10 +1561,8 @@ lba_driver_probe(struct parisc_device *d
2007         lba_dev->flags |= LBA_FLAG_SKIP_PROBE;
2008     }
2009 
2010- if (lba_bus) {
2011- lba_next_bus = lba_bus->subordinate + 1;
2012- pci_bus_add_devices(lba_bus);
2013- }
2014+ lba_next_bus = lba_bus->subordinate + 1;
2015+ pci_bus_add_devices(lba_bus);
2016 
2017     /* Whew! Finally done! Tell services we got this one covered. */
2018     return 0;
2019--- a/drivers/pci/bus.c
2020+++ b/drivers/pci/bus.c
2021@@ -18,6 +18,32 @@
2022 
2023 #include "pci.h"
2024 
2025+void pci_add_resource(struct list_head *resources, struct resource *res)
2026+{
2027+ struct pci_bus_resource *bus_res;
2028+
2029+ bus_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL);
2030+ if (!bus_res) {
2031+ printk(KERN_ERR "PCI: can't add bus resource %pR\n", res);
2032+ return;
2033+ }
2034+
2035+ bus_res->res = res;
2036+ list_add_tail(&bus_res->list, resources);
2037+}
2038+EXPORT_SYMBOL(pci_add_resource);
2039+
2040+void pci_free_resource_list(struct list_head *resources)
2041+{
2042+ struct pci_bus_resource *bus_res, *tmp;
2043+
2044+ list_for_each_entry_safe(bus_res, tmp, resources, list) {
2045+ list_del(&bus_res->list);
2046+ kfree(bus_res);
2047+ }
2048+}
2049+EXPORT_SYMBOL(pci_free_resource_list);
2050+
2051 void pci_bus_add_resource(struct pci_bus *bus, struct resource *res,
2052               unsigned int flags)
2053 {
2054@@ -52,16 +78,12 @@ EXPORT_SYMBOL_GPL(pci_bus_resource_n);
2055 
2056 void pci_bus_remove_resources(struct pci_bus *bus)
2057 {
2058- struct pci_bus_resource *bus_res, *tmp;
2059     int i;
2060 
2061     for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
2062         bus->resource[i] = NULL;
2063 
2064- list_for_each_entry_safe(bus_res, tmp, &bus->resources, list) {
2065- list_del(&bus_res->list);
2066- kfree(bus_res);
2067- }
2068+ pci_free_resource_list(&bus->resources);
2069 }
2070 
2071 /**
2072--- a/drivers/pci/probe.c
2073+++ b/drivers/pci/probe.c
2074@@ -1527,12 +1527,14 @@ unsigned int __devinit pci_scan_child_bu
2075     return max;
2076 }
2077 
2078-struct pci_bus * pci_create_bus(struct device *parent,
2079- int bus, struct pci_ops *ops, void *sysdata)
2080+struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
2081+ struct pci_ops *ops, void *sysdata, struct list_head *resources)
2082 {
2083- int error;
2084+ int error, i;
2085     struct pci_bus *b, *b2;
2086     struct device *dev;
2087+ struct pci_bus_resource *bus_res, *n;
2088+ struct resource *res;
2089 
2090     b = pci_alloc_bus();
2091     if (!b)
2092@@ -1582,8 +1584,20 @@ struct pci_bus * pci_create_bus(struct d
2093     pci_create_legacy_files(b);
2094 
2095     b->number = b->secondary = bus;
2096- b->resource[0] = &ioport_resource;
2097- b->resource[1] = &iomem_resource;
2098+
2099+ /* Add initial resources to the bus */
2100+ list_for_each_entry_safe(bus_res, n, resources, list)
2101+ list_move_tail(&bus_res->list, &b->resources);
2102+
2103+ if (parent)
2104+ dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev));
2105+ else
2106+ printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
2107+
2108+ pci_bus_for_each_resource(b, res, i) {
2109+ if (res)
2110+ dev_info(&b->dev, "root bus resource %pR\n", res);
2111+ }
2112 
2113     return b;
2114 
2115@@ -1599,18 +1613,58 @@ err_out:
2116     return NULL;
2117 }
2118 
2119+struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
2120+ struct pci_ops *ops, void *sysdata, struct list_head *resources)
2121+{
2122+ struct pci_bus *b;
2123+
2124+ b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
2125+ if (!b)
2126+ return NULL;
2127+
2128+ b->subordinate = pci_scan_child_bus(b);
2129+ pci_bus_add_devices(b);
2130+ return b;
2131+}
2132+EXPORT_SYMBOL(pci_scan_root_bus);
2133+
2134+/* Deprecated; use pci_scan_root_bus() instead */
2135 struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent,
2136         int bus, struct pci_ops *ops, void *sysdata)
2137 {
2138+ LIST_HEAD(resources);
2139     struct pci_bus *b;
2140 
2141- b = pci_create_bus(parent, bus, ops, sysdata);
2142+ pci_add_resource(&resources, &ioport_resource);
2143+ pci_add_resource(&resources, &iomem_resource);
2144+ b = pci_create_root_bus(parent, bus, ops, sysdata, &resources);
2145     if (b)
2146         b->subordinate = pci_scan_child_bus(b);
2147+ else
2148+ pci_free_resource_list(&resources);
2149     return b;
2150 }
2151 EXPORT_SYMBOL(pci_scan_bus_parented);
2152 
2153+struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops,
2154+ void *sysdata)
2155+{
2156+ LIST_HEAD(resources);
2157+ struct pci_bus *b;
2158+
2159+ pci_add_resource(&resources, &ioport_resource);
2160+ pci_add_resource(&resources, &iomem_resource);
2161+ b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources);
2162+ if (b) {
2163+ b->subordinate = pci_scan_child_bus(b);
2164+ pci_bus_add_devices(b);
2165+ } else {
2166+ pci_free_resource_list(&resources);
2167+ }
2168+ return b;
2169+}
2170+EXPORT_SYMBOL(pci_scan_bus);
2171+
2172 #ifdef CONFIG_HOTPLUG
2173 /**
2174  * pci_rescan_bus - scan a PCI bus for devices.
2175--- a/include/linux/pci.h
2176+++ b/include/linux/pci.h
2177@@ -660,17 +660,13 @@ extern struct pci_bus *pci_find_bus(int
2178 void pci_bus_add_devices(const struct pci_bus *bus);
2179 struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
2180                       struct pci_ops *ops, void *sysdata);
2181-static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops,
2182- void *sysdata)
2183-{
2184- struct pci_bus *root_bus;
2185- root_bus = pci_scan_bus_parented(NULL, bus, ops, sysdata);
2186- if (root_bus)
2187- pci_bus_add_devices(root_bus);
2188- return root_bus;
2189-}
2190-struct pci_bus *pci_create_bus(struct device *parent, int bus,
2191- struct pci_ops *ops, void *sysdata);
2192+struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
2193+struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
2194+ struct pci_ops *ops, void *sysdata,
2195+ struct list_head *resources);
2196+struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
2197+ struct pci_ops *ops, void *sysdata,
2198+ struct list_head *resources);
2199 struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
2200                 int busnr);
2201 void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
2202@@ -910,6 +906,8 @@ int pci_request_selected_regions_exclusi
2203 void pci_release_selected_regions(struct pci_dev *, int);
2204 
2205 /* drivers/pci/bus.c */
2206+void pci_add_resource(struct list_head *resources, struct resource *res);
2207+void pci_free_resource_list(struct list_head *resources);
2208 void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags);
2209 struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n);
2210 void pci_bus_remove_resources(struct pci_bus *bus);
2211

Archive Download this file



interactive