linux/arch/x86/kernel
Maciej W. Rozycki af174783b9 x86: I/O APIC: Never configure IRQ2
There is no such entity as ISA IRQ2.  The ACPI spec does not make it
explicitly clear, but does not preclude it either -- all it says is ISA
legacy interrupts are identity mapped by default (subject to overrides),
but it does not state whether IRQ2 exists or not.  As a result if there is
no IRQ0 override, then IRQ2 is normally initialised as an ISA interrupt,
which implies an edge-triggered line, which is unmasked by default as this
is what we do for edge-triggered I/O APIC interrupts so as not to miss an
edge.

To the best of my knowledge it is useless, as IRQ2 has not been in use
since the PC/AT as back then it was taken by the 8259A cascade interrupt
to the slave, with the line position in the slot rerouted to newly-created
IRQ9.  No device could thus make use of this line with the pair of 8259A
chips.  Now in theory INTIN2 of the I/O APIC may be usable, but the
interrupt of the device wired to it would not be available in the PIC mode
at all, so I seriously doubt if anybody decided to reuse it for a regular
device.

However there are two common uses of INTIN2.  One is for IRQ0, with an
ACPI interrupt override (or its equivalent in the MP table).  But in this
case IRQ2 is gone entirely with INTIN0 left vacant.  The other one is for
an 8959A ExtINTA cascade.  In this case IRQ0 goes to INTIN0 and if ACPI is
used INTIN2 is assumed to be IRQ2 (there is no override and ACPI has no
way to report ExtINTA interrupts).  This is where a problem happens.

The problem is INTIN2 is configured as a native APIC interrupt, with a
vector assigned and the mask cleared.  And the line may indeed get active
and inject interrupts if the master 8959A has its timer interrupt enabled
(it might happen for other interrupts too, but they are normally masked in
the process of rerouting them to the I/O APIC).  There are two cases where
it will happen:

* When the I/O APIC NMI watchdog is enabled.  This is actually a misnomer
  as the watchdog pulses are delivered through the 8259A to the LINT0
  inputs of all the local APICs in the system.  The implication is the
  output of the master 8259A goes high and low repeatedly, signalling
  interrupts to INTIN2 which is enabled too!

  [The origin of the name is I think for a brief period during the
  development we had a capability in our code to configure the watchdog to
  use an I/O APIC input; that would be INTIN2 in this scenario.]

* When the native route of IRQ0 via INTIN0 fails for whatever reason -- as
  it happens with the system considered here.  In this scenario the timer
  pulse is delivered through the 8259A to LINT0 input of the local APIC of
  the bootstrap processor, quite similarly to how is done for the watchdog
  described above.  The result is, again, INTIN2 receives these pulses
  too.  Rafael's system used to escape this scenario, because an incorrect
  IRQ0 override would occupy INTIN2 and prevent it from being unmasked.

My conclusion is IRQ2 should be excluded from configuration in all the
cases and the current exception for ACPI systems should be lifted.  The
reason being the exception not only being useless, but harmful as well.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: Andreas Herrmann <andreas.herrmann3@amd.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-07-11 20:54:03 +02:00
..
acpi x86: introduce max_low_pfn_mapped for 64-bit 2008-07-11 10:24:04 +02:00
cpu x86_64: add pseudo-features for 32-bit compat syscall 2008-07-11 15:44:57 +02:00
.gitignore
alternative.c x86: harden kernel code patching 2008-04-25 19:54:07 +02:00
amd_iommu_init.c x86, AMD IOMMU: remove unnecessary code from the iommu_enable function 2008-07-04 11:44:44 +02:00
amd_iommu.c x86, AMD IOMMU: flush domain TLB when there is more than one page to flush 2008-07-04 11:44:40 +02:00
aperture_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
apic_32.c x86: apic_32.c - add lapic resource 2008-07-09 07:43:24 +02:00
apic_64.c x86: nmi_watchdog - use NMI_NONE by default 2008-07-08 12:51:41 +02:00
apm_32.c x86: Switch apm to unlocked_kernel 2008-05-25 12:03:27 +02:00
asm-offsets_32.c x86/paravirt: split sysret and sysexit 2008-07-08 13:13:15 +02:00
asm-offsets_64.c x86: rename threadinfo to TI. 2008-07-09 09:14:02 +02:00
asm-offsets.c
audit_64.c
bootflag.c
cpuid.c PM: Remove destroy_suspended_device() 2008-04-19 19:10:28 -07:00
crash_dump_32.c
crash_dump_64.c
crash.c x86: allow machine_crash_shutdown to be replaced 2008-04-27 12:00:29 +03:00
doublefault_32.c
ds.c x86: debug Store - call kfree if only we really need it 2008-04-17 17:41:34 +02:00
e820.c x86: introduce max_low_pfn_mapped for 64-bit 2008-07-11 10:24:04 +02:00
early_printk.c x86: coding style fixes to x86/kernel/early_printk.c 2008-04-17 17:40:51 +02:00
early-quirks.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
efi_32.c x86: fix Intel Mac booting with EFI 2008-07-03 08:19:18 +02:00
efi_64.c x86: add flags parameter to reserve_bootmem_generic() 2008-07-08 11:49:49 +02:00
efi_stub_32.S
efi_stub_64.S
efi.c x86: introduce max_low_pfn_mapped for 64-bit 2008-07-11 10:24:04 +02:00
entry_32.S x86: use matching CFI_ENDPROC 2008-07-11 20:49:28 +02:00
entry_64.S x86: rename threadinfo to TI. 2008-07-09 09:14:02 +02:00
genapic_64.c x86: introduce max_physical_apicid for bigsmp switching 2008-06-10 11:32:09 +02:00
genapic_flat_64.c x86: use cpumask_of_cpu() 2008-04-17 17:41:36 +02:00
genx2apic_uv_x.c x86: map UV chipset space - UV support 2008-07-09 07:43:23 +02:00
geode_32.c x86, geode: add a VSA2 ID for General Software 2008-06-19 14:19:03 +02:00
head32.c x86: extract common part of head32.c and head64.c into head.c 2008-06-05 15:10:02 +02:00
head64.c x86: move reserve_setup_data to setup.c 2008-07-08 13:16:14 +02:00
head_32.S x86: boot secondary cpus through initial_code 2008-07-08 12:48:18 +02:00
head_64.S x86: always set _PAGE_GLOBAL in _PAGE_KERNEL* flags 2008-07-08 13:16:28 +02:00
head.c x86: move reserve_setup_data to setup.c 2008-07-08 13:16:14 +02:00
hpet.c x86: clean up computation of HPET .mult variables 2008-05-12 21:27:54 +02:00
i386_ksyms_32.c Generic semaphore implementation 2008-04-17 10:42:34 -04:00
i387.c x86 ptrace: fix PTRACE_GETFPXREGS error 2008-07-01 11:03:31 +02:00
i8237.c
i8253.c x86: cleanup div_sc() usage 2008-04-26 17:35:47 +02:00
i8259.c i8259: fix final ugliness 2008-06-02 11:55:52 +02:00
init_task.c [PATCH] take init_files to fs/file.c 2008-05-16 17:22:20 -04:00
io_apic_32.c x86: I/O APIC: Never configure IRQ2 2008-07-11 20:54:03 +02:00
io_apic_64.c x86: I/O APIC: Never configure IRQ2 2008-07-11 20:54:03 +02:00
io_delay.c x86: add dmi quirk for io_delay 2008-03-26 22:23:40 +01:00
ioport.c
ipi.c x86: ipi.c: removed duplicated include 2008-05-25 08:58:32 +02:00
irq_32.c Merge branch 'x86/irq' into x86/devel 2008-07-08 09:53:57 +02:00
irq_64.c x86: make /proc/stat account for all interrupts 2008-05-25 07:11:49 +02:00
irqinit_32.c x86: rename the i8259_32/64.c leftovers to irqinit_32/64.c 2008-05-24 16:47:39 +02:00
irqinit_64.c x86: rename the i8259_32/64.c leftovers to irqinit_32/64.c 2008-05-24 16:47:39 +02:00
k8.c
kdebugfs.c x86, boot: export linked list of struct setup_data via debugfs 2008-04-26 21:34:42 +02:00
kgdb.c x86: KGDB build fix 2008-04-19 19:19:54 +02:00
kprobes.c x86: replace most VM86 flags with flags from processor-flags.h 2008-04-17 17:41:33 +02:00
kvm.c x86: KVM guest: hypercall batching 2008-04-27 12:00:28 +03:00
kvmclock.c x86: KVM guest: Use the paravirt clocksource structs and functions 2008-06-24 21:02:33 +03:00
ldt.c x86: avoid re-loading LDT in unrelated address spaces 2008-05-22 19:11:20 +02:00
machine_kexec_32.c x86: arch/x86/kernel/machine_kexec_32.c: remove extra semicolons 2008-06-24 18:37:49 +02:00
machine_kexec_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
Makefile x86: fix tsc unification buglet with ftrace and stackprotector 2008-07-11 15:09:15 +02:00
mca_32.c x86: coding style fixes to arch/x86/kernel/mca_32.c 2008-04-17 17:40:49 +02:00
mfgpt_32.c geode: fix modular build 2008-06-12 21:25:51 +02:00
microcode.c x86: microcode: cosmetic changes 2008-07-03 11:37:20 +02:00
mmconf-fam10h_64.c x86: move mmconfig declarations to header 2008-05-30 15:45:17 -07:00
module_32.c
module_64.c
mpparse.c x86: add flags parameter to reserve_bootmem_generic() 2008-07-08 11:49:49 +02:00
msr.c PM: Remove destroy_suspended_device() 2008-04-19 19:10:28 -07:00
nmi.c x86: nmi_watchdog - introduce nmi_watchdog_active() helper 2008-07-08 12:51:42 +02:00
numaq_32.c x86: make generic arch support NUMAQ 2008-06-10 11:34:42 +02:00
olpc.c x86: olpc: add One Laptop Per Child architecture support 2008-04-29 08:06:07 -07:00
paravirt_patch_32.c x86/paravirt: split sysret and sysexit 2008-07-08 13:13:15 +02:00
paravirt_patch_64.c x86/paravirt: add sysret/sysexit pvops for returning to 32-bit compatibility userspace 2008-07-08 13:15:52 +02:00
paravirt.c x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
pci-calgary_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
pci-dma.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
pci-gart_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
pci-nommu.c x86: unify pci-nommu 2008-04-19 19:19:57 +02:00
pci-swiotlb_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
pcspeaker.c
pmtimer_64.c
probe_roms_32.c x86: seperate probe_roms into another file 2008-07-08 12:50:05 +02:00
process_32.c x86: move cpu_exit_clear to process_32.c 2008-07-08 12:48:24 +02:00
process_64.c x86: save %fs and %gs before load_TLS() and arch_leave_lazy_cpu_mode() 2008-07-08 13:11:11 +02:00
process.c x86: add C1E aware idle function, fix 2008-07-08 07:47:37 +02:00
ptrace.c x86 ptrace: fix PTRACE_GETFPXREGS error 2008-07-01 11:03:31 +02:00
pvclock.c x86: Add structs and functions for paravirt clocksource 2008-06-24 21:02:31 +03:00
quirks.c x86: add another PCI ID for ICH6 force hpet. 2008-06-05 15:11:35 +02:00
reboot_fixups_32.c x86: constify data in reboot.c 2008-05-25 08:58:30 +02:00
reboot.c x86: constify data in reboot.c 2008-05-25 08:58:30 +02:00
relocate_kernel_32.S x86: relocate_kernel - use predefined macroses for page attributes 2008-04-17 17:41:29 +02:00
relocate_kernel_64.S x86: relocate_kernel - use predefined macroses for page attributes 2008-04-17 17:41:29 +02:00
rtc.c provide rtc_cmos platform device 2008-06-12 18:05:42 -07:00
scx200_32.c x86: fix sparse warning in kernel/scx200_32.c 2008-01-31 22:05:45 +01:00
setup_percpu.c x86: move prefill_possible_map calling early 2008-07-08 13:16:24 +02:00
setup.c x86: introduce max_low_pfn_mapped for 64-bit 2008-07-11 10:24:04 +02:00
sigframe.h x86: move struct definitions to unifed sigframe.h 2008-04-17 17:40:46 +02:00
signal_32.c signals: x86 TS_RESTORE_SIGMASK 2008-04-30 08:29:37 -07:00
signal_64.c signals: x86 TS_RESTORE_SIGMASK 2008-04-30 08:29:37 -07:00
smp.c x86: fix app crashes after SMP resume 2008-05-13 19:36:12 +02:00
smpboot.c arch/x86/kernel/smpboot.c: fix warning 2008-07-09 08:18:39 +02:00
smpcommon_32.c x86: create smpcommon.c 2008-04-17 17:40:55 +02:00
smpcommon.c x86: create smpcommon.c 2008-04-17 17:40:55 +02:00
stacktrace.c x86: don't save unreliable stack trace entries 2008-02-26 12:55:58 +01:00
step.c x86: prevent unconditional writes to DebugCtl MSR 2008-04-17 17:40:58 +02:00
summit_32.c x86: make generic arch support NUMAQ 2008-06-10 11:34:42 +02:00
sys_i386_32.c x86: coding style fixes to arch/x86/kernel/sys_i386_32.c 2008-06-10 12:34:54 +02:00
sys_x86_64.c unified (weak) sys_pipe implementation 2008-05-03 13:50:33 -07:00
syscall_64.c x86: coding style fixes to arch/x86/kernel/syscall_64.c 2008-04-17 17:40:48 +02:00
syscall_table_32.S timerfd: wire the new timerfd API to the x86 family 2008-02-05 09:44:07 -08:00
tce_64.c
test_nx.c x86: Explicitly include required header files. 2008-04-17 17:41:15 +02:00
test_rodata.c x86: include proper prototypes for rodata_test 2008-02-14 23:30:20 +01:00
time_32.c x86: merge sched_clock handling 2008-07-09 07:43:25 +02:00
time_64.c x86: merge tsc_init and clocksource code 2008-07-09 07:43:27 +02:00
tlb_32.c x86: create tlb files 2008-04-17 17:40:56 +02:00
tlb_64.c SGI UV: TLB shootdown using broadcast assist unit, cleanups 2008-07-08 12:23:24 +02:00
tlb_uv.c x86, SGI UV: uv_ptc_proc_write fix 2008-07-08 12:23:31 +02:00
tls.c asmlinkage_protect replaces prevent_tail_call 2008-04-10 17:28:26 -07:00
tls.h
topology.c x86: fix section mismatch warning in topology.c:arch_register_cpu 2008-02-19 16:18:30 +01:00
trampoline_32.S x86: trampoline_32.S - switch to .cpuinit.data 2008-04-26 17:35:47 +02:00
trampoline_64.S x86: move suspend wakeup code to C 2008-04-17 17:41:37 +02:00
trampoline.c x86: extend e820 ealy_res support 32bit 2008-05-25 10:55:11 +02:00
traps_32.c x86: traps_xx: various small changes 2008-07-09 08:18:31 +02:00
traps_64.c x86: traps_xx: various small changes 2008-07-09 08:18:31 +02:00
tsc_sync.c x86: add warning to check_tsc_warp() 2008-01-30 13:33:24 +01:00
tsc.c x86: remove duplicate call to use_tsc_delay 2008-07-10 19:47:55 +02:00
verify_cpu_64.S
vm86_32.c x86: replace most VM86 flags with flags from processor-flags.h 2008-04-17 17:41:33 +02:00
vmi_32.c x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
vmiclock_32.c x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
vmlinux_32.lds.S x86: move tracedata to RODATA 2008-05-25 07:09:47 +02:00
vmlinux_64.lds.S Merge branches 'x86/numa-fixes', 'x86/apic', 'x86/apm', 'x86/bitops', 'x86/build', 'x86/cleanups', 'x86/cpa', 'x86/cpu', 'x86/defconfig', 'x86/gart', 'x86/i8259', 'x86/intel', 'x86/irqstats', 'x86/kconfig', 'x86/ldt', 'x86/mce', 'x86/memtest', 'x86/pat', 'x86/ptemask', 'x86/resumetrace', 'x86/threadinfo', 'x86/timers', 'x86/vdso' and 'x86/xen' into x86/devel 2008-07-08 09:16:56 +02:00
vmlinux.lds.S
vsmp_64.c x86: vsmp_64 add missing includes 2008-05-25 08:58:24 +02:00
vsyscall_64.c x86, 64-bit: use write_gdt_entry in vsyscall_set_cpu 2008-07-08 13:10:26 +02:00
x8664_ksyms_64.c x86: move x86_64 gdt closer to i386 2008-07-08 12:48:16 +02:00