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