]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/x86_64/kernel/time.c
7f58fa6824917beef6104bb6f3e1414179a8381b
[linux-2.6-omap-h63xx.git] / arch / x86_64 / kernel / time.c
1 /*
2  *  linux/arch/x86-64/kernel/time.c
3  *
4  *  "High Precision Event Timer" based timekeeping.
5  *
6  *  Copyright (c) 1991,1992,1995  Linus Torvalds
7  *  Copyright (c) 1994  Alan Modra
8  *  Copyright (c) 1995  Markus Kuhn
9  *  Copyright (c) 1996  Ingo Molnar
10  *  Copyright (c) 1998  Andrea Arcangeli
11  *  Copyright (c) 2002  Vojtech Pavlik
12  *  Copyright (c) 2003  Andi Kleen
13  *  RTC support code taken from arch/i386/kernel/timers/time_hpet.c
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/sched.h>
18 #include <linux/interrupt.h>
19 #include <linux/init.h>
20 #include <linux/mc146818rtc.h>
21 #include <linux/time.h>
22 #include <linux/ioport.h>
23 #include <linux/module.h>
24 #include <linux/device.h>
25 #include <linux/sysdev.h>
26 #include <linux/bcd.h>
27 #include <linux/kallsyms.h>
28 #include <linux/acpi.h>
29 #ifdef CONFIG_ACPI
30 #include <acpi/achware.h>       /* for PM timer frequency */
31 #endif
32 #include <asm/8253pit.h>
33 #include <asm/pgtable.h>
34 #include <asm/vsyscall.h>
35 #include <asm/timex.h>
36 #include <asm/proto.h>
37 #include <asm/hpet.h>
38 #include <asm/sections.h>
39 #include <linux/cpufreq.h>
40 #include <linux/hpet.h>
41 #ifdef CONFIG_X86_LOCAL_APIC
42 #include <asm/apic.h>
43 #endif
44
45 #ifdef CONFIG_CPU_FREQ
46 static void cpufreq_delayed_get(void);
47 #endif
48 extern void i8254_timer_resume(void);
49 extern int using_apic_timer;
50
51 static char *time_init_gtod(void);
52
53 DEFINE_SPINLOCK(rtc_lock);
54 DEFINE_SPINLOCK(i8253_lock);
55
56 int nohpet __initdata = 0;
57 static int notsc __initdata = 0;
58
59 #undef HPET_HACK_ENABLE_DANGEROUS
60
61 unsigned int cpu_khz;                                   /* TSC clocks / usec, not used here */
62 static unsigned long hpet_period;                       /* fsecs / HPET clock */
63 unsigned long hpet_tick;                                /* HPET clocks / interrupt */
64 int hpet_use_timer;                             /* Use counter of hpet for time keeping, otherwise PIT */
65 unsigned long vxtime_hz = PIT_TICK_RATE;
66 int report_lost_ticks;                          /* command line option */
67 unsigned long long monotonic_base;
68
69 struct vxtime_data __vxtime __section_vxtime;   /* for vsyscalls */
70
71 volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
72 unsigned long __wall_jiffies __section_wall_jiffies = INITIAL_JIFFIES;
73 struct timespec __xtime __section_xtime;
74 struct timezone __sys_tz __section_sys_tz;
75
76 /*
77  * do_gettimeoffset() returns microseconds since last timer interrupt was
78  * triggered by hardware. A memory read of HPET is slower than a register read
79  * of TSC, but much more reliable. It's also synchronized to the timer
80  * interrupt. Note that do_gettimeoffset() may return more than hpet_tick, if a
81  * timer interrupt has happened already, but vxtime.trigger wasn't updated yet.
82  * This is not a problem, because jiffies hasn't updated either. They are bound
83  * together by xtime_lock.
84  */
85
86 static inline unsigned int do_gettimeoffset_tsc(void)
87 {
88         unsigned long t;
89         unsigned long x;
90         t = get_cycles_sync();
91         if (t < vxtime.last_tsc) 
92                 t = vxtime.last_tsc; /* hack */
93         x = ((t - vxtime.last_tsc) * vxtime.tsc_quot) >> 32;
94         return x;
95 }
96
97 static inline unsigned int do_gettimeoffset_hpet(void)
98 {
99         /* cap counter read to one tick to avoid inconsistencies */
100         unsigned long counter = hpet_readl(HPET_COUNTER) - vxtime.last;
101         return (min(counter,hpet_tick) * vxtime.quot) >> 32;
102 }
103
104 unsigned int (*do_gettimeoffset)(void) = do_gettimeoffset_tsc;
105
106 /*
107  * This version of gettimeofday() has microsecond resolution and better than
108  * microsecond precision, as we're using at least a 10 MHz (usually 14.31818
109  * MHz) HPET timer.
110  */
111
112 void do_gettimeofday(struct timeval *tv)
113 {
114         unsigned long seq, t;
115         unsigned int sec, usec;
116
117         do {
118                 seq = read_seqbegin(&xtime_lock);
119
120                 sec = xtime.tv_sec;
121                 usec = xtime.tv_nsec / 1000;
122
123                 /* i386 does some correction here to keep the clock 
124                    monotonous even when ntpd is fixing drift.
125                    But they didn't work for me, there is a non monotonic
126                    clock anyways with ntp.
127                    I dropped all corrections now until a real solution can
128                    be found. Note when you fix it here you need to do the same
129                    in arch/x86_64/kernel/vsyscall.c and export all needed
130                    variables in vmlinux.lds. -AK */ 
131
132                 t = (jiffies - wall_jiffies) * (1000000L / HZ) +
133                         do_gettimeoffset();
134                 usec += t;
135
136         } while (read_seqretry(&xtime_lock, seq));
137
138         tv->tv_sec = sec + usec / 1000000;
139         tv->tv_usec = usec % 1000000;
140 }
141
142 EXPORT_SYMBOL(do_gettimeofday);
143
144 /*
145  * settimeofday() first undoes the correction that gettimeofday would do
146  * on the time, and then saves it. This is ugly, but has been like this for
147  * ages already.
148  */
149
150 int do_settimeofday(struct timespec *tv)
151 {
152         time_t wtm_sec, sec = tv->tv_sec;
153         long wtm_nsec, nsec = tv->tv_nsec;
154
155         if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
156                 return -EINVAL;
157
158         write_seqlock_irq(&xtime_lock);
159
160         nsec -= do_gettimeoffset() * 1000 +
161                 (jiffies - wall_jiffies) * (NSEC_PER_SEC/HZ);
162
163         wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
164         wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
165
166         set_normalized_timespec(&xtime, sec, nsec);
167         set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
168
169         ntp_clear();
170
171         write_sequnlock_irq(&xtime_lock);
172         clock_was_set();
173         return 0;
174 }
175
176 EXPORT_SYMBOL(do_settimeofday);
177
178 unsigned long profile_pc(struct pt_regs *regs)
179 {
180         unsigned long pc = instruction_pointer(regs);
181
182         /* Assume the lock function has either no stack frame or only a single 
183            word.  This checks if the address on the stack looks like a kernel 
184            text address.
185            There is a small window for false hits, but in that case the tick
186            is just accounted to the spinlock function.
187            Better would be to write these functions in assembler again
188            and check exactly. */
189         if (in_lock_functions(pc)) {
190                 char *v = *(char **)regs->rsp;
191                 if ((v >= _stext && v <= _etext) ||
192                         (v >= _sinittext && v <= _einittext) ||
193                         (v >= (char *)MODULES_VADDR  && v <= (char *)MODULES_END))
194                         return (unsigned long)v;
195                 return ((unsigned long *)regs->rsp)[1];
196         }
197         return pc;
198 }
199 EXPORT_SYMBOL(profile_pc);
200
201 /*
202  * In order to set the CMOS clock precisely, set_rtc_mmss has to be called 500
203  * ms after the second nowtime has started, because when nowtime is written
204  * into the registers of the CMOS clock, it will jump to the next second
205  * precisely 500 ms later. Check the Motorola MC146818A or Dallas DS12887 data
206  * sheet for details.
207  */
208
209 static void set_rtc_mmss(unsigned long nowtime)
210 {
211         int real_seconds, real_minutes, cmos_minutes;
212         unsigned char control, freq_select;
213
214 /*
215  * IRQs are disabled when we're called from the timer interrupt,
216  * no need for spin_lock_irqsave()
217  */
218
219         spin_lock(&rtc_lock);
220
221 /*
222  * Tell the clock it's being set and stop it.
223  */
224
225         control = CMOS_READ(RTC_CONTROL);
226         CMOS_WRITE(control | RTC_SET, RTC_CONTROL);
227
228         freq_select = CMOS_READ(RTC_FREQ_SELECT);
229         CMOS_WRITE(freq_select | RTC_DIV_RESET2, RTC_FREQ_SELECT);
230
231         cmos_minutes = CMOS_READ(RTC_MINUTES);
232                 BCD_TO_BIN(cmos_minutes);
233
234 /*
235  * since we're only adjusting minutes and seconds, don't interfere with hour
236  * overflow. This avoids messing with unknown time zones but requires your RTC
237  * not to be off by more than 15 minutes. Since we're calling it only when
238  * our clock is externally synchronized using NTP, this shouldn't be a problem.
239  */
240
241         real_seconds = nowtime % 60;
242         real_minutes = nowtime / 60;
243         if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1)
244                 real_minutes += 30;             /* correct for half hour time zone */
245         real_minutes %= 60;
246
247         if (abs(real_minutes - cmos_minutes) >= 30) {
248                 printk(KERN_WARNING "time.c: can't update CMOS clock "
249                        "from %d to %d\n", cmos_minutes, real_minutes);
250         } else {
251                 BIN_TO_BCD(real_seconds);
252                 BIN_TO_BCD(real_minutes);
253                 CMOS_WRITE(real_seconds, RTC_SECONDS);
254                 CMOS_WRITE(real_minutes, RTC_MINUTES);
255         }
256
257 /*
258  * The following flags have to be released exactly in this order, otherwise the
259  * DS12887 (popular MC146818A clone with integrated battery and quartz) will
260  * not reset the oscillator and will not update precisely 500 ms later. You
261  * won't find this mentioned in the Dallas Semiconductor data sheets, but who
262  * believes data sheets anyway ... -- Markus Kuhn
263  */
264
265         CMOS_WRITE(control, RTC_CONTROL);
266         CMOS_WRITE(freq_select, RTC_FREQ_SELECT);
267
268         spin_unlock(&rtc_lock);
269 }
270
271
272 /* monotonic_clock(): returns # of nanoseconds passed since time_init()
273  *              Note: This function is required to return accurate
274  *              time even in the absence of multiple timer ticks.
275  */
276 unsigned long long monotonic_clock(void)
277 {
278         unsigned long seq;
279         u32 last_offset, this_offset, offset;
280         unsigned long long base;
281
282         if (vxtime.mode == VXTIME_HPET) {
283                 do {
284                         seq = read_seqbegin(&xtime_lock);
285
286                         last_offset = vxtime.last;
287                         base = monotonic_base;
288                         this_offset = hpet_readl(HPET_COUNTER);
289                 } while (read_seqretry(&xtime_lock, seq));
290                 offset = (this_offset - last_offset);
291                 offset *= (NSEC_PER_SEC/HZ) / hpet_tick;
292         } else {
293                 do {
294                         seq = read_seqbegin(&xtime_lock);
295
296                         last_offset = vxtime.last_tsc;
297                         base = monotonic_base;
298                 } while (read_seqretry(&xtime_lock, seq));
299                 this_offset = get_cycles_sync();
300                 offset = (this_offset - last_offset)*1000 / cpu_khz; 
301         }
302         return base + offset;
303 }
304 EXPORT_SYMBOL(monotonic_clock);
305
306 static noinline void handle_lost_ticks(int lost, struct pt_regs *regs)
307 {
308         static long lost_count;
309         static int warned;
310         if (report_lost_ticks) {
311                 printk(KERN_WARNING "time.c: Lost %d timer tick(s)! ", lost);
312                 print_symbol("rip %s)\n", regs->rip);
313         }
314
315         if (lost_count == 1000 && !warned) {
316                 printk(KERN_WARNING "warning: many lost ticks.\n"
317                        KERN_WARNING "Your time source seems to be instable or "
318                                 "some driver is hogging interupts\n");
319                 print_symbol("rip %s\n", regs->rip);
320                 if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) {
321                         printk(KERN_WARNING "Falling back to HPET\n");
322                         if (hpet_use_timer)
323                                 vxtime.last = hpet_readl(HPET_T0_CMP) - 
324                                                         hpet_tick;
325                         else
326                                 vxtime.last = hpet_readl(HPET_COUNTER);
327                         vxtime.mode = VXTIME_HPET;
328                         do_gettimeoffset = do_gettimeoffset_hpet;
329                 }
330                 /* else should fall back to PIT, but code missing. */
331                 warned = 1;
332         } else
333                 lost_count++;
334
335 #ifdef CONFIG_CPU_FREQ
336         /* In some cases the CPU can change frequency without us noticing
337            Give cpufreq a change to catch up. */
338         if ((lost_count+1) % 25 == 0)
339                 cpufreq_delayed_get();
340 #endif
341 }
342
343 void main_timer_handler(struct pt_regs *regs)
344 {
345         static unsigned long rtc_update = 0;
346         unsigned long tsc;
347         int delay = 0, offset = 0, lost = 0;
348
349 /*
350  * Here we are in the timer irq handler. We have irqs locally disabled (so we
351  * don't need spin_lock_irqsave()) but we don't know if the timer_bh is running
352  * on the other CPU, so we need a lock. We also need to lock the vsyscall
353  * variables, because both do_timer() and us change them -arca+vojtech
354  */
355
356         write_seqlock(&xtime_lock);
357
358         if (vxtime.hpet_address)
359                 offset = hpet_readl(HPET_COUNTER);
360
361         if (hpet_use_timer) {
362                 /* if we're using the hpet timer functionality,
363                  * we can more accurately know the counter value
364                  * when the timer interrupt occured.
365                  */
366                 offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
367                 delay = hpet_readl(HPET_COUNTER) - offset;
368         } else if (!pmtmr_ioport) {
369                 spin_lock(&i8253_lock);
370                 outb_p(0x00, 0x43);
371                 delay = inb_p(0x40);
372                 delay |= inb(0x40) << 8;
373                 spin_unlock(&i8253_lock);
374                 delay = LATCH - 1 - delay;
375         }
376
377         tsc = get_cycles_sync();
378
379         if (vxtime.mode == VXTIME_HPET) {
380                 if (offset - vxtime.last > hpet_tick) {
381                         lost = (offset - vxtime.last) / hpet_tick - 1;
382                 }
383
384                 monotonic_base += 
385                         (offset - vxtime.last)*(NSEC_PER_SEC/HZ) / hpet_tick;
386
387                 vxtime.last = offset;
388 #ifdef CONFIG_X86_PM_TIMER
389         } else if (vxtime.mode == VXTIME_PMTMR) {
390                 lost = pmtimer_mark_offset();
391 #endif
392         } else {
393                 offset = (((tsc - vxtime.last_tsc) *
394                            vxtime.tsc_quot) >> 32) - (USEC_PER_SEC / HZ);
395
396                 if (offset < 0)
397                         offset = 0;
398
399                 if (offset > (USEC_PER_SEC / HZ)) {
400                         lost = offset / (USEC_PER_SEC / HZ);
401                         offset %= (USEC_PER_SEC / HZ);
402                 }
403
404                 monotonic_base += (tsc - vxtime.last_tsc)*1000000/cpu_khz ;
405
406                 vxtime.last_tsc = tsc - vxtime.quot * delay / vxtime.tsc_quot;
407
408                 if ((((tsc - vxtime.last_tsc) *
409                       vxtime.tsc_quot) >> 32) < offset)
410                         vxtime.last_tsc = tsc -
411                                 (((long) offset << 32) / vxtime.tsc_quot) - 1;
412         }
413
414         if (lost > 0) {
415                 handle_lost_ticks(lost, regs);
416                 jiffies += lost;
417         }
418
419 /*
420  * Do the timer stuff.
421  */
422
423         do_timer(regs);
424 #ifndef CONFIG_SMP
425         update_process_times(user_mode(regs));
426 #endif
427
428 /*
429  * In the SMP case we use the local APIC timer interrupt to do the profiling,
430  * except when we simulate SMP mode on a uniprocessor system, in that case we
431  * have to call the local interrupt handler.
432  */
433
434 #ifndef CONFIG_X86_LOCAL_APIC
435         profile_tick(CPU_PROFILING, regs);
436 #else
437         if (!using_apic_timer)
438                 smp_local_timer_interrupt(regs);
439 #endif
440
441 /*
442  * If we have an externally synchronized Linux clock, then update CMOS clock
443  * accordingly every ~11 minutes. set_rtc_mmss() will be called in the jiffy
444  * closest to exactly 500 ms before the next second. If the update fails, we
445  * don't care, as it'll be updated on the next turn, and the problem (time way
446  * off) isn't likely to go away much sooner anyway.
447  */
448
449         if (ntp_synced() && xtime.tv_sec > rtc_update &&
450                 abs(xtime.tv_nsec - 500000000) <= tick_nsec / 2) {
451                 set_rtc_mmss(xtime.tv_sec);
452                 rtc_update = xtime.tv_sec + 660;
453         }
454  
455         write_sequnlock(&xtime_lock);
456 }
457
458 static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
459 {
460         if (apic_runs_main_timer > 1)
461                 return IRQ_HANDLED;
462         main_timer_handler(regs);
463 #ifdef CONFIG_X86_LOCAL_APIC
464         if (using_apic_timer)
465                 smp_send_timer_broadcast_ipi();
466 #endif
467         return IRQ_HANDLED;
468 }
469
470 static unsigned int cyc2ns_scale __read_mostly;
471 #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
472
473 static inline void set_cyc2ns_scale(unsigned long cpu_khz)
474 {
475         cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR)/cpu_khz;
476 }
477
478 static inline unsigned long long cycles_2_ns(unsigned long long cyc)
479 {
480         return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
481 }
482
483 unsigned long long sched_clock(void)
484 {
485         unsigned long a = 0;
486
487 #if 0
488         /* Don't do a HPET read here. Using TSC always is much faster
489            and HPET may not be mapped yet when the scheduler first runs.
490            Disadvantage is a small drift between CPUs in some configurations,
491            but that should be tolerable. */
492         if (__vxtime.mode == VXTIME_HPET)
493                 return (hpet_readl(HPET_COUNTER) * vxtime.quot) >> 32;
494 #endif
495
496         /* Could do CPU core sync here. Opteron can execute rdtsc speculatively,
497            which means it is not completely exact and may not be monotonous between
498            CPUs. But the errors should be too small to matter for scheduling
499            purposes. */
500
501         rdtscll(a);
502         return cycles_2_ns(a);
503 }
504
505 static unsigned long get_cmos_time(void)
506 {
507         unsigned int timeout = 1000000, year, mon, day, hour, min, sec;
508         unsigned char uip = 0, this = 0;
509         unsigned long flags;
510         unsigned extyear = 0;
511
512 /*
513  * The Linux interpretation of the CMOS clock register contents: When the
514  * Update-In-Progress (UIP) flag goes from 1 to 0, the RTC registers show the
515  * second which has precisely just started. Waiting for this can take up to 1
516  * second, we timeout approximately after 2.4 seconds on a machine with
517  * standard 8.3 MHz ISA bus.
518  */
519
520         spin_lock_irqsave(&rtc_lock, flags);
521
522         while (timeout && (!uip || this)) {
523                 uip |= this;
524                 this = CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP;
525                 timeout--;
526         }
527
528         /*
529          * Here we are safe to assume the registers won't change for a whole
530          * second, so we just go ahead and read them.
531          */
532         sec = CMOS_READ(RTC_SECONDS);
533         min = CMOS_READ(RTC_MINUTES);
534         hour = CMOS_READ(RTC_HOURS);
535         day = CMOS_READ(RTC_DAY_OF_MONTH);
536         mon = CMOS_READ(RTC_MONTH);
537         year = CMOS_READ(RTC_YEAR);
538
539 #ifdef CONFIG_ACPI
540         if (acpi_fadt.revision >= FADT2_REVISION_ID && acpi_fadt.century)
541                 extyear = CMOS_READ(acpi_fadt.century);
542 #endif
543
544         spin_unlock_irqrestore(&rtc_lock, flags);
545
546         /*
547          * We know that x86-64 always uses BCD format, no need to check the
548          * config register.
549          */
550
551         BCD_TO_BIN(sec);
552         BCD_TO_BIN(min);
553         BCD_TO_BIN(hour);
554         BCD_TO_BIN(day);
555         BCD_TO_BIN(mon);
556         BCD_TO_BIN(year);
557
558         if (extyear) {
559                 BCD_TO_BIN(extyear);
560                 year += extyear;
561                 printk(KERN_INFO "Extended CMOS year: %d\n", extyear);
562         } else { 
563                 /*
564                  * x86-64 systems only exists since 2002.
565                  * This will work up to Dec 31, 2100
566                  */
567                 year += 2000;
568         }
569
570         return mktime(year, mon, day, hour, min, sec);
571 }
572
573 #ifdef CONFIG_CPU_FREQ
574
575 /* Frequency scaling support. Adjust the TSC based timer when the cpu frequency
576    changes.
577    
578    RED-PEN: On SMP we assume all CPUs run with the same frequency.  It's
579    not that important because current Opteron setups do not support
580    scaling on SMP anyroads.
581
582    Should fix up last_tsc too. Currently gettimeofday in the
583    first tick after the change will be slightly wrong. */
584
585 #include <linux/workqueue.h>
586
587 static unsigned int cpufreq_delayed_issched = 0;
588 static unsigned int cpufreq_init = 0;
589 static struct work_struct cpufreq_delayed_get_work;
590
591 static void handle_cpufreq_delayed_get(void *v)
592 {
593         unsigned int cpu;
594         for_each_online_cpu(cpu) {
595                 cpufreq_get(cpu);
596         }
597         cpufreq_delayed_issched = 0;
598 }
599
600 /* if we notice lost ticks, schedule a call to cpufreq_get() as it tries
601  * to verify the CPU frequency the timing core thinks the CPU is running
602  * at is still correct.
603  */
604 static void cpufreq_delayed_get(void)
605 {
606         static int warned;
607         if (cpufreq_init && !cpufreq_delayed_issched) {
608                 cpufreq_delayed_issched = 1;
609                 if (!warned) {
610                         warned = 1;
611                         printk(KERN_DEBUG 
612         "Losing some ticks... checking if CPU frequency changed.\n");
613                 }
614                 schedule_work(&cpufreq_delayed_get_work);
615         }
616 }
617
618 static unsigned int  ref_freq = 0;
619 static unsigned long loops_per_jiffy_ref = 0;
620
621 static unsigned long cpu_khz_ref = 0;
622
623 static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
624                                  void *data)
625 {
626         struct cpufreq_freqs *freq = data;
627         unsigned long *lpj, dummy;
628
629         if (cpu_has(&cpu_data[freq->cpu], X86_FEATURE_CONSTANT_TSC))
630                 return 0;
631
632         lpj = &dummy;
633         if (!(freq->flags & CPUFREQ_CONST_LOOPS))
634 #ifdef CONFIG_SMP
635                 lpj = &cpu_data[freq->cpu].loops_per_jiffy;
636 #else
637                 lpj = &boot_cpu_data.loops_per_jiffy;
638 #endif
639
640         if (!ref_freq) {
641                 ref_freq = freq->old;
642                 loops_per_jiffy_ref = *lpj;
643                 cpu_khz_ref = cpu_khz;
644         }
645         if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
646             (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
647             (val == CPUFREQ_RESUMECHANGE)) {
648                 *lpj =
649                 cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
650
651                 cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
652                 if (!(freq->flags & CPUFREQ_CONST_LOOPS))
653                         vxtime.tsc_quot = (1000L << 32) / cpu_khz;
654         }
655         
656         set_cyc2ns_scale(cpu_khz_ref);
657
658         return 0;
659 }
660  
661 static struct notifier_block time_cpufreq_notifier_block = {
662          .notifier_call  = time_cpufreq_notifier
663 };
664
665 static int __init cpufreq_tsc(void)
666 {
667         INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get, NULL);
668         if (!cpufreq_register_notifier(&time_cpufreq_notifier_block,
669                                        CPUFREQ_TRANSITION_NOTIFIER))
670                 cpufreq_init = 1;
671         return 0;
672 }
673
674 core_initcall(cpufreq_tsc);
675
676 #endif
677
678 /*
679  * calibrate_tsc() calibrates the processor TSC in a very simple way, comparing
680  * it to the HPET timer of known frequency.
681  */
682
683 #define TICK_COUNT 100000000
684
685 static unsigned int __init hpet_calibrate_tsc(void)
686 {
687         int tsc_start, hpet_start;
688         int tsc_now, hpet_now;
689         unsigned long flags;
690
691         local_irq_save(flags);
692         local_irq_disable();
693
694         hpet_start = hpet_readl(HPET_COUNTER);
695         rdtscl(tsc_start);
696
697         do {
698                 local_irq_disable();
699                 hpet_now = hpet_readl(HPET_COUNTER);
700                 tsc_now = get_cycles_sync();
701                 local_irq_restore(flags);
702         } while ((tsc_now - tsc_start) < TICK_COUNT &&
703                  (hpet_now - hpet_start) < TICK_COUNT);
704
705         return (tsc_now - tsc_start) * 1000000000L
706                 / ((hpet_now - hpet_start) * hpet_period / 1000);
707 }
708
709
710 /*
711  * pit_calibrate_tsc() uses the speaker output (channel 2) of
712  * the PIT. This is better than using the timer interrupt output,
713  * because we can read the value of the speaker with just one inb(),
714  * where we need three i/o operations for the interrupt channel.
715  * We count how many ticks the TSC does in 50 ms.
716  */
717
718 static unsigned int __init pit_calibrate_tsc(void)
719 {
720         unsigned long start, end;
721         unsigned long flags;
722
723         spin_lock_irqsave(&i8253_lock, flags);
724
725         outb((inb(0x61) & ~0x02) | 0x01, 0x61);
726
727         outb(0xb0, 0x43);
728         outb((PIT_TICK_RATE / (1000 / 50)) & 0xff, 0x42);
729         outb((PIT_TICK_RATE / (1000 / 50)) >> 8, 0x42);
730         start = get_cycles_sync();
731         while ((inb(0x61) & 0x20) == 0);
732         end = get_cycles_sync();
733
734         spin_unlock_irqrestore(&i8253_lock, flags);
735         
736         return (end - start) / 50;
737 }
738
739 #ifdef  CONFIG_HPET
740 static __init int late_hpet_init(void)
741 {
742         struct hpet_data        hd;
743         unsigned int            ntimer;
744
745         if (!vxtime.hpet_address)
746                 return -1;
747
748         memset(&hd, 0, sizeof (hd));
749
750         ntimer = hpet_readl(HPET_ID);
751         ntimer = (ntimer & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT;
752         ntimer++;
753
754         /*
755          * Register with driver.
756          * Timer0 and Timer1 is used by platform.
757          */
758         hd.hd_phys_address = vxtime.hpet_address;
759         hd.hd_address = (void __iomem *)fix_to_virt(FIX_HPET_BASE);
760         hd.hd_nirqs = ntimer;
761         hd.hd_flags = HPET_DATA_PLATFORM;
762         hpet_reserve_timer(&hd, 0);
763 #ifdef  CONFIG_HPET_EMULATE_RTC
764         hpet_reserve_timer(&hd, 1);
765 #endif
766         hd.hd_irq[0] = HPET_LEGACY_8254;
767         hd.hd_irq[1] = HPET_LEGACY_RTC;
768         if (ntimer > 2) {
769                 struct hpet             *hpet;
770                 struct hpet_timer       *timer;
771                 int                     i;
772
773                 hpet = (struct hpet *) fix_to_virt(FIX_HPET_BASE);
774                 timer = &hpet->hpet_timers[2];
775                 for (i = 2; i < ntimer; timer++, i++)
776                         hd.hd_irq[i] = (timer->hpet_config &
777                                         Tn_INT_ROUTE_CNF_MASK) >>
778                                 Tn_INT_ROUTE_CNF_SHIFT;
779
780         }
781
782         hpet_alloc(&hd);
783         return 0;
784 }
785 fs_initcall(late_hpet_init);
786 #endif
787
788 static int hpet_timer_stop_set_go(unsigned long tick)
789 {
790         unsigned int cfg;
791
792 /*
793  * Stop the timers and reset the main counter.
794  */
795
796         cfg = hpet_readl(HPET_CFG);
797         cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
798         hpet_writel(cfg, HPET_CFG);
799         hpet_writel(0, HPET_COUNTER);
800         hpet_writel(0, HPET_COUNTER + 4);
801
802 /*
803  * Set up timer 0, as periodic with first interrupt to happen at hpet_tick,
804  * and period also hpet_tick.
805  */
806         if (hpet_use_timer) {
807                 hpet_writel(HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
808                     HPET_TN_32BIT, HPET_T0_CFG);
809                 hpet_writel(hpet_tick, HPET_T0_CMP);
810                 hpet_writel(hpet_tick, HPET_T0_CMP); /* AK: why twice? */
811                 cfg |= HPET_CFG_LEGACY;
812         }
813 /*
814  * Go!
815  */
816
817         cfg |= HPET_CFG_ENABLE;
818         hpet_writel(cfg, HPET_CFG);
819
820         return 0;
821 }
822
823 static int hpet_init(void)
824 {
825         unsigned int id;
826
827         if (!vxtime.hpet_address)
828                 return -1;
829         set_fixmap_nocache(FIX_HPET_BASE, vxtime.hpet_address);
830         __set_fixmap(VSYSCALL_HPET, vxtime.hpet_address, PAGE_KERNEL_VSYSCALL_NOCACHE);
831
832 /*
833  * Read the period, compute tick and quotient.
834  */
835
836         id = hpet_readl(HPET_ID);
837
838         if (!(id & HPET_ID_VENDOR) || !(id & HPET_ID_NUMBER))
839                 return -1;
840
841         hpet_period = hpet_readl(HPET_PERIOD);
842         if (hpet_period < 100000 || hpet_period > 100000000)
843                 return -1;
844
845         hpet_tick = (1000000000L * (USEC_PER_SEC / HZ) + hpet_period / 2) /
846                 hpet_period;
847
848         hpet_use_timer = (id & HPET_ID_LEGSUP);
849
850         return hpet_timer_stop_set_go(hpet_tick);
851 }
852
853 static int hpet_reenable(void)
854 {
855         return hpet_timer_stop_set_go(hpet_tick);
856 }
857
858 #define PIT_MODE 0x43
859 #define PIT_CH0  0x40
860
861 static void __init __pit_init(int val, u8 mode)
862 {
863         unsigned long flags;
864
865         spin_lock_irqsave(&i8253_lock, flags);
866         outb_p(mode, PIT_MODE);
867         outb_p(val & 0xff, PIT_CH0);    /* LSB */
868         outb_p(val >> 8, PIT_CH0);      /* MSB */
869         spin_unlock_irqrestore(&i8253_lock, flags);
870 }
871
872 void __init pit_init(void)
873 {
874         __pit_init(LATCH, 0x34); /* binary, mode 2, LSB/MSB, ch 0 */
875 }
876
877 void __init pit_stop_interrupt(void)
878 {
879         __pit_init(0, 0x30); /* mode 0 */
880 }
881
882 void __init stop_timer_interrupt(void)
883 {
884         char *name;
885         if (vxtime.hpet_address) {
886                 name = "HPET";
887                 hpet_timer_stop_set_go(0);
888         } else {
889                 name = "PIT";
890                 pit_stop_interrupt();
891         }
892         printk(KERN_INFO "timer: %s interrupt stopped.\n", name);
893 }
894
895 int __init time_setup(char *str)
896 {
897         report_lost_ticks = 1;
898         return 1;
899 }
900
901 static struct irqaction irq0 = {
902         timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL
903 };
904
905 void __init time_init(void)
906 {
907         char *timename;
908         char *gtod;
909
910 #ifdef HPET_HACK_ENABLE_DANGEROUS
911         if (!vxtime.hpet_address) {
912                 printk(KERN_WARNING "time.c: WARNING: Enabling HPET base "
913                        "manually!\n");
914                 outl(0x800038a0, 0xcf8);
915                 outl(0xff000001, 0xcfc);
916                 outl(0x800038a0, 0xcf8);
917                 vxtime.hpet_address = inl(0xcfc) & 0xfffffffe;
918                 printk(KERN_WARNING "time.c: WARNING: Enabled HPET "
919                        "at %#lx.\n", vxtime.hpet_address);
920         }
921 #endif
922         if (nohpet)
923                 vxtime.hpet_address = 0;
924
925         xtime.tv_sec = get_cmos_time();
926         xtime.tv_nsec = 0;
927
928         set_normalized_timespec(&wall_to_monotonic,
929                                 -xtime.tv_sec, -xtime.tv_nsec);
930
931         if (!hpet_init())
932                 vxtime_hz = (1000000000000000L + hpet_period / 2) / hpet_period;
933         else
934                 vxtime.hpet_address = 0;
935
936         if (hpet_use_timer) {
937                 cpu_khz = hpet_calibrate_tsc();
938                 timename = "HPET";
939 #ifdef CONFIG_X86_PM_TIMER
940         } else if (pmtmr_ioport && !vxtime.hpet_address) {
941                 vxtime_hz = PM_TIMER_FREQUENCY;
942                 timename = "PM";
943                 pit_init();
944                 cpu_khz = pit_calibrate_tsc();
945 #endif
946         } else {
947                 pit_init();
948                 cpu_khz = pit_calibrate_tsc();
949                 timename = "PIT";
950         }
951
952         vxtime.mode = VXTIME_TSC;
953         gtod = time_init_gtod();
954
955         printk(KERN_INFO "time.c: Using %ld.%06ld MHz WALL %s GTOD %s timer.\n",
956                vxtime_hz / 1000000, vxtime_hz % 1000000, timename, gtod);
957         printk(KERN_INFO "time.c: Detected %d.%03d MHz processor.\n",
958                 cpu_khz / 1000, cpu_khz % 1000);
959         vxtime.quot = (1000000L << 32) / vxtime_hz;
960         vxtime.tsc_quot = (1000L << 32) / cpu_khz;
961         vxtime.last_tsc = get_cycles_sync();
962         setup_irq(0, &irq0);
963
964         set_cyc2ns_scale(cpu_khz);
965 }
966
967 /*
968  * Make an educated guess if the TSC is trustworthy and synchronized
969  * over all CPUs.
970  */
971 __cpuinit int unsynchronized_tsc(void)
972 {
973 #ifdef CONFIG_SMP
974         if (oem_force_hpet_timer())
975                 return 1;
976         /* Intel systems are normally all synchronized. Exceptions
977            are handled in the OEM check above. */
978         if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
979                 return 0;
980 #endif
981         /* Assume multi socket systems are not synchronized */
982         return num_present_cpus() > 1;
983 }
984
985 /*
986  * Decide what mode gettimeofday should use.
987  */
988 __init static char *time_init_gtod(void)
989 {
990         char *timetype;
991
992         if (unsynchronized_tsc())
993                 notsc = 1;
994         if (vxtime.hpet_address && notsc) {
995                 timetype = hpet_use_timer ? "HPET" : "PIT/HPET";
996                 if (hpet_use_timer)
997                         vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick;
998                 else
999                         vxtime.last = hpet_readl(HPET_COUNTER);
1000                 vxtime.mode = VXTIME_HPET;
1001                 do_gettimeoffset = do_gettimeoffset_hpet;
1002 #ifdef CONFIG_X86_PM_TIMER
1003         /* Using PM for gettimeofday is quite slow, but we have no other
1004            choice because the TSC is too unreliable on some systems. */
1005         } else if (pmtmr_ioport && !vxtime.hpet_address && notsc) {
1006                 timetype = "PM";
1007                 do_gettimeoffset = do_gettimeoffset_pm;
1008                 vxtime.mode = VXTIME_PMTMR;
1009                 sysctl_vsyscall = 0;
1010                 printk(KERN_INFO "Disabling vsyscall due to use of PM timer\n");
1011 #endif
1012         } else {
1013                 timetype = hpet_use_timer ? "HPET/TSC" : "PIT/TSC";
1014                 vxtime.mode = VXTIME_TSC;
1015         }
1016         return timetype;
1017 }
1018
1019 __setup("report_lost_ticks", time_setup);
1020
1021 static long clock_cmos_diff;
1022 static unsigned long sleep_start;
1023
1024 /*
1025  * sysfs support for the timer.
1026  */
1027
1028 static int timer_suspend(struct sys_device *dev, pm_message_t state)
1029 {
1030         /*
1031          * Estimate time zone so that set_time can update the clock
1032          */
1033         long cmos_time =  get_cmos_time();
1034
1035         clock_cmos_diff = -cmos_time;
1036         clock_cmos_diff += get_seconds();
1037         sleep_start = cmos_time;
1038         return 0;
1039 }
1040
1041 static int timer_resume(struct sys_device *dev)
1042 {
1043         unsigned long flags;
1044         unsigned long sec;
1045         unsigned long ctime = get_cmos_time();
1046         unsigned long sleep_length = (ctime - sleep_start) * HZ;
1047
1048         if (vxtime.hpet_address)
1049                 hpet_reenable();
1050         else
1051                 i8254_timer_resume();
1052
1053         sec = ctime + clock_cmos_diff;
1054         write_seqlock_irqsave(&xtime_lock,flags);
1055         xtime.tv_sec = sec;
1056         xtime.tv_nsec = 0;
1057         if (vxtime.mode == VXTIME_HPET) {
1058                 if (hpet_use_timer)
1059                         vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick;
1060                 else
1061                         vxtime.last = hpet_readl(HPET_COUNTER);
1062 #ifdef CONFIG_X86_PM_TIMER
1063         } else if (vxtime.mode == VXTIME_PMTMR) {
1064                 pmtimer_resume();
1065 #endif
1066         } else
1067                 vxtime.last_tsc = get_cycles_sync();
1068         write_sequnlock_irqrestore(&xtime_lock,flags);
1069         jiffies += sleep_length;
1070         wall_jiffies += sleep_length;
1071         monotonic_base += sleep_length * (NSEC_PER_SEC/HZ);
1072         touch_softlockup_watchdog();
1073         return 0;
1074 }
1075
1076 static struct sysdev_class timer_sysclass = {
1077         .resume = timer_resume,
1078         .suspend = timer_suspend,
1079         set_kset_name("timer"),
1080 };
1081
1082 /* XXX this driverfs stuff should probably go elsewhere later -john */
1083 static struct sys_device device_timer = {
1084         .id     = 0,
1085         .cls    = &timer_sysclass,
1086 };
1087
1088 static int time_init_device(void)
1089 {
1090         int error = sysdev_class_register(&timer_sysclass);
1091         if (!error)
1092                 error = sysdev_register(&device_timer);
1093         return error;
1094 }
1095
1096 device_initcall(time_init_device);
1097
1098 #ifdef CONFIG_HPET_EMULATE_RTC
1099 /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
1100  * is enabled, we support RTC interrupt functionality in software.
1101  * RTC has 3 kinds of interrupts:
1102  * 1) Update Interrupt - generate an interrupt, every sec, when RTC clock
1103  *    is updated
1104  * 2) Alarm Interrupt - generate an interrupt at a specific time of day
1105  * 3) Periodic Interrupt - generate periodic interrupt, with frequencies
1106  *    2Hz-8192Hz (2Hz-64Hz for non-root user) (all freqs in powers of 2)
1107  * (1) and (2) above are implemented using polling at a frequency of
1108  * 64 Hz. The exact frequency is a tradeoff between accuracy and interrupt
1109  * overhead. (DEFAULT_RTC_INT_FREQ)
1110  * For (3), we use interrupts at 64Hz or user specified periodic
1111  * frequency, whichever is higher.
1112  */
1113 #include <linux/rtc.h>
1114
1115 #define DEFAULT_RTC_INT_FREQ    64
1116 #define RTC_NUM_INTS            1
1117
1118 static unsigned long UIE_on;
1119 static unsigned long prev_update_sec;
1120
1121 static unsigned long AIE_on;
1122 static struct rtc_time alarm_time;
1123
1124 static unsigned long PIE_on;
1125 static unsigned long PIE_freq = DEFAULT_RTC_INT_FREQ;
1126 static unsigned long PIE_count;
1127
1128 static unsigned long hpet_rtc_int_freq; /* RTC interrupt frequency */
1129 static unsigned int hpet_t1_cmp; /* cached comparator register */
1130
1131 int is_hpet_enabled(void)
1132 {
1133         return vxtime.hpet_address != 0;
1134 }
1135
1136 /*
1137  * Timer 1 for RTC, we do not use periodic interrupt feature,
1138  * even if HPET supports periodic interrupts on Timer 1.
1139  * The reason being, to set up a periodic interrupt in HPET, we need to
1140  * stop the main counter. And if we do that everytime someone diables/enables
1141  * RTC, we will have adverse effect on main kernel timer running on Timer 0.
1142  * So, for the time being, simulate the periodic interrupt in software.
1143  *
1144  * hpet_rtc_timer_init() is called for the first time and during subsequent
1145  * interuppts reinit happens through hpet_rtc_timer_reinit().
1146  */
1147 int hpet_rtc_timer_init(void)
1148 {
1149         unsigned int cfg, cnt;
1150         unsigned long flags;
1151
1152         if (!is_hpet_enabled())
1153                 return 0;
1154         /*
1155          * Set the counter 1 and enable the interrupts.
1156          */
1157         if (PIE_on && (PIE_freq > DEFAULT_RTC_INT_FREQ))
1158                 hpet_rtc_int_freq = PIE_freq;
1159         else
1160                 hpet_rtc_int_freq = DEFAULT_RTC_INT_FREQ;
1161
1162         local_irq_save(flags);
1163         cnt = hpet_readl(HPET_COUNTER);
1164         cnt += ((hpet_tick*HZ)/hpet_rtc_int_freq);
1165         hpet_writel(cnt, HPET_T1_CMP);
1166         hpet_t1_cmp = cnt;
1167         local_irq_restore(flags);
1168
1169         cfg = hpet_readl(HPET_T1_CFG);
1170         cfg &= ~HPET_TN_PERIODIC;
1171         cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
1172         hpet_writel(cfg, HPET_T1_CFG);
1173
1174         return 1;
1175 }
1176
1177 static void hpet_rtc_timer_reinit(void)
1178 {
1179         unsigned int cfg, cnt;
1180
1181         if (unlikely(!(PIE_on | AIE_on | UIE_on))) {
1182                 cfg = hpet_readl(HPET_T1_CFG);
1183                 cfg &= ~HPET_TN_ENABLE;
1184                 hpet_writel(cfg, HPET_T1_CFG);
1185                 return;
1186         }
1187
1188         if (PIE_on && (PIE_freq > DEFAULT_RTC_INT_FREQ))
1189                 hpet_rtc_int_freq = PIE_freq;
1190         else
1191                 hpet_rtc_int_freq = DEFAULT_RTC_INT_FREQ;
1192
1193         /* It is more accurate to use the comparator value than current count.*/
1194         cnt = hpet_t1_cmp;
1195         cnt += hpet_tick*HZ/hpet_rtc_int_freq;
1196         hpet_writel(cnt, HPET_T1_CMP);
1197         hpet_t1_cmp = cnt;
1198 }
1199
1200 /*
1201  * The functions below are called from rtc driver.
1202  * Return 0 if HPET is not being used.
1203  * Otherwise do the necessary changes and return 1.
1204  */
1205 int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
1206 {
1207         if (!is_hpet_enabled())
1208                 return 0;
1209
1210         if (bit_mask & RTC_UIE)
1211                 UIE_on = 0;
1212         if (bit_mask & RTC_PIE)
1213                 PIE_on = 0;
1214         if (bit_mask & RTC_AIE)
1215                 AIE_on = 0;
1216
1217         return 1;
1218 }
1219
1220 int hpet_set_rtc_irq_bit(unsigned long bit_mask)
1221 {
1222         int timer_init_reqd = 0;
1223
1224         if (!is_hpet_enabled())
1225                 return 0;
1226
1227         if (!(PIE_on | AIE_on | UIE_on))
1228                 timer_init_reqd = 1;
1229
1230         if (bit_mask & RTC_UIE) {
1231                 UIE_on = 1;
1232         }
1233         if (bit_mask & RTC_PIE) {
1234                 PIE_on = 1;
1235                 PIE_count = 0;
1236         }
1237         if (bit_mask & RTC_AIE) {
1238                 AIE_on = 1;
1239         }
1240
1241         if (timer_init_reqd)
1242                 hpet_rtc_timer_init();
1243
1244         return 1;
1245 }
1246
1247 int hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec)
1248 {
1249         if (!is_hpet_enabled())
1250                 return 0;
1251
1252         alarm_time.tm_hour = hrs;
1253         alarm_time.tm_min = min;
1254         alarm_time.tm_sec = sec;
1255
1256         return 1;
1257 }
1258
1259 int hpet_set_periodic_freq(unsigned long freq)
1260 {
1261         if (!is_hpet_enabled())
1262                 return 0;
1263
1264         PIE_freq = freq;
1265         PIE_count = 0;
1266
1267         return 1;
1268 }
1269
1270 int hpet_rtc_dropped_irq(void)
1271 {
1272         if (!is_hpet_enabled())
1273                 return 0;
1274
1275         return 1;
1276 }
1277
1278 irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1279 {
1280         struct rtc_time curr_time;
1281         unsigned long rtc_int_flag = 0;
1282         int call_rtc_interrupt = 0;
1283
1284         hpet_rtc_timer_reinit();
1285
1286         if (UIE_on | AIE_on) {
1287                 rtc_get_rtc_time(&curr_time);
1288         }
1289         if (UIE_on) {
1290                 if (curr_time.tm_sec != prev_update_sec) {
1291                         /* Set update int info, call real rtc int routine */
1292                         call_rtc_interrupt = 1;
1293                         rtc_int_flag = RTC_UF;
1294                         prev_update_sec = curr_time.tm_sec;
1295                 }
1296         }
1297         if (PIE_on) {
1298                 PIE_count++;
1299                 if (PIE_count >= hpet_rtc_int_freq/PIE_freq) {
1300                         /* Set periodic int info, call real rtc int routine */
1301                         call_rtc_interrupt = 1;
1302                         rtc_int_flag |= RTC_PF;
1303                         PIE_count = 0;
1304                 }
1305         }
1306         if (AIE_on) {
1307                 if ((curr_time.tm_sec == alarm_time.tm_sec) &&
1308                     (curr_time.tm_min == alarm_time.tm_min) &&
1309                     (curr_time.tm_hour == alarm_time.tm_hour)) {
1310                         /* Set alarm int info, call real rtc int routine */
1311                         call_rtc_interrupt = 1;
1312                         rtc_int_flag |= RTC_AF;
1313                 }
1314         }
1315         if (call_rtc_interrupt) {
1316                 rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8));
1317                 rtc_interrupt(rtc_int_flag, dev_id, regs);
1318         }
1319         return IRQ_HANDLED;
1320 }
1321 #endif
1322
1323 static int __init nohpet_setup(char *s) 
1324
1325         nohpet = 1;
1326         return 0;
1327
1328
1329 __setup("nohpet", nohpet_setup);
1330
1331 int __init notsc_setup(char *s)
1332 {
1333         notsc = 1;
1334         return 0;
1335 }
1336
1337 __setup("notsc", notsc_setup);