• john stultz's avatar
    x86, hpet: fix for LS21 + HPET = boot hang · b13e2464
    john stultz authored
    Between 2.6.23 and 2.6.24-rc1 a change was made that broke IBM LS21
    systems that had the HPET enabled in the BIOS, resulting in boot hangs
    for x86_64.
    
    Specifically commit b8ce3359, which
    merges the i386 and x86_64 HPET code.
    
    Prior to this commit, when we setup the HPET timers in x86_64, we did
    the following:
    
    	hpet_writel(HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
                        HPET_TN_32BIT, HPET_T0_CFG);
    
    However after the i386/x86_64 HPET merge, we do the following:
    
    	cfg = hpet_readl(HPET_Tn_CFG(timer));
    	cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
    			HPET_TN_SETVAL | HPET_TN_32BIT;
    	hpet_writel(cfg, HPET_Tn_CFG(timer));
    
    However on LS21s with HPET enabled in the BIOS, the HPET_T0_CFG register
    boots with Level triggered interrupts (HPET_TN_LEVEL) enabled. This
    causes the periodic interrupt to be not so periodic, and that results in
    the boot time hang I reported earlier in the delay calibration.
    
    My fix: Always disable HPET_TN_LEVEL when setting up periodic mode.
    Signed-off-by: default avatarJohn Stultz <johnstul@us.ibm.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    b13e2464
hpet.c 25.3 KB