]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/sys/timetc.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / sys / timetc.h
1 /*-
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.ORG> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  * $FreeBSD$
10  */
11
12 #ifndef _SYS_TIMETC_H_
13 #define _SYS_TIMETC_H_
14
15 #ifndef _KERNEL
16 #error "no user-serviceable parts inside"
17 #endif
18
19 /*-
20  * `struct timecounter' is the interface between the hardware which implements
21  * a timecounter and the MI code which uses this to keep track of time.
22  *
23  * A timecounter is a binary counter which has two properties:
24  *    * it runs at a fixed, known frequency.
25  *    * it has sufficient bits to not roll over in less than approximately
26  *      max(2 msec, 2/HZ seconds).  (The value 2 here is really 1 + delta,
27  *      for some indeterminate value of delta.)
28  */
29
30 struct timecounter;
31 typedef u_int timecounter_get_t(struct timecounter *);
32 typedef void timecounter_pps_t(struct timecounter *);
33
34 struct timecounter {
35         timecounter_get_t       *tc_get_timecount;
36                 /*
37                  * This function reads the counter.  It is not required to
38                  * mask any unimplemented bits out, as long as they are
39                  * constant.
40                  */
41         timecounter_pps_t       *tc_poll_pps;
42                 /*
43                  * This function is optional.  It will be called whenever the
44                  * timecounter is rewound, and is intended to check for PPS
45                  * events.  Normal hardware does not need it but timecounters
46                  * which latch PPS in hardware (like sys/pci/xrpu.c) do.
47                  */
48         u_int                   tc_counter_mask;
49                 /* This mask should mask off any unimplemented bits. */
50         uint64_t                tc_frequency;
51                 /* Frequency of the counter in Hz. */
52         char                    *tc_name;
53                 /* Name of the timecounter. */
54         int                     tc_quality;
55                 /*
56                  * Used to determine if this timecounter is better than
57                  * another timecounter higher means better.  Negative
58                  * means "only use at explicit request".
59                  */
60         u_int                   tc_flags;
61 #define TC_FLAGS_C3STOP         1       /* Timer dies in C3. */
62
63         void                    *tc_priv;
64                 /* Pointer to the timecounter's private parts. */
65         struct timecounter      *tc_next;
66                 /* Pointer to the next timecounter. */
67 };
68
69 extern struct timecounter *timecounter;
70 extern int tc_min_ticktock_freq; /*
71                                   * Minimal tc_ticktock() call frequency,
72                                   * required to handle counter wraps.
73                                   */
74
75 u_int64_t tc_getfrequency(void);
76 void    tc_init(struct timecounter *tc);
77 void    tc_setclock(struct timespec *ts);
78 void    tc_ticktock(int cnt);
79 void    cpu_tick_calibration(void);
80
81 #ifdef SYSCTL_DECL
82 SYSCTL_DECL(_kern_timecounter);
83 #endif
84
85 #endif /* !_SYS_TIMETC_H_ */