fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / timex.h
index 31ef459..db501dc 100644 (file)
 #ifndef _LINUX_TIMEX_H
 #define _LINUX_TIMEX_H
 
-#include <linux/config.h>
 #include <linux/compiler.h>
+#include <linux/time.h>
 
 #include <asm/param.h>
 
-/*
- * The following defines establish the engineering parameters of the PLL
- * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
- * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
- * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
- * nearest power of two in order to avoid hardware multiply operations.
- */
-#if HZ >= 12 && HZ < 24
-# define SHIFT_HZ      4
-#elif HZ >= 24 && HZ < 48
-# define SHIFT_HZ      5
-#elif HZ >= 48 && HZ < 96
-# define SHIFT_HZ      6
-#elif HZ >= 96 && HZ < 192
-# define SHIFT_HZ      7
-#elif HZ >= 192 && HZ < 384
-# define SHIFT_HZ      8
-#elif HZ >= 384 && HZ < 768
-# define SHIFT_HZ      9
-#elif HZ >= 768 && HZ < 1536
-# define SHIFT_HZ      10
-#else
-# error You lose.
-#endif
-
 /*
  * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen
  * for a slightly underdamped convergence characteristic. SHIFT_KH
  * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours,
  * respectively.
  */
-#define SHIFT_KG 6             /* phase factor (shift) */
-#define SHIFT_KF 16            /* PLL frequency factor (shift) */
-#define SHIFT_KH 2             /* FLL frequency factor (shift) */
-#define MAXTC 6                        /* maximum time constant (shift) */
+#define SHIFT_PLL      4       /* PLL frequency factor (shift) */
+#define SHIFT_FLL      2       /* FLL frequency factor (shift) */
+#define MAXTC          10      /* maximum time constant (shift) */
 
 /*
- * The SHIFT_SCALE define establishes the decimal point of the time_phase
- * variable which serves as an extension to the low-order bits of the
- * system clock variable. The SHIFT_UPDATE define establishes the decimal
- * point of the time_offset variable which represents the current offset
- * with respect to standard time. The FINENSEC define represents 1 nsec in
- * scaled units.
+ * The SHIFT_UPDATE define establishes the decimal point of the
+ * time_offset variable which represents the current offset with
+ * respect to standard time.
  *
  * SHIFT_USEC defines the scaling (shift) of the time_freq and
  * time_tolerance variables, which represent the current frequency
  * offset and maximum frequency tolerance.
- *
- * FINENSEC is 1 ns in SHIFT_UPDATE units of the time_phase variable.
  */
-#define SHIFT_SCALE 22         /* phase scale (shift) */
-#define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */
+#define SHIFT_UPDATE (SHIFT_HZ + 1) /* time offset scale (shift) */
 #define SHIFT_USEC 16          /* frequency offset scale (shift) */
-#define FINENSEC (1L << (SHIFT_SCALE - 10)) /* ~1 ns in phase units */
+#define SHIFT_NSEC 12          /* kernel frequency offset scale */
 
 #define MAXPHASE 512000L        /* max phase error (us) */
 #define MAXFREQ (512L << SHIFT_USEC)  /* max frequency error (ppm) */
-#define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */
-#define MINSEC 16L              /* min interval between updates (s) */
-#define MAXSEC 1200L            /* max interval between updates (s) */
+#define MAXFREQ_NSEC (512000L << SHIFT_NSEC) /* max frequency error (ppb) */
+#define MINSEC 256             /* min interval between updates (s) */
+#define MAXSEC 2048            /* max interval between updates (s) */
 #define        NTP_PHASE_LIMIT (MAXPHASE << 5) /* beyond max. dispersion */
 
-/*
- * The following defines are used only if a pulse-per-second (PPS)
- * signal is available and connected via a modem control lead, such as
- * produced by the optional ppsclock feature incorporated in the Sun
- * asynch driver. They establish the design parameters of the frequency-
- * lock loop used to discipline the CPU clock oscillator to the PPS
- * signal.
- *
- * PPS_AVG is the averaging factor for the frequency loop, as well as
- * the time and frequency dispersion.
- *
- * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum
- * calibration intervals, respectively, in seconds as a power of two.
- *
- * PPS_VALID is the maximum interval before the PPS signal is considered
- * invalid and protocol updates used directly instead.
- *
- * MAXGLITCH is the maximum interval before a time offset of more than
- * MAXTIME is believed.
- */
-#define PPS_AVG 2              /* pps averaging constant (shift) */
-#define PPS_SHIFT 2            /* min interval duration (s) (shift) */
-#define PPS_SHIFTMAX 8         /* max interval duration (s) (shift) */
-#define PPS_VALID 120          /* pps signal watchdog max (s) */
-#define MAXGLITCH 30           /* pps signal glitch max (s) */
-
-/*
- * Pick up the architecture specific timex specifications
- */
-#include <asm/timex.h>
-
-/* LATCH is used in the interval timer and ftape setup. */
-#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
-
-/* Suppose we want to devide two numbers NOM and DEN: NOM/DEN, the we can
- * improve accuracy by shifting LSH bits, hence calculating:
- *     (NOM << LSH) / DEN
- * This however means trouble for large NOM, because (NOM << LSH) may no
- * longer fit in 32 bits. The following way of calculating this gives us
- * some slack, under the following conditions:
- *   - (NOM / DEN) fits in (32 - LSH) bits.
- *   - (NOM % DEN) fits in (32 - LSH) bits.
- */
-#define SH_DIV(NOM,DEN,LSH) (   ((NOM / DEN) << LSH)                    \
-                             + (((NOM % DEN) << LSH) + DEN / 2) / DEN)
-
-/* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */
-#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8))
-
-/* TICK_NSEC is the time between ticks in nsec assuming real ACTHZ */
-#define TICK_NSEC (SH_DIV (1000000UL * 1000, ACTHZ, 8))
-
-/* TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
-#define TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
-
-/* TICK_USEC_TO_NSEC is the time between ticks in nsec assuming real ACTHZ and */
-/* a value TUSEC for TICK_USEC (can be set bij adjtimex)               */
-#define TICK_USEC_TO_NSEC(TUSEC) (SH_DIV (TUSEC * USER_HZ * 1000, ACTHZ, 8))
-
-
-#include <linux/time.h>
 /*
  * syscall interface - used (mainly by NTP daemon)
  * to discipline kernel clock oscillator
@@ -277,6 +184,8 @@ struct timex {
 #define TIME_BAD       TIME_ERROR /* bw compat */
 
 #ifdef __KERNEL__
+#include <asm/timex.h>
+
 /*
  * kernel variables
  * Note: maximum error = NTP synch distance = dispersion + delay / 2;
@@ -289,36 +198,32 @@ extern int tickadj;                       /* amount of adjustment per tick */
 /*
  * phase-lock loop variables
  */
-extern int time_state;         /* clock status */
 extern int time_status;                /* clock synchronization status bits */
-extern long time_offset;       /* time adjustment (us) */
-extern long time_constant;     /* pll time constant */
-extern long time_tolerance;    /* frequency tolerance (ppm) */
-extern long time_precision;    /* clock precision (us) */
 extern long time_maxerror;     /* maximum error */
 extern long time_esterror;     /* estimated error */
 
-extern long time_phase;                /* phase offset (scaled us) */
 extern long time_freq;         /* frequency offset (scaled ppm) */
-extern long time_adj;          /* tick adjust (scaled 1 / HZ) */
-extern long time_reftime;      /* time at last adjustment (s) */
 
 extern long time_adjust;       /* The amount of adjtime left */
-extern long time_next_adjust;  /* Value for time_adjust at next tick */
-
-/* interface variables pps->timer interrupt */
-extern long pps_offset;                /* pps time offset (us) */
-extern long pps_jitter;                /* time dispersion (jitter) (us) */
-extern long pps_freq;          /* frequency offset (scaled ppm) */
-extern long pps_stabil;                /* frequency dispersion (scaled ppm) */
-extern long pps_valid;         /* pps signal watchdog counter */
-
-/* interface variables pps->adjtimex */
-extern int pps_shift;          /* interval duration (s) (shift) */
-extern long pps_jitcnt;                /* jitter limit exceeded */
-extern long pps_calcnt;                /* calibration intervals */
-extern long pps_errcnt;                /* calibration errors */
-extern long pps_stbcnt;                /* stability limit exceeded */
+
+extern void ntp_clear(void);
+
+/**
+ * ntp_synced - Returns 1 if the NTP status is not UNSYNC
+ *
+ */
+static inline int ntp_synced(void)
+{
+       return !(time_status & STA_UNSYNC);
+}
+
+/* Required to safely shift negative values */
+#define shift_right(x, s) ({   \
+       __typeof__(x) __x = (x);        \
+       __typeof__(s) __s = (s);        \
+       __x < 0 ? -(-__x >> __s) : __x >> __s;  \
+})
+
 
 #ifdef CONFIG_TIME_INTERPOLATION
 
@@ -343,20 +248,18 @@ extern long pps_stbcnt;           /* stability limit exceeded */
  * for the compensation is that the timer routines are not as scalable anymore.
  */
 
-#define INTERPOLATOR_ADJUST 65536
-#define INTERPOLATOR_MAX_SKIP 10*INTERPOLATOR_ADJUST
-
 struct time_interpolator {
-       unsigned short source;          /* time source flags */
-       unsigned char shift;            /* increases accuracy of multiply by shifting. */
-                       /* Note that bits may be lost if shift is set too high */
-       unsigned char jitter;           /* if set compensate for fluctuations */
-       unsigned nsec_per_cyc;          /* set by register_time_interpolator() */
+       u16 source;                     /* time source flags */
+       u8 shift;                       /* increases accuracy of multiply by shifting. */
+                               /* Note that bits may be lost if shift is set too high */
+       u8 jitter;                      /* if set compensate for fluctuations */
+       u32 nsec_per_cyc;               /* set by register_time_interpolator() */
        void *addr;                     /* address of counter or function */
+       u64 mask;                       /* mask the valid bits of the counter */
        unsigned long offset;           /* nsec offset at last update of interpolator */
-       unsigned long last_counter;     /* counter value in units of the counter at last update */
-       unsigned long last_cycle;       /* Last timer value if TIME_SOURCE_JITTER is set */
-       unsigned long frequency;        /* frequency in counts/second */
+       u64 last_counter;               /* counter value in units of the counter at last update */
+       u64 last_cycle;                 /* Last timer value if TIME_SOURCE_JITTER is set */
+       u64 frequency;                  /* frequency in counts/second */
        long drift;                     /* drift in parts-per-million (or -1) */
        unsigned long skips;            /* skips forward */
        unsigned long ns_skipped;       /* nanoseconds skipped */
@@ -366,18 +269,33 @@ struct time_interpolator {
 extern void register_time_interpolator(struct time_interpolator *);
 extern void unregister_time_interpolator(struct time_interpolator *);
 extern void time_interpolator_reset(void);
-extern unsigned long time_interpolator_resolution(void);
 extern unsigned long time_interpolator_get_offset(void);
+extern void time_interpolator_update(long delta_nsec);
 
 #else /* !CONFIG_TIME_INTERPOLATION */
 
-static inline void
-time_interpolator_reset(void)
+static inline void time_interpolator_reset(void)
+{
+}
+
+static inline void time_interpolator_update(long delta_nsec)
 {
 }
 
 #endif /* !CONFIG_TIME_INTERPOLATION */
 
+#define TICK_LENGTH_SHIFT      32
+
+/* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */
+extern u64 current_tick_length(void);
+
+extern void second_overflow(void);
+extern void update_ntp_one_tick(void);
+extern int do_adjtimex(struct timex *);
+
+/* Don't use! Compatibility define for existing users. */
+#define tickadj        (500/HZ ? : 1)
+
 #endif /* KERNEL */
 
 #endif /* LINUX_TIMEX_H */