Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 120904
b: refs/heads/master
c: 41b9eb2
h: refs/heads/master
v: v3
  • Loading branch information
Stefan Assmann authored and Ingo Molnar committed Jul 18, 2008
1 parent 1f2a944 commit d33079d
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3e370b29d35fb01bfb92c2814d6f79bf6a2cb970
refs/heads/master: 41b9eb264c8407655db57b60b4457fe1b2ec9977
4 changes: 4 additions & 0 deletions trunk/Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1536,6 +1536,10 @@ and is between 256 and 4096 characters. It is defined in the file
primary IO-APIC for bridges that cannot disable
boot IRQs. This fixes a source of spurious IRQs
when the system masks IRQs.
noioapicreroute [APIC] Disable workaround that uses the
boot IRQ equivalent of an IRQ that connects to
a chipset where boot IRQs cannot be disabled.
The opposite of ioapicreroute.
biosirq [X86-32] Use PCI BIOS calls to get the interrupt
routing table. These calls are known to be buggy
on several machines and they hang the machine
Expand Down
24 changes: 24 additions & 0 deletions trunk/arch/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,30 @@ config X86_VISWS_APIC
def_bool y
depends on X86_32 && X86_VISWS

config X86_REROUTE_FOR_BROKEN_BOOT_IRQS
bool "Reroute for broken boot IRQs"
default n
depends on X86_IO_APIC
help
This option enables a workaround that fixes a source of
spurious interrupts. This is recommended when threaded
interrupt handling is used on systems where the generation of
superfluous "boot interrupts" cannot be disabled.

Some chipsets generate a legacy INTx "boot IRQ" when the IRQ
entry in the chipset's IO-APIC is masked (as, e.g. the RT
kernel does during interrupt handling). On chipsets where this
boot IRQ generation cannot be disabled, this workaround keeps
the original IRQ line masked so that only the equivalent "boot
IRQ" is delivered to the CPUs. The workaround also tells the
kernel to set up the IRQ handler on the boot IRQ line. In this
way only one interrupt is delivered to the kernel. Otherwise
the spurious second interrupt may cause the kernel to bring
down (vital) interrupt lines.

Only affects "broken" chipsets. Interrupt sharing may be
increased on these systems.

config X86_MCE
bool "Machine Check Exception"
depends on !X86_VOYAGER
Expand Down
8 changes: 8 additions & 0 deletions trunk/arch/x86/pci/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ unsigned int pci_early_dump_regs;
static int pci_bf_sort;
int pci_routeirq;
int noioapicquirk;
#ifdef CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS
int noioapicreroute = 0;
#else
int noioapicreroute = 1;
#endif
int pcibios_last_bus = -1;
unsigned long pirq_table_addr;
struct pci_bus *pci_root_bus;
Expand Down Expand Up @@ -528,6 +532,10 @@ char * __devinit pcibios_setup(char *str)
if (noioapicreroute != -1)
noioapicreroute = 0;
return NULL;
} else if (!strcmp(str, "noioapicreroute")) {
if (noioapicreroute != -1)
noioapicreroute = 1;
return NULL;
}
return str;
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/pci/quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1397,7 +1397,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm);
*/
static void quirk_reroute_to_boot_interrupts_intel(struct pci_dev *dev)
{
if (noioapicquirk)
if (noioapicquirk || noioapicreroute)
return;

dev->irq_reroute_variant = INTEL_IRQ_REROUTE_VARIANT;
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/asm-x86/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct pci_sysdata {

extern int pci_routeirq;
extern int noioapicquirk;
extern int ioapicreroute;
extern int noioapicreroute;

/* scan a bus after allocating a pci_sysdata for it */
extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
Expand Down

0 comments on commit d33079d

Please sign in to comment.