1 From: john stultz <johnstul@us.ibm.com>
2 Date: Fri, 13 Feb 2009 02:48:53 +0000 (-0800)
3 Subject: x86, hpet: fix for LS21 + HPET = boot hang
4 Patch-mainline: 2.6.29-rc6
5 Git-commit: b13e24644c138d0ddbc451403c30a96b09bfd556
8 x86, hpet: fix for LS21 + HPET = boot hang
10 Between 2.6.23 and 2.6.24-rc1 a change was made that broke IBM LS21
11 systems that had the HPET enabled in the BIOS, resulting in boot hangs
14 Specifically commit b8ce33590687888ebb900d09557b8807c4539022, which
15 merges the i386 and x86_64 HPET code.
17 Prior to this commit, when we setup the HPET timers in x86_64, we did
20 hpet_writel(HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
21 HPET_TN_32BIT, HPET_T0_CFG);
23 However after the i386/x86_64 HPET merge, we do the following:
25 cfg = hpet_readl(HPET_Tn_CFG(timer));
26 cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
27 HPET_TN_SETVAL | HPET_TN_32BIT;
28 hpet_writel(cfg, HPET_Tn_CFG(timer));
30 However on LS21s with HPET enabled in the BIOS, the HPET_T0_CFG register
31 boots with Level triggered interrupts (HPET_TN_LEVEL) enabled. This
32 causes the periodic interrupt to be not so periodic, and that results in
33 the boot time hang I reported earlier in the delay calibration.
35 My fix: Always disable HPET_TN_LEVEL when setting up periodic mode.
37 Signed-off-by: John Stultz <johnstul@us.ibm.com>
38 Signed-off-by: Ingo Molnar <mingo@elte.hu>
39 Acked-by: Jeff Mahoney <jeffm@suse.com>
43 arch/x86/kernel/hpet.c | 2 ++
44 1 file changed, 2 insertions(+)
46 --- a/arch/x86/kernel/hpet.c
47 +++ b/arch/x86/kernel/hpet.c
48 @@ -304,6 +304,8 @@ static void hpet_legacy_set_mode(enum cl
49 now = hpet_read_value(HPET_COUNTER);
50 cmp = now + (unsigned long) delta;
51 cfg = hpet_readl(HPET_T0_CFG);
52 + /* Make sure we use edge triggered interrupts */
53 + cfg &= ~HPET_TN_LEVEL;
54 cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
56 (hpet_legacy_use_64_bits ? 0 : HPET_TN_32BIT);