File: /Users/paulross/dev/linux/linux-3.13/include/linux/timex.h

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: