clock.h revision 17394
114125Speter/* 214125Speter * Kernel interface to machine-dependent clock driver. 314125Speter * Garrett Wollman, September 1994. 414125Speter * This file is in the public domain. 514125Speter * 614125Speter * $Id: clock.h,v 1.15 1996/07/30 19:26:55 bde Exp $ 714125Speter */ 814125Speter 914125Speter#ifndef _MACHINE_CLOCK_H_ 1014125Speter#define _MACHINE_CLOCK_H_ 1114125Speter 1214125Speter#if defined(I586_CPU) || defined(I686_CPU) 1314125Speter 1414125Speter/* 1514125Speter * When we update the clock, we also update this bias value which is 1614125Speter * automatically subtracted in microtime(). We assume that CPU_THISTICKLEN() 1714125Speter * has been called at some point in the past, so that an appropriate value is 1814125Speter * set up in i586_last_tick. (This works even if we are not being called 1914125Speter * from hardclock because hardclock will have run before and will made the 2014125Speter * call.) 2114125Speter */ 2214125Speter#define CPU_CLOCKUPDATE(otime, ntime) \ 2314125Speter do { \ 2414125Speter if (i586_ctr_freq != 0) { \ 2514125Speter disable_intr(); \ 2614125Speter i586_ctr_bias = i586_last_tick; \ 2714125Speter *(otime) = *(ntime); \ 2814125Speter enable_intr(); \ 2914125Speter } else { \ 3014125Speter *(otime) = *(ntime); \ 3114125Speter } \ 3214125Speter } while(0) 3314125Speter 3414125Speter#define CPU_THISTICKLEN(dflt) cpu_thisticklen(dflt) 3514125Speter#else 3614125Speter#define CPU_CLOCKUPDATE(otime, ntime) \ 3714125Speter (*(otime) = *(ntime)) 3814125Speter#define CPU_THISTICKLEN(dflt) dflt 3914125Speter#endif 4014125Speter 4114125Speter#define I586_CTR_COMULTIPLIER_SHIFT 20 4214125Speter#define I586_CTR_MULTIPLIER_SHIFT 32 4314125Speter 4414125Speter#if defined(KERNEL) && !defined(LOCORE) 4514125Speter#include <sys/cdefs.h> 4614125Speter#include <machine/frame.h> 4714125Speter 4814125Speter/* 4914125Speter * i386 to clock driver interface. 5014125Speter * XXX almost all of it is misplaced. i586 stuff is done in isa/clock.c 5114125Speter * and isa stuff is done in i386/microtime.s and i386/support.s. 5214125Speter */ 5314125Speterextern int adjkerntz; 5414125Speterextern int disable_rtc_set; 5514125Speterextern int statclock_disable; 5614125Speterextern int wall_cmos_clock; 5714125Speter 5814125Speter#if defined(I586_CPU) || defined(I686_CPU) 5914125Speterextern u_int i586_ctr_bias; 6014125Speterextern u_int i586_ctr_comultiplier; 6114125Speterextern u_int i586_ctr_freq; 6214125Speterextern u_int i586_ctr_multiplier; 6314125Speterextern long long i586_last_tick; 6414125Speterextern unsigned long i586_avg_tick; 6514125Speter#endif 6614125Speterextern int timer0_max_count; 6714125Speterextern u_int timer0_overflow_threshold; 6814125Speterextern u_int timer0_prescaler_count; 6914125Speter 7014125Speter 7114125Speter#if defined(I586_CPU) || defined(I686_CPU) 7214125Speterstatic __inline u_long 7314125Spetercpu_thisticklen(u_long dflt) 7414125Speter{ 7514125Speter long long old; 7614125Speter long len; 7714125Speter 7814125Speter if (i586_ctr_freq != 0) { 7914125Speter old = i586_last_tick; 8014125Speter i586_last_tick = rdtsc(); 8114125Speter len = ((i586_last_tick - old) * i586_ctr_multiplier) 8214125Speter >> I586_CTR_MULTIPLIER_SHIFT; 8314125Speter i586_avg_tick = i586_avg_tick * 15 / 16 + len / 16; 8414125Speter } 8514125Speter return dflt; 8614125Speter} 8714125Speter#endif 8814125Speter 8914125Speter/* 9014125Speter * Driver to clock driver interface. 9114125Speter */ 9214125Spetervoid DELAY __P((int usec)); 9314125Speterint acquire_timer0 __P((int rate, 9414125Speter void (*function)(struct clockframe *frame))); 9514125Speterint acquire_timer2 __P((int mode)); 9614125Speterint release_timer0 __P((void)); 9714125Speterint release_timer2 __P((void)); 9814125Speter#ifndef PC98 9914125Speterint rtcin __P((int val)); 10014125Speter#else 10114125Speterint acquire_timer1 __P((int mode)); 10214125Speterint release_timer1 __P((void)); 10314125Spetervoid rtc_serialcombit __P((int i)); 10414125Spetervoid rtc_serialcom __P((int i)); 10514125Spetervoid rtc_outb __P((int val)); 10614125Speter#endif 10714125Speterint sysbeep __P((int pitch, int period)); 10814125Speter 10914125Speter#endif /* KERNEL && !LOCORE */ 11014125Speter 11114125Speter#endif /* !_MACHINE_CLOCK_H_ */ 11214125Speter