diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-18 13:31:12 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-18 13:31:12 -0400 |
commit | 3e370b29d35fb01bfb92c2814d6f79bf6a2cb970 (patch) | |
tree | 3b8fb467d60bfe6a34686f4abdc3a60050ba40a4 /arch/x86/pci | |
parent | 88d1dce3a74367291f65a757fbdcaf17f042f30c (diff) | |
parent | 5b664cb235e97afbf34db9c4d77f08ebd725335e (diff) |
Merge branch 'linus' into x86/pci-ioapic-boot-irq-quirks
Conflicts:
drivers/pci/quirks.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/pci')
-rw-r--r-- | arch/x86/pci/Makefile | 22 | ||||
-rw-r--r-- | arch/x86/pci/Makefile_32 | 26 | ||||
-rw-r--r-- | arch/x86/pci/Makefile_64 | 17 | ||||
-rw-r--r-- | arch/x86/pci/acpi.c | 3 | ||||
-rw-r--r-- | arch/x86/pci/amd_bus.c | 76 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 34 | ||||
-rw-r--r-- | arch/x86/pci/early.c | 60 | ||||
-rw-r--r-- | arch/x86/pci/i386.c | 4 | ||||
-rw-r--r-- | arch/x86/pci/init.c | 4 | ||||
-rw-r--r-- | arch/x86/pci/irq.c | 125 | ||||
-rw-r--r-- | arch/x86/pci/legacy.c | 16 | ||||
-rw-r--r-- | arch/x86/pci/mp_bus_to_node.c | 23 | ||||
-rw-r--r-- | arch/x86/pci/numa.c | 4 | ||||
-rw-r--r-- | arch/x86/pci/pci.h | 13 | ||||
-rw-r--r-- | arch/x86/pci/visws.c | 28 |
15 files changed, 292 insertions, 163 deletions
diff --git a/arch/x86/pci/Makefile b/arch/x86/pci/Makefile index c5c8e485fc44..e515e8db842a 100644 --- a/arch/x86/pci/Makefile +++ b/arch/x86/pci/Makefile | |||
@@ -1,5 +1,17 @@ | |||
1 | ifeq ($(CONFIG_X86_32),y) | 1 | obj-y := i386.o init.o |
2 | include ${srctree}/arch/x86/pci/Makefile_32 | 2 | |
3 | else | 3 | obj-$(CONFIG_PCI_BIOS) += pcbios.o |
4 | include ${srctree}/arch/x86/pci/Makefile_64 | 4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_$(BITS).o direct.o mmconfig-shared.o |
5 | endif | 5 | obj-$(CONFIG_PCI_DIRECT) += direct.o |
6 | obj-$(CONFIG_PCI_OLPC) += olpc.o | ||
7 | |||
8 | pci-y := fixup.o | ||
9 | pci-$(CONFIG_ACPI) += acpi.o | ||
10 | pci-y += legacy.o irq.o | ||
11 | |||
12 | pci-$(CONFIG_X86_VISWS) += visws.o | ||
13 | |||
14 | pci-$(CONFIG_X86_NUMAQ) += numa.o | ||
15 | |||
16 | obj-y += $(pci-y) common.o early.o | ||
17 | obj-y += amd_bus.o | ||
diff --git a/arch/x86/pci/Makefile_32 b/arch/x86/pci/Makefile_32 deleted file mode 100644 index a34fbf557926..000000000000 --- a/arch/x86/pci/Makefile_32 +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | obj-y := i386.o init.o | ||
2 | |||
3 | obj-$(CONFIG_PCI_BIOS) += pcbios.o | ||
4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_32.o direct.o mmconfig-shared.o | ||
5 | obj-$(CONFIG_PCI_DIRECT) += direct.o | ||
6 | obj-$(CONFIG_PCI_OLPC) += olpc.o | ||
7 | |||
8 | pci-y := fixup.o | ||
9 | |||
10 | # Do not change the ordering here. There is a nasty init function | ||
11 | # ordering dependency which breaks when you move acpi.o below | ||
12 | # legacy/irq.o | ||
13 | pci-$(CONFIG_ACPI) += acpi.o | ||
14 | pci-y += legacy.o irq.o | ||
15 | |||
16 | # Careful: VISWS overrule the pci-y above. The colons are | ||
17 | # therefor correct. This needs a proper fix by distangling the code. | ||
18 | pci-$(CONFIG_X86_VISWS) := visws.o fixup.o | ||
19 | |||
20 | pci-$(CONFIG_X86_NUMAQ) += numa.o | ||
21 | |||
22 | # Necessary for NUMAQ as well | ||
23 | pci-$(CONFIG_NUMA) += mp_bus_to_node.o | ||
24 | |||
25 | obj-y += $(pci-y) common.o early.o | ||
26 | obj-y += amd_bus.o | ||
diff --git a/arch/x86/pci/Makefile_64 b/arch/x86/pci/Makefile_64 deleted file mode 100644 index fd47068c95de..000000000000 --- a/arch/x86/pci/Makefile_64 +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for X86_64 specific PCI routines | ||
3 | # | ||
4 | # Reuse the i386 PCI subsystem | ||
5 | # | ||
6 | EXTRA_CFLAGS += -Iarch/x86/pci | ||
7 | |||
8 | obj-y := i386.o | ||
9 | obj-$(CONFIG_PCI_DIRECT)+= direct.o | ||
10 | obj-y += fixup.o init.o | ||
11 | obj-$(CONFIG_ACPI) += acpi.o | ||
12 | obj-y += legacy.o irq.o common.o early.o | ||
13 | # mmconfig has a 64bit special | ||
14 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_64.o direct.o mmconfig-shared.o | ||
15 | |||
16 | obj-y += amd_bus.o | ||
17 | |||
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 4fa52d3dc848..19af06927fbc 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -223,7 +223,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do | |||
223 | return bus; | 223 | return bus; |
224 | } | 224 | } |
225 | 225 | ||
226 | static int __init pci_acpi_init(void) | 226 | int __init pci_acpi_init(void) |
227 | { | 227 | { |
228 | struct pci_dev *dev = NULL; | 228 | struct pci_dev *dev = NULL; |
229 | 229 | ||
@@ -257,4 +257,3 @@ static int __init pci_acpi_init(void) | |||
257 | 257 | ||
258 | return 0; | 258 | return 0; |
259 | } | 259 | } |
260 | subsys_initcall(pci_acpi_init); | ||
diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c index d02c598451ec..dbf532369711 100644 --- a/arch/x86/pci/amd_bus.c +++ b/arch/x86/pci/amd_bus.c | |||
@@ -1,44 +1,25 @@ | |||
1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
2 | #include <linux/pci.h> | 2 | #include <linux/pci.h> |
3 | #include <linux/topology.h> | ||
3 | #include "pci.h" | 4 | #include "pci.h" |
4 | 5 | ||
5 | #ifdef CONFIG_X86_64 | 6 | #ifdef CONFIG_X86_64 |
6 | |||
7 | #include <asm/pci-direct.h> | 7 | #include <asm/pci-direct.h> |
8 | #include <asm/mpspec.h> | 8 | #include <asm/mpspec.h> |
9 | #include <linux/cpumask.h> | 9 | #include <linux/cpumask.h> |
10 | #include <linux/topology.h> | 10 | #endif |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * This discovers the pcibus <-> node mapping on AMD K8. | 13 | * This discovers the pcibus <-> node mapping on AMD K8. |
14 | * also get peer root bus resource for io,mmio | 14 | * also get peer root bus resource for io,mmio |
15 | */ | 15 | */ |
16 | 16 | ||
17 | |||
18 | /* | ||
19 | * sub bus (transparent) will use entres from 3 to store extra from root, | ||
20 | * so need to make sure have enought slot there, increase PCI_BUS_NUM_RESOURCES? | ||
21 | */ | ||
22 | #define RES_NUM 16 | ||
23 | struct pci_root_info { | ||
24 | char name[12]; | ||
25 | unsigned int res_num; | ||
26 | struct resource res[RES_NUM]; | ||
27 | int bus_min; | ||
28 | int bus_max; | ||
29 | int node; | ||
30 | int link; | ||
31 | }; | ||
32 | |||
33 | /* 4 at this time, it may become to 32 */ | ||
34 | #define PCI_ROOT_NR 4 | ||
35 | static int pci_root_num; | ||
36 | static struct pci_root_info pci_root_info[PCI_ROOT_NR]; | ||
37 | |||
38 | #ifdef CONFIG_NUMA | 17 | #ifdef CONFIG_NUMA |
39 | 18 | ||
40 | #define BUS_NR 256 | 19 | #define BUS_NR 256 |
41 | 20 | ||
21 | #ifdef CONFIG_X86_64 | ||
22 | |||
42 | static int mp_bus_to_node[BUS_NR]; | 23 | static int mp_bus_to_node[BUS_NR]; |
43 | 24 | ||
44 | void set_mp_bus_to_node(int busnum, int node) | 25 | void set_mp_bus_to_node(int busnum, int node) |
@@ -65,7 +46,52 @@ int get_mp_bus_to_node(int busnum) | |||
65 | 46 | ||
66 | return node; | 47 | return node; |
67 | } | 48 | } |
68 | #endif | 49 | |
50 | #else /* CONFIG_X86_32 */ | ||
51 | |||
52 | static unsigned char mp_bus_to_node[BUS_NR]; | ||
53 | |||
54 | void set_mp_bus_to_node(int busnum, int node) | ||
55 | { | ||
56 | if (busnum >= 0 && busnum < BUS_NR) | ||
57 | mp_bus_to_node[busnum] = (unsigned char) node; | ||
58 | } | ||
59 | |||
60 | int get_mp_bus_to_node(int busnum) | ||
61 | { | ||
62 | int node; | ||
63 | |||
64 | if (busnum < 0 || busnum > (BUS_NR - 1)) | ||
65 | return 0; | ||
66 | node = mp_bus_to_node[busnum]; | ||
67 | return node; | ||
68 | } | ||
69 | |||
70 | #endif /* CONFIG_X86_32 */ | ||
71 | |||
72 | #endif /* CONFIG_NUMA */ | ||
73 | |||
74 | #ifdef CONFIG_X86_64 | ||
75 | |||
76 | /* | ||
77 | * sub bus (transparent) will use entres from 3 to store extra from root, | ||
78 | * so need to make sure have enought slot there, increase PCI_BUS_NUM_RESOURCES? | ||
79 | */ | ||
80 | #define RES_NUM 16 | ||
81 | struct pci_root_info { | ||
82 | char name[12]; | ||
83 | unsigned int res_num; | ||
84 | struct resource res[RES_NUM]; | ||
85 | int bus_min; | ||
86 | int bus_max; | ||
87 | int node; | ||
88 | int link; | ||
89 | }; | ||
90 | |||
91 | /* 4 at this time, it may become to 32 */ | ||
92 | #define PCI_ROOT_NR 4 | ||
93 | static int pci_root_num; | ||
94 | static struct pci_root_info pci_root_info[PCI_ROOT_NR]; | ||
69 | 95 | ||
70 | void set_pci_bus_resources_arch_default(struct pci_bus *b) | 96 | void set_pci_bus_resources_arch_default(struct pci_bus *b) |
71 | { | 97 | { |
@@ -552,7 +578,7 @@ static int __init enable_pci_io_ecs(void) | |||
552 | /* assume all cpus from fam10h have IO ECS */ | 578 | /* assume all cpus from fam10h have IO ECS */ |
553 | if (boot_cpu_data.x86 < 0x10) | 579 | if (boot_cpu_data.x86 < 0x10) |
554 | return 0; | 580 | return 0; |
555 | on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1, 1); | 581 | on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1); |
556 | pci_probe |= PCI_HAS_IO_ECS; | 582 | pci_probe |= PCI_HAS_IO_ECS; |
557 | return 0; | 583 | return 0; |
558 | } | 584 | } |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 00a319cd5be3..1485a26ddcef 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -20,6 +20,7 @@ | |||
20 | unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | | 20 | unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | |
21 | PCI_PROBE_MMCONF; | 21 | PCI_PROBE_MMCONF; |
22 | 22 | ||
23 | unsigned int pci_early_dump_regs; | ||
23 | static int pci_bf_sort; | 24 | static int pci_bf_sort; |
24 | int pci_routeirq; | 25 | int pci_routeirq; |
25 | int noioapicquirk; | 26 | int noioapicquirk; |
@@ -33,7 +34,7 @@ struct pci_raw_ops *raw_pci_ext_ops; | |||
33 | int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, | 34 | int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, |
34 | int reg, int len, u32 *val) | 35 | int reg, int len, u32 *val) |
35 | { | 36 | { |
36 | if (reg < 256 && raw_pci_ops) | 37 | if (domain == 0 && reg < 256 && raw_pci_ops) |
37 | return raw_pci_ops->read(domain, bus, devfn, reg, len, val); | 38 | return raw_pci_ops->read(domain, bus, devfn, reg, len, val); |
38 | if (raw_pci_ext_ops) | 39 | if (raw_pci_ext_ops) |
39 | return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val); | 40 | return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val); |
@@ -43,7 +44,7 @@ int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, | |||
43 | int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, | 44 | int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, |
44 | int reg, int len, u32 val) | 45 | int reg, int len, u32 val) |
45 | { | 46 | { |
46 | if (reg < 256 && raw_pci_ops) | 47 | if (domain == 0 && reg < 256 && raw_pci_ops) |
47 | return raw_pci_ops->write(domain, bus, devfn, reg, len, val); | 48 | return raw_pci_ops->write(domain, bus, devfn, reg, len, val); |
48 | if (raw_pci_ext_ops) | 49 | if (raw_pci_ext_ops) |
49 | return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val); | 50 | return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val); |
@@ -123,6 +124,21 @@ void __init dmi_check_skip_isa_align(void) | |||
123 | dmi_check_system(can_skip_pciprobe_dmi_table); | 124 | dmi_check_system(can_skip_pciprobe_dmi_table); |
124 | } | 125 | } |
125 | 126 | ||
127 | static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | ||
128 | { | ||
129 | struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE]; | ||
130 | |||
131 | if (pci_probe & PCI_NOASSIGN_ROMS) { | ||
132 | if (rom_r->parent) | ||
133 | return; | ||
134 | if (rom_r->start) { | ||
135 | /* we deal with BIOS assigned ROM later */ | ||
136 | return; | ||
137 | } | ||
138 | rom_r->start = rom_r->end = rom_r->flags = 0; | ||
139 | } | ||
140 | } | ||
141 | |||
126 | /* | 142 | /* |
127 | * Called after each bus is probed, but before its children | 143 | * Called after each bus is probed, but before its children |
128 | * are examined. | 144 | * are examined. |
@@ -130,7 +146,11 @@ void __init dmi_check_skip_isa_align(void) | |||
130 | 146 | ||
131 | void __devinit pcibios_fixup_bus(struct pci_bus *b) | 147 | void __devinit pcibios_fixup_bus(struct pci_bus *b) |
132 | { | 148 | { |
149 | struct pci_dev *dev; | ||
150 | |||
133 | pci_read_bridge_bases(b); | 151 | pci_read_bridge_bases(b); |
152 | list_for_each_entry(dev, &b->devices, bus_list) | ||
153 | pcibios_fixup_device_resources(dev); | ||
134 | } | 154 | } |
135 | 155 | ||
136 | /* | 156 | /* |
@@ -386,7 +406,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum) | |||
386 | 406 | ||
387 | extern u8 pci_cache_line_size; | 407 | extern u8 pci_cache_line_size; |
388 | 408 | ||
389 | static int __init pcibios_init(void) | 409 | int __init pcibios_init(void) |
390 | { | 410 | { |
391 | struct cpuinfo_x86 *c = &boot_cpu_data; | 411 | struct cpuinfo_x86 *c = &boot_cpu_data; |
392 | 412 | ||
@@ -413,8 +433,6 @@ static int __init pcibios_init(void) | |||
413 | return 0; | 433 | return 0; |
414 | } | 434 | } |
415 | 435 | ||
416 | subsys_initcall(pcibios_init); | ||
417 | |||
418 | char * __devinit pcibios_setup(char *str) | 436 | char * __devinit pcibios_setup(char *str) |
419 | { | 437 | { |
420 | if (!strcmp(str, "off")) { | 438 | if (!strcmp(str, "off")) { |
@@ -485,12 +503,18 @@ char * __devinit pcibios_setup(char *str) | |||
485 | else if (!strcmp(str, "rom")) { | 503 | else if (!strcmp(str, "rom")) { |
486 | pci_probe |= PCI_ASSIGN_ROMS; | 504 | pci_probe |= PCI_ASSIGN_ROMS; |
487 | return NULL; | 505 | return NULL; |
506 | } else if (!strcmp(str, "norom")) { | ||
507 | pci_probe |= PCI_NOASSIGN_ROMS; | ||
508 | return NULL; | ||
488 | } else if (!strcmp(str, "assign-busses")) { | 509 | } else if (!strcmp(str, "assign-busses")) { |
489 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; | 510 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; |
490 | return NULL; | 511 | return NULL; |
491 | } else if (!strcmp(str, "use_crs")) { | 512 | } else if (!strcmp(str, "use_crs")) { |
492 | pci_probe |= PCI_USE__CRS; | 513 | pci_probe |= PCI_USE__CRS; |
493 | return NULL; | 514 | return NULL; |
515 | } else if (!strcmp(str, "earlydump")) { | ||
516 | pci_early_dump_regs = 1; | ||
517 | return NULL; | ||
494 | } else if (!strcmp(str, "routeirq")) { | 518 | } else if (!strcmp(str, "routeirq")) { |
495 | pci_routeirq = 1; | 519 | pci_routeirq = 1; |
496 | return NULL; | 520 | return NULL; |
diff --git a/arch/x86/pci/early.c b/arch/x86/pci/early.c index 42df4b6606df..858dbe3399f9 100644 --- a/arch/x86/pci/early.c +++ b/arch/x86/pci/early.c | |||
@@ -49,7 +49,14 @@ void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val) | |||
49 | { | 49 | { |
50 | PDprintk("%x writing to %x: %x\n", slot, offset, val); | 50 | PDprintk("%x writing to %x: %x\n", slot, offset, val); |
51 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); | 51 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); |
52 | outb(val, 0xcfc); | 52 | outb(val, 0xcfc + (offset&3)); |
53 | } | ||
54 | |||
55 | void write_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset, u16 val) | ||
56 | { | ||
57 | PDprintk("%x writing to %x: %x\n", slot, offset, val); | ||
58 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); | ||
59 | outw(val, 0xcfc + (offset&2)); | ||
53 | } | 60 | } |
54 | 61 | ||
55 | int early_pci_allowed(void) | 62 | int early_pci_allowed(void) |
@@ -57,3 +64,54 @@ int early_pci_allowed(void) | |||
57 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == | 64 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == |
58 | PCI_PROBE_CONF1; | 65 | PCI_PROBE_CONF1; |
59 | } | 66 | } |
67 | |||
68 | void early_dump_pci_device(u8 bus, u8 slot, u8 func) | ||
69 | { | ||
70 | int i; | ||
71 | int j; | ||
72 | u32 val; | ||
73 | |||
74 | printk("PCI: %02x:%02x:%02x", bus, slot, func); | ||
75 | |||
76 | for (i = 0; i < 256; i += 4) { | ||
77 | if (!(i & 0x0f)) | ||
78 | printk("\n%04x:",i); | ||
79 | |||
80 | val = read_pci_config(bus, slot, func, i); | ||
81 | for (j = 0; j < 4; j++) { | ||
82 | printk(" %02x", val & 0xff); | ||
83 | val >>= 8; | ||
84 | } | ||
85 | } | ||
86 | printk("\n"); | ||
87 | } | ||
88 | |||
89 | void early_dump_pci_devices(void) | ||
90 | { | ||
91 | unsigned bus, slot, func; | ||
92 | |||
93 | if (!early_pci_allowed()) | ||
94 | return; | ||
95 | |||
96 | for (bus = 0; bus < 256; bus++) { | ||
97 | for (slot = 0; slot < 32; slot++) { | ||
98 | for (func = 0; func < 8; func++) { | ||
99 | u32 class; | ||
100 | u8 type; | ||
101 | class = read_pci_config(bus, slot, func, | ||
102 | PCI_CLASS_REVISION); | ||
103 | if (class == 0xffffffff) | ||
104 | break; | ||
105 | |||
106 | early_dump_pci_device(bus, slot, func); | ||
107 | |||
108 | /* No multi-function device? */ | ||
109 | type = read_pci_config_byte(bus, slot, func, | ||
110 | PCI_HEADER_TYPE); | ||
111 | if (!(type & 0x80)) | ||
112 | break; | ||
113 | } | ||
114 | } | ||
115 | } | ||
116 | } | ||
117 | |||
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 6ccd7a108cd4..2aafb67dc5f1 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -334,7 +334,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
334 | flags = new_flags; | 334 | flags = new_flags; |
335 | } | 335 | } |
336 | 336 | ||
337 | if (vma->vm_pgoff <= max_pfn_mapped && | 337 | if (((vma->vm_pgoff < max_low_pfn_mapped) || |
338 | (vma->vm_pgoff >= (1UL<<(32 - PAGE_SHIFT)) && | ||
339 | vma->vm_pgoff < max_pfn_mapped)) && | ||
338 | ioremap_change_attr((unsigned long)__va(addr), len, flags)) { | 340 | ioremap_change_attr((unsigned long)__va(addr), len, flags)) { |
339 | free_memtype(addr, addr + len); | 341 | free_memtype(addr, addr + len); |
340 | return -EINVAL; | 342 | return -EINVAL; |
diff --git a/arch/x86/pci/init.c b/arch/x86/pci/init.c index b821f4462d99..d6c950f81858 100644 --- a/arch/x86/pci/init.c +++ b/arch/x86/pci/init.c | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | /* arch_initcall has too random ordering, so call the initializers | 5 | /* arch_initcall has too random ordering, so call the initializers |
6 | in the right sequence from here. */ | 6 | in the right sequence from here. */ |
7 | static __init int pci_access_init(void) | 7 | static __init int pci_arch_init(void) |
8 | { | 8 | { |
9 | #ifdef CONFIG_PCI_DIRECT | 9 | #ifdef CONFIG_PCI_DIRECT |
10 | int type = 0; | 10 | int type = 0; |
@@ -40,4 +40,4 @@ static __init int pci_access_init(void) | |||
40 | 40 | ||
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | arch_initcall(pci_access_init); | 43 | arch_initcall(pci_arch_init); |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index f0859de23e20..6a06a2eb0597 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -45,7 +45,8 @@ struct irq_router { | |||
45 | char *name; | 45 | char *name; |
46 | u16 vendor, device; | 46 | u16 vendor, device; |
47 | int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); | 47 | int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); |
48 | int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new); | 48 | int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, |
49 | int new); | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | struct irq_router_handler { | 52 | struct irq_router_handler { |
@@ -77,7 +78,8 @@ static inline struct irq_routing_table *pirq_check_routing_table(u8 *addr) | |||
77 | for (i = 0; i < rt->size; i++) | 78 | for (i = 0; i < rt->size; i++) |
78 | sum += addr[i]; | 79 | sum += addr[i]; |
79 | if (!sum) { | 80 | if (!sum) { |
80 | DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", rt); | 81 | DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", |
82 | rt); | ||
81 | return rt; | 83 | return rt; |
82 | } | 84 | } |
83 | return NULL; | 85 | return NULL; |
@@ -183,7 +185,8 @@ static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, | |||
183 | return (nr & 1) ? (x >> 4) : (x & 0xf); | 185 | return (nr & 1) ? (x >> 4) : (x & 0xf); |
184 | } | 186 | } |
185 | 187 | ||
186 | static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val) | 188 | static void write_config_nybble(struct pci_dev *router, unsigned offset, |
189 | unsigned nr, unsigned int val) | ||
187 | { | 190 | { |
188 | u8 x; | 191 | u8 x; |
189 | unsigned reg = offset + (nr >> 1); | 192 | unsigned reg = offset + (nr >> 1); |
@@ -467,7 +470,8 @@ static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int | |||
467 | return inb(0xc01) & 0xf; | 470 | return inb(0xc01) & 0xf; |
468 | } | 471 | } |
469 | 472 | ||
470 | static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | 473 | static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, |
474 | int pirq, int irq) | ||
471 | { | 475 | { |
472 | outb(pirq, 0xc00); | 476 | outb(pirq, 0xc00); |
473 | outb(irq, 0xc01); | 477 | outb(irq, 0xc01); |
@@ -660,7 +664,8 @@ static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router | |||
660 | } | 664 | } |
661 | 665 | ||
662 | 666 | ||
663 | static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | 667 | static __init int serverworks_router_probe(struct irq_router *r, |
668 | struct pci_dev *router, u16 device) | ||
664 | { | 669 | { |
665 | switch (device) { | 670 | switch (device) { |
666 | case PCI_DEVICE_ID_SERVERWORKS_OSB4: | 671 | case PCI_DEVICE_ID_SERVERWORKS_OSB4: |
@@ -827,10 +832,12 @@ static void __init pirq_find_router(struct irq_router *r) | |||
827 | 832 | ||
828 | for (h = pirq_routers; h->vendor; h++) { | 833 | for (h = pirq_routers; h->vendor; h++) { |
829 | /* First look for a router match */ | 834 | /* First look for a router match */ |
830 | if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device)) | 835 | if (rt->rtr_vendor == h->vendor && |
836 | h->probe(r, pirq_router_dev, rt->rtr_device)) | ||
831 | break; | 837 | break; |
832 | /* Fall back to a device match */ | 838 | /* Fall back to a device match */ |
833 | if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device)) | 839 | if (pirq_router_dev->vendor == h->vendor && |
840 | h->probe(r, pirq_router_dev, pirq_router_dev->device)) | ||
834 | break; | 841 | break; |
835 | } | 842 | } |
836 | printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", | 843 | printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", |
@@ -845,11 +852,13 @@ static void __init pirq_find_router(struct irq_router *r) | |||
845 | static struct irq_info *pirq_get_info(struct pci_dev *dev) | 852 | static struct irq_info *pirq_get_info(struct pci_dev *dev) |
846 | { | 853 | { |
847 | struct irq_routing_table *rt = pirq_table; | 854 | struct irq_routing_table *rt = pirq_table; |
848 | int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); | 855 | int entries = (rt->size - sizeof(struct irq_routing_table)) / |
856 | sizeof(struct irq_info); | ||
849 | struct irq_info *info; | 857 | struct irq_info *info; |
850 | 858 | ||
851 | for (info = rt->slots; entries--; info++) | 859 | for (info = rt->slots; entries--; info++) |
852 | if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) | 860 | if (info->bus == dev->bus->number && |
861 | PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) | ||
853 | return info; | 862 | return info; |
854 | return NULL; | 863 | return NULL; |
855 | } | 864 | } |
@@ -890,7 +899,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
890 | DBG(" -> not routed\n" KERN_DEBUG); | 899 | DBG(" -> not routed\n" KERN_DEBUG); |
891 | return 0; | 900 | return 0; |
892 | } | 901 | } |
893 | DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs); | 902 | DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, |
903 | pirq_table->exclusive_irqs); | ||
894 | mask &= pcibios_irq_mask; | 904 | mask &= pcibios_irq_mask; |
895 | 905 | ||
896 | /* Work around broken HP Pavilion Notebooks which assign USB to | 906 | /* Work around broken HP Pavilion Notebooks which assign USB to |
@@ -903,7 +913,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
903 | } | 913 | } |
904 | 914 | ||
905 | /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */ | 915 | /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */ |
906 | if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) { | 916 | if (acer_tm360_irqrouting && dev->irq == 11 && |
917 | dev->vendor == PCI_VENDOR_ID_O2) { | ||
907 | pirq = 0x68; | 918 | pirq = 0x68; |
908 | mask = 0x400; | 919 | mask = 0x400; |
909 | dev->irq = r->get(pirq_router_dev, dev, pirq); | 920 | dev->irq = r->get(pirq_router_dev, dev, pirq); |
@@ -920,15 +931,16 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
920 | newirq = 0; | 931 | newirq = 0; |
921 | else | 932 | else |
922 | printk("\n" KERN_WARNING | 933 | printk("\n" KERN_WARNING |
923 | "PCI: IRQ %i for device %s doesn't match PIRQ mask " | 934 | "PCI: IRQ %i for device %s doesn't match PIRQ mask - try pci=usepirqmask\n" |
924 | "- try pci=usepirqmask\n" KERN_DEBUG, newirq, | 935 | KERN_DEBUG, newirq, |
925 | pci_name(dev)); | 936 | pci_name(dev)); |
926 | } | 937 | } |
927 | if (!newirq && assign) { | 938 | if (!newirq && assign) { |
928 | for (i = 0; i < 16; i++) { | 939 | for (i = 0; i < 16; i++) { |
929 | if (!(mask & (1 << i))) | 940 | if (!(mask & (1 << i))) |
930 | continue; | 941 | continue; |
931 | if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED)) | 942 | if (pirq_penalty[i] < pirq_penalty[newirq] && |
943 | can_request_irq(i, IRQF_SHARED)) | ||
932 | newirq = i; | 944 | newirq = i; |
933 | } | 945 | } |
934 | } | 946 | } |
@@ -944,7 +956,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
944 | DBG(" -> got IRQ %d\n", irq); | 956 | DBG(" -> got IRQ %d\n", irq); |
945 | msg = "Found"; | 957 | msg = "Found"; |
946 | eisa_set_level_irq(irq); | 958 | eisa_set_level_irq(irq); |
947 | } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { | 959 | } else if (newirq && r->set && |
960 | (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { | ||
948 | DBG(" -> assigning IRQ %d", newirq); | 961 | DBG(" -> assigning IRQ %d", newirq); |
949 | if (r->set(pirq_router_dev, dev, pirq, newirq)) { | 962 | if (r->set(pirq_router_dev, dev, pirq, newirq)) { |
950 | eisa_set_level_irq(newirq); | 963 | eisa_set_level_irq(newirq); |
@@ -962,7 +975,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
962 | } else | 975 | } else |
963 | return 0; | 976 | return 0; |
964 | } | 977 | } |
965 | printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev)); | 978 | printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, |
979 | pci_name(dev)); | ||
966 | 980 | ||
967 | /* Update IRQ for all devices with the same pirq value */ | 981 | /* Update IRQ for all devices with the same pirq value */ |
968 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { | 982 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { |
@@ -974,7 +988,10 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
974 | if (!info) | 988 | if (!info) |
975 | continue; | 989 | continue; |
976 | if (info->irq[pin].link == pirq) { | 990 | if (info->irq[pin].link == pirq) { |
977 | /* We refuse to override the dev->irq information. Give a warning! */ | 991 | /* |
992 | * We refuse to override the dev->irq | ||
993 | * information. Give a warning! | ||
994 | */ | ||
978 | if (dev2->irq && dev2->irq != irq && \ | 995 | if (dev2->irq && dev2->irq != irq && \ |
979 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ | 996 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ |
980 | ((1 << dev2->irq) & mask))) { | 997 | ((1 << dev2->irq) & mask))) { |
@@ -987,7 +1004,9 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
987 | dev2->irq = irq; | 1004 | dev2->irq = irq; |
988 | pirq_penalty[irq]++; | 1005 | pirq_penalty[irq]++; |
989 | if (dev != dev2) | 1006 | if (dev != dev2) |
990 | printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2)); | 1007 | printk(KERN_INFO |
1008 | "PCI: Sharing IRQ %d with %s\n", | ||
1009 | irq, pci_name(dev2)); | ||
991 | } | 1010 | } |
992 | } | 1011 | } |
993 | return 1; | 1012 | return 1; |
@@ -1001,15 +1020,21 @@ static void __init pcibios_fixup_irqs(void) | |||
1001 | DBG(KERN_DEBUG "PCI: IRQ fixup\n"); | 1020 | DBG(KERN_DEBUG "PCI: IRQ fixup\n"); |
1002 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 1021 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
1003 | /* | 1022 | /* |
1004 | * If the BIOS has set an out of range IRQ number, just ignore it. | 1023 | * If the BIOS has set an out of range IRQ number, just |
1005 | * Also keep track of which IRQ's are already in use. | 1024 | * ignore it. Also keep track of which IRQ's are |
1025 | * already in use. | ||
1006 | */ | 1026 | */ |
1007 | if (dev->irq >= 16) { | 1027 | if (dev->irq >= 16) { |
1008 | DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq); | 1028 | DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", |
1029 | pci_name(dev), dev->irq); | ||
1009 | dev->irq = 0; | 1030 | dev->irq = 0; |
1010 | } | 1031 | } |
1011 | /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */ | 1032 | /* |
1012 | if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000) | 1033 | * If the IRQ is already assigned to a PCI device, |
1034 | * ignore its ISA use penalty | ||
1035 | */ | ||
1036 | if (pirq_penalty[dev->irq] >= 100 && | ||
1037 | pirq_penalty[dev->irq] < 100000) | ||
1013 | pirq_penalty[dev->irq] = 0; | 1038 | pirq_penalty[dev->irq] = 0; |
1014 | pirq_penalty[dev->irq]++; | 1039 | pirq_penalty[dev->irq]++; |
1015 | } | 1040 | } |
@@ -1025,8 +1050,13 @@ static void __init pcibios_fixup_irqs(void) | |||
1025 | int irq; | 1050 | int irq; |
1026 | 1051 | ||
1027 | if (pin) { | 1052 | if (pin) { |
1028 | pin--; /* interrupt pins are numbered starting from 1 */ | 1053 | /* |
1029 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); | 1054 | * interrupt pins are numbered starting |
1055 | * from 1 | ||
1056 | */ | ||
1057 | pin--; | ||
1058 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | ||
1059 | PCI_SLOT(dev->devfn), pin); | ||
1030 | /* | 1060 | /* |
1031 | * Busses behind bridges are typically not listed in the MP-table. | 1061 | * Busses behind bridges are typically not listed in the MP-table. |
1032 | * In this case we have to look up the IRQ based on the parent bus, | 1062 | * In this case we have to look up the IRQ based on the parent bus, |
@@ -1067,7 +1097,8 @@ static int __init fix_broken_hp_bios_irq9(const struct dmi_system_id *d) | |||
1067 | { | 1097 | { |
1068 | if (!broken_hp_bios_irq9) { | 1098 | if (!broken_hp_bios_irq9) { |
1069 | broken_hp_bios_irq9 = 1; | 1099 | broken_hp_bios_irq9 = 1; |
1070 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); | 1100 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", |
1101 | d->ident); | ||
1071 | } | 1102 | } |
1072 | return 0; | 1103 | return 0; |
1073 | } | 1104 | } |
@@ -1080,7 +1111,8 @@ static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d) | |||
1080 | { | 1111 | { |
1081 | if (!acer_tm360_irqrouting) { | 1112 | if (!acer_tm360_irqrouting) { |
1082 | acer_tm360_irqrouting = 1; | 1113 | acer_tm360_irqrouting = 1; |
1083 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); | 1114 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", |
1115 | d->ident); | ||
1084 | } | 1116 | } |
1085 | return 0; | 1117 | return 0; |
1086 | } | 1118 | } |
@@ -1092,7 +1124,8 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = { | |||
1092 | .matches = { | 1124 | .matches = { |
1093 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | 1125 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
1094 | DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"), | 1126 | DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"), |
1095 | DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"), | 1127 | DMI_MATCH(DMI_PRODUCT_VERSION, |
1128 | "HP Pavilion Notebook Model GE"), | ||
1096 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), | 1129 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), |
1097 | }, | 1130 | }, |
1098 | }, | 1131 | }, |
@@ -1107,7 +1140,7 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = { | |||
1107 | { } | 1140 | { } |
1108 | }; | 1141 | }; |
1109 | 1142 | ||
1110 | static int __init pcibios_irq_init(void) | 1143 | int __init pcibios_irq_init(void) |
1111 | { | 1144 | { |
1112 | DBG(KERN_DEBUG "PCI: IRQ init\n"); | 1145 | DBG(KERN_DEBUG "PCI: IRQ init\n"); |
1113 | 1146 | ||
@@ -1131,7 +1164,10 @@ static int __init pcibios_irq_init(void) | |||
1131 | if (!(pirq_table->exclusive_irqs & (1 << i))) | 1164 | if (!(pirq_table->exclusive_irqs & (1 << i))) |
1132 | pirq_penalty[i] += 100; | 1165 | pirq_penalty[i] += 100; |
1133 | } | 1166 | } |
1134 | /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */ | 1167 | /* |
1168 | * If we're using the I/O APIC, avoid using the PCI IRQ | ||
1169 | * routing table | ||
1170 | */ | ||
1135 | if (io_apic_assign_pci_irqs) | 1171 | if (io_apic_assign_pci_irqs) |
1136 | pirq_table = NULL; | 1172 | pirq_table = NULL; |
1137 | } | 1173 | } |
@@ -1142,9 +1178,6 @@ static int __init pcibios_irq_init(void) | |||
1142 | return 0; | 1178 | return 0; |
1143 | } | 1179 | } |
1144 | 1180 | ||
1145 | subsys_initcall(pcibios_irq_init); | ||
1146 | |||
1147 | |||
1148 | static void pirq_penalize_isa_irq(int irq, int active) | 1181 | static void pirq_penalize_isa_irq(int irq, int active) |
1149 | { | 1182 | { |
1150 | /* | 1183 | /* |
@@ -1178,7 +1211,7 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1178 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { | 1211 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { |
1179 | char *msg = ""; | 1212 | char *msg = ""; |
1180 | 1213 | ||
1181 | pin--; /* interrupt pins are numbered starting from 1 */ | 1214 | pin--; /* interrupt pins are numbered starting from 1 */ |
1182 | 1215 | ||
1183 | if (io_apic_assign_pci_irqs) { | 1216 | if (io_apic_assign_pci_irqs) { |
1184 | int irq; | 1217 | int irq; |
@@ -1198,13 +1231,16 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1198 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1231 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
1199 | PCI_SLOT(bridge->devfn), pin); | 1232 | PCI_SLOT(bridge->devfn), pin); |
1200 | if (irq >= 0) | 1233 | if (irq >= 0) |
1201 | printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n", | 1234 | printk(KERN_WARNING |
1202 | pci_name(bridge), 'A' + pin, irq); | 1235 | "PCI: using PPB %s[%c] to get irq %d\n", |
1236 | pci_name(bridge), | ||
1237 | 'A' + pin, irq); | ||
1203 | dev = bridge; | 1238 | dev = bridge; |
1204 | } | 1239 | } |
1205 | dev = temp_dev; | 1240 | dev = temp_dev; |
1206 | if (irq >= 0) { | 1241 | if (irq >= 0) { |
1207 | printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", | 1242 | printk(KERN_INFO |
1243 | "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", | ||
1208 | pci_name(dev), 'A' + pin, irq); | 1244 | pci_name(dev), 'A' + pin, irq); |
1209 | dev->irq = irq; | 1245 | dev->irq = irq; |
1210 | return 0; | 1246 | return 0; |
@@ -1215,12 +1251,17 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1215 | else | 1251 | else |
1216 | msg = " Please try using pci=biosirq."; | 1252 | msg = " Please try using pci=biosirq."; |
1217 | 1253 | ||
1218 | /* With IDE legacy devices the IRQ lookup failure is not a problem.. */ | 1254 | /* |
1219 | if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5)) | 1255 | * With IDE legacy devices the IRQ lookup failure is not |
1256 | * a problem.. | ||
1257 | */ | ||
1258 | if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && | ||
1259 | !(dev->class & 0x5)) | ||
1220 | return 0; | 1260 | return 0; |
1221 | 1261 | ||
1222 | printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", | 1262 | printk(KERN_WARNING |
1223 | 'A' + pin, pci_name(dev), msg); | 1263 | "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", |
1264 | 'A' + pin, pci_name(dev), msg); | ||
1224 | } | 1265 | } |
1225 | return 0; | 1266 | return 0; |
1226 | } | 1267 | } |
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c index a67921ce60af..132876cc6fca 100644 --- a/arch/x86/pci/legacy.c +++ b/arch/x86/pci/legacy.c | |||
@@ -55,4 +55,18 @@ static int __init pci_legacy_init(void) | |||
55 | return 0; | 55 | return 0; |
56 | } | 56 | } |
57 | 57 | ||
58 | subsys_initcall(pci_legacy_init); | 58 | int __init pci_subsys_init(void) |
59 | { | ||
60 | #ifdef CONFIG_ACPI | ||
61 | pci_acpi_init(); | ||
62 | #endif | ||
63 | pci_legacy_init(); | ||
64 | pcibios_irq_init(); | ||
65 | #ifdef CONFIG_X86_NUMAQ | ||
66 | pci_numa_init(); | ||
67 | #endif | ||
68 | pcibios_init(); | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | subsys_initcall(pci_subsys_init); | ||
diff --git a/arch/x86/pci/mp_bus_to_node.c b/arch/x86/pci/mp_bus_to_node.c deleted file mode 100644 index 022943999b84..000000000000 --- a/arch/x86/pci/mp_bus_to_node.c +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | #include <linux/pci.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/topology.h> | ||
4 | |||
5 | #define BUS_NR 256 | ||
6 | |||
7 | static unsigned char mp_bus_to_node[BUS_NR]; | ||
8 | |||
9 | void set_mp_bus_to_node(int busnum, int node) | ||
10 | { | ||
11 | if (busnum >= 0 && busnum < BUS_NR) | ||
12 | mp_bus_to_node[busnum] = (unsigned char) node; | ||
13 | } | ||
14 | |||
15 | int get_mp_bus_to_node(int busnum) | ||
16 | { | ||
17 | int node; | ||
18 | |||
19 | if (busnum < 0 || busnum > (BUS_NR - 1)) | ||
20 | return 0; | ||
21 | node = mp_bus_to_node[busnum]; | ||
22 | return node; | ||
23 | } | ||
diff --git a/arch/x86/pci/numa.c b/arch/x86/pci/numa.c index 99f1ecd485b5..8b5ca1966731 100644 --- a/arch/x86/pci/numa.c +++ b/arch/x86/pci/numa.c | |||
@@ -151,7 +151,7 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d) | |||
151 | } | 151 | } |
152 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx); | 152 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx); |
153 | 153 | ||
154 | static int __init pci_numa_init(void) | 154 | int __init pci_numa_init(void) |
155 | { | 155 | { |
156 | int quad; | 156 | int quad; |
157 | 157 | ||
@@ -176,5 +176,3 @@ static int __init pci_numa_init(void) | |||
176 | } | 176 | } |
177 | return 0; | 177 | return 0; |
178 | } | 178 | } |
179 | |||
180 | subsys_initcall(pci_numa_init); | ||
diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h index ba263e626a68..3e25deb821ac 100644 --- a/arch/x86/pci/pci.h +++ b/arch/x86/pci/pci.h | |||
@@ -28,6 +28,7 @@ | |||
28 | #define PCI_USE__CRS 0x10000 | 28 | #define PCI_USE__CRS 0x10000 |
29 | #define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000 | 29 | #define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000 |
30 | #define PCI_HAS_IO_ECS 0x40000 | 30 | #define PCI_HAS_IO_ECS 0x40000 |
31 | #define PCI_NOASSIGN_ROMS 0x80000 | ||
31 | 32 | ||
32 | extern unsigned int pci_probe; | 33 | extern unsigned int pci_probe; |
33 | extern unsigned long pirq_table_addr; | 34 | extern unsigned long pirq_table_addr; |
@@ -39,9 +40,6 @@ enum pci_bf_sort_state { | |||
39 | pci_dmi_bf, | 40 | pci_dmi_bf, |
40 | }; | 41 | }; |
41 | 42 | ||
42 | extern void __init dmi_check_pciprobe(void); | ||
43 | extern void __init dmi_check_skip_isa_align(void); | ||
44 | |||
45 | /* pci-i386.c */ | 43 | /* pci-i386.c */ |
46 | 44 | ||
47 | extern unsigned int pcibios_max_latency; | 45 | extern unsigned int pcibios_max_latency; |
@@ -99,10 +97,19 @@ extern struct pci_raw_ops *raw_pci_ext_ops; | |||
99 | 97 | ||
100 | extern struct pci_raw_ops pci_direct_conf1; | 98 | extern struct pci_raw_ops pci_direct_conf1; |
101 | 99 | ||
100 | /* arch_initcall level */ | ||
102 | extern int pci_direct_probe(void); | 101 | extern int pci_direct_probe(void); |
103 | extern void pci_direct_init(int type); | 102 | extern void pci_direct_init(int type); |
104 | extern void pci_pcbios_init(void); | 103 | extern void pci_pcbios_init(void); |
105 | extern int pci_olpc_init(void); | 104 | extern int pci_olpc_init(void); |
105 | extern void __init dmi_check_pciprobe(void); | ||
106 | extern void __init dmi_check_skip_isa_align(void); | ||
107 | |||
108 | /* some common used subsys_initcalls */ | ||
109 | extern int __init pci_acpi_init(void); | ||
110 | extern int __init pcibios_irq_init(void); | ||
111 | extern int __init pci_numa_init(void); | ||
112 | extern int __init pcibios_init(void); | ||
106 | 113 | ||
107 | /* pci-mmconfig.c */ | 114 | /* pci-mmconfig.c */ |
108 | 115 | ||
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c index c2df4e97eed6..1a7bed492bb1 100644 --- a/arch/x86/pci/visws.c +++ b/arch/x86/pci/visws.c | |||
@@ -8,18 +8,19 @@ | |||
8 | #include <linux/pci.h> | 8 | #include <linux/pci.h> |
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | 10 | ||
11 | #include "cobalt.h" | 11 | #include <asm/setup.h> |
12 | #include "lithium.h" | 12 | #include <asm/visws/cobalt.h> |
13 | #include <asm/visws/lithium.h> | ||
13 | 14 | ||
14 | #include "pci.h" | 15 | #include "pci.h" |
15 | 16 | ||
16 | static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; } | 17 | static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; } |
17 | static void pci_visws_disable_irq(struct pci_dev *dev) { } | 18 | static void pci_visws_disable_irq(struct pci_dev *dev) { } |
18 | 19 | ||
19 | int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq; | 20 | /* int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq; */ |
20 | void (*pcibios_disable_irq)(struct pci_dev *dev) = &pci_visws_disable_irq; | 21 | /* void (*pcibios_disable_irq)(struct pci_dev *dev) = &pci_visws_disable_irq; */ |
21 | 22 | ||
22 | void __init pcibios_penalize_isa_irq(int irq, int active) {} | 23 | /* void __init pcibios_penalize_isa_irq(int irq, int active) {} */ |
23 | 24 | ||
24 | 25 | ||
25 | unsigned int pci_bus0, pci_bus1; | 26 | unsigned int pci_bus0, pci_bus1; |
@@ -85,7 +86,7 @@ void __init pcibios_update_irq(struct pci_dev *dev, int irq) | |||
85 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 86 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
86 | } | 87 | } |
87 | 88 | ||
88 | static int __init pcibios_init(void) | 89 | static int __init pci_visws_init(void) |
89 | { | 90 | { |
90 | /* The VISWS supports configuration access type 1 only */ | 91 | /* The VISWS supports configuration access type 1 only */ |
91 | pci_probe = (pci_probe | PCI_PROBE_CONF1) & | 92 | pci_probe = (pci_probe | PCI_PROBE_CONF1) & |
@@ -105,4 +106,17 @@ static int __init pcibios_init(void) | |||
105 | return 0; | 106 | return 0; |
106 | } | 107 | } |
107 | 108 | ||
108 | subsys_initcall(pcibios_init); | 109 | static __init int pci_subsys_init(void) |
110 | { | ||
111 | if (!is_visws_box()) | ||
112 | return -1; | ||
113 | |||
114 | pcibios_enable_irq = &pci_visws_enable_irq; | ||
115 | pcibios_disable_irq = &pci_visws_disable_irq; | ||
116 | |||
117 | pci_visws_init(); | ||
118 | pcibios_init(); | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | subsys_initcall(pci_subsys_init); | ||