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