diff options
author | Stefan Assmann <sassmann@suse.de> | 2008-06-11 10:35:15 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-08 11:50:51 -0400 |
commit | 9197979b518573999d52d9e85bce1680682ed85c (patch) | |
tree | 056a03ab39e68e7533988f35d73a7b0cb9e99622 | |
parent | a9322f6488b432ddc1e89be88242c827c633fb63 (diff) |
x86, pci: introduce pci=ioapicreroute kernel cmdline option
Introduce pci=ioapicreroute kernel cmdline option to enable rerouting of boot
interrupts to the primary io-apic.
Signed-off-by: Stefan Assmann <sassmann@suse.de>
Signed-off-by: Olaf Dabrunz <od@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | Documentation/kernel-parameters.txt | 4 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 5 | ||||
-rw-r--r-- | include/asm-x86/io_apic.h | 4 | ||||
-rw-r--r-- | include/asm-x86/pci.h | 1 |
4 files changed, 14 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 1aebe9dffbaa..df262b3c3d6e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1521,6 +1521,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1521 | noioapicquirk [APIC] Disable all boot interrupt quirks. | 1521 | noioapicquirk [APIC] Disable all boot interrupt quirks. |
1522 | Safety option to keep boot IRQs enabled. This | 1522 | Safety option to keep boot IRQs enabled. This |
1523 | should never be necessary. | 1523 | should never be necessary. |
1524 | ioapicreroute [APIC] Enable rerouting of boot IRQs to the | ||
1525 | primary IO-APIC for bridges that cannot disable | ||
1526 | boot IRQs. This fixes a source of spurious IRQs | ||
1527 | when the system masks IRQs. | ||
1524 | biosirq [X86-32] Use PCI BIOS calls to get the interrupt | 1528 | biosirq [X86-32] Use PCI BIOS calls to get the interrupt |
1525 | routing table. These calls are known to be buggy | 1529 | routing table. These calls are known to be buggy |
1526 | on several machines and they hang the machine | 1530 | on several machines and they hang the machine |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index bc6a101ed7ec..0a9eaa736d94 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -23,6 +23,7 @@ unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | | |||
23 | static int pci_bf_sort; | 23 | static int pci_bf_sort; |
24 | int pci_routeirq; | 24 | int pci_routeirq; |
25 | int noioapicquirk; | 25 | int noioapicquirk; |
26 | int noioapicreroute = 1; | ||
26 | int pcibios_last_bus = -1; | 27 | int pcibios_last_bus = -1; |
27 | unsigned long pirq_table_addr; | 28 | unsigned long pirq_table_addr; |
28 | struct pci_bus *pci_root_bus; | 29 | struct pci_bus *pci_root_bus; |
@@ -499,6 +500,10 @@ char * __devinit pcibios_setup(char *str) | |||
499 | } else if (!strcmp(str, "noioapicquirk")) { | 500 | } else if (!strcmp(str, "noioapicquirk")) { |
500 | noioapicquirk = 1; | 501 | noioapicquirk = 1; |
501 | return NULL; | 502 | return NULL; |
503 | } else if (!strcmp(str, "ioapicreroute")) { | ||
504 | if (noioapicreroute != -1) | ||
505 | noioapicreroute = 0; | ||
506 | return NULL; | ||
502 | } | 507 | } |
503 | return str; | 508 | return str; |
504 | } | 509 | } |
diff --git a/include/asm-x86/io_apic.h b/include/asm-x86/io_apic.h index 8ca0110819f4..a39670ae17df 100644 --- a/include/asm-x86/io_apic.h +++ b/include/asm-x86/io_apic.h | |||
@@ -160,12 +160,16 @@ extern int skip_ioapic_setup; | |||
160 | /* 1 if "noapic" boot option passed */ | 160 | /* 1 if "noapic" boot option passed */ |
161 | extern int noioapicquirk; | 161 | extern int noioapicquirk; |
162 | 162 | ||
163 | /* -1 if "noapic" boot option passed */ | ||
164 | extern int noioapicreroute; | ||
165 | |||
163 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ | 166 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ |
164 | extern int timer_through_8259; | 167 | extern int timer_through_8259; |
165 | 168 | ||
166 | static inline void disable_ioapic_setup(void) | 169 | static inline void disable_ioapic_setup(void) |
167 | { | 170 | { |
168 | noioapicquirk = 1; | 171 | noioapicquirk = 1; |
172 | noioapicreroute = -1; | ||
169 | skip_ioapic_setup = 1; | 173 | skip_ioapic_setup = 1; |
170 | } | 174 | } |
171 | 175 | ||
diff --git a/include/asm-x86/pci.h b/include/asm-x86/pci.h index 30eec93a845e..52a29f7668ef 100644 --- a/include/asm-x86/pci.h +++ b/include/asm-x86/pci.h | |||
@@ -20,6 +20,7 @@ struct pci_sysdata { | |||
20 | 20 | ||
21 | extern int pci_routeirq; | 21 | extern int pci_routeirq; |
22 | extern int noioapicquirk; | 22 | extern int noioapicquirk; |
23 | extern int ioapicreroute; | ||
23 | 24 | ||
24 | /* scan a bus after allocating a pci_sysdata for it */ | 25 | /* scan a bus after allocating a pci_sysdata for it */ |
25 | extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, | 26 | extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, |