diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/pci.h | 7 | ||||
-rw-r--r-- | arch/x86/include/asm/topology.h | 14 | ||||
-rw-r--r-- | arch/x86/pci/acpi.c | 59 | ||||
-rw-r--r-- | arch/x86/pci/amd_bus.c | 10 | ||||
-rw-r--r-- | arch/x86/pci/bus_numa.c | 13 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 128 | ||||
-rw-r--r-- | arch/x86/pci/fixup.c | 24 | ||||
-rw-r--r-- | arch/x86/pci/irq.c | 6 | ||||
-rw-r--r-- | arch/x86/pci/legacy.c | 4 | ||||
-rw-r--r-- | arch/x86/pci/numaq_32.c | 6 | ||||
-rw-r--r-- | arch/x86/pci/visws.c | 4 |
11 files changed, 66 insertions, 209 deletions
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index 1ac6114c9ea5..96ae4f4040bb 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h | |||
@@ -26,11 +26,6 @@ extern int pci_routeirq; | |||
26 | extern int noioapicquirk; | 26 | extern int noioapicquirk; |
27 | extern int noioapicreroute; | 27 | extern int noioapicreroute; |
28 | 28 | ||
29 | /* scan a bus after allocating a pci_sysdata for it */ | ||
30 | extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, | ||
31 | int node); | ||
32 | extern struct pci_bus *pci_scan_bus_with_sysdata(int busno); | ||
33 | |||
34 | #ifdef CONFIG_PCI | 29 | #ifdef CONFIG_PCI |
35 | 30 | ||
36 | #ifdef CONFIG_PCI_DOMAINS | 31 | #ifdef CONFIG_PCI_DOMAINS |
@@ -70,7 +65,7 @@ extern unsigned long pci_mem_start; | |||
70 | 65 | ||
71 | extern int pcibios_enabled; | 66 | extern int pcibios_enabled; |
72 | void pcibios_config_init(void); | 67 | void pcibios_config_init(void); |
73 | struct pci_bus *pcibios_scan_root(int bus); | 68 | void pcibios_scan_root(int bus); |
74 | 69 | ||
75 | void pcibios_set_master(struct pci_dev *dev); | 70 | void pcibios_set_master(struct pci_dev *dev); |
76 | void pcibios_penalize_isa_irq(int irq, int active); | 71 | void pcibios_penalize_isa_irq(int irq, int active); |
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index b28097e4c8c3..0e8f04f2c26f 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
@@ -132,19 +132,7 @@ static inline void arch_fix_phys_package_id(int num, u32 slot) | |||
132 | } | 132 | } |
133 | 133 | ||
134 | struct pci_bus; | 134 | struct pci_bus; |
135 | int x86_pci_root_bus_node(int bus); | ||
135 | void x86_pci_root_bus_resources(int bus, struct list_head *resources); | 136 | void x86_pci_root_bus_resources(int bus, struct list_head *resources); |
136 | 137 | ||
137 | #ifdef CONFIG_NUMA | ||
138 | extern int get_mp_bus_to_node(int busnum); | ||
139 | extern void set_mp_bus_to_node(int busnum, int node); | ||
140 | #else | ||
141 | static inline int get_mp_bus_to_node(int busnum) | ||
142 | { | ||
143 | return 0; | ||
144 | } | ||
145 | static inline void set_mp_bus_to_node(int busnum, int node) | ||
146 | { | ||
147 | } | ||
148 | #endif | ||
149 | |||
150 | #endif /* _ASM_X86_TOPOLOGY_H */ | 138 | #endif /* _ASM_X86_TOPOLOGY_H */ |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 4f25ec077552..01edac6c5e18 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -218,9 +218,8 @@ static void teardown_mcfg_map(struct pci_root_info *info) | |||
218 | } | 218 | } |
219 | #endif | 219 | #endif |
220 | 220 | ||
221 | static acpi_status | 221 | static acpi_status resource_to_addr(struct acpi_resource *resource, |
222 | resource_to_addr(struct acpi_resource *resource, | 222 | struct acpi_resource_address64 *addr) |
223 | struct acpi_resource_address64 *addr) | ||
224 | { | 223 | { |
225 | acpi_status status; | 224 | acpi_status status; |
226 | struct acpi_resource_memory24 *memory24; | 225 | struct acpi_resource_memory24 *memory24; |
@@ -265,8 +264,7 @@ resource_to_addr(struct acpi_resource *resource, | |||
265 | return AE_ERROR; | 264 | return AE_ERROR; |
266 | } | 265 | } |
267 | 266 | ||
268 | static acpi_status | 267 | static acpi_status count_resource(struct acpi_resource *acpi_res, void *data) |
269 | count_resource(struct acpi_resource *acpi_res, void *data) | ||
270 | { | 268 | { |
271 | struct pci_root_info *info = data; | 269 | struct pci_root_info *info = data; |
272 | struct acpi_resource_address64 addr; | 270 | struct acpi_resource_address64 addr; |
@@ -278,8 +276,7 @@ count_resource(struct acpi_resource *acpi_res, void *data) | |||
278 | return AE_OK; | 276 | return AE_OK; |
279 | } | 277 | } |
280 | 278 | ||
281 | static acpi_status | 279 | static acpi_status setup_resource(struct acpi_resource *acpi_res, void *data) |
282 | setup_resource(struct acpi_resource *acpi_res, void *data) | ||
283 | { | 280 | { |
284 | struct pci_root_info *info = data; | 281 | struct pci_root_info *info = data; |
285 | struct resource *res; | 282 | struct resource *res; |
@@ -435,9 +432,9 @@ static void release_pci_root_info(struct pci_host_bridge *bridge) | |||
435 | __release_pci_root_info(info); | 432 | __release_pci_root_info(info); |
436 | } | 433 | } |
437 | 434 | ||
438 | static void | 435 | static void probe_pci_root_info(struct pci_root_info *info, |
439 | probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device, | 436 | struct acpi_device *device, |
440 | int busnum, int domain) | 437 | int busnum, int domain) |
441 | { | 438 | { |
442 | size_t size; | 439 | size_t size; |
443 | 440 | ||
@@ -473,16 +470,13 @@ probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device, | |||
473 | struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) | 470 | struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) |
474 | { | 471 | { |
475 | struct acpi_device *device = root->device; | 472 | struct acpi_device *device = root->device; |
476 | struct pci_root_info *info = NULL; | 473 | struct pci_root_info *info; |
477 | int domain = root->segment; | 474 | int domain = root->segment; |
478 | int busnum = root->secondary.start; | 475 | int busnum = root->secondary.start; |
479 | LIST_HEAD(resources); | 476 | LIST_HEAD(resources); |
480 | struct pci_bus *bus = NULL; | 477 | struct pci_bus *bus; |
481 | struct pci_sysdata *sd; | 478 | struct pci_sysdata *sd; |
482 | int node; | 479 | int node; |
483 | #ifdef CONFIG_ACPI_NUMA | ||
484 | int pxm; | ||
485 | #endif | ||
486 | 480 | ||
487 | if (pci_ignore_seg) | 481 | if (pci_ignore_seg) |
488 | domain = 0; | 482 | domain = 0; |
@@ -494,19 +488,12 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) | |||
494 | return NULL; | 488 | return NULL; |
495 | } | 489 | } |
496 | 490 | ||
497 | node = -1; | 491 | node = acpi_get_node(device->handle); |
498 | #ifdef CONFIG_ACPI_NUMA | 492 | if (node == NUMA_NO_NODE) |
499 | pxm = acpi_get_pxm(device->handle); | 493 | node = x86_pci_root_bus_node(busnum); |
500 | if (pxm >= 0) | ||
501 | node = pxm_to_node(pxm); | ||
502 | if (node != -1) | ||
503 | set_mp_bus_to_node(busnum, node); | ||
504 | else | ||
505 | #endif | ||
506 | node = get_mp_bus_to_node(busnum); | ||
507 | 494 | ||
508 | if (node != -1 && !node_online(node)) | 495 | if (node != NUMA_NO_NODE && !node_online(node)) |
509 | node = -1; | 496 | node = NUMA_NO_NODE; |
510 | 497 | ||
511 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 498 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
512 | if (!info) { | 499 | if (!info) { |
@@ -519,15 +506,12 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) | |||
519 | sd->domain = domain; | 506 | sd->domain = domain; |
520 | sd->node = node; | 507 | sd->node = node; |
521 | sd->companion = device; | 508 | sd->companion = device; |
522 | /* | 509 | |
523 | * Maybe the desired pci bus has been already scanned. In such case | ||
524 | * it is unnecessary to scan the pci bus with the given domain,busnum. | ||
525 | */ | ||
526 | bus = pci_find_bus(domain, busnum); | 510 | bus = pci_find_bus(domain, busnum); |
527 | if (bus) { | 511 | if (bus) { |
528 | /* | 512 | /* |
529 | * If the desired bus exits, the content of bus->sysdata will | 513 | * If the desired bus has been scanned already, replace |
530 | * be replaced by sd. | 514 | * its bus->sysdata. |
531 | */ | 515 | */ |
532 | memcpy(bus->sysdata, sd, sizeof(*sd)); | 516 | memcpy(bus->sysdata, sd, sizeof(*sd)); |
533 | kfree(info); | 517 | kfree(info); |
@@ -572,15 +556,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) | |||
572 | pcie_bus_configure_settings(child); | 556 | pcie_bus_configure_settings(child); |
573 | } | 557 | } |
574 | 558 | ||
575 | if (bus && node != -1) { | 559 | if (bus && node != NUMA_NO_NODE) |
576 | #ifdef CONFIG_ACPI_NUMA | ||
577 | if (pxm >= 0) | ||
578 | dev_printk(KERN_DEBUG, &bus->dev, | ||
579 | "on NUMA node %d (pxm %d)\n", node, pxm); | ||
580 | #else | ||
581 | dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); | 560 | dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); |
582 | #endif | ||
583 | } | ||
584 | 561 | ||
585 | return bus; | 562 | return bus; |
586 | } | 563 | } |
diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c index a48be98e9ded..a313a7fb6b86 100644 --- a/arch/x86/pci/amd_bus.c +++ b/arch/x86/pci/amd_bus.c | |||
@@ -44,15 +44,6 @@ static struct pci_root_info __init *find_pci_root_info(int node, int link) | |||
44 | return NULL; | 44 | return NULL; |
45 | } | 45 | } |
46 | 46 | ||
47 | static void __init set_mp_bus_range_to_node(int min_bus, int max_bus, int node) | ||
48 | { | ||
49 | #ifdef CONFIG_NUMA | ||
50 | int j; | ||
51 | |||
52 | for (j = min_bus; j <= max_bus; j++) | ||
53 | set_mp_bus_to_node(j, node); | ||
54 | #endif | ||
55 | } | ||
56 | /** | 47 | /** |
57 | * early_fill_mp_bus_to_node() | 48 | * early_fill_mp_bus_to_node() |
58 | * called before pcibios_scan_root and pci_scan_bus | 49 | * called before pcibios_scan_root and pci_scan_bus |
@@ -117,7 +108,6 @@ static int __init early_fill_mp_bus_info(void) | |||
117 | min_bus = (reg >> 16) & 0xff; | 108 | min_bus = (reg >> 16) & 0xff; |
118 | max_bus = (reg >> 24) & 0xff; | 109 | max_bus = (reg >> 24) & 0xff; |
119 | node = (reg >> 4) & 0x07; | 110 | node = (reg >> 4) & 0x07; |
120 | set_mp_bus_range_to_node(min_bus, max_bus, node); | ||
121 | link = (reg >> 8) & 0x03; | 111 | link = (reg >> 8) & 0x03; |
122 | 112 | ||
123 | info = alloc_pci_root_info(min_bus, max_bus, node, link); | 113 | info = alloc_pci_root_info(min_bus, max_bus, node, link); |
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index c2735feb2508..f3a2cfc14125 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c | |||
@@ -10,9 +10,6 @@ static struct pci_root_info *x86_find_pci_root_info(int bus) | |||
10 | { | 10 | { |
11 | struct pci_root_info *info; | 11 | struct pci_root_info *info; |
12 | 12 | ||
13 | if (list_empty(&pci_root_infos)) | ||
14 | return NULL; | ||
15 | |||
16 | list_for_each_entry(info, &pci_root_infos, list) | 13 | list_for_each_entry(info, &pci_root_infos, list) |
17 | if (info->busn.start == bus) | 14 | if (info->busn.start == bus) |
18 | return info; | 15 | return info; |
@@ -20,6 +17,16 @@ static struct pci_root_info *x86_find_pci_root_info(int bus) | |||
20 | return NULL; | 17 | return NULL; |
21 | } | 18 | } |
22 | 19 | ||
20 | int x86_pci_root_bus_node(int bus) | ||
21 | { | ||
22 | struct pci_root_info *info = x86_find_pci_root_info(bus); | ||
23 | |||
24 | if (!info) | ||
25 | return NUMA_NO_NODE; | ||
26 | |||
27 | return info->node; | ||
28 | } | ||
29 | |||
23 | void x86_pci_root_bus_resources(int bus, struct list_head *resources) | 30 | void x86_pci_root_bus_resources(int bus, struct list_head *resources) |
24 | { | 31 | { |
25 | struct pci_root_info *info = x86_find_pci_root_info(bus); | 32 | struct pci_root_info *info = x86_find_pci_root_info(bus); |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 981c2dbd72cc..d491deddebae 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -456,19 +456,25 @@ void __init dmi_check_pciprobe(void) | |||
456 | dmi_check_system(pciprobe_dmi_table); | 456 | dmi_check_system(pciprobe_dmi_table); |
457 | } | 457 | } |
458 | 458 | ||
459 | struct pci_bus *pcibios_scan_root(int busnum) | 459 | void pcibios_scan_root(int busnum) |
460 | { | 460 | { |
461 | struct pci_bus *bus = NULL; | 461 | struct pci_bus *bus; |
462 | struct pci_sysdata *sd; | ||
463 | LIST_HEAD(resources); | ||
462 | 464 | ||
463 | while ((bus = pci_find_next_bus(bus)) != NULL) { | 465 | sd = kzalloc(sizeof(*sd), GFP_KERNEL); |
464 | if (bus->number == busnum) { | 466 | if (!sd) { |
465 | /* Already scanned */ | 467 | printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busnum); |
466 | return bus; | 468 | return; |
467 | } | 469 | } |
470 | sd->node = x86_pci_root_bus_node(busnum); | ||
471 | x86_pci_root_bus_resources(busnum, &resources); | ||
472 | printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum); | ||
473 | bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources); | ||
474 | if (!bus) { | ||
475 | pci_free_resource_list(&resources); | ||
476 | kfree(sd); | ||
468 | } | 477 | } |
469 | |||
470 | return pci_scan_bus_on_node(busnum, &pci_root_ops, | ||
471 | get_mp_bus_to_node(busnum)); | ||
472 | } | 478 | } |
473 | 479 | ||
474 | void __init pcibios_set_cache_line_size(void) | 480 | void __init pcibios_set_cache_line_size(void) |
@@ -677,105 +683,3 @@ int pci_ext_cfg_avail(void) | |||
677 | else | 683 | else |
678 | return 0; | 684 | return 0; |
679 | } | 685 | } |
680 | |||
681 | struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) | ||
682 | { | ||
683 | LIST_HEAD(resources); | ||
684 | struct pci_bus *bus = NULL; | ||
685 | struct pci_sysdata *sd; | ||
686 | |||
687 | /* | ||
688 | * Allocate per-root-bus (not per bus) arch-specific data. | ||
689 | * TODO: leak; this memory is never freed. | ||
690 | * It's arguable whether it's worth the trouble to care. | ||
691 | */ | ||
692 | sd = kzalloc(sizeof(*sd), GFP_KERNEL); | ||
693 | if (!sd) { | ||
694 | printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busno); | ||
695 | return NULL; | ||
696 | } | ||
697 | sd->node = node; | ||
698 | x86_pci_root_bus_resources(busno, &resources); | ||
699 | printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busno); | ||
700 | bus = pci_scan_root_bus(NULL, busno, ops, sd, &resources); | ||
701 | if (!bus) { | ||
702 | pci_free_resource_list(&resources); | ||
703 | kfree(sd); | ||
704 | } | ||
705 | |||
706 | return bus; | ||
707 | } | ||
708 | |||
709 | struct pci_bus *pci_scan_bus_with_sysdata(int busno) | ||
710 | { | ||
711 | return pci_scan_bus_on_node(busno, &pci_root_ops, -1); | ||
712 | } | ||
713 | |||
714 | /* | ||
715 | * NUMA info for PCI busses | ||
716 | * | ||
717 | * Early arch code is responsible for filling in reasonable values here. | ||
718 | * A node id of "-1" means "use current node". In other words, if a bus | ||
719 | * has a -1 node id, it's not tightly coupled to any particular chunk | ||
720 | * of memory (as is the case on some Nehalem systems). | ||
721 | */ | ||
722 | #ifdef CONFIG_NUMA | ||
723 | |||
724 | #define BUS_NR 256 | ||
725 | |||
726 | #ifdef CONFIG_X86_64 | ||
727 | |||
728 | static int mp_bus_to_node[BUS_NR] = { | ||
729 | [0 ... BUS_NR - 1] = -1 | ||
730 | }; | ||
731 | |||
732 | void set_mp_bus_to_node(int busnum, int node) | ||
733 | { | ||
734 | if (busnum >= 0 && busnum < BUS_NR) | ||
735 | mp_bus_to_node[busnum] = node; | ||
736 | } | ||
737 | |||
738 | int get_mp_bus_to_node(int busnum) | ||
739 | { | ||
740 | int node = -1; | ||
741 | |||
742 | if (busnum < 0 || busnum > (BUS_NR - 1)) | ||
743 | return node; | ||
744 | |||
745 | node = mp_bus_to_node[busnum]; | ||
746 | |||
747 | /* | ||
748 | * let numa_node_id to decide it later in dma_alloc_pages | ||
749 | * if there is no ram on that node | ||
750 | */ | ||
751 | if (node != -1 && !node_online(node)) | ||
752 | node = -1; | ||
753 | |||
754 | return node; | ||
755 | } | ||
756 | |||
757 | #else /* CONFIG_X86_32 */ | ||
758 | |||
759 | static int mp_bus_to_node[BUS_NR] = { | ||
760 | [0 ... BUS_NR - 1] = -1 | ||
761 | }; | ||
762 | |||
763 | void set_mp_bus_to_node(int busnum, int node) | ||
764 | { | ||
765 | if (busnum >= 0 && busnum < BUS_NR) | ||
766 | mp_bus_to_node[busnum] = (unsigned char) node; | ||
767 | } | ||
768 | |||
769 | int get_mp_bus_to_node(int busnum) | ||
770 | { | ||
771 | int node; | ||
772 | |||
773 | if (busnum < 0 || busnum > (BUS_NR - 1)) | ||
774 | return 0; | ||
775 | node = mp_bus_to_node[busnum]; | ||
776 | return node; | ||
777 | } | ||
778 | |||
779 | #endif /* CONFIG_X86_32 */ | ||
780 | |||
781 | #endif /* CONFIG_NUMA */ | ||
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index bca9e85daaa5..94ae9ae9574f 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c | |||
@@ -25,9 +25,9 @@ static void pci_fixup_i450nx(struct pci_dev *d) | |||
25 | dev_dbg(&d->dev, "i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, | 25 | dev_dbg(&d->dev, "i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, |
26 | suba, subb); | 26 | suba, subb); |
27 | if (busno) | 27 | if (busno) |
28 | pci_scan_bus_with_sysdata(busno); /* Bus A */ | 28 | pcibios_scan_root(busno); /* Bus A */ |
29 | if (suba < subb) | 29 | if (suba < subb) |
30 | pci_scan_bus_with_sysdata(suba+1); /* Bus B */ | 30 | pcibios_scan_root(suba+1); /* Bus B */ |
31 | } | 31 | } |
32 | pcibios_last_bus = -1; | 32 | pcibios_last_bus = -1; |
33 | } | 33 | } |
@@ -42,7 +42,7 @@ static void pci_fixup_i450gx(struct pci_dev *d) | |||
42 | u8 busno; | 42 | u8 busno; |
43 | pci_read_config_byte(d, 0x4a, &busno); | 43 | pci_read_config_byte(d, 0x4a, &busno); |
44 | dev_info(&d->dev, "i440KX/GX host bridge; secondary bus %02x\n", busno); | 44 | dev_info(&d->dev, "i440KX/GX host bridge; secondary bus %02x\n", busno); |
45 | pci_scan_bus_with_sysdata(busno); | 45 | pcibios_scan_root(busno); |
46 | pcibios_last_bus = -1; | 46 | pcibios_last_bus = -1; |
47 | } | 47 | } |
48 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx); | 48 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx); |
@@ -313,9 +313,10 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_r | |||
313 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | 313 | * IORESOURCE_ROM_SHADOW is used to associate the boot video |
314 | * card with this copy. On laptops this copy has to be used since | 314 | * card with this copy. On laptops this copy has to be used since |
315 | * the main ROM may be compressed or combined with another image. | 315 | * the main ROM may be compressed or combined with another image. |
316 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | 316 | * See pci_map_rom() for use of this flag. Before marking the device |
317 | * is marked here since the boot video device will be the only enabled | 317 | * with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set |
318 | * video device at this point. | 318 | * by either arch cde or vga-arbitration, if so only apply the fixup to this |
319 | * already determined primary video card. | ||
319 | */ | 320 | */ |
320 | 321 | ||
321 | static void pci_fixup_video(struct pci_dev *pdev) | 322 | static void pci_fixup_video(struct pci_dev *pdev) |
@@ -346,12 +347,13 @@ static void pci_fixup_video(struct pci_dev *pdev) | |||
346 | } | 347 | } |
347 | bus = bus->parent; | 348 | bus = bus->parent; |
348 | } | 349 | } |
349 | pci_read_config_word(pdev, PCI_COMMAND, &config); | 350 | if (!vga_default_device() || pdev == vga_default_device()) { |
350 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | 351 | pci_read_config_word(pdev, PCI_COMMAND, &config); |
351 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | 352 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { |
352 | dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); | 353 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; |
353 | if (!vga_default_device()) | 354 | dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); |
354 | vga_set_default_device(pdev); | 355 | vga_set_default_device(pdev); |
356 | } | ||
355 | } | 357 | } |
356 | } | 358 | } |
357 | DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, | 359 | DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index 372e9b8989b3..84112f55dd7a 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -136,13 +136,9 @@ static void __init pirq_peer_trick(void) | |||
136 | busmap[e->bus] = 1; | 136 | busmap[e->bus] = 1; |
137 | } | 137 | } |
138 | for (i = 1; i < 256; i++) { | 138 | for (i = 1; i < 256; i++) { |
139 | int node; | ||
140 | if (!busmap[i] || pci_find_bus(0, i)) | 139 | if (!busmap[i] || pci_find_bus(0, i)) |
141 | continue; | 140 | continue; |
142 | node = get_mp_bus_to_node(i); | 141 | pcibios_scan_root(i); |
143 | if (pci_scan_bus_on_node(i, &pci_root_ops, node)) | ||
144 | printk(KERN_INFO "PCI: Discovered primary peer " | ||
145 | "bus %02x [IRQ]\n", i); | ||
146 | } | 142 | } |
147 | pcibios_last_bus = -1; | 143 | pcibios_last_bus = -1; |
148 | } | 144 | } |
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c index 4db96fb1c232..5b662c0faf8c 100644 --- a/arch/x86/pci/legacy.c +++ b/arch/x86/pci/legacy.c | |||
@@ -37,19 +37,17 @@ int __init pci_legacy_init(void) | |||
37 | void pcibios_scan_specific_bus(int busn) | 37 | void pcibios_scan_specific_bus(int busn) |
38 | { | 38 | { |
39 | int devfn; | 39 | int devfn; |
40 | long node; | ||
41 | u32 l; | 40 | u32 l; |
42 | 41 | ||
43 | if (pci_find_bus(0, busn)) | 42 | if (pci_find_bus(0, busn)) |
44 | return; | 43 | return; |
45 | 44 | ||
46 | node = get_mp_bus_to_node(busn); | ||
47 | for (devfn = 0; devfn < 256; devfn += 8) { | 45 | for (devfn = 0; devfn < 256; devfn += 8) { |
48 | if (!raw_pci_read(0, busn, devfn, PCI_VENDOR_ID, 2, &l) && | 46 | if (!raw_pci_read(0, busn, devfn, PCI_VENDOR_ID, 2, &l) && |
49 | l != 0x0000 && l != 0xffff) { | 47 | l != 0x0000 && l != 0xffff) { |
50 | DBG("Found device at %02x:%02x [%04x]\n", busn, devfn, l); | 48 | DBG("Found device at %02x:%02x [%04x]\n", busn, devfn, l); |
51 | printk(KERN_INFO "PCI: Discovered peer bus %02x\n", busn); | 49 | printk(KERN_INFO "PCI: Discovered peer bus %02x\n", busn); |
52 | pci_scan_bus_on_node(busn, &pci_root_ops, node); | 50 | pcibios_scan_root(busn); |
53 | return; | 51 | return; |
54 | } | 52 | } |
55 | } | 53 | } |
diff --git a/arch/x86/pci/numaq_32.c b/arch/x86/pci/numaq_32.c index 72c229f9ebcf..080eb0374fff 100644 --- a/arch/x86/pci/numaq_32.c +++ b/arch/x86/pci/numaq_32.c | |||
@@ -135,11 +135,11 @@ static void pci_fixup_i450nx(struct pci_dev *d) | |||
135 | pxb, busno, suba, subb); | 135 | pxb, busno, suba, subb); |
136 | if (busno) { | 136 | if (busno) { |
137 | /* Bus A */ | 137 | /* Bus A */ |
138 | pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, busno)); | 138 | pcibios_scan_root(QUADLOCAL2BUS(quad, busno)); |
139 | } | 139 | } |
140 | if (suba < subb) { | 140 | if (suba < subb) { |
141 | /* Bus B */ | 141 | /* Bus B */ |
142 | pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, suba+1)); | 142 | pcibios_scan_root(QUADLOCAL2BUS(quad, suba+1)); |
143 | } | 143 | } |
144 | } | 144 | } |
145 | pcibios_last_bus = -1; | 145 | pcibios_last_bus = -1; |
@@ -159,7 +159,7 @@ int __init pci_numaq_init(void) | |||
159 | continue; | 159 | continue; |
160 | printk("Scanning PCI bus %d for quad %d\n", | 160 | printk("Scanning PCI bus %d for quad %d\n", |
161 | QUADLOCAL2BUS(quad,0), quad); | 161 | QUADLOCAL2BUS(quad,0), quad); |
162 | pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, 0)); | 162 | pcibios_scan_root(QUADLOCAL2BUS(quad, 0)); |
163 | } | 163 | } |
164 | return 0; | 164 | return 0; |
165 | } | 165 | } |
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c index 3e6d2a6db866..cd9d4d1681d2 100644 --- a/arch/x86/pci/visws.c +++ b/arch/x86/pci/visws.c | |||
@@ -78,8 +78,8 @@ int __init pci_visws_init(void) | |||
78 | "bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0); | 78 | "bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0); |
79 | 79 | ||
80 | raw_pci_ops = &pci_direct_conf1; | 80 | raw_pci_ops = &pci_direct_conf1; |
81 | pci_scan_bus_with_sysdata(pci_bus0); | 81 | pcibios_scan_root(pci_bus0); |
82 | pci_scan_bus_with_sysdata(pci_bus1); | 82 | pcibios_scan_root(pci_bus1); |
83 | pci_fixup_irqs(pci_common_swizzle, visws_map_irq); | 83 | pci_fixup_irqs(pci_common_swizzle, visws_map_irq); |
84 | pcibios_resource_survey(); | 84 | pcibios_resource_survey(); |
85 | /* Request bus scan */ | 85 | /* Request bus scan */ |