forked from Minki/linux
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>
This commit is contained in:
parent
92d499d991
commit
c86c7fbc82
@ -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
|
||||
|
@ -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>
|
||||
@ -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)
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/hpet.h>
|
||||
#include <asm/gart.h>
|
||||
|
||||
/*
|
||||
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user