summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/clock.h
blob: 1467e4e64bb1bb6eb68ad3d4aefb984238d499e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * Kernel interface to machine-dependent clock driver.
 * Garrett Wollman, September 1994.
 * This file is in the public domain.
 *
 *	$Id: clock.h,v 1.12 1996/04/22 19:40:27 nate Exp $
 */

#ifndef _MACHINE_CLOCK_H_
#define	_MACHINE_CLOCK_H_

#if defined(I586_CPU) || defined(I686_CPU)

/*
 * When we update the clock, we also update this bias value which is
 * automatically subtracted in microtime().  We assume that CPU_THISTICKLEN()
 * has been called at some point in the past, so that an appropriate value is
 * set up in i586_last_tick.  (This works even if we are not being called
 * from hardclock because hardclock will have run before and will made the
 * call.)
 */
#define CPU_CLOCKUPDATE(otime, ntime) \
	do { \
	if(i586_ctr_rate) { \
		disable_intr(); \
		i586_ctr_bias = i586_last_tick; \
		*(otime) = *(ntime); \
		enable_intr(); \
	} else { \
		*(otime) = *(ntime); \
	} \
	} while(0)

#define	CPU_THISTICKLEN(dflt) cpu_thisticklen(dflt)
#else
#define CPU_CLOCKUPDATE(otime, ntime) \
		(*(otime) = *(ntime))
#define CPU_THISTICKLEN(dflt) dflt
#endif

#define		I586_CTR_RATE_SHIFT	8

#if defined(KERNEL) && !defined(LOCORE)
#include <sys/cdefs.h>
#include <machine/frame.h>

/*
 * i386 to clock driver interface.
 * XXX almost all of it is misplaced.  i586 stuff is done in isa/clock.c
 * and isa stuff is done in i386/microtime.s and i386/support.s.
 */
extern int	adjkerntz;
extern int	disable_rtc_set;
extern int	statclock_disable;
extern int	wall_cmos_clock;

#if defined(I586_CPU) || defined(I686_CPU)
extern unsigned	i586_ctr_freq;
extern unsigned	i586_ctr_rate;	/* fixed point */
extern long long i586_last_tick;
extern long long i586_ctr_bias;
extern unsigned long i586_avg_tick;
#endif
extern int 	timer0_max_count;
extern u_int 	timer0_overflow_threshold;
extern u_int 	timer0_prescaler_count;


#if defined(I586_CPU) || defined(I686_CPU)
static __inline u_long 
cpu_thisticklen(u_long dflt)
{
	long long old;
	long len;

	if (i586_ctr_rate) {
		old = i586_last_tick;
		i586_last_tick = rdtsc();
		len = ((i586_last_tick - old) << I586_CTR_RATE_SHIFT)
			/ i586_ctr_rate;
		i586_avg_tick = i586_avg_tick * 15 / 16 + len / 16;
	}
	return dflt;
}
#endif

/*
 * Driver to clock driver interface.
 */
void	DELAY __P((int usec));
int	acquire_timer0 __P((int rate,
			    void (*function)(struct clockframe *frame)));
int	acquire_timer2 __P((int mode));
int	release_timer0 __P((void));
int	release_timer2 __P((void));
int	rtcin __P((int val));
int	sysbeep __P((int pitch, int period));

#endif /* KERNEL && !LOCORE */

#endif /* !_MACHINE_CLOCK_H_ */
OpenPOWER on IntegriCloud