On Mon, 27 Aug 2007 11:26:29 -0700 "Pallipadi, Venkatesh" <venkatesh.pallipadi@xxxxxxxxx> wrote: > > > - Another thing to try is to disable HPET and boot with PIT in the > first kernel. Just to check whether PIT never works on this platform > or the first kernel is doing something to stop PIT. You can try > "hpet=disable" boot option for that. > > Thanks, > Venki I've tried kernel 1 with HPET disabled - it boots fine, PIT works! Then I made additional investigations and found out that PIT won't work in kernel 2 if bit HPET_CFG_LEGACY is set. Bit HPET_CFG_LEGACY is set by hpet_enable_int() during HPET initialization, so if this bit is cleared in machine_kexec() kernel 2 boots fine. I can't explain this magic, maybe someone can explain this. Thanks. Here is new version of workaround for 2.6.23-rc3 Signed-off-by: Konstantin Baydarov <kbaidarov@xxxxxxxxxxxxx> arch/i386/kernel/hpet.c | 12 ++++++++++++ arch/i386/kernel/machine_kexec.c | 6 ++++++ include/asm-i386/hpet.h | 3 +++ 3 files changed, 21 insertions(+) Index: linux-2.6.23-rc3/arch/i386/kernel/hpet.c =================================================================== --- linux-2.6.23-rc3.orig/arch/i386/kernel/hpet.c +++ linux-2.6.23-rc3/arch/i386/kernel/hpet.c @@ -149,6 +149,18 @@ static void hpet_enable_int(void) hpet_legacy_int_enabled = 1; } +#ifdef CONFIG_KEXEC +void hpet_disable_int(void) +{ + unsigned long cfg = hpet_readl(HPET_CFG); + + cfg &= ~HPET_CFG_LEGACY; + hpet_writel(cfg, HPET_CFG); + hpet_legacy_int_enabled = 0; + +} +#endif + static void hpet_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { Index: linux-2.6.23-rc3/arch/i386/kernel/machine_kexec.c =================================================================== --- linux-2.6.23-rc3.orig/arch/i386/kernel/machine_kexec.c +++ linux-2.6.23-rc3/arch/i386/kernel/machine_kexec.c @@ -19,6 +19,7 @@ #include <asm/cpufeature.h> #include <asm/desc.h> #include <asm/system.h> +#include <asm/hpet.h> #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE))) static u32 kexec_pgd[1024] PAGE_ALIGNED; @@ -109,6 +110,11 @@ NORET_TYPE void machine_kexec(struct kim /* Interrupts aren't acceptable while we reboot */ local_irq_disable(); +#ifdef CONFIG_HPET_TIMER + /* Without this PIT won't work in executed kernel */ + hpet_disable_int(); +#endif + control_page = page_address(image->control_code_page); memcpy(control_page, relocate_kernel, PAGE_SIZE); Index: linux-2.6.23-rc3/include/asm-i386/hpet.h =================================================================== --- linux-2.6.23-rc3.orig/include/asm-i386/hpet.h +++ linux-2.6.23-rc3/include/asm-i386/hpet.h @@ -66,6 +66,9 @@ extern unsigned long hpet_address; extern int is_hpet_enabled(void); extern int hpet_enable(void); +#ifdef CONFIG_KEXEC +extern void hpet_disable_int(void); +#endif #ifdef CONFIG_HPET_EMULATE_RTC - To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html