Commit c86c7fbc829e27e2a4093f98ded9fbd75e515adb
Committed by
Ingo Molnar
1 parent
92d499d991
x86: disable hpet on shutdown
If HPET was enabled by pci quirks, we use i8253 as initial clockevent because pci quirks doesn't run until pci is initialized. The above means the kernel (or something) is assuming HPET legacy replacement is disabled and can use i8253 at boot. If we used kexec, it isn't true. So, this patch disables HPET legacy replacement for kexec in machine_shutdown(). Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Acked-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Showing 4 changed files with 23 additions and 0 deletions Side-by-side Diff
arch/x86/kernel/hpet.c
... | ... | @@ -446,6 +446,20 @@ |
446 | 446 | } |
447 | 447 | fs_initcall(hpet_late_init); |
448 | 448 | |
449 | +void hpet_disable(void) | |
450 | +{ | |
451 | + if (is_hpet_capable()) { | |
452 | + unsigned long cfg = hpet_readl(HPET_CFG); | |
453 | + | |
454 | + if (hpet_legacy_int_enabled) { | |
455 | + cfg &= ~HPET_CFG_LEGACY; | |
456 | + hpet_legacy_int_enabled = 0; | |
457 | + } | |
458 | + cfg &= ~HPET_CFG_ENABLE; | |
459 | + hpet_writel(cfg, HPET_CFG); | |
460 | + } | |
461 | +} | |
462 | + | |
449 | 463 | #ifdef CONFIG_HPET_EMULATE_RTC |
450 | 464 | |
451 | 465 | /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET |
arch/x86/kernel/reboot_32.c
... | ... | @@ -11,6 +11,7 @@ |
11 | 11 | #include <linux/reboot.h> |
12 | 12 | #include <asm/uaccess.h> |
13 | 13 | #include <asm/apic.h> |
14 | +#include <asm/hpet.h> | |
14 | 15 | #include <asm/desc.h> |
15 | 16 | #include "mach_reboot.h" |
16 | 17 | #include <asm/reboot_fixups.h> |
... | ... | @@ -325,6 +326,9 @@ |
325 | 326 | |
326 | 327 | #ifdef CONFIG_X86_IO_APIC |
327 | 328 | disable_IO_APIC(); |
329 | +#endif | |
330 | +#ifdef CONFIG_HPET_TIMER | |
331 | + hpet_disable(); | |
328 | 332 | #endif |
329 | 333 | } |
330 | 334 |
arch/x86/kernel/reboot_64.c
... | ... | @@ -17,6 +17,7 @@ |
17 | 17 | #include <asm/pgtable.h> |
18 | 18 | #include <asm/tlbflush.h> |
19 | 19 | #include <asm/apic.h> |
20 | +#include <asm/hpet.h> | |
20 | 21 | #include <asm/gart.h> |
21 | 22 | |
22 | 23 | /* |
... | ... | @@ -113,6 +114,9 @@ |
113 | 114 | |
114 | 115 | disable_IO_APIC(); |
115 | 116 | |
117 | +#ifdef CONFIG_HPET_TIMER | |
118 | + hpet_disable(); | |
119 | +#endif | |
116 | 120 | local_irq_restore(flags); |
117 | 121 | |
118 | 122 | pci_iommu_shutdown(); |
include/asm-x86/hpet.h