clock.h revision 11452
1/*
2 * Kernel interface to machine-dependent clock driver.
3 * Garrett Wollman, September 1994.
4 * This file is in the public domain.
5 */
6
7#ifndef _MACHINE_CLOCK_H_
8#define	_MACHINE_CLOCK_H_
9
10#ifdef I586_CPU
11
12#define I586_CYCLECTR(x) \
13	__asm __volatile(".byte 0x0f, 0x31" : "=A" (x))
14
15/*
16 * When we update the clock, we also update this bias value which is
17 * automatically subtracted in microtime().  We assume that CPU_THISTICKLEN()
18 * has been called at some point in the past, so that an appropriate value is
19 * set up in i586_last_tick.  (This works even if we are not being called
20 * from hardclock because hardclock will have run before and will made the
21 * call.)
22 */
23#define CPU_CLOCKUPDATE(otime, ntime) \
24	do { \
25	if(pentium_mhz) { \
26		disable_intr(); \
27		i586_ctr_bias = i586_last_tick; \
28		*(otime) = *(ntime); \
29		enable_intr(); \
30	} else { \
31		*(otime) = *(ntime); \
32	} \
33	} while(0)
34
35#define	CPU_THISTICKLEN(dflt) cpu_thisticklen(dflt)
36#else
37#define CPU_CLOCKUPDATE(otime, ntime) \
38		(*(otime) = *(ntime))
39#define CPU_THISTICKLEN(dflt) dflt
40#endif
41
42#if defined(KERNEL) && !defined(LOCORE)
43#include <sys/cdefs.h>
44#include <machine/frame.h>
45
46/*
47 * i386 to clock driver interface.
48 * XXX almost all of it is misplaced.  i586 stuff is done in isa/clock.c
49 * and isa stuff is done in i386/microtime.s and i386/support.s.
50 */
51extern int	adjkerntz;
52extern int	disable_rtc_set;
53#ifdef I586_CPU
54extern int	pentium_mhz;
55extern long long i586_last_tick;
56extern long long i586_ctr_bias;
57#endif
58extern int 	timer0_max_count;
59extern u_int 	timer0_overflow_threshold;
60extern u_int 	timer0_prescaler_count;
61
62#ifdef I586_CPU
63void	calibrate_cyclecounter __P((void));
64#endif
65void	clkintr __P((struct clockframe frame));
66void	rtcintr __P((struct clockframe frame));
67
68#ifdef I586_CPU
69static __inline u_long
70cpu_thisticklen(u_long dflt)
71{
72	long long old;
73	long rv;
74
75	if (pentium_mhz) {
76		old = i586_last_tick;
77		I586_CYCLECTR(i586_last_tick);
78		rv = (i586_last_tick - old) / pentium_mhz;
79	} else {
80		rv = dflt;
81	}
82	return rv;
83}
84#endif
85
86/*
87 * Driver to clock driver interface.
88 */
89void	DELAY __P((int usec));
90int	acquire_timer0 __P((int rate,
91			    void (*function)(struct clockframe *frame)));
92int	acquire_timer2 __P((int mode));
93int	release_timer0 __P((void));
94int	release_timer2 __P((void));
95int	sysbeep __P((int pitch, int period));
96
97#endif /* KERNEL && !LOCORE */
98
99#endif /* !_MACHINE_CLOCK_H_ */
100