kernel-ark/arch/x86/kernel
Rene Herman b02aae9cf5 x86: provide a DMI based port 0x80 I/O delay override.
x86: provide a DMI based port 0x80 I/O delay override.

Certain (HP) laptops experience trouble from our port 0x80 I/O delay
writes. This patch provides for a DMI based switch to the "alternate
diagnostic port" 0xed (as used by some BIOSes as well) for these.

David P. Reed confirmed that port 0xed works for him and provides a
proper delay. The symptoms of _not_ working are a hanging machine,
with "hwclock" use being a direct trigger.

Earlier versions of this attempted to simply use udelay(2), with the
2 being a value tested to be a nicely conservative upper-bound with
help from many on the linux-kernel mailinglist but that approach has
two problems.

First, pre-loops_per_jiffy calibration (which is post PIT init while
some implementations of the PIT are actually one of the historically
problematic devices that need the delay) udelay() isn't particularly
well-defined. We could initialise loops_per_jiffy conservatively (and
based on CPU family so as to not unduly delay old machines) which
would sort of work, but...

Second, delaying isn't the only effect that a write to port 0x80 has.
It's also a PCI posting barrier which some devices may be explicitly
or implicitly relying on. Alan Cox did a survey and found evidence
that additionally some drivers may be racy on SMP without the bus
locking outb.

Switching to an inb() makes the timing too unpredictable and as such,
this DMI based switch should be the safest approach for now. Any more
invasive changes should get more rigid testing first. It's moreover
only very few machines with the problem and a DMI based hack seems
to fit that situation.

This also introduces a command-line parameter "io_delay" to override
the DMI based choice again:

	io_delay=<standard|alternate>

where "standard" means using the standard port 0x80 and "alternate"
port 0xed.

This retains the udelay method as a config (CONFIG_UDELAY_IO_DELAY) and
command-line ("io_delay=udelay") choice for testing purposes as well.

This does not change the io_delay() in the boot code which is using
the same port 0x80 I/O delay but those do not appear to be a problem
as David P. Reed reported the problem was already gone after using the
udelay version. He moreover reported that booting with "acpi=off" also
fixed things and seeing as how ACPI isn't touched until after this DMI
based I/O port switch I believe it's safe to leave the ones in the boot
code be.

The DMI strings from David's HP Pavilion dv9000z are in there already
and we need to get/verify the DMI info from other machines with the
problem, notably the HP Pavilion dv6000z.

This patch is partly based on earlier patches from Pavel Machek and
David P. Reed.

Signed-off-by: Rene Herman <rene.herman@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2008-01-30 13:30:05 +01:00
..
acpi ACPI: suspend: old debugging hacks sneaked back 2007-12-06 16:03:06 -05:00
cpu kobj: fix threshold_init_device/kobject_uevent_env oops 2008-01-30 13:29:58 +01:00
.gitignore .gitignore update for x86 arch 2007-10-17 21:19:04 +02:00
alternative.c x86: convert cpuinfo_x86 array to a per_cpu array 2007-10-19 20:35:04 +02:00
aperture_64.c x86 gart: rename symbols only used for the GART implementation 2007-10-30 00:22:22 +01:00
apic_32.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
apic_64.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
apm_32.c PM: ACPI and APM must not be enabled at the same time 2008-01-11 12:26:47 -05:00
asm-offsets_32.c Boot with virtual == physical to get closer to native Linux. 2007-10-23 15:49:54 +10:00
asm-offsets_64.c x86: Fix boot protocol KEEP_SEGMENTS check. 2007-10-27 20:57:43 +02:00
asm-offsets.c
audit_64.c
bootflag.c
bugs_64.c
cpuid.c PM: Acquire device locks on suspend 2008-01-24 20:40:04 -08:00
crash_dump_32.c kmap leak fix for x86_32 kdump 2007-10-19 11:53:33 -07:00
crash_dump_64.c
crash.c x86: disable hpet legacy replacement for kdump 2007-12-03 17:17:10 +01:00
doublefault_32.c
e820_32.c kexec: add BSS to resource tree 2007-10-22 08:13:19 -07:00
e820_64.c kexec: add BSS to resource tree 2007-10-22 08:13:19 -07:00
early_printk.c [x86] remove uses of magic macros for boot_params access 2007-10-16 17:38:31 -07:00
early-quirks.c x86 gart: rename symbols only used for the GART implementation 2007-10-30 00:22:22 +01:00
efi_32.c kexec: add BSS to resource tree 2007-10-22 08:13:19 -07:00
efi_stub_32.S
entry_32.S Merge branch 'xen-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen 2007-10-17 11:10:11 -07:00
entry_64.S sched: high-res preemption tick 2008-01-25 21:08:29 +01:00
genapic_64.c x86: convert cpu_to_apicid to be a per cpu variable 2007-10-19 20:35:03 +02:00
genapic_flat_64.c x86: convert cpu_to_apicid to be a per cpu variable 2007-10-19 20:35:03 +02:00
geode_32.c
head64.c x86: use descriptor's functions instead of inline assembly 2007-10-19 20:35:03 +02:00
head_32.S fix lguest rmmod "bad pgd" 2008-01-01 11:30:35 -08:00
head_64.S
hpet.c x86: assign IRQs to HPET timers, fix 2008-01-30 13:30:03 +01:00
i386_ksyms_32.c x86: export the symbol empty_zero_page on the 32-bit x86 architecture 2007-11-26 20:42:19 +01:00
i387_32.c
i387_64.c x86: fix taking DNA during 64bit sigreturn 2007-11-12 11:09:33 -08:00
i8237.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
i8253.c x86: unregister PIT clocksource when PIT is disabled 2008-01-30 13:30:03 +01:00
i8259_32.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
i8259_64.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
init_task.c x86: merge init_task_32/64.c 2007-10-19 20:35:02 +02:00
io_apic_32.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
io_apic_64.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
io_delay.c x86: provide a DMI based port 0x80 I/O delay override. 2008-01-30 13:30:05 +01:00
ioport_32.c
ioport_64.c
irq_32.c x86: also show non-zero IRQ counts for vectors that currently don't have a handler 2007-10-17 20:16:54 +02:00
irq_64.c x86: also show non-zero IRQ counts for vectors that currently don't have a handler 2007-10-17 20:16:54 +02:00
k8.c
kprobes_32.c x86: jprobe bugfix 2007-12-18 18:05:58 +01:00
kprobes_64.c x86: kprobes bugfix 2007-12-18 18:05:58 +01:00
ldt_32.c x86: convert mm_context_t semaphore to a mutex 2007-10-17 20:17:05 +02:00
ldt_64.c x86: convert mm_context_t semaphore to a mutex 2007-10-17 20:17:00 +02:00
machine_kexec_32.c Use extended crashkernel command line on i386 2007-10-19 11:53:49 -07:00
machine_kexec_64.c x86: Dump filtering supports x86_64 sparsemem 2007-10-27 20:57:43 +02:00
Makefile x86: delete vsyscall files during make clean 2007-10-17 21:56:01 +02:00
Makefile_32 x86: provide a DMI based port 0x80 I/O delay override. 2008-01-30 13:30:05 +01:00
Makefile_64 x86: provide a DMI based port 0x80 I/O delay override. 2008-01-30 13:30:05 +01:00
mca_32.c
mfgpt_32.c x86: GEODE fix a race condition in the MFGPT timer tick 2008-01-22 23:30:16 +01:00
microcode.c cpu-hotplug: replace lock_cpu_hotplug() with get_online_cpus() 2008-01-25 21:08:02 +01:00
module_32.c
module_64.c
mpparse_32.c spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
mpparse_64.c x86: acpi use cpu_physical_id 2007-10-19 20:35:03 +02:00
msr.c PM: Acquire device locks on suspend 2008-01-24 20:40:04 -08:00
nmi_32.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
nmi_64.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
numaq_32.c
paravirt_32.c x86/paravirt: revert exports to restore old behaviour 2007-11-29 09:24:55 -08:00
pci-calgary_64.c x86 gart: rename iommu.h to gart.h 2007-10-30 00:22:22 +01:00
pci-dma_32.c i386: Clean up duplicate includes in arch/i386/kernel/ 2007-10-17 20:15:51 +02:00
pci-dma_64.c x86: turn off iommu merge by default 2007-11-26 20:42:19 +01:00
pci-gart_64.c x86 gart: rename symbols only used for the GART implementation 2007-10-30 00:22:22 +01:00
pci-nommu_64.c x86 gart: rename iommu.h to gart.h 2007-10-30 00:22:22 +01:00
pci-swiotlb_64.c x86 gart: rename iommu.h to gart.h 2007-10-30 00:22:22 +01:00
pcspeaker.c
pmtimer_64.c
process_32.c Kick CPUS that might be sleeping in cpus_idle_wait 2008-01-14 08:52:22 -08:00
process_64.c time: more timer related cleanups 2008-01-30 13:30:00 +01:00
ptrace_32.c spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
ptrace_64.c x86: convert mm_context_t semaphore to a mutex 2007-10-17 20:17:00 +02:00
quirks.c x86: Add HPET force support for MCP55 (nForce 5) chipsets 2007-10-23 22:37:25 +02:00
reboot_32.c x86: disable hpet on shutdown 2007-12-03 17:17:10 +01:00
reboot_64.c x86: disable hpet on shutdown 2007-12-03 17:17:10 +01:00
reboot_fixups_32.c x86: reboot fixup for wrap2c board 2007-11-17 16:27:02 +01:00
relocate_kernel_32.S
relocate_kernel_64.S
scx200_32.c
setup64.c x86: use descriptor's functions instead of inline assembly 2007-10-19 20:35:03 +02:00
setup_32.c x86: provide a DMI based port 0x80 I/O delay override. 2008-01-30 13:30:05 +01:00
setup_64.c x86: provide a DMI based port 0x80 I/O delay override. 2008-01-30 13:30:05 +01:00
sigframe_32.h
signal_32.c sched: high-res preemption tick 2008-01-25 21:08:29 +01:00
signal_64.c sched: high-res preemption tick 2008-01-25 21:08:29 +01:00
smp_32.c x86: export smp_ops to allow modular build of KVM 2007-10-27 20:57:43 +02:00
smp_64.c x86: implement missing x86_64 function smp_call_function_mask() 2007-10-19 20:35:03 +02:00
smpboot_32.c x86 smpboot_32.c section fixes 2007-12-19 23:20:18 +01:00
smpboot_64.c x86: fix do_fork_idle section mismatch 2008-01-08 16:10:35 -08:00
smpcommon_32.c
srat_32.c
stacktrace.c sched: latencytop support 2008-01-25 21:08:34 +01:00
summit_32.c spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
suspend_64.c x86: hibernation: document __save_processor_state() on x86 2008-01-30 13:30:04 +01:00
suspend_asm_64.S x86: Save registers in saved_context during suspend and hibernation 2007-10-23 22:37:24 +02:00
sys_i386_32.c remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
sys_x86_64.c
syscall_64.c
syscall_table_32.S
sysenter_32.c
tce_64.c x86: Create clflush() inline, remove hardcoded wbinvd 2007-10-17 20:16:12 +02:00
time_32.c
time_64.c x86: on x86_64, correct reading of PC RTC when update in progress in time_64.c 2007-11-17 16:27:01 +01:00
topology.c x86: arch_register_cpu() section fix 2007-12-04 17:19:07 +01:00
trampoline_32.S x86: misc. constifications 2007-10-17 20:16:08 +02:00
trampoline_64.S x86: misc. constifications 2007-10-17 20:16:08 +02:00
traps_32.c lockdep: more hardirq annotations for notify_die() 2008-01-16 09:51:59 +01:00
traps_64.c lockdep: more hardirq annotations for notify_die() 2008-01-16 09:51:59 +01:00
tsc_32.c x86: fix more TSC clock source calibration errors 2007-10-23 22:37:22 +02:00
tsc_64.c x86: convert cpuinfo_x86 array to a per_cpu array 2007-10-19 20:35:04 +02:00
tsc_sync.c x86: fix: s2ram + P4 + tsc = annoyance 2008-01-30 13:30:04 +01:00
verify_cpu_64.S
vm86_32.c
vmi_32.c paravirt: clean up lazy mode handling 2007-10-16 11:51:29 -07:00
vmiclock_32.c
vmlinux_32.lds.S all archs: consolidate init and exit sections in vmlinux.lds.h 2008-01-28 23:21:17 +01:00
vmlinux_64.lds.S all archs: consolidate init and exit sections in vmlinux.lds.h 2008-01-28 23:21:17 +01:00
vmlinux.lds.S
vsmp_64.c
vsyscall_32.lds.S
vsyscall_32.S
vsyscall_64.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial 2007-10-19 20:36:17 -07:00
vsyscall-int80_32.S
vsyscall-note_32.S
vsyscall-sigreturn_32.S
vsyscall-sysenter_32.S
x8664_ksyms_64.c