Commit c86c7fbc829e27e2a4093f98ded9fbd75e515adb

Authored by OGAWA Hirofumi
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
... ... @@ -61,6 +61,7 @@
61 61 extern int hpet_force_user;
62 62 extern int is_hpet_enabled(void);
63 63 extern int hpet_enable(void);
  64 +extern void hpet_disable(void);
64 65 extern unsigned long hpet_readl(unsigned long a);
65 66 extern void force_hpet_resume(void);
66 67