Skip to content

Commit

Permalink
x86: disable hpet on shutdown
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
OGAWA Hirofumi authored and Ingo Molnar committed Dec 3, 2007
1 parent 92d499d commit c86c7fb
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 0 deletions.
14 changes: 14 additions & 0 deletions arch/x86/kernel/hpet.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,20 @@ static __init int hpet_late_init(void)
}
fs_initcall(hpet_late_init);

void hpet_disable(void)
{
if (is_hpet_capable()) {
unsigned long cfg = hpet_readl(HPET_CFG);

if (hpet_legacy_int_enabled) {
cfg &= ~HPET_CFG_LEGACY;
hpet_legacy_int_enabled = 0;
}
cfg &= ~HPET_CFG_ENABLE;
hpet_writel(cfg, HPET_CFG);
}
}

#ifdef CONFIG_HPET_EMULATE_RTC

/* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
Expand Down
4 changes: 4 additions & 0 deletions arch/x86/kernel/reboot_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <linux/reboot.h>
#include <asm/uaccess.h>
#include <asm/apic.h>
#include <asm/hpet.h>
#include <asm/desc.h>
#include "mach_reboot.h"
#include <asm/reboot_fixups.h>
Expand Down Expand Up @@ -326,6 +327,9 @@ static void native_machine_shutdown(void)
#ifdef CONFIG_X86_IO_APIC
disable_IO_APIC();
#endif
#ifdef CONFIG_HPET_TIMER
hpet_disable();
#endif
}

void __attribute__((weak)) mach_reboot_fixups(void)
Expand Down
4 changes: 4 additions & 0 deletions arch/x86/kernel/reboot_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <asm/pgtable.h>
#include <asm/tlbflush.h>
#include <asm/apic.h>
#include <asm/hpet.h>
#include <asm/gart.h>

/*
Expand Down Expand Up @@ -113,6 +114,9 @@ void machine_shutdown(void)

disable_IO_APIC();

#ifdef CONFIG_HPET_TIMER
hpet_disable();
#endif
local_irq_restore(flags);

pci_iommu_shutdown();
Expand Down
1 change: 1 addition & 0 deletions include/asm-x86/hpet.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ extern unsigned long force_hpet_address;
extern int hpet_force_user;
extern int is_hpet_enabled(void);
extern int hpet_enable(void);
extern void hpet_disable(void);
extern unsigned long hpet_readl(unsigned long a);
extern void force_hpet_resume(void);

Expand Down

0 comments on commit c86c7fb

Please sign in to comment.