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