Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
1: /***************************************************************************** 2: * * 3: * Copyright (c) David L. Mills 1993 * 4: * * 5: * Permission to use, copy, modify, and distribute this software and its * 6: * documentation for any purpose and without fee is hereby granted, provided * 7: * that the above copyright notice appears in all copies and that both the * 8: * copyright notice and this permission notice appear in supporting * 9: * documentation, and that the name University of Delaware not be used in * 10: * advertising or publicity pertaining to distribution of the software * 11: * without specific, written prior permission. The University of Delaware * 12: * makes no representations about the suitability this software for any * 13: * purpose. It is provided "as is" without express or implied warranty. * 14: * * 15: *****************************************************************************/ 16: 17: /* 18: * Modification history timex.h 19: * 20: * 29 Dec 97 Russell King 21: * Moved CLOCK_TICK_RATE, CLOCK_TICK_FACTOR and FINETUNE to asm/timex.h 22: * for ARM machines 23: * 24: * 9 Jan 97 Adrian Sun 25: * Shifted LATCH define to allow access to alpha machines. 26: * 27: * 26 Sep 94 David L. Mills 28: * Added defines for hybrid phase/frequency-lock loop. 29: * 30: * 19 Mar 94 David L. Mills 31: * Moved defines from kernel routines to header file and added new 32: * defines for PPS phase-lock loop. 33: * 34: * 20 Feb 94 David L. Mills 35: * Revised status codes and structures for external clock and PPS 36: * signal discipline. 37: * 38: * 28 Nov 93 David L. Mills 39: * Adjusted parameters to improve stability and increase poll 40: * interval. 41: * 42: * 17 Sep 93 David L. Mills 43: * Created file $NTP/include/sys/timex.h 44: * 07 Oct 93 Torsten Duwe 45: * Derived linux/timex.h 46: * 1995-08-13 Torsten Duwe 47: * kernel PLL updated to 1994-12-13 specs (rfc-1589) 48: * 1997-08-30 Ulrich Windl 49: * Added new constant NTP_PHASE_LIMIT 50: * 2004-08-12 Christoph Lameter 51: * Reworked time interpolation logic 52: */ 53: #ifndef _LINUX_TIMEX_H 54: #define _LINUX_TIMEX_H 55: 56: #include <uapi/linux/timex.h> 57: 58: #define ADJ_ADJTIME 0x8000 /* switch between adjtime/adjtimex modes */ 59: #define ADJ_OFFSET_SINGLESHOT 0x0001 /* old-fashioned adjtime */ 60: #define ADJ_OFFSET_READONLY 0x2000 /* read-only adjtime */ 61: #include <linux/compiler.h> 62: #include <linux/types.h> 63: #include <linux/param.h> 64: 65: #include <asm/timex.h> 66: 67: #ifndef random_get_entropy 68: /* 69: * The random_get_entropy() function is used by the /dev/random driver 70: * in order to extract entropy via the relative unpredictability of 71: * when an interrupt takes places versus a high speed, fine-grained 72: * timing source or cycle counter. Since it will be occurred on every 73: * single interrupt, it must have a very low cost/overhead. 74: * 75: * By default we use get_cycles() for this purpose, but individual 76: * architectures may override this in their asm/timex.h header file. 77: */ 78: #define random_get_entropy() get_cycles() 79: #endif 80: 81: /* 82: * SHIFT_PLL is used as a dampening factor to define how much we 83: * adjust the frequency correction for a given offset in PLL mode. 84: * It also used in dampening the offset correction, to define how 85: * much of the current value in time_offset we correct for each 86: * second. Changing this value changes the stiffness of the ntp 87: * adjustment code. A lower value makes it more flexible, reducing 88: * NTP convergence time. A higher value makes it stiffer, increasing 89: * convergence time, but making the clock more stable. 90: * 91: * In David Mills' nanokernel reference implementation SHIFT_PLL is 4. 92: * However this seems to increase convergence time much too long. 93: * 94: * https://lists.ntp.org/pipermail/hackers/2008-January/003487.html 95: * 96: * In the above mailing list discussion, it seems the value of 4 97: * was appropriate for other Unix systems with HZ=100, and that 98: * SHIFT_PLL should be decreased as HZ increases. However, Linux's 99: * clock steering implementation is HZ independent. 100: * 101: * Through experimentation, a SHIFT_PLL value of 2 was found to allow 102: * for fast convergence (very similar to the NTPv3 code used prior to 103: * v2.6.19), with good clock stability. 104: * 105: * 106: * SHIFT_FLL is used as a dampening factor to define how much we 107: * adjust the frequency correction for a given offset in FLL mode. 108: * In David Mills' nanokernel reference implementation SHIFT_FLL is 2. 109: * 110: * MAXTC establishes the maximum time constant of the PLL. 111: */ 112: #define SHIFT_PLL 2 /* PLL frequency factor (shift) */ 113: #define SHIFT_FLL 2 /* FLL frequency factor (shift) */ 114: #define MAXTC 10 /* maximum time constant (shift) */ 115: 116: /* 117: * SHIFT_USEC defines the scaling (shift) of the time_freq and 118: * time_tolerance variables, which represent the current frequency 119: * offset and maximum frequency tolerance. 120: */ 121: #define SHIFT_USEC 16 /* frequency offset scale (shift) */ 122: #define PPM_SCALE ((s64)NSEC_PER_USEC << (NTP_SCALE_SHIFT - SHIFT_USEC)) 123: #define PPM_SCALE_INV_SHIFT 19 124: #define PPM_SCALE_INV ((1LL << (PPM_SCALE_INV_SHIFT + NTP_SCALE_SHIFT)) / \ 125: PPM_SCALE + 1) 126: 127: #define MAXPHASE 500000000L /* max phase error (ns) */ 128: #define MAXFREQ 500000 /* max frequency error (ns/s) */ 129: #define MAXFREQ_SCALED ((s64)MAXFREQ << NTP_SCALE_SHIFT) 130: #define MINSEC 256 /* min interval between updates (s) */ 131: #define MAXSEC 2048 /* max interval between updates (s) */ 132: #define NTP_PHASE_LIMIT ((MAXPHASE / NSEC_PER_USEC) << 5) /* beyond max. dispersion */ 133: 134: /* 135: * kernel variables 136: * Note: maximum error = NTP synch distance = dispersion + delay / 2; 137: * estimated error = NTP dispersion. 138: */ 139: extern unsigned long tick_usec; /* USER_HZ period (usec) */ 140: extern unsigned long tick_nsec; /* SHIFTED_HZ period (nsec) */ 141: 142: /* Required to safely shift negative values */ 143: #define shift_right(x, s) ({ \ 144: __typeof__(x) __x = (x); \ 145: __typeof__(s) __s = (s); \ 146: __x < 0 ? -(-__x >> __s) : __x >> __s; \ 147: }) 148: 149: #define NTP_SCALE_SHIFT 32 150: 151: #define NTP_INTERVAL_FREQ (HZ) 152: #define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ) 153: 154: extern int do_adjtimex(struct timex *); 155: extern void hardpps(const struct timespec *, const struct timespec *); 156: 157: int read_current_timer(unsigned long *timer_val); 158: void ntp_notify_cmos_timer(void); 159: 160: /* The clock frequency of the i8253/i8254 PIT */ 161: #define PIT_TICK_RATE 1193182ul 162: 163: #endif /* LINUX_TIMEX_H */ 164: