|
@@ -232,7 +232,8 @@ int __init hpet_enable(void)
|
|
|
{
|
|
|
unsigned long id;
|
|
|
uint64_t hpet_freq;
|
|
|
- u64 tmp;
|
|
|
+ u64 tmp, start, now;
|
|
|
+ cycle_t t1;
|
|
|
|
|
|
if (!is_hpet_capable())
|
|
|
return 0;
|
|
@@ -279,6 +280,27 @@ int __init hpet_enable(void)
|
|
|
/* Start the counter */
|
|
|
hpet_start_counter();
|
|
|
|
|
|
+ /* Verify whether hpet counter works */
|
|
|
+ t1 = read_hpet();
|
|
|
+ rdtscll(start);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We don't know the TSC frequency yet, but waiting for
|
|
|
+ * 200000 TSC cycles is safe:
|
|
|
+ * 4 GHz == 50us
|
|
|
+ * 1 GHz == 200us
|
|
|
+ */
|
|
|
+ do {
|
|
|
+ rep_nop();
|
|
|
+ rdtscll(now);
|
|
|
+ } while ((now - start) < 200000UL);
|
|
|
+
|
|
|
+ if (t1 == read_hpet()) {
|
|
|
+ printk(KERN_WARNING
|
|
|
+ "HPET counter not counting. HPET disabled\n");
|
|
|
+ goto out_nohpet;
|
|
|
+ }
|
|
|
+
|
|
|
/* Initialize and register HPET clocksource
|
|
|
*
|
|
|
* hpet period is in femto seconds per cycle
|