diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-02-24 17:25:33 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-02-24 17:25:33 -0500 |
commit | ecd58d667a6ac4350d2f67b9accaadf575bae4b0 (patch) | |
tree | 5209771a0a1f61820171e444d3e4a580ecf3955f | |
parent | b07f2ebc109b607789f648dedcff4b125f9afec6 (diff) | |
parent | fb127cb9de791d62fb393d6e65fa9869bddd2460 (diff) |
Merge branch 'pci-next+probe_only+bus2res-fb127cb' of git://github.com/bjorn-helgaas/linux into linux-next
72 files changed, 397 insertions, 1120 deletions
diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h index 28d0497fd3c7..d01afb78919c 100644 --- a/arch/alpha/include/asm/pci.h +++ b/arch/alpha/include/asm/pci.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/dma-mapping.h> | 7 | #include <linux/dma-mapping.h> |
8 | #include <asm/scatterlist.h> | 8 | #include <asm/scatterlist.h> |
9 | #include <asm/machvec.h> | 9 | #include <asm/machvec.h> |
10 | #include <asm-generic/pci-bridge.h> | ||
10 | 11 | ||
11 | /* | 12 | /* |
12 | * The following structure is used to manage multiple PCI busses. | 13 | * The following structure is used to manage multiple PCI busses. |
@@ -99,12 +100,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | |||
99 | return channel ? 15 : 14; | 100 | return channel ? 15 : 14; |
100 | } | 101 | } |
101 | 102 | ||
102 | extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *, | ||
103 | struct resource *); | ||
104 | |||
105 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
106 | struct pci_bus_region *region); | ||
107 | |||
108 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index | 103 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index |
109 | 104 | ||
110 | static inline int pci_proc_domain(struct pci_bus *bus) | 105 | static inline int pci_proc_domain(struct pci_bus *bus) |
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 8c723c1b086a..1a629636cc16 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -43,12 +43,10 @@ const char *const pci_mem_names[] = { | |||
43 | 43 | ||
44 | const char pci_hae0_name[] = "HAE0"; | 44 | const char pci_hae0_name[] = "HAE0"; |
45 | 45 | ||
46 | /* Indicate whether we respect the PCI setup left by console. */ | ||
47 | /* | 46 | /* |
48 | * Make this long-lived so that we know when shutting down | 47 | * If PCI_PROBE_ONLY in pci_flags is set, we don't change any PCI resource |
49 | * whether we probed only or not. | 48 | * assignments. |
50 | */ | 49 | */ |
51 | int pci_probe_only; | ||
52 | 50 | ||
53 | /* | 51 | /* |
54 | * The PCI controller list. | 52 | * The PCI controller list. |
@@ -215,7 +213,7 @@ pdev_save_srm_config(struct pci_dev *dev) | |||
215 | struct pdev_srm_saved_conf *tmp; | 213 | struct pdev_srm_saved_conf *tmp; |
216 | static int printed = 0; | 214 | static int printed = 0; |
217 | 215 | ||
218 | if (!alpha_using_srm || pci_probe_only) | 216 | if (!alpha_using_srm || pci_has_flag(PCI_PROBE_ONLY)) |
219 | return; | 217 | return; |
220 | 218 | ||
221 | if (!printed) { | 219 | if (!printed) { |
@@ -242,7 +240,7 @@ pci_restore_srm_config(void) | |||
242 | struct pdev_srm_saved_conf *tmp; | 240 | struct pdev_srm_saved_conf *tmp; |
243 | 241 | ||
244 | /* No need to restore if probed only. */ | 242 | /* No need to restore if probed only. */ |
245 | if (pci_probe_only) | 243 | if (pci_has_flag(PCI_PROBE_ONLY)) |
246 | return; | 244 | return; |
247 | 245 | ||
248 | /* Restore SRM config. */ | 246 | /* Restore SRM config. */ |
@@ -253,46 +251,17 @@ pci_restore_srm_config(void) | |||
253 | #endif | 251 | #endif |
254 | 252 | ||
255 | void __devinit | 253 | void __devinit |
256 | pcibios_fixup_resource(struct resource *res, struct resource *root) | ||
257 | { | ||
258 | res->start += root->start; | ||
259 | res->end += root->start; | ||
260 | } | ||
261 | |||
262 | void __devinit | ||
263 | pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus) | ||
264 | { | ||
265 | /* Update device resources. */ | ||
266 | struct pci_controller *hose = (struct pci_controller *)bus->sysdata; | ||
267 | int i; | ||
268 | |||
269 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
270 | if (!dev->resource[i].start) | ||
271 | continue; | ||
272 | if (dev->resource[i].flags & IORESOURCE_IO) | ||
273 | pcibios_fixup_resource(&dev->resource[i], | ||
274 | hose->io_space); | ||
275 | else if (dev->resource[i].flags & IORESOURCE_MEM) | ||
276 | pcibios_fixup_resource(&dev->resource[i], | ||
277 | hose->mem_space); | ||
278 | } | ||
279 | } | ||
280 | |||
281 | void __devinit | ||
282 | pcibios_fixup_bus(struct pci_bus *bus) | 254 | pcibios_fixup_bus(struct pci_bus *bus) |
283 | { | 255 | { |
284 | struct pci_dev *dev = bus->self; | 256 | struct pci_dev *dev = bus->self; |
285 | 257 | ||
286 | if (pci_probe_only && dev && | 258 | if (pci_has_flag(PCI_PROBE_ONLY) && dev && |
287 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { | 259 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { |
288 | pci_read_bridge_bases(bus); | 260 | pci_read_bridge_bases(bus); |
289 | pcibios_fixup_device_resources(dev, bus); | ||
290 | } | 261 | } |
291 | 262 | ||
292 | list_for_each_entry(dev, &bus->devices, bus_list) { | 263 | list_for_each_entry(dev, &bus->devices, bus_list) { |
293 | pdev_save_srm_config(dev); | 264 | pdev_save_srm_config(dev); |
294 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
295 | pcibios_fixup_device_resources(dev, bus); | ||
296 | } | 265 | } |
297 | } | 266 | } |
298 | 267 | ||
@@ -302,42 +271,6 @@ pcibios_update_irq(struct pci_dev *dev, int irq) | |||
302 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 271 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
303 | } | 272 | } |
304 | 273 | ||
305 | void | ||
306 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
307 | struct resource *res) | ||
308 | { | ||
309 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
310 | unsigned long offset = 0; | ||
311 | |||
312 | if (res->flags & IORESOURCE_IO) | ||
313 | offset = hose->io_space->start; | ||
314 | else if (res->flags & IORESOURCE_MEM) | ||
315 | offset = hose->mem_space->start; | ||
316 | |||
317 | region->start = res->start - offset; | ||
318 | region->end = res->end - offset; | ||
319 | } | ||
320 | |||
321 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
322 | struct pci_bus_region *region) | ||
323 | { | ||
324 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
325 | unsigned long offset = 0; | ||
326 | |||
327 | if (res->flags & IORESOURCE_IO) | ||
328 | offset = hose->io_space->start; | ||
329 | else if (res->flags & IORESOURCE_MEM) | ||
330 | offset = hose->mem_space->start; | ||
331 | |||
332 | res->start = region->start + offset; | ||
333 | res->end = region->end + offset; | ||
334 | } | ||
335 | |||
336 | #ifdef CONFIG_HOTPLUG | ||
337 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
338 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
339 | #endif | ||
340 | |||
341 | int | 274 | int |
342 | pcibios_enable_device(struct pci_dev *dev, int mask) | 275 | pcibios_enable_device(struct pci_dev *dev, int mask) |
343 | { | 276 | { |
@@ -374,7 +307,8 @@ pcibios_claim_one_bus(struct pci_bus *b) | |||
374 | 307 | ||
375 | if (r->parent || !r->start || !r->flags) | 308 | if (r->parent || !r->start || !r->flags) |
376 | continue; | 309 | continue; |
377 | if (pci_probe_only || (r->flags & IORESOURCE_PCI_FIXED)) | 310 | if (pci_has_flag(PCI_PROBE_ONLY) || |
311 | (r->flags & IORESOURCE_PCI_FIXED)) | ||
378 | pci_claim_resource(dev, i); | 312 | pci_claim_resource(dev, i); |
379 | } | 313 | } |
380 | } | 314 | } |
@@ -416,8 +350,10 @@ common_init_pci(void) | |||
416 | hose->mem_space->end = end; | 350 | hose->mem_space->end = end; |
417 | 351 | ||
418 | INIT_LIST_HEAD(&resources); | 352 | INIT_LIST_HEAD(&resources); |
419 | pci_add_resource(&resources, hose->io_space); | 353 | pci_add_resource_offset(&resources, hose->io_space, |
420 | pci_add_resource(&resources, hose->mem_space); | 354 | hose->io_space->start); |
355 | pci_add_resource_offset(&resources, hose->mem_space, | ||
356 | hose->mem_space->start); | ||
421 | 357 | ||
422 | bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops, | 358 | bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops, |
423 | hose, &resources); | 359 | hose, &resources); |
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index 85457b2d4516..2b0ac429f5eb 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h | |||
@@ -173,9 +173,6 @@ extern void pci_restore_srm_config(void); | |||
173 | extern struct pci_controller *hose_head, **hose_tail; | 173 | extern struct pci_controller *hose_head, **hose_tail; |
174 | extern struct pci_controller *pci_isa_hose; | 174 | extern struct pci_controller *pci_isa_hose; |
175 | 175 | ||
176 | /* Indicate that we trust the console to configure things properly. */ | ||
177 | extern int pci_probe_only; | ||
178 | |||
179 | extern unsigned long alpha_agpgart_size; | 176 | extern unsigned long alpha_agpgart_size; |
180 | 177 | ||
181 | extern void common_init_pci(void); | 178 | extern void common_init_pci(void); |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 95cfc83ece8f..fc8b12508611 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -384,7 +384,8 @@ marvel_init_pci(void) | |||
384 | 384 | ||
385 | marvel_register_error_handlers(); | 385 | marvel_register_error_handlers(); |
386 | 386 | ||
387 | pci_probe_only = 1; | 387 | /* Indicate that we trust the console to configure things properly */ |
388 | pci_set_flags(PCI_PROBE_ONLY); | ||
388 | common_init_pci(); | 389 | common_init_pci(); |
389 | locate_and_init_vga(NULL); | 390 | locate_and_init_vga(NULL); |
390 | 391 | ||
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index f47b30a2a117..b8eafa053539 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -331,7 +331,8 @@ titan_init_pci(void) | |||
331 | */ | 331 | */ |
332 | titan_late_init(); | 332 | titan_late_init(); |
333 | 333 | ||
334 | pci_probe_only = 1; | 334 | /* Indicate that we trust the console to configure things properly */ |
335 | pci_set_flags(PCI_PROBE_ONLY); | ||
335 | common_init_pci(); | 336 | common_init_pci(); |
336 | SMC669_Init(0); | 337 | SMC669_Init(0); |
337 | locate_and_init_vga(NULL); | 338 | locate_and_init_vga(NULL); |
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index d1bcd7b13ebc..9384c2d02baa 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
@@ -299,8 +299,8 @@ int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) | |||
299 | goto err1; | 299 | goto err1; |
300 | } | 300 | } |
301 | 301 | ||
302 | pci_add_resource(&sys->resources, &it8152_io); | 302 | pci_add_resource_offset(&sys->resources, &it8152_io, sys->io_offset); |
303 | pci_add_resource(&sys->resources, &it8152_mem); | 303 | pci_add_resource_offset(&sys->resources, &it8152_mem, sys->mem_offset); |
304 | 304 | ||
305 | if (platform_notify || platform_notify_remove) { | 305 | if (platform_notify || platform_notify_remove) { |
306 | printk(KERN_ERR "PCI: Can't use platform_notify\n"); | 306 | printk(KERN_ERR "PCI: Can't use platform_notify\n"); |
diff --git a/arch/arm/include/asm/pci.h b/arch/arm/include/asm/pci.h index da337ba57ffd..a98a2e112fae 100644 --- a/arch/arm/include/asm/pci.h +++ b/arch/arm/include/asm/pci.h | |||
@@ -57,14 +57,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
57 | extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | 57 | extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
58 | enum pci_mmap_state mmap_state, int write_combine); | 58 | enum pci_mmap_state mmap_state, int write_combine); |
59 | 59 | ||
60 | extern void | ||
61 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
62 | struct resource *res); | ||
63 | |||
64 | extern void | ||
65 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
66 | struct pci_bus_region *region); | ||
67 | |||
68 | /* | 60 | /* |
69 | * Dummy implementation; always return 0. | 61 | * Dummy implementation; always return 0. |
70 | */ | 62 | */ |
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index f58ba3589908..be5d3b23284d 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <asm/mach/pci.h> | 16 | #include <asm/mach/pci.h> |
17 | 17 | ||
18 | static int debug_pci; | 18 | static int debug_pci; |
19 | static int use_firmware; | ||
20 | 19 | ||
21 | /* | 20 | /* |
22 | * We can't use pci_find_device() here since we are | 21 | * We can't use pci_find_device() here since we are |
@@ -295,28 +294,6 @@ static inline int pdev_bad_for_parity(struct pci_dev *dev) | |||
295 | } | 294 | } |
296 | 295 | ||
297 | /* | 296 | /* |
298 | * Adjust the device resources from bus-centric to Linux-centric. | ||
299 | */ | ||
300 | static void __devinit | ||
301 | pdev_fixup_device_resources(struct pci_sys_data *root, struct pci_dev *dev) | ||
302 | { | ||
303 | resource_size_t offset; | ||
304 | int i; | ||
305 | |||
306 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
307 | if (dev->resource[i].start == 0) | ||
308 | continue; | ||
309 | if (dev->resource[i].flags & IORESOURCE_MEM) | ||
310 | offset = root->mem_offset; | ||
311 | else | ||
312 | offset = root->io_offset; | ||
313 | |||
314 | dev->resource[i].start += offset; | ||
315 | dev->resource[i].end += offset; | ||
316 | } | ||
317 | } | ||
318 | |||
319 | /* | ||
320 | * pcibios_fixup_bus - Called after each bus is probed, | 297 | * pcibios_fixup_bus - Called after each bus is probed, |
321 | * but before its children are examined. | 298 | * but before its children are examined. |
322 | */ | 299 | */ |
@@ -333,8 +310,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) | |||
333 | list_for_each_entry(dev, &bus->devices, bus_list) { | 310 | list_for_each_entry(dev, &bus->devices, bus_list) { |
334 | u16 status; | 311 | u16 status; |
335 | 312 | ||
336 | pdev_fixup_device_resources(root, dev); | ||
337 | |||
338 | pci_read_config_word(dev, PCI_STATUS, &status); | 313 | pci_read_config_word(dev, PCI_STATUS, &status); |
339 | 314 | ||
340 | /* | 315 | /* |
@@ -400,43 +375,6 @@ EXPORT_SYMBOL(pcibios_fixup_bus); | |||
400 | #endif | 375 | #endif |
401 | 376 | ||
402 | /* | 377 | /* |
403 | * Convert from Linux-centric to bus-centric addresses for bridge devices. | ||
404 | */ | ||
405 | void | ||
406 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
407 | struct resource *res) | ||
408 | { | ||
409 | struct pci_sys_data *root = dev->sysdata; | ||
410 | unsigned long offset = 0; | ||
411 | |||
412 | if (res->flags & IORESOURCE_IO) | ||
413 | offset = root->io_offset; | ||
414 | if (res->flags & IORESOURCE_MEM) | ||
415 | offset = root->mem_offset; | ||
416 | |||
417 | region->start = res->start - offset; | ||
418 | region->end = res->end - offset; | ||
419 | } | ||
420 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
421 | |||
422 | void __devinit | ||
423 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
424 | struct pci_bus_region *region) | ||
425 | { | ||
426 | struct pci_sys_data *root = dev->sysdata; | ||
427 | unsigned long offset = 0; | ||
428 | |||
429 | if (res->flags & IORESOURCE_IO) | ||
430 | offset = root->io_offset; | ||
431 | if (res->flags & IORESOURCE_MEM) | ||
432 | offset = root->mem_offset; | ||
433 | |||
434 | res->start = region->start + offset; | ||
435 | res->end = region->end + offset; | ||
436 | } | ||
437 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
438 | |||
439 | /* | ||
440 | * Swizzle the device pin each time we cross a bridge. | 378 | * Swizzle the device pin each time we cross a bridge. |
441 | * This might update pin and returns the slot number. | 379 | * This might update pin and returns the slot number. |
442 | */ | 380 | */ |
@@ -497,10 +435,10 @@ static void __init pcibios_init_hw(struct hw_pci *hw) | |||
497 | 435 | ||
498 | if (ret > 0) { | 436 | if (ret > 0) { |
499 | if (list_empty(&sys->resources)) { | 437 | if (list_empty(&sys->resources)) { |
500 | pci_add_resource(&sys->resources, | 438 | pci_add_resource_offset(&sys->resources, |
501 | &ioport_resource); | 439 | &ioport_resource, sys->io_offset); |
502 | pci_add_resource(&sys->resources, | 440 | pci_add_resource_offset(&sys->resources, |
503 | &iomem_resource); | 441 | &iomem_resource, sys->mem_offset); |
504 | } | 442 | } |
505 | 443 | ||
506 | sys->bus = hw->scan(nr, sys); | 444 | sys->bus = hw->scan(nr, sys); |
@@ -525,6 +463,7 @@ void __init pci_common_init(struct hw_pci *hw) | |||
525 | 463 | ||
526 | INIT_LIST_HEAD(&hw->buses); | 464 | INIT_LIST_HEAD(&hw->buses); |
527 | 465 | ||
466 | pci_add_flags(PCI_REASSIGN_ALL_RSRC); | ||
528 | if (hw->preinit) | 467 | if (hw->preinit) |
529 | hw->preinit(); | 468 | hw->preinit(); |
530 | pcibios_init_hw(hw); | 469 | pcibios_init_hw(hw); |
@@ -536,7 +475,7 @@ void __init pci_common_init(struct hw_pci *hw) | |||
536 | list_for_each_entry(sys, &hw->buses, node) { | 475 | list_for_each_entry(sys, &hw->buses, node) { |
537 | struct pci_bus *bus = sys->bus; | 476 | struct pci_bus *bus = sys->bus; |
538 | 477 | ||
539 | if (!use_firmware) { | 478 | if (!pci_has_flag(PCI_PROBE_ONLY)) { |
540 | /* | 479 | /* |
541 | * Size the bridge windows. | 480 | * Size the bridge windows. |
542 | */ | 481 | */ |
@@ -559,6 +498,7 @@ void __init pci_common_init(struct hw_pci *hw) | |||
559 | pci_bus_add_devices(bus); | 498 | pci_bus_add_devices(bus); |
560 | } | 499 | } |
561 | } | 500 | } |
501 | EXPORT_SYMBOL(pci_flags); | ||
562 | 502 | ||
563 | #ifndef CONFIG_PCI_HOST_ITE8152 | 503 | #ifndef CONFIG_PCI_HOST_ITE8152 |
564 | void pcibios_set_master(struct pci_dev *dev) | 504 | void pcibios_set_master(struct pci_dev *dev) |
@@ -573,7 +513,7 @@ char * __init pcibios_setup(char *str) | |||
573 | debug_pci = 1; | 513 | debug_pci = 1; |
574 | return NULL; | 514 | return NULL; |
575 | } else if (!strcmp(str, "firmware")) { | 515 | } else if (!strcmp(str, "firmware")) { |
576 | use_firmware = 1; | 516 | pci_add_flags(PCI_PROBE_ONLY); |
577 | return NULL; | 517 | return NULL; |
578 | } | 518 | } |
579 | return str; | 519 | return str; |
diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c index e159d69967c9..79d001f831e0 100644 --- a/arch/arm/mach-cns3xxx/pcie.c +++ b/arch/arm/mach-cns3xxx/pcie.c | |||
@@ -155,8 +155,8 @@ static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) | |||
155 | BUG_ON(request_resource(&iomem_resource, res_io) || | 155 | BUG_ON(request_resource(&iomem_resource, res_io) || |
156 | request_resource(&iomem_resource, res_mem)); | 156 | request_resource(&iomem_resource, res_mem)); |
157 | 157 | ||
158 | pci_add_resource(&sys->resources, res_io); | 158 | pci_add_resource_offset(&sys->resources, res_io, sys->io_offset); |
159 | pci_add_resource(&sys->resources, res_mem); | 159 | pci_add_resource_offset(&sys->resources, res_mem, sys->mem_offset); |
160 | 160 | ||
161 | return 1; | 161 | return 1; |
162 | } | 162 | } |
diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c index 52e96d397ba8..48a032005ea3 100644 --- a/arch/arm/mach-dove/pcie.c +++ b/arch/arm/mach-dove/pcie.c | |||
@@ -69,7 +69,7 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys) | |||
69 | pp->res[0].flags = IORESOURCE_IO; | 69 | pp->res[0].flags = IORESOURCE_IO; |
70 | if (request_resource(&ioport_resource, &pp->res[0])) | 70 | if (request_resource(&ioport_resource, &pp->res[0])) |
71 | panic("Request PCIe IO resource failed\n"); | 71 | panic("Request PCIe IO resource failed\n"); |
72 | pci_add_resource(&sys->resources, &pp->res[0]); | 72 | pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * IORESOURCE_MEM | 75 | * IORESOURCE_MEM |
@@ -88,7 +88,7 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys) | |||
88 | pp->res[1].flags = IORESOURCE_MEM; | 88 | pp->res[1].flags = IORESOURCE_MEM; |
89 | if (request_resource(&iomem_resource, &pp->res[1])) | 89 | if (request_resource(&iomem_resource, &pp->res[1])) |
90 | panic("Request PCIe Memory resource failed\n"); | 90 | panic("Request PCIe Memory resource failed\n"); |
91 | pci_add_resource(&sys->resources, &pp->res[1]); | 91 | pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); |
92 | 92 | ||
93 | return 1; | 93 | return 1; |
94 | } | 94 | } |
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index f685650c25d7..3194d3f73503 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c | |||
@@ -275,11 +275,13 @@ int __init dc21285_setup(int nr, struct pci_sys_data *sys) | |||
275 | allocate_resource(&iomem_resource, &res[0], 0x40000000, | 275 | allocate_resource(&iomem_resource, &res[0], 0x40000000, |
276 | 0x80000000, 0xffffffff, 0x40000000, NULL, NULL); | 276 | 0x80000000, 0xffffffff, 0x40000000, NULL, NULL); |
277 | 277 | ||
278 | pci_add_resource(&sys->resources, &ioport_resource); | ||
279 | pci_add_resource(&sys->resources, &res[0]); | ||
280 | pci_add_resource(&sys->resources, &res[1]); | ||
281 | sys->mem_offset = DC21285_PCI_MEM; | 278 | sys->mem_offset = DC21285_PCI_MEM; |
282 | 279 | ||
280 | pci_add_resource_offset(&sys->resources, | ||
281 | &ioport_resource, sys->io_offset); | ||
282 | pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset); | ||
283 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); | ||
284 | |||
283 | return 1; | 285 | return 1; |
284 | } | 286 | } |
285 | 287 | ||
diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index 3c82566acece..015be770c1d8 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c | |||
@@ -378,9 +378,10 @@ static int __init pci_v3_setup_resources(struct pci_sys_data *sys) | |||
378 | * the mem resource for this bus | 378 | * the mem resource for this bus |
379 | * the prefetch mem resource for this bus | 379 | * the prefetch mem resource for this bus |
380 | */ | 380 | */ |
381 | pci_add_resource(&sys->resources, &ioport_resource); | 381 | pci_add_resource_offset(&sys->resources, |
382 | pci_add_resource(&sys->resources, &non_mem); | 382 | &ioport_resource, sys->io_offset); |
383 | pci_add_resource(&sys->resources, &pre_mem); | 383 | pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset); |
384 | pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset); | ||
384 | 385 | ||
385 | return 1; | 386 | return 1; |
386 | } | 387 | } |
diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c index b8f5a8736511..861cb12ef436 100644 --- a/arch/arm/mach-iop13xx/pci.c +++ b/arch/arm/mach-iop13xx/pci.c | |||
@@ -1084,8 +1084,8 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
1084 | request_resource(&ioport_resource, &res[0]); | 1084 | request_resource(&ioport_resource, &res[0]); |
1085 | request_resource(&iomem_resource, &res[1]); | 1085 | request_resource(&iomem_resource, &res[1]); |
1086 | 1086 | ||
1087 | pci_add_resource(&sys->resources, &res[0]); | 1087 | pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset); |
1088 | pci_add_resource(&sys->resources, &res[1]); | 1088 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
1089 | 1089 | ||
1090 | return 1; | 1090 | return 1; |
1091 | } | 1091 | } |
diff --git a/arch/arm/mach-ixp2000/pci.c b/arch/arm/mach-ixp2000/pci.c index 626fda435aa9..49c36f3cd602 100644 --- a/arch/arm/mach-ixp2000/pci.c +++ b/arch/arm/mach-ixp2000/pci.c | |||
@@ -243,8 +243,10 @@ int ixp2000_pci_setup(int nr, struct pci_sys_data *sys) | |||
243 | if (nr >= 1) | 243 | if (nr >= 1) |
244 | return 0; | 244 | return 0; |
245 | 245 | ||
246 | pci_add_resource(&sys->resources, &ixp2000_pci_io_space); | 246 | pci_add_resource_offset(&sys->resources, |
247 | pci_add_resource(&sys->resources, &ixp2000_pci_mem_space); | 247 | &ixp2000_pci_io_space, sys->io_offset); |
248 | pci_add_resource_offset(&sys->resources, | ||
249 | &ixp2000_pci_mem_space, sys->mem_offset); | ||
248 | 250 | ||
249 | return 1; | 251 | return 1; |
250 | } | 252 | } |
diff --git a/arch/arm/mach-ixp23xx/pci.c b/arch/arm/mach-ixp23xx/pci.c index 25b5c462cea2..3cbbd3208fa8 100644 --- a/arch/arm/mach-ixp23xx/pci.c +++ b/arch/arm/mach-ixp23xx/pci.c | |||
@@ -281,8 +281,10 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
281 | if (nr >= 1) | 281 | if (nr >= 1) |
282 | return 0; | 282 | return 0; |
283 | 283 | ||
284 | pci_add_resource(&sys->resources, &ixp23xx_pci_io_space); | 284 | pci_add_resource_offset(&sys->resources, |
285 | pci_add_resource(&sys->resources, &ixp23xx_pci_mem_space); | 285 | &ixp23xx_pci_io_space, sys->io_offset); |
286 | pci_add_resource_offset(&sys->resources, | ||
287 | &ixp23xx_pci_mem_space, sys->mem_offset); | ||
286 | 288 | ||
287 | return 1; | 289 | return 1; |
288 | } | 290 | } |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 5eff15f24bc2..8508882b13f0 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
@@ -472,8 +472,8 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys) | |||
472 | request_resource(&ioport_resource, &res[0]); | 472 | request_resource(&ioport_resource, &res[0]); |
473 | request_resource(&iomem_resource, &res[1]); | 473 | request_resource(&iomem_resource, &res[1]); |
474 | 474 | ||
475 | pci_add_resource(&sys->resources, &res[0]); | 475 | pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset); |
476 | pci_add_resource(&sys->resources, &res[1]); | 476 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
477 | 477 | ||
478 | platform_notify = ixp4xx_pci_platform_notify; | 478 | platform_notify = ixp4xx_pci_platform_notify; |
479 | platform_notify_remove = ixp4xx_pci_platform_notify_remove; | 479 | platform_notify_remove = ixp4xx_pci_platform_notify_remove; |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index a066a6d8d9d2..f56a0118c1bb 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
@@ -198,9 +198,9 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys) | |||
198 | if (request_resource(&iomem_resource, &pp->res[1])) | 198 | if (request_resource(&iomem_resource, &pp->res[1])) |
199 | panic("Request PCIe%d Memory resource failed\n", index); | 199 | panic("Request PCIe%d Memory resource failed\n", index); |
200 | 200 | ||
201 | pci_add_resource(&sys->resources, &pp->res[0]); | ||
202 | pci_add_resource(&sys->resources, &pp->res[1]); | ||
203 | sys->io_offset = 0; | 201 | sys->io_offset = 0; |
202 | pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); | ||
203 | pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); | ||
204 | 204 | ||
205 | /* | 205 | /* |
206 | * Generic PCIe unit setup. | 206 | * Generic PCIe unit setup. |
diff --git a/arch/arm/mach-ks8695/pci.c b/arch/arm/mach-ks8695/pci.c index b26f992071df..acc701435817 100644 --- a/arch/arm/mach-ks8695/pci.c +++ b/arch/arm/mach-ks8695/pci.c | |||
@@ -169,8 +169,8 @@ static int __init ks8695_pci_setup(int nr, struct pci_sys_data *sys) | |||
169 | request_resource(&iomem_resource, &pci_mem); | 169 | request_resource(&iomem_resource, &pci_mem); |
170 | request_resource(&ioport_resource, &pci_io); | 170 | request_resource(&ioport_resource, &pci_io); |
171 | 171 | ||
172 | pci_add_resource(&sys->resources, &pci_io); | 172 | pci_add_resource_offset(&sys->resources, &pci_io, sys->io_offset); |
173 | pci_add_resource(&sys->resources, &pci_mem); | 173 | pci_add_resource_offset(&sys->resources, &pci_mem, sys->mem_offset); |
174 | 174 | ||
175 | /* Assign and enable processor bridge */ | 175 | /* Assign and enable processor bridge */ |
176 | ks8695_local_writeconfig(PCI_BASE_ADDRESS_0, KS8695_PCIMEM_PA); | 176 | ks8695_local_writeconfig(PCI_BASE_ADDRESS_0, KS8695_PCIMEM_PA); |
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index 8459f6d7d8ca..df3e38055a24 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
@@ -155,8 +155,8 @@ static int __init mv78xx0_pcie_setup(int nr, struct pci_sys_data *sys) | |||
155 | orion_pcie_set_local_bus_nr(pp->base, sys->busnr); | 155 | orion_pcie_set_local_bus_nr(pp->base, sys->busnr); |
156 | orion_pcie_setup(pp->base); | 156 | orion_pcie_setup(pp->base); |
157 | 157 | ||
158 | pci_add_resource(&sys->resources, &pp->res[0]); | 158 | pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); |
159 | pci_add_resource(&sys->resources, &pp->res[1]); | 159 | pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); |
160 | 160 | ||
161 | return 1; | 161 | return 1; |
162 | } | 162 | } |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 09a045f0c406..d6a91948e4dc 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
@@ -171,13 +171,14 @@ static int __init pcie_setup(struct pci_sys_data *sys) | |||
171 | /* | 171 | /* |
172 | * IORESOURCE_IO | 172 | * IORESOURCE_IO |
173 | */ | 173 | */ |
174 | sys->io_offset = 0; | ||
174 | res[0].name = "PCIe I/O Space"; | 175 | res[0].name = "PCIe I/O Space"; |
175 | res[0].flags = IORESOURCE_IO; | 176 | res[0].flags = IORESOURCE_IO; |
176 | res[0].start = ORION5X_PCIE_IO_BUS_BASE; | 177 | res[0].start = ORION5X_PCIE_IO_BUS_BASE; |
177 | res[0].end = res[0].start + ORION5X_PCIE_IO_SIZE - 1; | 178 | res[0].end = res[0].start + ORION5X_PCIE_IO_SIZE - 1; |
178 | if (request_resource(&ioport_resource, &res[0])) | 179 | if (request_resource(&ioport_resource, &res[0])) |
179 | panic("Request PCIe IO resource failed\n"); | 180 | panic("Request PCIe IO resource failed\n"); |
180 | pci_add_resource(&sys->resources, &res[0]); | 181 | pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset); |
181 | 182 | ||
182 | /* | 183 | /* |
183 | * IORESOURCE_MEM | 184 | * IORESOURCE_MEM |
@@ -188,9 +189,7 @@ static int __init pcie_setup(struct pci_sys_data *sys) | |||
188 | res[1].end = res[1].start + ORION5X_PCIE_MEM_SIZE - 1; | 189 | res[1].end = res[1].start + ORION5X_PCIE_MEM_SIZE - 1; |
189 | if (request_resource(&iomem_resource, &res[1])) | 190 | if (request_resource(&iomem_resource, &res[1])) |
190 | panic("Request PCIe Memory resource failed\n"); | 191 | panic("Request PCIe Memory resource failed\n"); |
191 | pci_add_resource(&sys->resources, &res[1]); | 192 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
192 | |||
193 | sys->io_offset = 0; | ||
194 | 193 | ||
195 | return 1; | 194 | return 1; |
196 | } | 195 | } |
@@ -499,13 +498,14 @@ static int __init pci_setup(struct pci_sys_data *sys) | |||
499 | /* | 498 | /* |
500 | * IORESOURCE_IO | 499 | * IORESOURCE_IO |
501 | */ | 500 | */ |
501 | sys->io_offset = 0; | ||
502 | res[0].name = "PCI I/O Space"; | 502 | res[0].name = "PCI I/O Space"; |
503 | res[0].flags = IORESOURCE_IO; | 503 | res[0].flags = IORESOURCE_IO; |
504 | res[0].start = ORION5X_PCI_IO_BUS_BASE; | 504 | res[0].start = ORION5X_PCI_IO_BUS_BASE; |
505 | res[0].end = res[0].start + ORION5X_PCI_IO_SIZE - 1; | 505 | res[0].end = res[0].start + ORION5X_PCI_IO_SIZE - 1; |
506 | if (request_resource(&ioport_resource, &res[0])) | 506 | if (request_resource(&ioport_resource, &res[0])) |
507 | panic("Request PCI IO resource failed\n"); | 507 | panic("Request PCI IO resource failed\n"); |
508 | pci_add_resource(&sys->resources, &res[0]); | 508 | pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset); |
509 | 509 | ||
510 | /* | 510 | /* |
511 | * IORESOURCE_MEM | 511 | * IORESOURCE_MEM |
@@ -516,9 +516,7 @@ static int __init pci_setup(struct pci_sys_data *sys) | |||
516 | res[1].end = res[1].start + ORION5X_PCI_MEM_SIZE - 1; | 516 | res[1].end = res[1].start + ORION5X_PCI_MEM_SIZE - 1; |
517 | if (request_resource(&iomem_resource, &res[1])) | 517 | if (request_resource(&iomem_resource, &res[1])) |
518 | panic("Request PCI Memory resource failed\n"); | 518 | panic("Request PCI Memory resource failed\n"); |
519 | pci_add_resource(&sys->resources, &res[1]); | 519 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
520 | |||
521 | sys->io_offset = 0; | ||
522 | 520 | ||
523 | return 1; | 521 | return 1; |
524 | } | 522 | } |
diff --git a/arch/arm/mach-sa1100/pci-nanoengine.c b/arch/arm/mach-sa1100/pci-nanoengine.c index 0d01ca788922..b466bca9c651 100644 --- a/arch/arm/mach-sa1100/pci-nanoengine.c +++ b/arch/arm/mach-sa1100/pci-nanoengine.c | |||
@@ -244,9 +244,11 @@ static int __init pci_nanoengine_setup_resources(struct pci_sys_data *sys) | |||
244 | printk(KERN_ERR "PCI: unable to allocate prefetchable\n"); | 244 | printk(KERN_ERR "PCI: unable to allocate prefetchable\n"); |
245 | return -EBUSY; | 245 | return -EBUSY; |
246 | } | 246 | } |
247 | pci_add_resource(&sys->resources, &pci_io_ports); | 247 | pci_add_resource_offset(&sys->resources, &pci_io_ports, sys->io_offset); |
248 | pci_add_resource(&sys->resources, &pci_non_prefetchable_memory); | 248 | pci_add_resource_offset(&sys->resources, |
249 | pci_add_resource(&sys->resources, &pci_prefetchable_memory); | 249 | &pci_non_prefetchable_memory, sys->mem_offset); |
250 | pci_add_resource_offset(&sys->resources, | ||
251 | &pci_prefetchable_memory, sys->mem_offset); | ||
250 | 252 | ||
251 | return 1; | 253 | return 1; |
252 | } | 254 | } |
diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c index af8b63435727..14b29ab5d8f0 100644 --- a/arch/arm/mach-tegra/pcie.c +++ b/arch/arm/mach-tegra/pcie.c | |||
@@ -408,7 +408,7 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
408 | pp->res[0].flags = IORESOURCE_IO; | 408 | pp->res[0].flags = IORESOURCE_IO; |
409 | if (request_resource(&ioport_resource, &pp->res[0])) | 409 | if (request_resource(&ioport_resource, &pp->res[0])) |
410 | panic("Request PCIe IO resource failed\n"); | 410 | panic("Request PCIe IO resource failed\n"); |
411 | pci_add_resource(&sys->resources, &pp->res[0]); | 411 | pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); |
412 | 412 | ||
413 | /* | 413 | /* |
414 | * IORESOURCE_MEM | 414 | * IORESOURCE_MEM |
@@ -427,7 +427,7 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
427 | pp->res[1].flags = IORESOURCE_MEM; | 427 | pp->res[1].flags = IORESOURCE_MEM; |
428 | if (request_resource(&iomem_resource, &pp->res[1])) | 428 | if (request_resource(&iomem_resource, &pp->res[1])) |
429 | panic("Request PCIe Memory resource failed\n"); | 429 | panic("Request PCIe Memory resource failed\n"); |
430 | pci_add_resource(&sys->resources, &pp->res[1]); | 430 | pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); |
431 | 431 | ||
432 | /* | 432 | /* |
433 | * IORESOURCE_MEM | IORESOURCE_PREFETCH | 433 | * IORESOURCE_MEM | IORESOURCE_PREFETCH |
@@ -446,7 +446,7 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
446 | pp->res[2].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH; | 446 | pp->res[2].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH; |
447 | if (request_resource(&iomem_resource, &pp->res[2])) | 447 | if (request_resource(&iomem_resource, &pp->res[2])) |
448 | panic("Request PCIe Prefetch Memory resource failed\n"); | 448 | panic("Request PCIe Prefetch Memory resource failed\n"); |
449 | pci_add_resource(&sys->resources, &pp->res[2]); | 449 | pci_add_resource_offset(&sys->resources, &pp->res[2], sys->mem_offset); |
450 | 450 | ||
451 | return 1; | 451 | return 1; |
452 | } | 452 | } |
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index 90069bce23bc..51733b022d04 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c | |||
@@ -219,9 +219,9 @@ static int __init pci_versatile_setup_resources(struct list_head *resources) | |||
219 | * the mem resource for this bus | 219 | * the mem resource for this bus |
220 | * the prefetch mem resource for this bus | 220 | * the prefetch mem resource for this bus |
221 | */ | 221 | */ |
222 | pci_add_resource(resources, &io_mem); | 222 | pci_add_resource_offset(resources, &io_mem, sys->io_offset); |
223 | pci_add_resource(resources, &non_mem); | 223 | pci_add_resource_offset(resources, &non_mem, sys->mem_offset); |
224 | pci_add_resource(resources, &pre_mem); | 224 | pci_add_resource_offset(resources, &pre_mem, sys->mem_offset); |
225 | 225 | ||
226 | goto out; | 226 | goto out; |
227 | 227 | ||
diff --git a/arch/arm/mm/iomap.c b/arch/arm/mm/iomap.c index e62956e12030..4614208369f1 100644 --- a/arch/arm/mm/iomap.c +++ b/arch/arm/mm/iomap.c | |||
@@ -32,9 +32,6 @@ EXPORT_SYMBOL(pcibios_min_io); | |||
32 | unsigned long pcibios_min_mem = 0x01000000; | 32 | unsigned long pcibios_min_mem = 0x01000000; |
33 | EXPORT_SYMBOL(pcibios_min_mem); | 33 | EXPORT_SYMBOL(pcibios_min_mem); |
34 | 34 | ||
35 | unsigned int pci_flags = PCI_REASSIGN_ALL_RSRC; | ||
36 | EXPORT_SYMBOL(pci_flags); | ||
37 | |||
38 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | 35 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) |
39 | { | 36 | { |
40 | if ((unsigned long)addr >= VMALLOC_START && | 37 | if ((unsigned long)addr >= VMALLOC_START && |
diff --git a/arch/arm/plat-iop/pci.c b/arch/arm/plat-iop/pci.c index f4d40a27111e..72768356447a 100644 --- a/arch/arm/plat-iop/pci.c +++ b/arch/arm/plat-iop/pci.c | |||
@@ -215,8 +215,8 @@ int iop3xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
215 | sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0; | 215 | sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0; |
216 | sys->io_offset = IOP3XX_PCI_LOWER_IO_PA - *IOP3XX_OIOWTVR; | 216 | sys->io_offset = IOP3XX_PCI_LOWER_IO_PA - *IOP3XX_OIOWTVR; |
217 | 217 | ||
218 | pci_add_resource(&sys->resources, &res[0]); | 218 | pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset); |
219 | pci_add_resource(&sys->resources, &res[1]); | 219 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
220 | 220 | ||
221 | return 1; | 221 | return 1; |
222 | } | 222 | } |
diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h index 279b38ae74aa..b22e5f5fa593 100644 --- a/arch/ia64/include/asm/pci.h +++ b/arch/ia64/include/asm/pci.h | |||
@@ -108,12 +108,6 @@ static inline int pci_proc_domain(struct pci_bus *bus) | |||
108 | return (pci_domain_nr(bus) != 0); | 108 | return (pci_domain_nr(bus) != 0); |
109 | } | 109 | } |
110 | 110 | ||
111 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
112 | struct pci_bus_region *region, struct resource *res); | ||
113 | |||
114 | extern void pcibios_bus_to_resource(struct pci_dev *dev, | ||
115 | struct resource *res, struct pci_bus_region *region); | ||
116 | |||
117 | static inline struct resource * | 111 | static inline struct resource * |
118 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | 112 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) |
119 | { | 113 | { |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index f82f5d4b65fd..d1ce3200147c 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -320,7 +320,8 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data) | |||
320 | * Ignore these tiny memory ranges */ | 320 | * Ignore these tiny memory ranges */ |
321 | if (!((window->resource.flags & IORESOURCE_MEM) && | 321 | if (!((window->resource.flags & IORESOURCE_MEM) && |
322 | (window->resource.end - window->resource.start < 16))) | 322 | (window->resource.end - window->resource.start < 16))) |
323 | pci_add_resource(&info->resources, &window->resource); | 323 | pci_add_resource_offset(&info->resources, &window->resource, |
324 | window->offset); | ||
324 | 325 | ||
325 | return AE_OK; | 326 | return AE_OK; |
326 | } | 327 | } |
@@ -395,54 +396,6 @@ out1: | |||
395 | return NULL; | 396 | return NULL; |
396 | } | 397 | } |
397 | 398 | ||
398 | void pcibios_resource_to_bus(struct pci_dev *dev, | ||
399 | struct pci_bus_region *region, struct resource *res) | ||
400 | { | ||
401 | struct pci_controller *controller = PCI_CONTROLLER(dev); | ||
402 | unsigned long offset = 0; | ||
403 | int i; | ||
404 | |||
405 | for (i = 0; i < controller->windows; i++) { | ||
406 | struct pci_window *window = &controller->window[i]; | ||
407 | if (!(window->resource.flags & res->flags)) | ||
408 | continue; | ||
409 | if (window->resource.start > res->start) | ||
410 | continue; | ||
411 | if (window->resource.end < res->end) | ||
412 | continue; | ||
413 | offset = window->offset; | ||
414 | break; | ||
415 | } | ||
416 | |||
417 | region->start = res->start - offset; | ||
418 | region->end = res->end - offset; | ||
419 | } | ||
420 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
421 | |||
422 | void pcibios_bus_to_resource(struct pci_dev *dev, | ||
423 | struct resource *res, struct pci_bus_region *region) | ||
424 | { | ||
425 | struct pci_controller *controller = PCI_CONTROLLER(dev); | ||
426 | unsigned long offset = 0; | ||
427 | int i; | ||
428 | |||
429 | for (i = 0; i < controller->windows; i++) { | ||
430 | struct pci_window *window = &controller->window[i]; | ||
431 | if (!(window->resource.flags & res->flags)) | ||
432 | continue; | ||
433 | if (window->resource.start - window->offset > region->start) | ||
434 | continue; | ||
435 | if (window->resource.end - window->offset < region->end) | ||
436 | continue; | ||
437 | offset = window->offset; | ||
438 | break; | ||
439 | } | ||
440 | |||
441 | res->start = region->start + offset; | ||
442 | res->end = region->end + offset; | ||
443 | } | ||
444 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
445 | |||
446 | static int __devinit is_valid_resource(struct pci_dev *dev, int idx) | 399 | static int __devinit is_valid_resource(struct pci_dev *dev, int idx) |
447 | { | 400 | { |
448 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; | 401 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; |
@@ -464,15 +417,11 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx) | |||
464 | static void __devinit | 417 | static void __devinit |
465 | pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) | 418 | pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) |
466 | { | 419 | { |
467 | struct pci_bus_region region; | ||
468 | int i; | 420 | int i; |
469 | 421 | ||
470 | for (i = start; i < limit; i++) { | 422 | for (i = start; i < limit; i++) { |
471 | if (!dev->resource[i].flags) | 423 | if (!dev->resource[i].flags) |
472 | continue; | 424 | continue; |
473 | region.start = dev->resource[i].start; | ||
474 | region.end = dev->resource[i].end; | ||
475 | pcibios_bus_to_resource(dev, &dev->resource[i], ®ion); | ||
476 | if ((is_valid_resource(dev, i))) | 425 | if ((is_valid_resource(dev, i))) |
477 | pci_claim_resource(dev, i); | 426 | pci_claim_resource(dev, i); |
478 | } | 427 | } |
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 0a36f082eaf1..238e2c511d94 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -297,7 +297,8 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) | |||
297 | s64 status = 0; | 297 | s64 status = 0; |
298 | struct pci_controller *controller; | 298 | struct pci_controller *controller; |
299 | struct pcibus_bussoft *prom_bussoft_ptr; | 299 | struct pcibus_bussoft *prom_bussoft_ptr; |
300 | 300 | LIST_HEAD(resources); | |
301 | int i; | ||
301 | 302 | ||
302 | status = sal_get_pcibus_info((u64) segment, (u64) busnum, | 303 | status = sal_get_pcibus_info((u64) segment, (u64) busnum, |
303 | (u64) ia64_tpa(&prom_bussoft_ptr)); | 304 | (u64) ia64_tpa(&prom_bussoft_ptr)); |
@@ -315,7 +316,15 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) | |||
315 | */ | 316 | */ |
316 | controller->platform_data = prom_bussoft_ptr; | 317 | controller->platform_data = prom_bussoft_ptr; |
317 | 318 | ||
318 | bus = pci_scan_bus(busnum, &pci_root_ops, controller); | 319 | sn_legacy_pci_window_fixup(controller, |
320 | prom_bussoft_ptr->bs_legacy_io, | ||
321 | prom_bussoft_ptr->bs_legacy_mem); | ||
322 | for (i = 0; i < controller->windows; i++) | ||
323 | pci_add_resource_offset(&resources, | ||
324 | &controller->window[i].resource, | ||
325 | controller->window[i].offset); | ||
326 | bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, controller, | ||
327 | &resources); | ||
319 | if (bus == NULL) | 328 | if (bus == NULL) |
320 | goto error_return; /* error, or bus already scanned */ | 329 | goto error_return; /* error, or bus already scanned */ |
321 | 330 | ||
@@ -348,9 +357,6 @@ sn_bus_fixup(struct pci_bus *bus) | |||
348 | return; | 357 | return; |
349 | } | 358 | } |
350 | sn_common_bus_fixup(bus, prom_bussoft_ptr); | 359 | sn_common_bus_fixup(bus, prom_bussoft_ptr); |
351 | sn_legacy_pci_window_fixup(PCI_CONTROLLER(bus), | ||
352 | prom_bussoft_ptr->bs_legacy_io, | ||
353 | prom_bussoft_ptr->bs_legacy_mem); | ||
354 | } | 360 | } |
355 | list_for_each_entry(pci_dev, &bus->devices, bus_list) { | 361 | list_for_each_entry(pci_dev, &bus->devices, bus_list) { |
356 | sn_io_slot_fixup(pci_dev); | 362 | sn_io_slot_fixup(pci_dev); |
diff --git a/arch/microblaze/include/asm/pci-bridge.h b/arch/microblaze/include/asm/pci-bridge.h index e9834b2991d0..cb5d39794800 100644 --- a/arch/microblaze/include/asm/pci-bridge.h +++ b/arch/microblaze/include/asm/pci-bridge.h | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/ioport.h> | 12 | #include <linux/ioport.h> |
13 | #include <asm-generic/pci-bridge.h> | ||
14 | 13 | ||
15 | struct device_node; | 14 | struct device_node; |
16 | 15 | ||
diff --git a/arch/microblaze/include/asm/pci.h b/arch/microblaze/include/asm/pci.h index 033137628e8a..a0da88bf70c5 100644 --- a/arch/microblaze/include/asm/pci.h +++ b/arch/microblaze/include/asm/pci.h | |||
@@ -94,14 +94,6 @@ extern int pci_mmap_legacy_page_range(struct pci_bus *bus, | |||
94 | */ | 94 | */ |
95 | #define PCI_DMA_BUS_IS_PHYS (1) | 95 | #define PCI_DMA_BUS_IS_PHYS (1) |
96 | 96 | ||
97 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
98 | struct pci_bus_region *region, | ||
99 | struct resource *res); | ||
100 | |||
101 | extern void pcibios_bus_to_resource(struct pci_dev *dev, | ||
102 | struct resource *res, | ||
103 | struct pci_bus_region *region); | ||
104 | |||
105 | static inline struct resource *pcibios_select_root(struct pci_dev *pdev, | 97 | static inline struct resource *pcibios_select_root(struct pci_dev *pdev, |
106 | struct resource *res) | 98 | struct resource *res) |
107 | { | 99 | { |
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 85f2ac1230a8..d10403dadd2b 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c | |||
@@ -46,9 +46,6 @@ static int global_phb_number; /* Global phb counter */ | |||
46 | /* ISA Memory physical address */ | 46 | /* ISA Memory physical address */ |
47 | resource_size_t isa_mem_base; | 47 | resource_size_t isa_mem_base; |
48 | 48 | ||
49 | /* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ | ||
50 | unsigned int pci_flags; | ||
51 | |||
52 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; | 49 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; |
53 | 50 | ||
54 | unsigned long isa_io_base; | 51 | unsigned long isa_io_base; |
@@ -833,64 +830,7 @@ int pci_proc_domain(struct pci_bus *bus) | |||
833 | { | 830 | { |
834 | struct pci_controller *hose = pci_bus_to_host(bus); | 831 | struct pci_controller *hose = pci_bus_to_host(bus); |
835 | 832 | ||
836 | if (!(pci_flags & PCI_ENABLE_PROC_DOMAINS)) | 833 | return 0; |
837 | return 0; | ||
838 | if (pci_flags & PCI_COMPAT_DOMAIN_0) | ||
839 | return hose->global_number != 0; | ||
840 | return 1; | ||
841 | } | ||
842 | |||
843 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
844 | struct resource *res) | ||
845 | { | ||
846 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
847 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
848 | |||
849 | if (!hose) | ||
850 | return; | ||
851 | if (res->flags & IORESOURCE_IO) { | ||
852 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
853 | mask = 0xffffffffu; | ||
854 | } else if (res->flags & IORESOURCE_MEM) | ||
855 | offset = hose->pci_mem_offset; | ||
856 | |||
857 | region->start = (res->start - offset) & mask; | ||
858 | region->end = (res->end - offset) & mask; | ||
859 | } | ||
860 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
861 | |||
862 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
863 | struct pci_bus_region *region) | ||
864 | { | ||
865 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
866 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
867 | |||
868 | if (!hose) | ||
869 | return; | ||
870 | if (res->flags & IORESOURCE_IO) { | ||
871 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
872 | mask = 0xffffffffu; | ||
873 | } else if (res->flags & IORESOURCE_MEM) | ||
874 | offset = hose->pci_mem_offset; | ||
875 | res->start = (region->start + offset) & mask; | ||
876 | res->end = (region->end + offset) & mask; | ||
877 | } | ||
878 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
879 | |||
880 | /* Fixup a bus resource into a linux resource */ | ||
881 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) | ||
882 | { | ||
883 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
884 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
885 | |||
886 | if (res->flags & IORESOURCE_IO) { | ||
887 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
888 | mask = 0xffffffffu; | ||
889 | } else if (res->flags & IORESOURCE_MEM) | ||
890 | offset = hose->pci_mem_offset; | ||
891 | |||
892 | res->start = (res->start + offset) & mask; | ||
893 | res->end = (res->end + offset) & mask; | ||
894 | } | 834 | } |
895 | 835 | ||
896 | /* This header fixup will do the resource fixup for all devices as they are | 836 | /* This header fixup will do the resource fixup for all devices as they are |
@@ -910,13 +850,7 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev) | |||
910 | struct resource *res = dev->resource + i; | 850 | struct resource *res = dev->resource + i; |
911 | if (!res->flags) | 851 | if (!res->flags) |
912 | continue; | 852 | continue; |
913 | /* On platforms that have PCI_PROBE_ONLY set, we don't | 853 | if (res->start == 0) { |
914 | * consider 0 as an unassigned BAR value. It's technically | ||
915 | * a valid value, but linux doesn't like it... so when we can | ||
916 | * re-assign things, we do so, but if we can't, we keep it | ||
917 | * around and hope for the best... | ||
918 | */ | ||
919 | if (res->start == 0 && !(pci_flags & PCI_PROBE_ONLY)) { | ||
920 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]" \ | 854 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]" \ |
921 | "is unassigned\n", | 855 | "is unassigned\n", |
922 | pci_name(dev), i, | 856 | pci_name(dev), i, |
@@ -929,18 +863,11 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev) | |||
929 | continue; | 863 | continue; |
930 | } | 864 | } |
931 | 865 | ||
932 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n", | 866 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n", |
933 | pci_name(dev), i, | 867 | pci_name(dev), i, |
934 | (unsigned long long)res->start,\ | 868 | (unsigned long long)res->start,\ |
935 | (unsigned long long)res->end, | 869 | (unsigned long long)res->end, |
936 | (unsigned int)res->flags); | 870 | (unsigned int)res->flags); |
937 | |||
938 | fixup_resource(res, dev); | ||
939 | |||
940 | pr_debug("PCI:%s %016llx-%016llx\n", | ||
941 | pci_name(dev), | ||
942 | (unsigned long long)res->start, | ||
943 | (unsigned long long)res->end); | ||
944 | } | 871 | } |
945 | } | 872 | } |
946 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources); | 873 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources); |
@@ -959,10 +886,6 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus, | |||
959 | u16 command; | 886 | u16 command; |
960 | int i; | 887 | int i; |
961 | 888 | ||
962 | /* We don't do anything if PCI_PROBE_ONLY is set */ | ||
963 | if (pci_flags & PCI_PROBE_ONLY) | ||
964 | return 0; | ||
965 | |||
966 | /* Job is a bit different between memory and IO */ | 889 | /* Job is a bit different between memory and IO */ |
967 | if (res->flags & IORESOURCE_MEM) { | 890 | if (res->flags & IORESOURCE_MEM) { |
968 | /* If the BAR is non-0 (res != pci_mem_offset) then it's | 891 | /* If the BAR is non-0 (res != pci_mem_offset) then it's |
@@ -1037,9 +960,6 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) | |||
1037 | (unsigned long long)res->end, | 960 | (unsigned long long)res->end, |
1038 | (unsigned int)res->flags); | 961 | (unsigned int)res->flags); |
1039 | 962 | ||
1040 | /* Perform fixup */ | ||
1041 | fixup_resource(res, dev); | ||
1042 | |||
1043 | /* Try to detect uninitialized P2P bridge resources, | 963 | /* Try to detect uninitialized P2P bridge resources, |
1044 | * and clear them out so they get re-assigned later | 964 | * and clear them out so they get re-assigned later |
1045 | */ | 965 | */ |
@@ -1107,9 +1027,6 @@ EXPORT_SYMBOL(pcibios_fixup_bus); | |||
1107 | 1027 | ||
1108 | static int skip_isa_ioresource_align(struct pci_dev *dev) | 1028 | static int skip_isa_ioresource_align(struct pci_dev *dev) |
1109 | { | 1029 | { |
1110 | if ((pci_flags & PCI_CAN_SKIP_ISA_ALIGN) && | ||
1111 | !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA)) | ||
1112 | return 1; | ||
1113 | return 0; | 1030 | return 0; |
1114 | } | 1031 | } |
1115 | 1032 | ||
@@ -1236,8 +1153,6 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1236 | * and as such ensure proper re-allocation | 1153 | * and as such ensure proper re-allocation |
1237 | * later. | 1154 | * later. |
1238 | */ | 1155 | */ |
1239 | if (pci_flags & PCI_REASSIGN_ALL_RSRC) | ||
1240 | goto clear_resource; | ||
1241 | pr = pci_find_parent_resource(bus->self, res); | 1156 | pr = pci_find_parent_resource(bus->self, res); |
1242 | if (pr == res) { | 1157 | if (pr == res) { |
1243 | /* this happens when the generic PCI | 1158 | /* this happens when the generic PCI |
@@ -1422,27 +1337,19 @@ void __init pcibios_resource_survey(void) | |||
1422 | list_for_each_entry(b, &pci_root_buses, node) | 1337 | list_for_each_entry(b, &pci_root_buses, node) |
1423 | pcibios_allocate_bus_resources(b); | 1338 | pcibios_allocate_bus_resources(b); |
1424 | 1339 | ||
1425 | if (!(pci_flags & PCI_REASSIGN_ALL_RSRC)) { | 1340 | pcibios_allocate_resources(0); |
1426 | pcibios_allocate_resources(0); | 1341 | pcibios_allocate_resources(1); |
1427 | pcibios_allocate_resources(1); | ||
1428 | } | ||
1429 | 1342 | ||
1430 | /* Before we start assigning unassigned resource, we try to reserve | 1343 | /* Before we start assigning unassigned resource, we try to reserve |
1431 | * the low IO area and the VGA memory area if they intersect the | 1344 | * the low IO area and the VGA memory area if they intersect the |
1432 | * bus available resources to avoid allocating things on top of them | 1345 | * bus available resources to avoid allocating things on top of them |
1433 | */ | 1346 | */ |
1434 | if (!(pci_flags & PCI_PROBE_ONLY)) { | 1347 | list_for_each_entry(b, &pci_root_buses, node) |
1435 | list_for_each_entry(b, &pci_root_buses, node) | 1348 | pcibios_reserve_legacy_regions(b); |
1436 | pcibios_reserve_legacy_regions(b); | ||
1437 | } | ||
1438 | 1349 | ||
1439 | /* Now, if the platform didn't decide to blindly trust the firmware, | 1350 | /* Now proceed to assigning things that were left unassigned */ |
1440 | * we proceed to assigning things that were left unassigned | 1351 | pr_debug("PCI: Assigning unassigned resources...\n"); |
1441 | */ | 1352 | pci_assign_unassigned_resources(); |
1442 | if (!(pci_flags & PCI_PROBE_ONLY)) { | ||
1443 | pr_debug("PCI: Assigning unassigned resources...\n"); | ||
1444 | pci_assign_unassigned_resources(); | ||
1445 | } | ||
1446 | } | 1353 | } |
1447 | 1354 | ||
1448 | #ifdef CONFIG_HOTPLUG | 1355 | #ifdef CONFIG_HOTPLUG |
@@ -1535,7 +1442,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1535 | res->end = res->start + IO_SPACE_LIMIT; | 1442 | res->end = res->start + IO_SPACE_LIMIT; |
1536 | res->flags = IORESOURCE_IO; | 1443 | res->flags = IORESOURCE_IO; |
1537 | } | 1444 | } |
1538 | pci_add_resource(resources, res); | 1445 | pci_add_resource_offset(resources, res, hose->io_base_virt - _IO_BASE); |
1539 | 1446 | ||
1540 | pr_debug("PCI: PHB IO resource = %016llx-%016llx [%lx]\n", | 1447 | pr_debug("PCI: PHB IO resource = %016llx-%016llx [%lx]\n", |
1541 | (unsigned long long)res->start, | 1448 | (unsigned long long)res->start, |
@@ -1558,7 +1465,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1558 | res->flags = IORESOURCE_MEM; | 1465 | res->flags = IORESOURCE_MEM; |
1559 | 1466 | ||
1560 | } | 1467 | } |
1561 | pci_add_resource(resources, res); | 1468 | pci_add_resource_offset(resources, res, hose->pci_mem_offset); |
1562 | 1469 | ||
1563 | pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", | 1470 | pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", |
1564 | i, (unsigned long long)res->start, | 1471 | i, (unsigned long long)res->start, |
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h index 576397c69920..fcd4060f6421 100644 --- a/arch/mips/include/asm/pci.h +++ b/arch/mips/include/asm/pci.h | |||
@@ -92,6 +92,7 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
92 | #include <asm/scatterlist.h> | 92 | #include <asm/scatterlist.h> |
93 | #include <linux/string.h> | 93 | #include <linux/string.h> |
94 | #include <asm/io.h> | 94 | #include <asm/io.h> |
95 | #include <asm-generic/pci-bridge.h> | ||
95 | 96 | ||
96 | struct pci_dev; | 97 | struct pci_dev; |
97 | 98 | ||
@@ -112,12 +113,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
112 | } | 113 | } |
113 | #endif | 114 | #endif |
114 | 115 | ||
115 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
116 | struct pci_bus_region *region, struct resource *res); | ||
117 | |||
118 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
119 | struct pci_bus_region *region); | ||
120 | |||
121 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index | 116 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index |
122 | 117 | ||
123 | static inline int pci_proc_domain(struct pci_bus *bus) | 118 | static inline int pci_proc_domain(struct pci_bus *bus) |
@@ -145,8 +140,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | |||
145 | #define arch_setup_msi_irqs arch_setup_msi_irqs | 140 | #define arch_setup_msi_irqs arch_setup_msi_irqs |
146 | #endif | 141 | #endif |
147 | 142 | ||
148 | extern int pci_probe_only; | ||
149 | |||
150 | extern char * (*pcibios_plat_setup)(char *str); | 143 | extern char * (*pcibios_plat_setup)(char *str); |
151 | 144 | ||
152 | #endif /* _ASM_PCI_H */ | 145 | #endif /* _ASM_PCI_H */ |
diff --git a/arch/mips/pci/fixup-cobalt.c b/arch/mips/pci/fixup-cobalt.c index acacd1407c63..9553b14002dd 100644 --- a/arch/mips/pci/fixup-cobalt.c +++ b/arch/mips/pci/fixup-cobalt.c | |||
@@ -51,67 +51,6 @@ static void qube_raq_galileo_early_fixup(struct pci_dev *dev) | |||
51 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111, | 51 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111, |
52 | qube_raq_galileo_early_fixup); | 52 | qube_raq_galileo_early_fixup); |
53 | 53 | ||
54 | static void __devinit cobalt_legacy_ide_resource_fixup(struct pci_dev *dev, | ||
55 | struct resource *res) | ||
56 | { | ||
57 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
58 | unsigned long offset = hose->io_offset; | ||
59 | struct resource orig = *res; | ||
60 | |||
61 | if (!(res->flags & IORESOURCE_IO) || | ||
62 | !(res->flags & IORESOURCE_PCI_FIXED)) | ||
63 | return; | ||
64 | |||
65 | res->start -= offset; | ||
66 | res->end -= offset; | ||
67 | dev_printk(KERN_DEBUG, &dev->dev, "converted legacy %pR to bus %pR\n", | ||
68 | &orig, res); | ||
69 | } | ||
70 | |||
71 | static void __devinit cobalt_legacy_ide_fixup(struct pci_dev *dev) | ||
72 | { | ||
73 | u32 class; | ||
74 | u8 progif; | ||
75 | |||
76 | /* | ||
77 | * If the IDE controller is in legacy mode, pci_setup_device() fills in | ||
78 | * the resources with the legacy addresses that normally appear on the | ||
79 | * PCI bus, just as if we had read them from a BAR. | ||
80 | * | ||
81 | * However, with the GT-64111, those legacy addresses, e.g., 0x1f0, | ||
82 | * will never appear on the PCI bus because it converts memory accesses | ||
83 | * in the PCI I/O region (which is never at address zero) into I/O port | ||
84 | * accesses with no address translation. | ||
85 | * | ||
86 | * For example, if GT_DEF_PCI0_IO_BASE is 0x10000000, a load or store | ||
87 | * to physical address 0x100001f0 will become a PCI access to I/O port | ||
88 | * 0x100001f0. There's no way to generate an access to I/O port 0x1f0, | ||
89 | * but the VT82C586 IDE controller does respond at 0x100001f0 because | ||
90 | * it only decodes the low 24 bits of the address. | ||
91 | * | ||
92 | * When this quirk runs, the pci_dev resources should contain bus | ||
93 | * addresses, not Linux I/O port numbers, so convert legacy addresses | ||
94 | * like 0x1f0 to bus addresses like 0x100001f0. Later, we'll convert | ||
95 | * them back with pcibios_fixup_bus() or pcibios_bus_to_resource(). | ||
96 | */ | ||
97 | class = dev->class >> 8; | ||
98 | if (class != PCI_CLASS_STORAGE_IDE) | ||
99 | return; | ||
100 | |||
101 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); | ||
102 | if ((progif & 1) == 0) { | ||
103 | cobalt_legacy_ide_resource_fixup(dev, &dev->resource[0]); | ||
104 | cobalt_legacy_ide_resource_fixup(dev, &dev->resource[1]); | ||
105 | } | ||
106 | if ((progif & 4) == 0) { | ||
107 | cobalt_legacy_ide_resource_fixup(dev, &dev->resource[2]); | ||
108 | cobalt_legacy_ide_resource_fixup(dev, &dev->resource[3]); | ||
109 | } | ||
110 | } | ||
111 | |||
112 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, | ||
113 | cobalt_legacy_ide_fixup); | ||
114 | |||
115 | static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev) | 54 | static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev) |
116 | { | 55 | { |
117 | unsigned short cfgword; | 56 | unsigned short cfgword; |
diff --git a/arch/mips/pci/pci-bcm1480.c b/arch/mips/pci/pci-bcm1480.c index af8c31996965..37b52dc3d27e 100644 --- a/arch/mips/pci/pci-bcm1480.c +++ b/arch/mips/pci/pci-bcm1480.c | |||
@@ -204,7 +204,7 @@ static int __init bcm1480_pcibios_init(void) | |||
204 | uint64_t reg; | 204 | uint64_t reg; |
205 | 205 | ||
206 | /* CFE will assign PCI resources */ | 206 | /* CFE will assign PCI resources */ |
207 | pci_probe_only = 1; | 207 | pci_set_flags(PCI_PROBE_ONLY); |
208 | 208 | ||
209 | /* Avoid ISA compat ranges. */ | 209 | /* Avoid ISA compat ranges. */ |
210 | PCIBIOS_MIN_IO = 0x00008000UL; | 210 | PCIBIOS_MIN_IO = 0x00008000UL; |
diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index 193e9494f98e..0fbe4c0c170a 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c | |||
@@ -50,7 +50,7 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid) | |||
50 | bridge_t *bridge; | 50 | bridge_t *bridge; |
51 | int slot; | 51 | int slot; |
52 | 52 | ||
53 | pci_probe_only = 1; | 53 | pci_set_flags(PCI_PROBE_ONLY); |
54 | 54 | ||
55 | printk("a bridge\n"); | 55 | printk("a bridge\n"); |
56 | 56 | ||
diff --git a/arch/mips/pci/pci-lantiq.c b/arch/mips/pci/pci-lantiq.c index be1e1afe12c3..030c77e7926e 100644 --- a/arch/mips/pci/pci-lantiq.c +++ b/arch/mips/pci/pci-lantiq.c | |||
@@ -270,7 +270,8 @@ static int __devinit ltq_pci_probe(struct platform_device *pdev) | |||
270 | { | 270 | { |
271 | struct ltq_pci_data *ltq_pci_data = | 271 | struct ltq_pci_data *ltq_pci_data = |
272 | (struct ltq_pci_data *) pdev->dev.platform_data; | 272 | (struct ltq_pci_data *) pdev->dev.platform_data; |
273 | pci_probe_only = 0; | 273 | |
274 | pci_clear_flags(PCI_PROBE_ONLY); | ||
274 | ltq_pci_irq_map = ltq_pci_data->irq; | 275 | ltq_pci_irq_map = ltq_pci_data->irq; |
275 | ltq_pci_membase = ioremap_nocache(PCI_CR_BASE_ADDR, PCI_CR_SIZE); | 276 | ltq_pci_membase = ioremap_nocache(PCI_CR_BASE_ADDR, PCI_CR_SIZE); |
276 | ltq_pci_mapped_cfg = | 277 | ltq_pci_mapped_cfg = |
diff --git a/arch/mips/pci/pci-sb1250.c b/arch/mips/pci/pci-sb1250.c index 1711e8e101bc..dd97f3a83baa 100644 --- a/arch/mips/pci/pci-sb1250.c +++ b/arch/mips/pci/pci-sb1250.c | |||
@@ -213,7 +213,7 @@ static int __init sb1250_pcibios_init(void) | |||
213 | uint64_t reg; | 213 | uint64_t reg; |
214 | 214 | ||
215 | /* CFE will assign PCI resources */ | 215 | /* CFE will assign PCI resources */ |
216 | pci_probe_only = 1; | 216 | pci_set_flags(PCI_PROBE_ONLY); |
217 | 217 | ||
218 | /* Avoid ISA compat ranges. */ | 218 | /* Avoid ISA compat ranges. */ |
219 | PCIBIOS_MIN_IO = 0x00008000UL; | 219 | PCIBIOS_MIN_IO = 0x00008000UL; |
diff --git a/arch/mips/pci/pci-xlr.c b/arch/mips/pci/pci-xlr.c index 3d701a962ef4..1644805a6730 100644 --- a/arch/mips/pci/pci-xlr.c +++ b/arch/mips/pci/pci-xlr.c | |||
@@ -292,7 +292,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
292 | static int __init pcibios_init(void) | 292 | static int __init pcibios_init(void) |
293 | { | 293 | { |
294 | /* PSB assigns PCI resources */ | 294 | /* PSB assigns PCI resources */ |
295 | pci_probe_only = 1; | 295 | pci_set_flags(PCI_PROBE_ONLY); |
296 | pci_config_base = ioremap(DEFAULT_PCI_CONFIG_BASE, 16 << 20); | 296 | pci_config_base = ioremap(DEFAULT_PCI_CONFIG_BASE, 16 << 20); |
297 | 297 | ||
298 | /* Extend IO port for memory mapped io */ | 298 | /* Extend IO port for memory mapped io */ |
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index aec2b111d35b..0514866fa925 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c | |||
@@ -20,16 +20,9 @@ | |||
20 | #include <asm/cpu-info.h> | 20 | #include <asm/cpu-info.h> |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Indicate whether we respect the PCI setup left by the firmware. | 23 | * If PCI_PROBE_ONLY in pci_flags is set, we don't change any PCI resource |
24 | * | 24 | * assignments. |
25 | * Make this long-lived so that we know when shutting down | ||
26 | * whether we probed only or not. | ||
27 | */ | 25 | */ |
28 | int pci_probe_only; | ||
29 | |||
30 | #define PCI_ASSIGN_ALL_BUSSES 1 | ||
31 | |||
32 | unsigned int pci_probe = PCI_ASSIGN_ALL_BUSSES; | ||
33 | 26 | ||
34 | /* | 27 | /* |
35 | * The PCI controller list. | 28 | * The PCI controller list. |
@@ -92,11 +85,12 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose) | |||
92 | if (!hose->iommu) | 85 | if (!hose->iommu) |
93 | PCI_DMA_BUS_IS_PHYS = 1; | 86 | PCI_DMA_BUS_IS_PHYS = 1; |
94 | 87 | ||
95 | if (hose->get_busno && pci_probe_only) | 88 | if (hose->get_busno && pci_has_flag(PCI_PROBE_ONLY)) |
96 | next_busno = (*hose->get_busno)(); | 89 | next_busno = (*hose->get_busno)(); |
97 | 90 | ||
98 | pci_add_resource(&resources, hose->mem_resource); | 91 | pci_add_resource_offset(&resources, |
99 | pci_add_resource(&resources, hose->io_resource); | 92 | hose->mem_resource, hose->mem_offset); |
93 | pci_add_resource_offset(&resources, hose->io_resource, hose->io_offset); | ||
100 | bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose, | 94 | bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose, |
101 | &resources); | 95 | &resources); |
102 | if (!bus) | 96 | if (!bus) |
@@ -115,7 +109,7 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose) | |||
115 | need_domain_info = 1; | 109 | need_domain_info = 1; |
116 | } | 110 | } |
117 | 111 | ||
118 | if (!pci_probe_only) { | 112 | if (!pci_has_flag(PCI_PROBE_ONLY)) { |
119 | pci_bus_size_bridges(bus); | 113 | pci_bus_size_bridges(bus); |
120 | pci_bus_assign_resources(bus); | 114 | pci_bus_assign_resources(bus); |
121 | pci_enable_bridges(bus); | 115 | pci_enable_bridges(bus); |
@@ -241,7 +235,7 @@ static int pcibios_enable_resources(struct pci_dev *dev, int mask) | |||
241 | 235 | ||
242 | unsigned int pcibios_assign_all_busses(void) | 236 | unsigned int pcibios_assign_all_busses(void) |
243 | { | 237 | { |
244 | return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0; | 238 | return 1; |
245 | } | 239 | } |
246 | 240 | ||
247 | int pcibios_enable_device(struct pci_dev *dev, int mask) | 241 | int pcibios_enable_device(struct pci_dev *dev, int mask) |
@@ -254,45 +248,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
254 | return pcibios_plat_dev_init(dev); | 248 | return pcibios_plat_dev_init(dev); |
255 | } | 249 | } |
256 | 250 | ||
257 | static void pcibios_fixup_device_resources(struct pci_dev *dev, | ||
258 | struct pci_bus *bus) | ||
259 | { | ||
260 | /* Update device resources. */ | ||
261 | struct pci_controller *hose = (struct pci_controller *)bus->sysdata; | ||
262 | unsigned long offset = 0; | ||
263 | int i; | ||
264 | |||
265 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
266 | if (!dev->resource[i].start) | ||
267 | continue; | ||
268 | if (dev->resource[i].flags & IORESOURCE_IO) | ||
269 | offset = hose->io_offset; | ||
270 | else if (dev->resource[i].flags & IORESOURCE_MEM) | ||
271 | offset = hose->mem_offset; | ||
272 | |||
273 | dev->resource[i].start += offset; | ||
274 | dev->resource[i].end += offset; | ||
275 | } | ||
276 | } | ||
277 | |||
278 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 251 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
279 | { | 252 | { |
280 | /* Propagate hose info into the subordinate devices. */ | ||
281 | |||
282 | struct list_head *ln; | ||
283 | struct pci_dev *dev = bus->self; | 253 | struct pci_dev *dev = bus->self; |
284 | 254 | ||
285 | if (pci_probe_only && dev && | 255 | if (pci_has_flag(PCI_PROBE_ONLY) && dev && |
286 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { | 256 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { |
287 | pci_read_bridge_bases(bus); | 257 | pci_read_bridge_bases(bus); |
288 | pcibios_fixup_device_resources(dev, bus); | ||
289 | } | ||
290 | |||
291 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | ||
292 | dev = pci_dev_b(ln); | ||
293 | |||
294 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
295 | pcibios_fixup_device_resources(dev, bus); | ||
296 | } | 258 | } |
297 | } | 259 | } |
298 | 260 | ||
@@ -302,40 +264,7 @@ pcibios_update_irq(struct pci_dev *dev, int irq) | |||
302 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 264 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
303 | } | 265 | } |
304 | 266 | ||
305 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
306 | struct resource *res) | ||
307 | { | ||
308 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
309 | unsigned long offset = 0; | ||
310 | |||
311 | if (res->flags & IORESOURCE_IO) | ||
312 | offset = hose->io_offset; | ||
313 | else if (res->flags & IORESOURCE_MEM) | ||
314 | offset = hose->mem_offset; | ||
315 | |||
316 | region->start = res->start - offset; | ||
317 | region->end = res->end - offset; | ||
318 | } | ||
319 | |||
320 | void __devinit | ||
321 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
322 | struct pci_bus_region *region) | ||
323 | { | ||
324 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
325 | unsigned long offset = 0; | ||
326 | |||
327 | if (res->flags & IORESOURCE_IO) | ||
328 | offset = hose->io_offset; | ||
329 | else if (res->flags & IORESOURCE_MEM) | ||
330 | offset = hose->mem_offset; | ||
331 | |||
332 | res->start = region->start + offset; | ||
333 | res->end = region->end + offset; | ||
334 | } | ||
335 | |||
336 | #ifdef CONFIG_HOTPLUG | 267 | #ifdef CONFIG_HOTPLUG |
337 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
338 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
339 | EXPORT_SYMBOL(PCIBIOS_MIN_IO); | 268 | EXPORT_SYMBOL(PCIBIOS_MIN_IO); |
340 | EXPORT_SYMBOL(PCIBIOS_MIN_MEM); | 269 | EXPORT_SYMBOL(PCIBIOS_MIN_MEM); |
341 | #endif | 270 | #endif |
diff --git a/arch/mn10300/include/asm/pci.h b/arch/mn10300/include/asm/pci.h index 6095a28561dd..8137c25c4e15 100644 --- a/arch/mn10300/include/asm/pci.h +++ b/arch/mn10300/include/asm/pci.h | |||
@@ -85,22 +85,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
85 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ | 85 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ |
86 | #include <asm-generic/pci-dma-compat.h> | 86 | #include <asm-generic/pci-dma-compat.h> |
87 | 87 | ||
88 | /** | ||
89 | * pcibios_resource_to_bus - convert resource to PCI bus address | ||
90 | * @dev: device which owns this resource | ||
91 | * @region: converted bus-centric region (start,end) | ||
92 | * @res: resource to convert | ||
93 | * | ||
94 | * Convert a resource to a PCI device bus address or bus window. | ||
95 | */ | ||
96 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
97 | struct pci_bus_region *region, | ||
98 | struct resource *res); | ||
99 | |||
100 | extern void pcibios_bus_to_resource(struct pci_dev *dev, | ||
101 | struct resource *res, | ||
102 | struct pci_bus_region *region); | ||
103 | |||
104 | static inline struct resource * | 88 | static inline struct resource * |
105 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | 89 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) |
106 | { | 90 | { |
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index a7c5f08ca9f5..6dce9fc2cf3c 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c | |||
@@ -32,8 +32,7 @@ struct pci_ops *pci_root_ops; | |||
32 | * insert specific PCI bus resources instead of using the platform-level bus | 32 | * insert specific PCI bus resources instead of using the platform-level bus |
33 | * resources directly for the PCI root bus. | 33 | * resources directly for the PCI root bus. |
34 | * | 34 | * |
35 | * These are configured and inserted by pcibios_init() and are attached to the | 35 | * These are configured and inserted by pcibios_init(). |
36 | * root bus by pcibios_fixup_bus(). | ||
37 | */ | 36 | */ |
38 | static struct resource pci_ioport_resource = { | 37 | static struct resource pci_ioport_resource = { |
39 | .name = "PCI IO", | 38 | .name = "PCI IO", |
@@ -78,52 +77,6 @@ static inline int __query(const struct pci_bus *bus, unsigned int devfn) | |||
78 | } | 77 | } |
79 | 78 | ||
80 | /* | 79 | /* |
81 | * translate Linuxcentric addresses to PCI bus addresses | ||
82 | */ | ||
83 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
84 | struct resource *res) | ||
85 | { | ||
86 | if (res->flags & IORESOURCE_IO) { | ||
87 | region->start = (res->start & 0x00ffffff); | ||
88 | region->end = (res->end & 0x00ffffff); | ||
89 | } | ||
90 | |||
91 | if (res->flags & IORESOURCE_MEM) { | ||
92 | region->start = (res->start & 0x03ffffff) | MEM_PAGING_REG; | ||
93 | region->end = (res->end & 0x03ffffff) | MEM_PAGING_REG; | ||
94 | } | ||
95 | |||
96 | #if 0 | ||
97 | printk(KERN_DEBUG "RES->BUS: %lx-%lx => %lx-%lx\n", | ||
98 | res->start, res->end, region->start, region->end); | ||
99 | #endif | ||
100 | } | ||
101 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
102 | |||
103 | /* | ||
104 | * translate PCI bus addresses to Linuxcentric addresses | ||
105 | */ | ||
106 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
107 | struct pci_bus_region *region) | ||
108 | { | ||
109 | if (res->flags & IORESOURCE_IO) { | ||
110 | res->start = (region->start & 0x00ffffff) | 0xbe000000; | ||
111 | res->end = (region->end & 0x00ffffff) | 0xbe000000; | ||
112 | } | ||
113 | |||
114 | if (res->flags & IORESOURCE_MEM) { | ||
115 | res->start = (region->start & 0x03ffffff) | 0xb8000000; | ||
116 | res->end = (region->end & 0x03ffffff) | 0xb8000000; | ||
117 | } | ||
118 | |||
119 | #if 0 | ||
120 | printk(KERN_INFO "BUS->RES: %lx-%lx => %lx-%lx\n", | ||
121 | region->start, region->end, res->start, res->end); | ||
122 | #endif | ||
123 | } | ||
124 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
125 | |||
126 | /* | ||
127 | * | 80 | * |
128 | */ | 81 | */ |
129 | static int pci_ampci_read_config_byte(struct pci_bus *bus, unsigned int devfn, | 82 | static int pci_ampci_read_config_byte(struct pci_bus *bus, unsigned int devfn, |
@@ -364,9 +317,6 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | |||
364 | if (!dev->resource[i].flags) | 317 | if (!dev->resource[i].flags) |
365 | continue; | 318 | continue; |
366 | 319 | ||
367 | region.start = dev->resource[i].start; | ||
368 | region.end = dev->resource[i].end; | ||
369 | pcibios_bus_to_resource(dev, &dev->resource[i], ®ion); | ||
370 | if (is_valid_resource(dev, i)) | 320 | if (is_valid_resource(dev, i)) |
371 | pci_claim_resource(dev, i); | 321 | pci_claim_resource(dev, i); |
372 | } | 322 | } |
@@ -397,6 +347,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) | |||
397 | */ | 347 | */ |
398 | static int __init pcibios_init(void) | 348 | static int __init pcibios_init(void) |
399 | { | 349 | { |
350 | resource_size_t io_offset, mem_offset; | ||
400 | LIST_HEAD(resources); | 351 | LIST_HEAD(resources); |
401 | 352 | ||
402 | ioport_resource.start = 0xA0000000; | 353 | ioport_resource.start = 0xA0000000; |
@@ -420,8 +371,13 @@ static int __init pcibios_init(void) | |||
420 | printk(KERN_INFO "PCI: Probing PCI hardware [mempage %08x]\n", | 371 | printk(KERN_INFO "PCI: Probing PCI hardware [mempage %08x]\n", |
421 | MEM_PAGING_REG); | 372 | MEM_PAGING_REG); |
422 | 373 | ||
423 | pci_add_resource(&resources, &pci_ioport_resource); | 374 | io_offset = pci_ioport_resource.start - |
424 | pci_add_resource(&resources, &pci_iomem_resource); | 375 | (pci_ioport_resource.start & 0x00ffffff); |
376 | mem_offset = pci_iomem_resource.start - | ||
377 | ((pci_iomem_resource.start & 0x03ffffff) | MEM_PAGING_REG); | ||
378 | |||
379 | pci_add_resource_offset(&resources, &pci_ioport_resource, io_offset); | ||
380 | pci_add_resource_offset(&resources, &pci_iomem_resource, mem_offset); | ||
425 | pci_root_bus = pci_scan_root_bus(NULL, 0, &pci_direct_ampci, NULL, | 381 | pci_root_bus = pci_scan_root_bus(NULL, 0, &pci_direct_ampci, NULL, |
426 | &resources); | 382 | &resources); |
427 | 383 | ||
diff --git a/arch/parisc/include/asm/pci.h b/arch/parisc/include/asm/pci.h index 2242a5c636c2..3234f492d575 100644 --- a/arch/parisc/include/asm/pci.h +++ b/arch/parisc/include/asm/pci.h | |||
@@ -82,38 +82,8 @@ struct pci_hba_data { | |||
82 | 82 | ||
83 | #ifdef CONFIG_64BIT | 83 | #ifdef CONFIG_64BIT |
84 | #define PCI_F_EXTEND 0xffffffff00000000UL | 84 | #define PCI_F_EXTEND 0xffffffff00000000UL |
85 | #define PCI_IS_LMMIO(hba,a) pci_is_lmmio(hba,a) | ||
86 | |||
87 | /* We need to know if an address is LMMMIO or GMMIO. | ||
88 | * LMMIO requires mangling and GMMIO we must use as-is. | ||
89 | */ | ||
90 | static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a) | ||
91 | { | ||
92 | return(((a) & PCI_F_EXTEND) == PCI_F_EXTEND); | ||
93 | } | ||
94 | |||
95 | /* | ||
96 | ** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses. | ||
97 | ** See pci.c for more conversions used by Generic PCI code. | ||
98 | ** | ||
99 | ** Platform characteristics/firmware guarantee that | ||
100 | ** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO | ||
101 | ** (2) PA_VIEW == IO_VIEW for GMMIO | ||
102 | */ | ||
103 | #define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \ | ||
104 | ? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \ | ||
105 | : (a)) /* GMMIO */ | ||
106 | #define PCI_HOST_ADDR(hba,a) (((a) & PCI_F_EXTEND) == 0 \ | ||
107 | ? (a) + hba->lmmio_space_offset \ | ||
108 | : (a)) | ||
109 | |||
110 | #else /* !CONFIG_64BIT */ | 85 | #else /* !CONFIG_64BIT */ |
111 | |||
112 | #define PCI_BUS_ADDR(hba,a) (a) | ||
113 | #define PCI_HOST_ADDR(hba,a) (a) | ||
114 | #define PCI_F_EXTEND 0UL | 86 | #define PCI_F_EXTEND 0UL |
115 | #define PCI_IS_LMMIO(hba,a) (1) /* 32-bit doesn't support GMMIO */ | ||
116 | |||
117 | #endif /* !CONFIG_64BIT */ | 87 | #endif /* !CONFIG_64BIT */ |
118 | 88 | ||
119 | /* | 89 | /* |
@@ -245,14 +215,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
245 | } | 215 | } |
246 | #endif | 216 | #endif |
247 | 217 | ||
248 | extern void | ||
249 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
250 | struct resource *res); | ||
251 | |||
252 | extern void | ||
253 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
254 | struct pci_bus_region *region); | ||
255 | |||
256 | static inline void pcibios_penalize_isa_irq(int irq, int active) | 218 | static inline void pcibios_penalize_isa_irq(int irq, int active) |
257 | { | 219 | { |
258 | /* We don't need to penalize isa irq's */ | 220 | /* We don't need to penalize isa irq's */ |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 9efd97405317..74d544b1cd22 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
@@ -195,58 +195,6 @@ void __init pcibios_init_bus(struct pci_bus *bus) | |||
195 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bridge_ctl); | 195 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bridge_ctl); |
196 | } | 196 | } |
197 | 197 | ||
198 | /* called by drivers/pci/setup-bus.c:pci_setup_bridge(). */ | ||
199 | void __devinit pcibios_resource_to_bus(struct pci_dev *dev, | ||
200 | struct pci_bus_region *region, struct resource *res) | ||
201 | { | ||
202 | #ifdef CONFIG_64BIT | ||
203 | struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data); | ||
204 | #endif | ||
205 | |||
206 | if (res->flags & IORESOURCE_IO) { | ||
207 | /* | ||
208 | ** I/O space may see busnumbers here. Something | ||
209 | ** in the form of 0xbbxxxx where bb is the bus num | ||
210 | ** and xxxx is the I/O port space address. | ||
211 | ** Remaining address translation are done in the | ||
212 | ** PCI Host adapter specific code - ie dino_out8. | ||
213 | */ | ||
214 | region->start = PCI_PORT_ADDR(res->start); | ||
215 | region->end = PCI_PORT_ADDR(res->end); | ||
216 | } else if (res->flags & IORESOURCE_MEM) { | ||
217 | /* Convert MMIO addr to PCI addr (undo global virtualization) */ | ||
218 | region->start = PCI_BUS_ADDR(hba, res->start); | ||
219 | region->end = PCI_BUS_ADDR(hba, res->end); | ||
220 | } | ||
221 | |||
222 | DBG_RES("pcibios_resource_to_bus(%02x %s [%lx,%lx])\n", | ||
223 | dev->bus->number, res->flags & IORESOURCE_IO ? "IO" : "MEM", | ||
224 | region->start, region->end); | ||
225 | } | ||
226 | |||
227 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
228 | struct pci_bus_region *region) | ||
229 | { | ||
230 | #ifdef CONFIG_64BIT | ||
231 | struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data); | ||
232 | #endif | ||
233 | |||
234 | if (res->flags & IORESOURCE_MEM) { | ||
235 | res->start = PCI_HOST_ADDR(hba, region->start); | ||
236 | res->end = PCI_HOST_ADDR(hba, region->end); | ||
237 | } | ||
238 | |||
239 | if (res->flags & IORESOURCE_IO) { | ||
240 | res->start = region->start; | ||
241 | res->end = region->end; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | #ifdef CONFIG_HOTPLUG | ||
246 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
247 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
248 | #endif | ||
249 | |||
250 | /* | 198 | /* |
251 | * pcibios align resources() is called every time generic PCI code | 199 | * pcibios align resources() is called every time generic PCI code |
252 | * wants to generate a new address. The process of looking for | 200 | * wants to generate a new address. The process of looking for |
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h index f54b3d26ce9d..201e352d488d 100644 --- a/arch/powerpc/include/asm/pci.h +++ b/arch/powerpc/include/asm/pci.h | |||
@@ -154,14 +154,6 @@ extern int pci_mmap_legacy_page_range(struct pci_bus *bus, | |||
154 | 154 | ||
155 | #endif /* CONFIG_PPC64 */ | 155 | #endif /* CONFIG_PPC64 */ |
156 | 156 | ||
157 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
158 | struct pci_bus_region *region, | ||
159 | struct resource *res); | ||
160 | |||
161 | extern void pcibios_bus_to_resource(struct pci_dev *dev, | ||
162 | struct resource *res, | ||
163 | struct pci_bus_region *region); | ||
164 | |||
165 | extern void pcibios_claim_one_bus(struct pci_bus *b); | 157 | extern void pcibios_claim_one_bus(struct pci_bus *b); |
166 | 158 | ||
167 | extern void pcibios_finish_adding_to_bus(struct pci_bus *bus); | 159 | extern void pcibios_finish_adding_to_bus(struct pci_bus *bus); |
diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 43268f15004e..f4f7ad89c5a8 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h | |||
@@ -45,8 +45,6 @@ extern void init_pci_config_tokens (void); | |||
45 | extern unsigned long get_phb_buid (struct device_node *); | 45 | extern unsigned long get_phb_buid (struct device_node *); |
46 | extern int rtas_setup_phb(struct pci_controller *phb); | 46 | extern int rtas_setup_phb(struct pci_controller *phb); |
47 | 47 | ||
48 | extern unsigned long pci_probe_only; | ||
49 | |||
50 | /* ---- EEH internal-use-only related routines ---- */ | 48 | /* ---- EEH internal-use-only related routines ---- */ |
51 | #ifdef CONFIG_EEH | 49 | #ifdef CONFIG_EEH |
52 | 50 | ||
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index cce98d76e905..910b9dea7037 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -50,9 +50,6 @@ static int global_phb_number; /* Global phb counter */ | |||
50 | /* ISA Memory physical address */ | 50 | /* ISA Memory physical address */ |
51 | resource_size_t isa_mem_base; | 51 | resource_size_t isa_mem_base; |
52 | 52 | ||
53 | /* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ | ||
54 | unsigned int pci_flags = 0; | ||
55 | |||
56 | 53 | ||
57 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; | 54 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; |
58 | 55 | ||
@@ -849,60 +846,6 @@ int pci_proc_domain(struct pci_bus *bus) | |||
849 | return 1; | 846 | return 1; |
850 | } | 847 | } |
851 | 848 | ||
852 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
853 | struct resource *res) | ||
854 | { | ||
855 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
856 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
857 | |||
858 | if (!hose) | ||
859 | return; | ||
860 | if (res->flags & IORESOURCE_IO) { | ||
861 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
862 | mask = 0xffffffffu; | ||
863 | } else if (res->flags & IORESOURCE_MEM) | ||
864 | offset = hose->pci_mem_offset; | ||
865 | |||
866 | region->start = (res->start - offset) & mask; | ||
867 | region->end = (res->end - offset) & mask; | ||
868 | } | ||
869 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
870 | |||
871 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
872 | struct pci_bus_region *region) | ||
873 | { | ||
874 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
875 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
876 | |||
877 | if (!hose) | ||
878 | return; | ||
879 | if (res->flags & IORESOURCE_IO) { | ||
880 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
881 | mask = 0xffffffffu; | ||
882 | } else if (res->flags & IORESOURCE_MEM) | ||
883 | offset = hose->pci_mem_offset; | ||
884 | res->start = (region->start + offset) & mask; | ||
885 | res->end = (region->end + offset) & mask; | ||
886 | } | ||
887 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
888 | |||
889 | /* Fixup a bus resource into a linux resource */ | ||
890 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) | ||
891 | { | ||
892 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
893 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
894 | |||
895 | if (res->flags & IORESOURCE_IO) { | ||
896 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
897 | mask = 0xffffffffu; | ||
898 | } else if (res->flags & IORESOURCE_MEM) | ||
899 | offset = hose->pci_mem_offset; | ||
900 | |||
901 | res->start = (res->start + offset) & mask; | ||
902 | res->end = (res->end + offset) & mask; | ||
903 | } | ||
904 | |||
905 | |||
906 | /* This header fixup will do the resource fixup for all devices as they are | 849 | /* This header fixup will do the resource fixup for all devices as they are |
907 | * probed, but not for bridge ranges | 850 | * probed, but not for bridge ranges |
908 | */ | 851 | */ |
@@ -942,18 +885,11 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev) | |||
942 | continue; | 885 | continue; |
943 | } | 886 | } |
944 | 887 | ||
945 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n", | 888 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n", |
946 | pci_name(dev), i, | 889 | pci_name(dev), i, |
947 | (unsigned long long)res->start,\ | 890 | (unsigned long long)res->start,\ |
948 | (unsigned long long)res->end, | 891 | (unsigned long long)res->end, |
949 | (unsigned int)res->flags); | 892 | (unsigned int)res->flags); |
950 | |||
951 | fixup_resource(res, dev); | ||
952 | |||
953 | pr_debug("PCI:%s %016llx-%016llx\n", | ||
954 | pci_name(dev), | ||
955 | (unsigned long long)res->start, | ||
956 | (unsigned long long)res->end); | ||
957 | } | 893 | } |
958 | 894 | ||
959 | /* Call machine specific resource fixup */ | 895 | /* Call machine specific resource fixup */ |
@@ -1055,27 +991,18 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) | |||
1055 | continue; | 991 | continue; |
1056 | } | 992 | } |
1057 | 993 | ||
1058 | pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n", | 994 | pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x]\n", |
1059 | pci_name(dev), i, | 995 | pci_name(dev), i, |
1060 | (unsigned long long)res->start,\ | 996 | (unsigned long long)res->start,\ |
1061 | (unsigned long long)res->end, | 997 | (unsigned long long)res->end, |
1062 | (unsigned int)res->flags); | 998 | (unsigned int)res->flags); |
1063 | 999 | ||
1064 | /* Perform fixup */ | ||
1065 | fixup_resource(res, dev); | ||
1066 | |||
1067 | /* Try to detect uninitialized P2P bridge resources, | 1000 | /* Try to detect uninitialized P2P bridge resources, |
1068 | * and clear them out so they get re-assigned later | 1001 | * and clear them out so they get re-assigned later |
1069 | */ | 1002 | */ |
1070 | if (pcibios_uninitialized_bridge_resource(bus, res)) { | 1003 | if (pcibios_uninitialized_bridge_resource(bus, res)) { |
1071 | res->flags = 0; | 1004 | res->flags = 0; |
1072 | pr_debug("PCI:%s (unassigned)\n", pci_name(dev)); | 1005 | pr_debug("PCI:%s (unassigned)\n", pci_name(dev)); |
1073 | } else { | ||
1074 | |||
1075 | pr_debug("PCI:%s %016llx-%016llx\n", | ||
1076 | pci_name(dev), | ||
1077 | (unsigned long long)res->start, | ||
1078 | (unsigned long long)res->end); | ||
1079 | } | 1006 | } |
1080 | } | 1007 | } |
1081 | } | 1008 | } |
@@ -1589,7 +1516,8 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1589 | (unsigned long long)res->start, | 1516 | (unsigned long long)res->start, |
1590 | (unsigned long long)res->end, | 1517 | (unsigned long long)res->end, |
1591 | (unsigned long)res->flags); | 1518 | (unsigned long)res->flags); |
1592 | pci_add_resource(resources, res); | 1519 | pci_add_resource_offset(resources, res, |
1520 | (resource_size_t) hose->io_base_virt - _IO_BASE); | ||
1593 | 1521 | ||
1594 | /* Hookup PHB Memory resources */ | 1522 | /* Hookup PHB Memory resources */ |
1595 | for (i = 0; i < 3; ++i) { | 1523 | for (i = 0; i < 3; ++i) { |
@@ -1612,7 +1540,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1612 | (unsigned long long)res->start, | 1540 | (unsigned long long)res->start, |
1613 | (unsigned long long)res->end, | 1541 | (unsigned long long)res->end, |
1614 | (unsigned long)res->flags); | 1542 | (unsigned long)res->flags); |
1615 | pci_add_resource(resources, res); | 1543 | pci_add_resource_offset(resources, res, hose->pci_mem_offset); |
1616 | } | 1544 | } |
1617 | 1545 | ||
1618 | pr_debug("PCI: PHB MEM offset = %016llx\n", | 1546 | pr_debug("PCI: PHB MEM offset = %016llx\n", |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 3318d39b7d4c..75417fdc773c 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -33,8 +33,6 @@ | |||
33 | #include <asm/machdep.h> | 33 | #include <asm/machdep.h> |
34 | #include <asm/ppc-pci.h> | 34 | #include <asm/ppc-pci.h> |
35 | 35 | ||
36 | unsigned long pci_probe_only = 1; | ||
37 | |||
38 | /* pci_io_base -- the base address from which io bars are offsets. | 36 | /* pci_io_base -- the base address from which io bars are offsets. |
39 | * This is the lowest I/O base address (so bar values are always positive), | 37 | * This is the lowest I/O base address (so bar values are always positive), |
40 | * and it *must* be the start of ISA space if an ISA bus exists because | 38 | * and it *must* be the start of ISA space if an ISA bus exists because |
@@ -55,9 +53,6 @@ static int __init pcibios_init(void) | |||
55 | */ | 53 | */ |
56 | ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot; | 54 | ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot; |
57 | 55 | ||
58 | if (pci_probe_only) | ||
59 | pci_add_flags(PCI_PROBE_ONLY); | ||
60 | |||
61 | /* On ppc64, we always enable PCI domains and we keep domain 0 | 56 | /* On ppc64, we always enable PCI domains and we keep domain 0 |
62 | * backward compatible in /proc for video cards | 57 | * backward compatible in /proc for video cards |
63 | */ | 58 | */ |
diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index 6cd8f0196b6d..140735c18c36 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c | |||
@@ -276,7 +276,7 @@ void __init find_and_init_phbs(void) | |||
276 | pci_devs_phb_init(); | 276 | pci_devs_phb_init(); |
277 | 277 | ||
278 | /* | 278 | /* |
279 | * pci_probe_only and pci_assign_all_buses can be set via properties | 279 | * PCI_PROBE_ONLY and PCI_REASSIGN_ALL_BUS can be set via properties |
280 | * in chosen. | 280 | * in chosen. |
281 | */ | 281 | */ |
282 | if (of_chosen) { | 282 | if (of_chosen) { |
@@ -284,8 +284,12 @@ void __init find_and_init_phbs(void) | |||
284 | 284 | ||
285 | prop = of_get_property(of_chosen, | 285 | prop = of_get_property(of_chosen, |
286 | "linux,pci-probe-only", NULL); | 286 | "linux,pci-probe-only", NULL); |
287 | if (prop) | 287 | if (prop) { |
288 | pci_probe_only = *prop; | 288 | if (*prop) |
289 | pci_add_flags(PCI_PROBE_ONLY); | ||
290 | else | ||
291 | pci_clear_flags(PCI_PROBE_ONLY); | ||
292 | } | ||
289 | 293 | ||
290 | #ifdef CONFIG_PPC32 /* Will be made generic soon */ | 294 | #ifdef CONFIG_PPC32 /* Will be made generic soon */ |
291 | prop = of_get_property(of_chosen, | 295 | prop = of_get_property(of_chosen, |
diff --git a/arch/powerpc/platforms/iseries/pci.c b/arch/powerpc/platforms/iseries/pci.c index c75412884625..171b2f30d6ad 100644 --- a/arch/powerpc/platforms/iseries/pci.c +++ b/arch/powerpc/platforms/iseries/pci.c | |||
@@ -868,7 +868,7 @@ void __init iSeries_pcibios_init(void) | |||
868 | /* Install IO hooks */ | 868 | /* Install IO hooks */ |
869 | ppc_pci_io = iseries_pci_io; | 869 | ppc_pci_io = iseries_pci_io; |
870 | 870 | ||
871 | pci_probe_only = 1; | 871 | pci_add_flags(PCI_PROBE_ONLY); |
872 | 872 | ||
873 | /* iSeries has no IO space in the common sense, it needs to set | 873 | /* iSeries has no IO space in the common sense, it needs to set |
874 | * the IO base to 0 | 874 | * the IO base to 0 |
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 401e3f3f74c8..465ee8f5c086 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -620,7 +620,7 @@ void __init maple_pci_init(void) | |||
620 | } | 620 | } |
621 | 621 | ||
622 | /* Tell pci.c to not change any resource allocations. */ | 622 | /* Tell pci.c to not change any resource allocations. */ |
623 | pci_probe_only = 1; | 623 | pci_add_flags(PCI_PROBE_ONLY); |
624 | } | 624 | } |
625 | 625 | ||
626 | int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel) | 626 | int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel) |
diff --git a/arch/powerpc/platforms/pasemi/pci.c b/arch/powerpc/platforms/pasemi/pci.c index b6a0ec45c695..b27d8861116b 100644 --- a/arch/powerpc/platforms/pasemi/pci.c +++ b/arch/powerpc/platforms/pasemi/pci.c | |||
@@ -231,7 +231,7 @@ void __init pas_pci_init(void) | |||
231 | pci_devs_phb_init(); | 231 | pci_devs_phb_init(); |
232 | 232 | ||
233 | /* Use the common resource allocation mechanism */ | 233 | /* Use the common resource allocation mechanism */ |
234 | pci_probe_only = 1; | 234 | pci_add_flags(PCI_PROBE_ONLY); |
235 | } | 235 | } |
236 | 236 | ||
237 | void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset) | 237 | void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset) |
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 31a7d3a7ce25..43bbe1bda939 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -1059,9 +1059,6 @@ void __init pmac_pci_init(void) | |||
1059 | } | 1059 | } |
1060 | /* pmac_check_ht_link(); */ | 1060 | /* pmac_check_ht_link(); */ |
1061 | 1061 | ||
1062 | /* We can allocate missing resources if any */ | ||
1063 | pci_probe_only = 0; | ||
1064 | |||
1065 | #else /* CONFIG_PPC64 */ | 1062 | #else /* CONFIG_PPC64 */ |
1066 | init_p2pbridge(); | 1063 | init_p2pbridge(); |
1067 | init_second_ohare(); | 1064 | init_second_ohare(); |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 5e155dfc4320..fbdd74dac3ac 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -1299,15 +1299,14 @@ void __init pnv_pci_init_ioda1_phb(struct device_node *np) | |||
1299 | /* Setup MSI support */ | 1299 | /* Setup MSI support */ |
1300 | pnv_pci_init_ioda_msis(phb); | 1300 | pnv_pci_init_ioda_msis(phb); |
1301 | 1301 | ||
1302 | /* We set both probe_only and PCI_REASSIGN_ALL_RSRC. This is an | 1302 | /* We set both PCI_PROBE_ONLY and PCI_REASSIGN_ALL_RSRC. This is an |
1303 | * odd combination which essentially means that we skip all resource | 1303 | * odd combination which essentially means that we skip all resource |
1304 | * fixups and assignments in the generic code, and do it all | 1304 | * fixups and assignments in the generic code, and do it all |
1305 | * ourselves here | 1305 | * ourselves here |
1306 | */ | 1306 | */ |
1307 | pci_probe_only = 1; | ||
1308 | ppc_md.pcibios_fixup_phb = pnv_pci_ioda_fixup_phb; | 1307 | ppc_md.pcibios_fixup_phb = pnv_pci_ioda_fixup_phb; |
1309 | ppc_md.pcibios_enable_device_hook = pnv_pci_enable_device_hook; | 1308 | ppc_md.pcibios_enable_device_hook = pnv_pci_enable_device_hook; |
1310 | pci_add_flags(PCI_REASSIGN_ALL_RSRC); | 1309 | pci_add_flags(PCI_PROBE_ONLY | PCI_REASSIGN_ALL_RSRC); |
1311 | 1310 | ||
1312 | /* Reset IODA tables to a clean state */ | 1311 | /* Reset IODA tables to a clean state */ |
1313 | rc = opal_pci_reset(phb_id, OPAL_PCI_IODA_TABLE_RESET, OPAL_ASSERT_RESET); | 1312 | rc = opal_pci_reset(phb_id, OPAL_PCI_IODA_TABLE_RESET, OPAL_ASSERT_RESET); |
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index a70bc1e385eb..69dca5a8ada8 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
@@ -555,10 +555,7 @@ void __init pnv_pci_init(void) | |||
555 | { | 555 | { |
556 | struct device_node *np; | 556 | struct device_node *np; |
557 | 557 | ||
558 | pci_set_flags(PCI_CAN_SKIP_ISA_ALIGN); | 558 | pci_add_flags(PCI_CAN_SKIP_ISA_ALIGN); |
559 | |||
560 | /* We do not want to just probe */ | ||
561 | pci_probe_only = 0; | ||
562 | 559 | ||
563 | /* OPAL absent, try POPAL first then RTAS detection of PHBs */ | 560 | /* OPAL absent, try POPAL first then RTAS detection of PHBs */ |
564 | if (!firmware_has_feature(FW_FEATURE_OPAL)) { | 561 | if (!firmware_has_feature(FW_FEATURE_OPAL)) { |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index f79f1278dfca..fc2a6f60f665 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -380,6 +380,9 @@ static void __init pSeries_setup_arch(void) | |||
380 | 380 | ||
381 | fwnmi_init(); | 381 | fwnmi_init(); |
382 | 382 | ||
383 | /* By default, only probe PCI (can be overriden by rtas_pci) */ | ||
384 | pci_add_flags(PCI_PROBE_ONLY); | ||
385 | |||
383 | /* Find and initialize PCI host bridges */ | 386 | /* Find and initialize PCI host bridges */ |
384 | init_pci_config_tokens(); | 387 | init_pci_config_tokens(); |
385 | find_and_init_phbs(); | 388 | find_and_init_phbs(); |
diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c index e0262cd0e2d3..299157afb517 100644 --- a/arch/powerpc/platforms/wsp/wsp_pci.c +++ b/arch/powerpc/platforms/wsp/wsp_pci.c | |||
@@ -682,7 +682,6 @@ static int __init wsp_setup_one_phb(struct device_node *np) | |||
682 | /* XXX Force re-assigning of everything for now */ | 682 | /* XXX Force re-assigning of everything for now */ |
683 | pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC | | 683 | pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC | |
684 | PCI_ENABLE_PROC_DOMAINS); | 684 | PCI_ENABLE_PROC_DOMAINS); |
685 | pci_probe_only = 0; | ||
686 | 685 | ||
687 | /* Calculate how the TCE space is divided */ | 686 | /* Calculate how the TCE space is divided */ |
688 | phb->dma32_base = 0; | 687 | phb->dma32_base = 0; |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 8f18dd090a66..e5aacef1d04b 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -37,11 +37,20 @@ static void __devinit pcibios_scanbus(struct pci_channel *hose) | |||
37 | static int next_busno; | 37 | static int next_busno; |
38 | static int need_domain_info; | 38 | static int need_domain_info; |
39 | LIST_HEAD(resources); | 39 | LIST_HEAD(resources); |
40 | struct resource *res; | ||
41 | resource_size_t offset; | ||
40 | int i; | 42 | int i; |
41 | struct pci_bus *bus; | 43 | struct pci_bus *bus; |
42 | 44 | ||
43 | for (i = 0; i < hose->nr_resources; i++) | 45 | for (i = 0; i < hose->nr_resources; i++) { |
44 | pci_add_resource(&resources, hose->resources + i); | 46 | res = hose->resources + i; |
47 | offset = 0; | ||
48 | if (res->flags & IORESOURCE_IO) | ||
49 | offset = hose->io_offset; | ||
50 | else if (res->flags & IORESOURCE_MEM) | ||
51 | offset = hose->mem_offset; | ||
52 | pci_add_resource_offset(&resources, res, offset); | ||
53 | } | ||
45 | 54 | ||
46 | bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose, | 55 | bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose, |
47 | &resources); | 56 | &resources); |
@@ -143,42 +152,12 @@ static int __init pcibios_init(void) | |||
143 | } | 152 | } |
144 | subsys_initcall(pcibios_init); | 153 | subsys_initcall(pcibios_init); |
145 | 154 | ||
146 | static void pcibios_fixup_device_resources(struct pci_dev *dev, | ||
147 | struct pci_bus *bus) | ||
148 | { | ||
149 | /* Update device resources. */ | ||
150 | struct pci_channel *hose = bus->sysdata; | ||
151 | unsigned long offset = 0; | ||
152 | int i; | ||
153 | |||
154 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
155 | if (!dev->resource[i].start) | ||
156 | continue; | ||
157 | if (dev->resource[i].flags & IORESOURCE_IO) | ||
158 | offset = hose->io_offset; | ||
159 | else if (dev->resource[i].flags & IORESOURCE_MEM) | ||
160 | offset = hose->mem_offset; | ||
161 | |||
162 | dev->resource[i].start += offset; | ||
163 | dev->resource[i].end += offset; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | /* | 155 | /* |
168 | * Called after each bus is probed, but before its children | 156 | * Called after each bus is probed, but before its children |
169 | * are examined. | 157 | * are examined. |
170 | */ | 158 | */ |
171 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 159 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
172 | { | 160 | { |
173 | struct pci_dev *dev; | ||
174 | struct list_head *ln; | ||
175 | |||
176 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | ||
177 | dev = pci_dev_b(ln); | ||
178 | |||
179 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
180 | pcibios_fixup_device_resources(dev, bus); | ||
181 | } | ||
182 | } | 161 | } |
183 | 162 | ||
184 | /* | 163 | /* |
@@ -208,36 +187,6 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, | |||
208 | return start; | 187 | return start; |
209 | } | 188 | } |
210 | 189 | ||
211 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
212 | struct resource *res) | ||
213 | { | ||
214 | struct pci_channel *hose = dev->sysdata; | ||
215 | unsigned long offset = 0; | ||
216 | |||
217 | if (res->flags & IORESOURCE_IO) | ||
218 | offset = hose->io_offset; | ||
219 | else if (res->flags & IORESOURCE_MEM) | ||
220 | offset = hose->mem_offset; | ||
221 | |||
222 | region->start = res->start - offset; | ||
223 | region->end = res->end - offset; | ||
224 | } | ||
225 | |||
226 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
227 | struct pci_bus_region *region) | ||
228 | { | ||
229 | struct pci_channel *hose = dev->sysdata; | ||
230 | unsigned long offset = 0; | ||
231 | |||
232 | if (res->flags & IORESOURCE_IO) | ||
233 | offset = hose->io_offset; | ||
234 | else if (res->flags & IORESOURCE_MEM) | ||
235 | offset = hose->mem_offset; | ||
236 | |||
237 | res->start = region->start + offset; | ||
238 | res->end = region->end + offset; | ||
239 | } | ||
240 | |||
241 | int pcibios_enable_device(struct pci_dev *dev, int mask) | 190 | int pcibios_enable_device(struct pci_dev *dev, int mask) |
242 | { | 191 | { |
243 | return pci_enable_resources(dev, mask); | 192 | return pci_enable_resources(dev, mask); |
@@ -381,8 +330,6 @@ EXPORT_SYMBOL(pci_iounmap); | |||
381 | #endif /* CONFIG_GENERIC_IOMAP */ | 330 | #endif /* CONFIG_GENERIC_IOMAP */ |
382 | 331 | ||
383 | #ifdef CONFIG_HOTPLUG | 332 | #ifdef CONFIG_HOTPLUG |
384 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
385 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
386 | EXPORT_SYMBOL(PCIBIOS_MIN_IO); | 333 | EXPORT_SYMBOL(PCIBIOS_MIN_IO); |
387 | EXPORT_SYMBOL(PCIBIOS_MIN_MEM); | 334 | EXPORT_SYMBOL(PCIBIOS_MIN_MEM); |
388 | #endif | 335 | #endif |
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h index cb21e2399dc1..bff96c2e7d25 100644 --- a/arch/sh/include/asm/pci.h +++ b/arch/sh/include/asm/pci.h | |||
@@ -114,12 +114,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
114 | /* Board-specific fixup routines. */ | 114 | /* Board-specific fixup routines. */ |
115 | int pcibios_map_platform_irq(const struct pci_dev *dev, u8 slot, u8 pin); | 115 | int pcibios_map_platform_irq(const struct pci_dev *dev, u8 slot, u8 pin); |
116 | 116 | ||
117 | extern void pcibios_resource_to_bus(struct pci_dev *dev, | ||
118 | struct pci_bus_region *region, struct resource *res); | ||
119 | |||
120 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
121 | struct pci_bus_region *region); | ||
122 | |||
123 | #define pci_domain_nr(bus) ((struct pci_channel *)(bus)->sysdata)->index | 117 | #define pci_domain_nr(bus) ((struct pci_channel *)(bus)->sysdata)->index |
124 | 118 | ||
125 | static inline int pci_proc_domain(struct pci_bus *bus) | 119 | static inline int pci_proc_domain(struct pci_bus *bus) |
diff --git a/arch/sparc/include/asm/pci_32.h b/arch/sparc/include/asm/pci_32.h index 6de7f7bf956a..dc503297481f 100644 --- a/arch/sparc/include/asm/pci_32.h +++ b/arch/sparc/include/asm/pci_32.h | |||
@@ -52,14 +52,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
52 | * 64Kbytes by the Host controller. | 52 | * 64Kbytes by the Host controller. |
53 | */ | 53 | */ |
54 | 54 | ||
55 | extern void | ||
56 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
57 | struct resource *res); | ||
58 | |||
59 | extern void | ||
60 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
61 | struct pci_bus_region *region); | ||
62 | |||
63 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | 55 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) |
64 | { | 56 | { |
65 | return PCI_IRQ_NONE; | 57 | return PCI_IRQ_NONE; |
diff --git a/arch/sparc/include/asm/pci_64.h b/arch/sparc/include/asm/pci_64.h index 755a4bb6bcd3..1633b718d3bc 100644 --- a/arch/sparc/include/asm/pci_64.h +++ b/arch/sparc/include/asm/pci_64.h | |||
@@ -73,14 +73,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
73 | enum pci_mmap_state mmap_state, | 73 | enum pci_mmap_state mmap_state, |
74 | int write_combine); | 74 | int write_combine); |
75 | 75 | ||
76 | extern void | ||
77 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
78 | struct resource *res); | ||
79 | |||
80 | extern void | ||
81 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
82 | struct pci_bus_region *region); | ||
83 | |||
84 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | 76 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) |
85 | { | 77 | { |
86 | return PCI_IRQ_NONE; | 78 | return PCI_IRQ_NONE; |
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index c7bec25fdb1c..aba6b958b2a5 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c | |||
@@ -15,14 +15,19 @@ | |||
15 | 15 | ||
16 | /* The LEON architecture does not rely on a BIOS or bootloader to setup | 16 | /* The LEON architecture does not rely on a BIOS or bootloader to setup |
17 | * PCI for us. The Linux generic routines are used to setup resources, | 17 | * PCI for us. The Linux generic routines are used to setup resources, |
18 | * reset values of confuration-space registers settings ae preseved. | 18 | * reset values of configuration-space register settings are preserved. |
19 | * | ||
20 | * PCI Memory and Prefetchable Memory is direct-mapped. However I/O Space is | ||
21 | * accessed through a Window which is translated to low 64KB in PCI space, the | ||
22 | * first 4KB is not used so 60KB is available. | ||
19 | */ | 23 | */ |
20 | void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) | 24 | void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) |
21 | { | 25 | { |
22 | LIST_HEAD(resources); | 26 | LIST_HEAD(resources); |
23 | struct pci_bus *root_bus; | 27 | struct pci_bus *root_bus; |
24 | 28 | ||
25 | pci_add_resource(&resources, &info->io_space); | 29 | pci_add_resource_offset(&resources, &info->io_space, |
30 | info->io_space.start - 0x1000); | ||
26 | pci_add_resource(&resources, &info->mem_space); | 31 | pci_add_resource(&resources, &info->mem_space); |
27 | 32 | ||
28 | root_bus = pci_scan_root_bus(&ofdev->dev, 0, info->ops, info, | 33 | root_bus = pci_scan_root_bus(&ofdev->dev, 0, info->ops, info, |
@@ -38,44 +43,6 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) | |||
38 | } | 43 | } |
39 | } | 44 | } |
40 | 45 | ||
41 | /* PCI Memory and Prefetchable Memory is direct-mapped. However I/O Space is | ||
42 | * accessed through a Window which is translated to low 64KB in PCI space, the | ||
43 | * first 4KB is not used so 60KB is available. | ||
44 | * | ||
45 | * This function is used by generic code to translate resource addresses into | ||
46 | * PCI addresses. | ||
47 | */ | ||
48 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
49 | struct resource *res) | ||
50 | { | ||
51 | struct leon_pci_info *info = dev->bus->sysdata; | ||
52 | |||
53 | region->start = res->start; | ||
54 | region->end = res->end; | ||
55 | |||
56 | if (res->flags & IORESOURCE_IO) { | ||
57 | region->start -= (info->io_space.start - 0x1000); | ||
58 | region->end -= (info->io_space.start - 0x1000); | ||
59 | } | ||
60 | } | ||
61 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
62 | |||
63 | /* see pcibios_resource_to_bus() comment */ | ||
64 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
65 | struct pci_bus_region *region) | ||
66 | { | ||
67 | struct leon_pci_info *info = dev->bus->sysdata; | ||
68 | |||
69 | res->start = region->start; | ||
70 | res->end = region->end; | ||
71 | |||
72 | if (res->flags & IORESOURCE_IO) { | ||
73 | res->start += (info->io_space.start - 0x1000); | ||
74 | res->end += (info->io_space.start - 0x1000); | ||
75 | } | ||
76 | } | ||
77 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
78 | |||
79 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) | 46 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) |
80 | { | 47 | { |
81 | struct leon_pci_info *info = pbus->sysdata; | 48 | struct leon_pci_info *info = pbus->sysdata; |
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index bb8bc2e519ac..253e8ac2783f 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c | |||
@@ -691,8 +691,10 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm, | |||
691 | 691 | ||
692 | printk("PCI: Scanning PBM %s\n", node->full_name); | 692 | printk("PCI: Scanning PBM %s\n", node->full_name); |
693 | 693 | ||
694 | pci_add_resource(&resources, &pbm->io_space); | 694 | pci_add_resource_offset(&resources, &pbm->io_space, |
695 | pci_add_resource(&resources, &pbm->mem_space); | 695 | pbm->io_space.start); |
696 | pci_add_resource_offset(&resources, &pbm->mem_space, | ||
697 | pbm->mem_space.start); | ||
696 | bus = pci_create_root_bus(parent, pbm->pci_first_busno, pbm->pci_ops, | 698 | bus = pci_create_root_bus(parent, pbm->pci_first_busno, pbm->pci_ops, |
697 | pbm, &resources); | 699 | pbm, &resources); |
698 | if (!bus) { | 700 | if (!bus) { |
@@ -755,46 +757,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
755 | return 0; | 757 | return 0; |
756 | } | 758 | } |
757 | 759 | ||
758 | void pcibios_resource_to_bus(struct pci_dev *pdev, struct pci_bus_region *region, | ||
759 | struct resource *res) | ||
760 | { | ||
761 | struct pci_pbm_info *pbm = pdev->bus->sysdata; | ||
762 | struct resource zero_res, *root; | ||
763 | |||
764 | zero_res.start = 0; | ||
765 | zero_res.end = 0; | ||
766 | zero_res.flags = res->flags; | ||
767 | |||
768 | if (res->flags & IORESOURCE_IO) | ||
769 | root = &pbm->io_space; | ||
770 | else | ||
771 | root = &pbm->mem_space; | ||
772 | |||
773 | pci_resource_adjust(&zero_res, root); | ||
774 | |||
775 | region->start = res->start - zero_res.start; | ||
776 | region->end = res->end - zero_res.start; | ||
777 | } | ||
778 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
779 | |||
780 | void pcibios_bus_to_resource(struct pci_dev *pdev, struct resource *res, | ||
781 | struct pci_bus_region *region) | ||
782 | { | ||
783 | struct pci_pbm_info *pbm = pdev->bus->sysdata; | ||
784 | struct resource *root; | ||
785 | |||
786 | res->start = region->start; | ||
787 | res->end = region->end; | ||
788 | |||
789 | if (res->flags & IORESOURCE_IO) | ||
790 | root = &pbm->io_space; | ||
791 | else | ||
792 | root = &pbm->mem_space; | ||
793 | |||
794 | pci_resource_adjust(res, root); | ||
795 | } | ||
796 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
797 | |||
798 | char * __devinit pcibios_setup(char *str) | 760 | char * __devinit pcibios_setup(char *str) |
799 | { | 761 | { |
800 | return str; | 762 | return str; |
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c index a8f07fe10cad..6c1248f5f56a 100644 --- a/arch/unicore32/kernel/pci.c +++ b/arch/unicore32/kernel/pci.c | |||
@@ -19,9 +19,9 @@ | |||
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <asm-generic/pci-bridge.h> | ||
22 | 23 | ||
23 | static int debug_pci; | 24 | static int debug_pci; |
24 | static int use_firmware; | ||
25 | 25 | ||
26 | #define CONFIG_CMD(bus, devfn, where) \ | 26 | #define CONFIG_CMD(bus, devfn, where) \ |
27 | (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3)) | 27 | (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3)) |
@@ -276,7 +276,7 @@ static int __init pci_common_init(void) | |||
276 | 276 | ||
277 | pci_fixup_irqs(pci_common_swizzle, pci_puv3_map_irq); | 277 | pci_fixup_irqs(pci_common_swizzle, pci_puv3_map_irq); |
278 | 278 | ||
279 | if (!use_firmware) { | 279 | if (!pci_has_flag(PCI_PROBE_ONLY)) { |
280 | /* | 280 | /* |
281 | * Size the bridge windows. | 281 | * Size the bridge windows. |
282 | */ | 282 | */ |
@@ -303,7 +303,7 @@ char * __devinit pcibios_setup(char *str) | |||
303 | debug_pci = 1; | 303 | debug_pci = 1; |
304 | return NULL; | 304 | return NULL; |
305 | } else if (!strcmp(str, "firmware")) { | 305 | } else if (!strcmp(str, "firmware")) { |
306 | use_firmware = 1; | 306 | pci_add_flags(PCI_PROBE_ONLY); |
307 | return NULL; | 307 | return NULL; |
308 | } | 308 | } |
309 | return str; | 309 | return str; |
diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c index 61045c192e88..eb30e356f5be 100644 --- a/arch/xtensa/kernel/pci.c +++ b/arch/xtensa/kernel/pci.c | |||
@@ -153,7 +153,7 @@ static void __init pci_controller_apertures(struct pci_controller *pci_ctrl, | |||
153 | } | 153 | } |
154 | res->start += io_offset; | 154 | res->start += io_offset; |
155 | res->end += io_offset; | 155 | res->end += io_offset; |
156 | pci_add_resource(resources, res); | 156 | pci_add_resource_offset(resources, res, io_offset); |
157 | 157 | ||
158 | for (i = 0; i < 3; i++) { | 158 | for (i = 0; i < 3; i++) { |
159 | res = &pci_ctrl->mem_resources[i]; | 159 | res = &pci_ctrl->mem_resources[i]; |
@@ -200,24 +200,9 @@ subsys_initcall(pcibios_init); | |||
200 | 200 | ||
201 | void __init pcibios_fixup_bus(struct pci_bus *bus) | 201 | void __init pcibios_fixup_bus(struct pci_bus *bus) |
202 | { | 202 | { |
203 | struct pci_controller *pci_ctrl = bus->sysdata; | ||
204 | struct resource *res; | ||
205 | unsigned long io_offset; | ||
206 | int i; | ||
207 | |||
208 | io_offset = (unsigned long)pci_ctrl->io_space.base; | ||
209 | if (bus->parent) { | 203 | if (bus->parent) { |
210 | /* This is a subordinate bridge */ | 204 | /* This is a subordinate bridge */ |
211 | pci_read_bridge_bases(bus); | 205 | pci_read_bridge_bases(bus); |
212 | |||
213 | for (i = 0; i < 4; i++) { | ||
214 | if ((res = bus->resource[i]) == NULL || !res->flags) | ||
215 | continue; | ||
216 | if (io_offset && (res->flags & IORESOURCE_IO)) { | ||
217 | res->start += io_offset; | ||
218 | res->end += io_offset; | ||
219 | } | ||
220 | } | ||
221 | } | 206 | } |
222 | } | 207 | } |
223 | 208 | ||
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 7ff10c1e8664..0610e91bceb2 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
@@ -553,7 +553,6 @@ dino_fixup_bus(struct pci_bus *bus) | |||
553 | struct list_head *ln; | 553 | struct list_head *ln; |
554 | struct pci_dev *dev; | 554 | struct pci_dev *dev; |
555 | struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); | 555 | struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); |
556 | int port_base = HBA_PORT_BASE(dino_dev->hba.hba_num); | ||
557 | 556 | ||
558 | DBG(KERN_WARNING "%s(0x%p) bus %d platform_data 0x%p\n", | 557 | DBG(KERN_WARNING "%s(0x%p) bus %d platform_data 0x%p\n", |
559 | __func__, bus, bus->secondary, | 558 | __func__, bus, bus->secondary, |
@@ -599,8 +598,6 @@ dino_fixup_bus(struct pci_bus *bus) | |||
599 | 598 | ||
600 | 599 | ||
601 | list_for_each(ln, &bus->devices) { | 600 | list_for_each(ln, &bus->devices) { |
602 | int i; | ||
603 | |||
604 | dev = pci_dev_b(ln); | 601 | dev = pci_dev_b(ln); |
605 | if (is_card_dino(&dino_dev->hba.dev->id)) | 602 | if (is_card_dino(&dino_dev->hba.dev->id)) |
606 | dino_card_fixup(dev); | 603 | dino_card_fixup(dev); |
@@ -612,21 +609,6 @@ dino_fixup_bus(struct pci_bus *bus) | |||
612 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) | 609 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) |
613 | continue; | 610 | continue; |
614 | 611 | ||
615 | /* Adjust the I/O Port space addresses */ | ||
616 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
617 | struct resource *res = &dev->resource[i]; | ||
618 | if (res->flags & IORESOURCE_IO) { | ||
619 | res->start |= port_base; | ||
620 | res->end |= port_base; | ||
621 | } | ||
622 | #ifdef __LP64__ | ||
623 | /* Sign Extend MMIO addresses */ | ||
624 | else if (res->flags & IORESOURCE_MEM) { | ||
625 | res->start |= F_EXTEND(0UL); | ||
626 | res->end |= F_EXTEND(0UL); | ||
627 | } | ||
628 | #endif | ||
629 | } | ||
630 | /* null out the ROM resource if there is one (we don't | 612 | /* null out the ROM resource if there is one (we don't |
631 | * care about an expansion rom on parisc, since it | 613 | * care about an expansion rom on parisc, since it |
632 | * usually contains (x86) bios code) */ | 614 | * usually contains (x86) bios code) */ |
@@ -991,11 +973,14 @@ static int __init dino_probe(struct parisc_device *dev) | |||
991 | 973 | ||
992 | dev->dev.platform_data = dino_dev; | 974 | dev->dev.platform_data = dino_dev; |
993 | 975 | ||
994 | pci_add_resource(&resources, &dino_dev->hba.io_space); | 976 | pci_add_resource_offset(&resources, &dino_dev->hba.io_space, |
977 | HBA_PORT_BASE(dino_dev->hba.hba_num)); | ||
995 | if (dino_dev->hba.lmmio_space.flags) | 978 | if (dino_dev->hba.lmmio_space.flags) |
996 | pci_add_resource(&resources, &dino_dev->hba.lmmio_space); | 979 | pci_add_resource_offset(&resources, &dino_dev->hba.lmmio_space, |
980 | dino_dev->hba.lmmio_space_offset); | ||
997 | if (dino_dev->hba.elmmio_space.flags) | 981 | if (dino_dev->hba.elmmio_space.flags) |
998 | pci_add_resource(&resources, &dino_dev->hba.elmmio_space); | 982 | pci_add_resource_offset(&resources, &dino_dev->hba.elmmio_space, |
983 | dino_dev->hba.lmmio_space_offset); | ||
999 | if (dino_dev->hba.gmmio_space.flags) | 984 | if (dino_dev->hba.gmmio_space.flags) |
1000 | pci_add_resource(&resources, &dino_dev->hba.gmmio_space); | 985 | pci_add_resource(&resources, &dino_dev->hba.gmmio_space); |
1001 | 986 | ||
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index d5f3d753a108..e8857647e210 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c | |||
@@ -635,7 +635,6 @@ lba_fixup_bus(struct pci_bus *bus) | |||
635 | u16 status; | 635 | u16 status; |
636 | #endif | 636 | #endif |
637 | struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge)); | 637 | struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge)); |
638 | int lba_portbase = HBA_PORT_BASE(ldev->hba.hba_num); | ||
639 | 638 | ||
640 | DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n", | 639 | DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n", |
641 | bus, bus->secondary, bus->bridge->platform_data); | 640 | bus, bus->secondary, bus->bridge->platform_data); |
@@ -726,27 +725,6 @@ lba_fixup_bus(struct pci_bus *bus) | |||
726 | if (!res->start) | 725 | if (!res->start) |
727 | continue; | 726 | continue; |
728 | 727 | ||
729 | if (res->flags & IORESOURCE_IO) { | ||
730 | DBG("lba_fixup_bus() I/O Ports [%lx/%lx] -> ", | ||
731 | res->start, res->end); | ||
732 | res->start |= lba_portbase; | ||
733 | res->end |= lba_portbase; | ||
734 | DBG("[%lx/%lx]\n", res->start, res->end); | ||
735 | } else if (res->flags & IORESOURCE_MEM) { | ||
736 | /* | ||
737 | ** Convert PCI (IO_VIEW) addresses to | ||
738 | ** processor (PA_VIEW) addresses | ||
739 | */ | ||
740 | DBG("lba_fixup_bus() MMIO [%lx/%lx] -> ", | ||
741 | res->start, res->end); | ||
742 | res->start = PCI_HOST_ADDR(HBA_DATA(ldev), res->start); | ||
743 | res->end = PCI_HOST_ADDR(HBA_DATA(ldev), res->end); | ||
744 | DBG("[%lx/%lx]\n", res->start, res->end); | ||
745 | } else { | ||
746 | DBG("lba_fixup_bus() WTF? 0x%lx [%lx/%lx] XXX", | ||
747 | res->flags, res->start, res->end); | ||
748 | } | ||
749 | |||
750 | /* | 728 | /* |
751 | ** FIXME: this will result in whinging for devices | 729 | ** FIXME: this will result in whinging for devices |
752 | ** that share expansion ROMs (think quad tulip), but | 730 | ** that share expansion ROMs (think quad tulip), but |
@@ -1514,11 +1492,14 @@ lba_driver_probe(struct parisc_device *dev) | |||
1514 | lba_dev->hba.lmmio_space.flags = 0; | 1492 | lba_dev->hba.lmmio_space.flags = 0; |
1515 | } | 1493 | } |
1516 | 1494 | ||
1517 | pci_add_resource(&resources, &lba_dev->hba.io_space); | 1495 | pci_add_resource_offset(&resources, &lba_dev->hba.io_space, |
1496 | HBA_PORT_BASE(lba_dev->hba.hba_num)); | ||
1518 | if (lba_dev->hba.elmmio_space.start) | 1497 | if (lba_dev->hba.elmmio_space.start) |
1519 | pci_add_resource(&resources, &lba_dev->hba.elmmio_space); | 1498 | pci_add_resource_offset(&resources, &lba_dev->hba.elmmio_space, |
1499 | lba_dev->hba.lmmio_space_offset); | ||
1520 | if (lba_dev->hba.lmmio_space.flags) | 1500 | if (lba_dev->hba.lmmio_space.flags) |
1521 | pci_add_resource(&resources, &lba_dev->hba.lmmio_space); | 1501 | pci_add_resource_offset(&resources, &lba_dev->hba.lmmio_space, |
1502 | lba_dev->hba.lmmio_space_offset); | ||
1522 | if (lba_dev->hba.gmmio_space.flags) | 1503 | if (lba_dev->hba.gmmio_space.flags) |
1523 | pci_add_resource(&resources, &lba_dev->hba.gmmio_space); | 1504 | pci_add_resource(&resources, &lba_dev->hba.gmmio_space); |
1524 | 1505 | ||
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 398f5d859791..4ce5ef2f2826 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -18,28 +18,36 @@ | |||
18 | 18 | ||
19 | #include "pci.h" | 19 | #include "pci.h" |
20 | 20 | ||
21 | void pci_add_resource(struct list_head *resources, struct resource *res) | 21 | void pci_add_resource_offset(struct list_head *resources, struct resource *res, |
22 | resource_size_t offset) | ||
22 | { | 23 | { |
23 | struct pci_bus_resource *bus_res; | 24 | struct pci_host_bridge_window *window; |
24 | 25 | ||
25 | bus_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL); | 26 | window = kzalloc(sizeof(struct pci_host_bridge_window), GFP_KERNEL); |
26 | if (!bus_res) { | 27 | if (!window) { |
27 | printk(KERN_ERR "PCI: can't add bus resource %pR\n", res); | 28 | printk(KERN_ERR "PCI: can't add host bridge window %pR\n", res); |
28 | return; | 29 | return; |
29 | } | 30 | } |
30 | 31 | ||
31 | bus_res->res = res; | 32 | window->res = res; |
32 | list_add_tail(&bus_res->list, resources); | 33 | window->offset = offset; |
34 | list_add_tail(&window->list, resources); | ||
35 | } | ||
36 | EXPORT_SYMBOL(pci_add_resource_offset); | ||
37 | |||
38 | void pci_add_resource(struct list_head *resources, struct resource *res) | ||
39 | { | ||
40 | pci_add_resource_offset(resources, res, 0); | ||
33 | } | 41 | } |
34 | EXPORT_SYMBOL(pci_add_resource); | 42 | EXPORT_SYMBOL(pci_add_resource); |
35 | 43 | ||
36 | void pci_free_resource_list(struct list_head *resources) | 44 | void pci_free_resource_list(struct list_head *resources) |
37 | { | 45 | { |
38 | struct pci_bus_resource *bus_res, *tmp; | 46 | struct pci_host_bridge_window *window, *tmp; |
39 | 47 | ||
40 | list_for_each_entry_safe(bus_res, tmp, resources, list) { | 48 | list_for_each_entry_safe(window, tmp, resources, list) { |
41 | list_del(&bus_res->list); | 49 | list_del(&window->list); |
42 | kfree(bus_res); | 50 | kfree(window); |
43 | } | 51 | } |
44 | } | 52 | } |
45 | EXPORT_SYMBOL(pci_free_resource_list); | 53 | EXPORT_SYMBOL(pci_free_resource_list); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index dc904bd4b569..36c22032ea14 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ | 15 | #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ |
16 | #define CARDBUS_RESERVE_BUSNR 3 | 16 | #define CARDBUS_RESERVE_BUSNR 3 |
17 | 17 | ||
18 | static LIST_HEAD(pci_host_bridges); | ||
19 | |||
18 | /* Ugh. Need to stop exporting this to modules. */ | 20 | /* Ugh. Need to stop exporting this to modules. */ |
19 | LIST_HEAD(pci_root_buses); | 21 | LIST_HEAD(pci_root_buses); |
20 | EXPORT_SYMBOL(pci_root_buses); | 22 | EXPORT_SYMBOL(pci_root_buses); |
@@ -42,6 +44,82 @@ int no_pci_devices(void) | |||
42 | } | 44 | } |
43 | EXPORT_SYMBOL(no_pci_devices); | 45 | EXPORT_SYMBOL(no_pci_devices); |
44 | 46 | ||
47 | static struct pci_host_bridge *pci_host_bridge(struct pci_dev *dev) | ||
48 | { | ||
49 | struct pci_bus *bus; | ||
50 | struct pci_host_bridge *bridge; | ||
51 | |||
52 | bus = dev->bus; | ||
53 | while (bus->parent) | ||
54 | bus = bus->parent; | ||
55 | |||
56 | list_for_each_entry(bridge, &pci_host_bridges, list) { | ||
57 | if (bridge->bus == bus) | ||
58 | return bridge; | ||
59 | } | ||
60 | |||
61 | return NULL; | ||
62 | } | ||
63 | |||
64 | static bool resource_contains(struct resource *res1, struct resource *res2) | ||
65 | { | ||
66 | return res1->start <= res2->start && res1->end >= res2->end; | ||
67 | } | ||
68 | |||
69 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
70 | struct resource *res) | ||
71 | { | ||
72 | struct pci_host_bridge *bridge = pci_host_bridge(dev); | ||
73 | struct pci_host_bridge_window *window; | ||
74 | resource_size_t offset = 0; | ||
75 | |||
76 | list_for_each_entry(window, &bridge->windows, list) { | ||
77 | if (resource_type(res) != resource_type(window->res)) | ||
78 | continue; | ||
79 | |||
80 | if (resource_contains(window->res, res)) { | ||
81 | offset = window->offset; | ||
82 | break; | ||
83 | } | ||
84 | } | ||
85 | |||
86 | region->start = res->start - offset; | ||
87 | region->end = res->end - offset; | ||
88 | } | ||
89 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
90 | |||
91 | static bool region_contains(struct pci_bus_region *region1, | ||
92 | struct pci_bus_region *region2) | ||
93 | { | ||
94 | return region1->start <= region2->start && region1->end >= region2->end; | ||
95 | } | ||
96 | |||
97 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
98 | struct pci_bus_region *region) | ||
99 | { | ||
100 | struct pci_host_bridge *bridge = pci_host_bridge(dev); | ||
101 | struct pci_host_bridge_window *window; | ||
102 | struct pci_bus_region bus_region; | ||
103 | resource_size_t offset = 0; | ||
104 | |||
105 | list_for_each_entry(window, &bridge->windows, list) { | ||
106 | if (resource_type(res) != resource_type(window->res)) | ||
107 | continue; | ||
108 | |||
109 | bus_region.start = window->res->start - window->offset; | ||
110 | bus_region.end = window->res->end - window->offset; | ||
111 | |||
112 | if (region_contains(&bus_region, region)) { | ||
113 | offset = window->offset; | ||
114 | break; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | res->start = region->start + offset; | ||
119 | res->end = region->end + offset; | ||
120 | } | ||
121 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
122 | |||
45 | /* | 123 | /* |
46 | * PCI Bus Class | 124 | * PCI Bus Class |
47 | */ | 125 | */ |
@@ -135,6 +213,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
135 | { | 213 | { |
136 | u32 l, sz, mask; | 214 | u32 l, sz, mask; |
137 | u16 orig_cmd; | 215 | u16 orig_cmd; |
216 | struct pci_bus_region region; | ||
138 | 217 | ||
139 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; | 218 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; |
140 | 219 | ||
@@ -214,11 +293,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
214 | /* Address above 32-bit boundary; disable the BAR */ | 293 | /* Address above 32-bit boundary; disable the BAR */ |
215 | pci_write_config_dword(dev, pos, 0); | 294 | pci_write_config_dword(dev, pos, 0); |
216 | pci_write_config_dword(dev, pos + 4, 0); | 295 | pci_write_config_dword(dev, pos + 4, 0); |
217 | res->start = 0; | 296 | region.start = 0; |
218 | res->end = sz64; | 297 | region.end = sz64; |
298 | pcibios_bus_to_resource(dev, res, ®ion); | ||
219 | } else { | 299 | } else { |
220 | res->start = l64; | 300 | region.start = l64; |
221 | res->end = l64 + sz64; | 301 | region.end = l64 + sz64; |
302 | pcibios_bus_to_resource(dev, res, ®ion); | ||
222 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", | 303 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", |
223 | pos, res); | 304 | pos, res); |
224 | } | 305 | } |
@@ -228,8 +309,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
228 | if (!sz) | 309 | if (!sz) |
229 | goto fail; | 310 | goto fail; |
230 | 311 | ||
231 | res->start = l; | 312 | region.start = l; |
232 | res->end = l + sz; | 313 | region.end = l + sz; |
314 | pcibios_bus_to_resource(dev, res, ®ion); | ||
233 | 315 | ||
234 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | 316 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); |
235 | } | 317 | } |
@@ -266,7 +348,8 @@ static void __devinit pci_read_bridge_io(struct pci_bus *child) | |||
266 | struct pci_dev *dev = child->self; | 348 | struct pci_dev *dev = child->self; |
267 | u8 io_base_lo, io_limit_lo; | 349 | u8 io_base_lo, io_limit_lo; |
268 | unsigned long base, limit; | 350 | unsigned long base, limit; |
269 | struct resource *res; | 351 | struct pci_bus_region region; |
352 | struct resource *res, res2; | ||
270 | 353 | ||
271 | res = child->resource[0]; | 354 | res = child->resource[0]; |
272 | pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); | 355 | pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); |
@@ -284,10 +367,13 @@ static void __devinit pci_read_bridge_io(struct pci_bus *child) | |||
284 | 367 | ||
285 | if (base && base <= limit) { | 368 | if (base && base <= limit) { |
286 | res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO; | 369 | res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO; |
370 | region.start = base; | ||
371 | region.end = limit + 0xfff; | ||
372 | pcibios_bus_to_resource(dev, &res2, ®ion); | ||
287 | if (!res->start) | 373 | if (!res->start) |
288 | res->start = base; | 374 | res->start = res2.start; |
289 | if (!res->end) | 375 | if (!res->end) |
290 | res->end = limit + 0xfff; | 376 | res->end = res2.end; |
291 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); | 377 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); |
292 | } | 378 | } |
293 | } | 379 | } |
@@ -297,6 +383,7 @@ static void __devinit pci_read_bridge_mmio(struct pci_bus *child) | |||
297 | struct pci_dev *dev = child->self; | 383 | struct pci_dev *dev = child->self; |
298 | u16 mem_base_lo, mem_limit_lo; | 384 | u16 mem_base_lo, mem_limit_lo; |
299 | unsigned long base, limit; | 385 | unsigned long base, limit; |
386 | struct pci_bus_region region; | ||
300 | struct resource *res; | 387 | struct resource *res; |
301 | 388 | ||
302 | res = child->resource[1]; | 389 | res = child->resource[1]; |
@@ -306,8 +393,9 @@ static void __devinit pci_read_bridge_mmio(struct pci_bus *child) | |||
306 | limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16; | 393 | limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16; |
307 | if (base && base <= limit) { | 394 | if (base && base <= limit) { |
308 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; | 395 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; |
309 | res->start = base; | 396 | region.start = base; |
310 | res->end = limit + 0xfffff; | 397 | region.end = limit + 0xfffff; |
398 | pcibios_bus_to_resource(dev, res, ®ion); | ||
311 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); | 399 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); |
312 | } | 400 | } |
313 | } | 401 | } |
@@ -317,6 +405,7 @@ static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child) | |||
317 | struct pci_dev *dev = child->self; | 405 | struct pci_dev *dev = child->self; |
318 | u16 mem_base_lo, mem_limit_lo; | 406 | u16 mem_base_lo, mem_limit_lo; |
319 | unsigned long base, limit; | 407 | unsigned long base, limit; |
408 | struct pci_bus_region region; | ||
320 | struct resource *res; | 409 | struct resource *res; |
321 | 410 | ||
322 | res = child->resource[2]; | 411 | res = child->resource[2]; |
@@ -353,8 +442,9 @@ static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child) | |||
353 | IORESOURCE_MEM | IORESOURCE_PREFETCH; | 442 | IORESOURCE_MEM | IORESOURCE_PREFETCH; |
354 | if (res->flags & PCI_PREF_RANGE_TYPE_64) | 443 | if (res->flags & PCI_PREF_RANGE_TYPE_64) |
355 | res->flags |= IORESOURCE_MEM_64; | 444 | res->flags |= IORESOURCE_MEM_64; |
356 | res->start = base; | 445 | region.start = base; |
357 | res->end = limit + 0xfffff; | 446 | region.end = limit + 0xfffff; |
447 | pcibios_bus_to_resource(dev, res, ®ion); | ||
358 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); | 448 | dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res); |
359 | } | 449 | } |
360 | } | 450 | } |
@@ -900,6 +990,8 @@ int pci_setup_device(struct pci_dev *dev) | |||
900 | u8 hdr_type; | 990 | u8 hdr_type; |
901 | struct pci_slot *slot; | 991 | struct pci_slot *slot; |
902 | int pos = 0; | 992 | int pos = 0; |
993 | struct pci_bus_region region; | ||
994 | struct resource *res; | ||
903 | 995 | ||
904 | if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type)) | 996 | if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type)) |
905 | return -EIO; | 997 | return -EIO; |
@@ -961,20 +1053,28 @@ int pci_setup_device(struct pci_dev *dev) | |||
961 | u8 progif; | 1053 | u8 progif; |
962 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); | 1054 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); |
963 | if ((progif & 1) == 0) { | 1055 | if ((progif & 1) == 0) { |
964 | dev->resource[0].start = 0x1F0; | 1056 | region.start = 0x1F0; |
965 | dev->resource[0].end = 0x1F7; | 1057 | region.end = 0x1F7; |
966 | dev->resource[0].flags = LEGACY_IO_RESOURCE; | 1058 | res = &dev->resource[0]; |
967 | dev->resource[1].start = 0x3F6; | 1059 | res->flags = LEGACY_IO_RESOURCE; |
968 | dev->resource[1].end = 0x3F6; | 1060 | pcibios_bus_to_resource(dev, res, ®ion); |
969 | dev->resource[1].flags = LEGACY_IO_RESOURCE; | 1061 | region.start = 0x3F6; |
1062 | region.end = 0x3F6; | ||
1063 | res = &dev->resource[1]; | ||
1064 | res->flags = LEGACY_IO_RESOURCE; | ||
1065 | pcibios_bus_to_resource(dev, res, ®ion); | ||
970 | } | 1066 | } |
971 | if ((progif & 4) == 0) { | 1067 | if ((progif & 4) == 0) { |
972 | dev->resource[2].start = 0x170; | 1068 | region.start = 0x170; |
973 | dev->resource[2].end = 0x177; | 1069 | region.end = 0x177; |
974 | dev->resource[2].flags = LEGACY_IO_RESOURCE; | 1070 | res = &dev->resource[2]; |
975 | dev->resource[3].start = 0x376; | 1071 | res->flags = LEGACY_IO_RESOURCE; |
976 | dev->resource[3].end = 0x376; | 1072 | pcibios_bus_to_resource(dev, res, ®ion); |
977 | dev->resource[3].flags = LEGACY_IO_RESOURCE; | 1073 | region.start = 0x376; |
1074 | region.end = 0x376; | ||
1075 | res = &dev->resource[3]; | ||
1076 | res->flags = LEGACY_IO_RESOURCE; | ||
1077 | pcibios_bus_to_resource(dev, res, ®ion); | ||
978 | } | 1078 | } |
979 | } | 1079 | } |
980 | break; | 1080 | break; |
@@ -1543,21 +1643,27 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) | |||
1543 | struct pci_bus *pci_create_root_bus(struct device *parent, int bus, | 1643 | struct pci_bus *pci_create_root_bus(struct device *parent, int bus, |
1544 | struct pci_ops *ops, void *sysdata, struct list_head *resources) | 1644 | struct pci_ops *ops, void *sysdata, struct list_head *resources) |
1545 | { | 1645 | { |
1546 | int error, i; | 1646 | int error; |
1647 | struct pci_host_bridge *bridge; | ||
1547 | struct pci_bus *b, *b2; | 1648 | struct pci_bus *b, *b2; |
1548 | struct device *dev; | 1649 | struct device *dev; |
1549 | struct pci_bus_resource *bus_res, *n; | 1650 | struct pci_host_bridge_window *window, *n; |
1550 | struct resource *res; | 1651 | struct resource *res; |
1652 | resource_size_t offset; | ||
1653 | char bus_addr[64]; | ||
1654 | char *fmt; | ||
1655 | |||
1656 | bridge = kzalloc(sizeof(*bridge), GFP_KERNEL); | ||
1657 | if (!bridge) | ||
1658 | return NULL; | ||
1551 | 1659 | ||
1552 | b = pci_alloc_bus(); | 1660 | b = pci_alloc_bus(); |
1553 | if (!b) | 1661 | if (!b) |
1554 | return NULL; | 1662 | goto err_bus; |
1555 | 1663 | ||
1556 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 1664 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
1557 | if (!dev) { | 1665 | if (!dev) |
1558 | kfree(b); | 1666 | goto err_dev; |
1559 | return NULL; | ||
1560 | } | ||
1561 | 1667 | ||
1562 | b->sysdata = sysdata; | 1668 | b->sysdata = sysdata; |
1563 | b->ops = ops; | 1669 | b->ops = ops; |
@@ -1569,10 +1675,6 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus, | |||
1569 | goto err_out; | 1675 | goto err_out; |
1570 | } | 1676 | } |
1571 | 1677 | ||
1572 | down_write(&pci_bus_sem); | ||
1573 | list_add_tail(&b->node, &pci_root_buses); | ||
1574 | up_write(&pci_bus_sem); | ||
1575 | |||
1576 | dev->parent = parent; | 1678 | dev->parent = parent; |
1577 | dev->release = pci_release_bus_bridge_dev; | 1679 | dev->release = pci_release_bus_bridge_dev; |
1578 | dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus); | 1680 | dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus); |
@@ -1598,31 +1700,53 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus, | |||
1598 | 1700 | ||
1599 | b->number = b->secondary = bus; | 1701 | b->number = b->secondary = bus; |
1600 | 1702 | ||
1601 | /* Add initial resources to the bus */ | 1703 | bridge->bus = b; |
1602 | list_for_each_entry_safe(bus_res, n, resources, list) | 1704 | INIT_LIST_HEAD(&bridge->windows); |
1603 | list_move_tail(&bus_res->list, &b->resources); | ||
1604 | 1705 | ||
1605 | if (parent) | 1706 | if (parent) |
1606 | dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev)); | 1707 | dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev)); |
1607 | else | 1708 | else |
1608 | printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev)); | 1709 | printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev)); |
1609 | 1710 | ||
1610 | pci_bus_for_each_resource(b, res, i) { | 1711 | /* Add initial resources to the bus */ |
1611 | if (res) | 1712 | list_for_each_entry_safe(window, n, resources, list) { |
1612 | dev_info(&b->dev, "root bus resource %pR\n", res); | 1713 | list_move_tail(&window->list, &bridge->windows); |
1714 | res = window->res; | ||
1715 | offset = window->offset; | ||
1716 | pci_bus_add_resource(b, res, 0); | ||
1717 | if (offset) { | ||
1718 | if (resource_type(res) == IORESOURCE_IO) | ||
1719 | fmt = " (bus address [%#06llx-%#06llx])"; | ||
1720 | else | ||
1721 | fmt = " (bus address [%#010llx-%#010llx])"; | ||
1722 | snprintf(bus_addr, sizeof(bus_addr), fmt, | ||
1723 | (unsigned long long) (res->start - offset), | ||
1724 | (unsigned long long) (res->end - offset)); | ||
1725 | } else | ||
1726 | bus_addr[0] = '\0'; | ||
1727 | dev_info(&b->dev, "root bus resource %pR%s\n", res, bus_addr); | ||
1613 | } | 1728 | } |
1614 | 1729 | ||
1730 | down_write(&pci_bus_sem); | ||
1731 | list_add_tail(&bridge->list, &pci_host_bridges); | ||
1732 | list_add_tail(&b->node, &pci_root_buses); | ||
1733 | up_write(&pci_bus_sem); | ||
1734 | |||
1615 | return b; | 1735 | return b; |
1616 | 1736 | ||
1617 | class_dev_reg_err: | 1737 | class_dev_reg_err: |
1618 | device_unregister(dev); | 1738 | device_unregister(dev); |
1619 | dev_reg_err: | 1739 | dev_reg_err: |
1620 | down_write(&pci_bus_sem); | 1740 | down_write(&pci_bus_sem); |
1741 | list_del(&bridge->list); | ||
1621 | list_del(&b->node); | 1742 | list_del(&b->node); |
1622 | up_write(&pci_bus_sem); | 1743 | up_write(&pci_bus_sem); |
1623 | err_out: | 1744 | err_out: |
1624 | kfree(dev); | 1745 | kfree(dev); |
1746 | err_dev: | ||
1625 | kfree(b); | 1747 | kfree(b); |
1748 | err_bus: | ||
1749 | kfree(bridge); | ||
1626 | return NULL; | 1750 | return NULL; |
1627 | } | 1751 | } |
1628 | 1752 | ||
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c9214a14b49b..8fa2d4be88de 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -25,8 +25,11 @@ | |||
25 | #include <linux/ioport.h> | 25 | #include <linux/ioport.h> |
26 | #include <linux/cache.h> | 26 | #include <linux/cache.h> |
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <asm-generic/pci-bridge.h> | ||
28 | #include "pci.h" | 29 | #include "pci.h" |
29 | 30 | ||
31 | unsigned int pci_flags; | ||
32 | |||
30 | struct pci_dev_resource { | 33 | struct pci_dev_resource { |
31 | struct list_head list; | 34 | struct list_head list; |
32 | struct resource *res; | 35 | struct resource *res; |
diff --git a/include/asm-generic/pci-bridge.h b/include/asm-generic/pci-bridge.h index 4a5aca2a2c94..a5b5d5a89a4f 100644 --- a/include/asm-generic/pci-bridge.h +++ b/include/asm-generic/pci-bridge.h | |||
@@ -45,6 +45,11 @@ static inline void pci_add_flags(int flags) | |||
45 | pci_flags |= flags; | 45 | pci_flags |= flags; |
46 | } | 46 | } |
47 | 47 | ||
48 | static inline void pci_clear_flags(int flags) | ||
49 | { | ||
50 | pci_flags &= ~flags; | ||
51 | } | ||
52 | |||
48 | static inline int pci_has_flag(int flag) | 53 | static inline int pci_has_flag(int flag) |
49 | { | 54 | { |
50 | return pci_flags & flag; | 55 | return pci_flags & flag; |
@@ -52,6 +57,7 @@ static inline int pci_has_flag(int flag) | |||
52 | #else | 57 | #else |
53 | static inline void pci_set_flags(int flags) { } | 58 | static inline void pci_set_flags(int flags) { } |
54 | static inline void pci_add_flags(int flags) { } | 59 | static inline void pci_add_flags(int flags) { } |
60 | static inline void pci_clear_flags(int flags) { } | ||
55 | static inline int pci_has_flag(int flag) | 61 | static inline int pci_has_flag(int flag) |
56 | { | 62 | { |
57 | return 0; | 63 | return 0; |
diff --git a/include/asm-generic/pci.h b/include/asm-generic/pci.h index 26373cff4546..e80a0495e5b0 100644 --- a/include/asm-generic/pci.h +++ b/include/asm-generic/pci.h | |||
@@ -6,30 +6,6 @@ | |||
6 | #ifndef _ASM_GENERIC_PCI_H | 6 | #ifndef _ASM_GENERIC_PCI_H |
7 | #define _ASM_GENERIC_PCI_H | 7 | #define _ASM_GENERIC_PCI_H |
8 | 8 | ||
9 | /** | ||
10 | * pcibios_resource_to_bus - convert resource to PCI bus address | ||
11 | * @dev: device which owns this resource | ||
12 | * @region: converted bus-centric region (start,end) | ||
13 | * @res: resource to convert | ||
14 | * | ||
15 | * Convert a resource to a PCI device bus address or bus window. | ||
16 | */ | ||
17 | static inline void | ||
18 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
19 | struct resource *res) | ||
20 | { | ||
21 | region->start = res->start; | ||
22 | region->end = res->end; | ||
23 | } | ||
24 | |||
25 | static inline void | ||
26 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
27 | struct pci_bus_region *region) | ||
28 | { | ||
29 | res->start = region->start; | ||
30 | res->end = region->end; | ||
31 | } | ||
32 | |||
33 | static inline struct resource * | 9 | static inline struct resource * |
34 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | 10 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) |
35 | { | 11 | { |
diff --git a/include/linux/pci.h b/include/linux/pci.h index bcaa51ca7858..be58a51706cc 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -368,6 +368,18 @@ static inline int pci_channel_offline(struct pci_dev *pdev) | |||
368 | return (pdev->error_state != pci_channel_io_normal); | 368 | return (pdev->error_state != pci_channel_io_normal); |
369 | } | 369 | } |
370 | 370 | ||
371 | struct pci_host_bridge_window { | ||
372 | struct list_head list; | ||
373 | struct resource *res; /* host bridge aperture (CPU address) */ | ||
374 | resource_size_t offset; /* bus address + offset = CPU address */ | ||
375 | }; | ||
376 | |||
377 | struct pci_host_bridge { | ||
378 | struct list_head list; | ||
379 | struct pci_bus *bus; /* root bus */ | ||
380 | struct list_head windows; /* pci_host_bridge_windows */ | ||
381 | }; | ||
382 | |||
371 | /* | 383 | /* |
372 | * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond | 384 | * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond |
373 | * to P2P or CardBus bridge windows) go in a table. Additional ones (for | 385 | * to P2P or CardBus bridge windows) go in a table. Additional ones (for |
@@ -636,6 +648,10 @@ void pci_fixup_cardbus(struct pci_bus *); | |||
636 | 648 | ||
637 | /* Generic PCI functions used internally */ | 649 | /* Generic PCI functions used internally */ |
638 | 650 | ||
651 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
652 | struct resource *res); | ||
653 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
654 | struct pci_bus_region *region); | ||
639 | void pcibios_scan_specific_bus(int busn); | 655 | void pcibios_scan_specific_bus(int busn); |
640 | extern struct pci_bus *pci_find_bus(int domain, int busnr); | 656 | extern struct pci_bus *pci_find_bus(int domain, int busnr); |
641 | void pci_bus_add_devices(const struct pci_bus *bus); | 657 | void pci_bus_add_devices(const struct pci_bus *bus); |
@@ -896,6 +912,8 @@ void pci_release_selected_regions(struct pci_dev *, int); | |||
896 | 912 | ||
897 | /* drivers/pci/bus.c */ | 913 | /* drivers/pci/bus.c */ |
898 | void pci_add_resource(struct list_head *resources, struct resource *res); | 914 | void pci_add_resource(struct list_head *resources, struct resource *res); |
915 | void pci_add_resource_offset(struct list_head *resources, struct resource *res, | ||
916 | resource_size_t offset); | ||
899 | void pci_free_resource_list(struct list_head *resources); | 917 | void pci_free_resource_list(struct list_head *resources); |
900 | void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags); | 918 | void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags); |
901 | struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n); | 919 | struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n); |