summaryrefslogtreecommitdiff
path: root/arch/i386/kernel/timers/timer_hpet.c
diff options
context:
space:
mode:
authorjohn stultz <johnstul@us.ibm.com>2005-05-01 08:58:50 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-01 08:58:50 -0700
commit35492df5ae0f36f717448b2aea908d3a8891d1c4 (patch)
tree4b9ebb20ec019daf301eef37fd6c7b75a7ea7de9 /arch/i386/kernel/timers/timer_hpet.c
parent5b7abc6fdcaf103f15e06c518ef0aec02a9c00e7 (diff)
[PATCH] i386: fix hpet for systems that don't support legacy replacement
Currently the i386 HPET code assumes the entire HPET implementation from the spec is present. This breaks on boxes that do not implement the optional legacy timer replacement functionality portion of the spec. This patch, which is very similar to my x86-64 patch for the same issue, fixes the problem allowing i386 systems that cannot use the HPET for the timer interrupt and RTC to still use the HPET as a time source. I've tested this patch on a system systems without HPET, with HPET but without legacy timer replacement, as well as HPET with legacy timer replacement. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/timers/timer_hpet.c')
-rw-r--r--arch/i386/kernel/timers/timer_hpet.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c
index 713134e71844..f778f471a09a 100644
--- a/arch/i386/kernel/timers/timer_hpet.c
+++ b/arch/i386/kernel/timers/timer_hpet.c
@@ -79,7 +79,7 @@ static unsigned long get_offset_hpet(void)
eax = hpet_readl(HPET_COUNTER);
eax -= hpet_last; /* hpet delta */
-
+ eax = min(hpet_tick, eax);
/*
* Time offset = (hpet delta) * ( usecs per HPET clock )
* = (hpet delta) * ( usecs per tick / HPET clocks per tick)
@@ -105,9 +105,12 @@ static void mark_offset_hpet(void)
last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low;
rdtsc(last_tsc_low, last_tsc_high);
- offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
- if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
- int lost_ticks = (offset - hpet_last) / hpet_tick;
+ if (hpet_use_timer)
+ offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
+ else
+ offset = hpet_readl(HPET_COUNTER);
+ if (unlikely(((offset - hpet_last) >= (2*hpet_tick)) && (hpet_last != 0))) {
+ int lost_ticks = ((offset - hpet_last) / hpet_tick) - 1;
jiffies_64 += lost_ticks;
}
hpet_last = offset;