linux/kernel/time/ntp.c
<<
>>
Prefs
   1/*
   2 * NTP state machine interfaces and logic.
   3 *
   4 * This code was mainly moved from kernel/timer.c and kernel/time.c
   5 * Please see those files for relevant copyright info and historical
   6 * changelogs.
   7 */
   8#include <linux/capability.h>
   9#include <linux/clocksource.h>
  10#include <linux/workqueue.h>
  11#include <linux/hrtimer.h>
  12#include <linux/jiffies.h>
  13#include <linux/math64.h>
  14#include <linux/timex.h>
  15#include <linux/time.h>
  16#include <linux/mm.h>
  17#include <linux/module.h>
  18
  19#include "tick-internal.h"
  20
  21/*
  22 * NTP timekeeping variables:
  23 */
  24
  25DEFINE_SPINLOCK(ntp_lock);
  26
  27
  28/* USER_HZ period (usecs): */
  29unsigned long                   tick_usec = TICK_USEC;
  30
  31/* SHIFTED_HZ period (nsecs): */
  32unsigned long                   tick_nsec;
  33
  34static u64                      tick_length;
  35static u64                      tick_length_base;
  36
  37#define MAX_TICKADJ             500LL           /* usecs */
  38#define MAX_TICKADJ_SCALED \
  39        (((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ)
  40
  41/*
  42 * phase-lock loop variables
  43 */
  44
  45/*
  46 * clock synchronization status
  47 *
  48 * (TIME_ERROR prevents overwriting the CMOS clock)
  49 */
  50static int                      time_state = TIME_OK;
  51
  52/* clock status bits:                                                   */
  53static int                      time_status = STA_UNSYNC;
  54
  55/* TAI offset (secs):                                                   */
  56static long                     time_tai;
  57
  58/* time adjustment (nsecs):                                             */
  59static s64                      time_offset;
  60
  61/* pll time constant:                                                   */
  62static long                     time_constant = 2;
  63
  64/* maximum error (usecs):                                               */
  65static long                     time_maxerror = NTP_PHASE_LIMIT;
  66
  67/* estimated error (usecs):                                             */
  68static long                     time_esterror = NTP_PHASE_LIMIT;
  69
  70/* frequency offset (scaled nsecs/secs):                                */
  71static s64                      time_freq;
  72
  73/* time at last adjustment (secs):                                      */
  74static long                     time_reftime;
  75
  76static long                     time_adjust;
  77
  78/* constant (boot-param configurable) NTP tick adjustment (upscaled)    */
  79static s64                      ntp_tick_adj;
  80
  81#ifdef CONFIG_NTP_PPS
  82
  83/*
  84 * The following variables are used when a pulse-per-second (PPS) signal
  85 * is available. They establish the engineering parameters of the clock
  86 * discipline loop when controlled by the PPS signal.
  87 */
  88#define PPS_VALID       10      /* PPS signal watchdog max (s) */
  89#define PPS_POPCORN     4       /* popcorn spike threshold (shift) */
  90#define PPS_INTMIN      2       /* min freq interval (s) (shift) */
  91#define PPS_INTMAX      8       /* max freq interval (s) (shift) */
  92#define PPS_INTCOUNT    4       /* number of consecutive good intervals to
  93                                   increase pps_shift or consecutive bad
  94                                   intervals to decrease it */
  95#define PPS_MAXWANDER   100000  /* max PPS freq wander (ns/s) */
  96
  97static int pps_valid;           /* signal watchdog counter */
  98static long pps_tf[3];          /* phase median filter */
  99static long pps_jitter;         /* current jitter (ns) */
 100static struct timespec pps_fbase; /* beginning of the last freq interval */
 101static int pps_shift;           /* current interval duration (s) (shift) */
 102static int pps_intcnt;          /* interval counter */
 103static s64 pps_freq;            /* frequency offset (scaled ns/s) */
 104static long pps_stabil;         /* current stability (scaled ns/s) */
 105
 106/*
 107 * PPS signal quality monitors
 108 */
 109static long pps_calcnt;         /* calibration intervals */
 110static long pps_jitcnt;         /* jitter limit exceeded */
 111static long pps_stbcnt;         /* stability limit exceeded */
 112static long pps_errcnt;         /* calibration errors */
 113
 114
 115/* PPS kernel consumer compensates the whole phase error immediately.
 116 * Otherwise, reduce the offset by a fixed factor times the time constant.
 117 */
 118static inline s64 ntp_offset_chunk(s64 offset)
 119{
 120        if (time_status & STA_PPSTIME && time_status & STA_PPSSIGNAL)
 121                return offset;
 122        else
 123                return shift_right(offset, SHIFT_PLL + time_constant);
 124}
 125
 126static inline void pps_reset_freq_interval(void)
 127{
 128        /* the PPS calibration interval may end
 129           surprisingly early */
 130        pps_shift = PPS_INTMIN;
 131        pps_intcnt = 0;
 132}
 133
 134/**
 135 * pps_clear - Clears the PPS state variables
 136 *
 137 * Must be called while holding a write on the ntp_lock
 138 */
 139static inline void pps_clear(void)
 140{
 141        pps_reset_freq_interval();
 142        pps_tf[0] = 0;
 143        pps_tf[1] = 0;
 144        pps_tf[2] = 0;
 145        pps_fbase.tv_sec = pps_fbase.tv_nsec = 0;
 146        pps_freq = 0;
 147}
 148
 149/* Decrease pps_valid to indicate that another second has passed since
 150 * the last PPS signal. When it reaches 0, indicate that PPS signal is
 151 * missing.
 152 *
 153 * Must be called while holding a write on the ntp_lock
 154 */
 155static inline void pps_dec_valid(void)
 156{
 157        if (pps_valid > 0)
 158                pps_valid--;
 159        else {
 160                time_status &= ~(STA_PPSSIGNAL | STA_PPSJITTER |
 161                                 STA_PPSWANDER | STA_PPSERROR);
 162                pps_clear();
 163        }
 164}
 165
 166static inline void pps_set_freq(s64 freq)
 167{
 168        pps_freq = freq;
 169}
 170
 171static inline int is_error_status(int status)
 172{
 173        return (time_status & (STA_UNSYNC|STA_CLOCKERR))
 174                /* PPS signal lost when either PPS time or
 175                 * PPS frequency synchronization requested
 176                 */
 177                || ((time_status & (STA_PPSFREQ|STA_PPSTIME))
 178                        && !(time_status & STA_PPSSIGNAL))
 179                /* PPS jitter exceeded when
 180                 * PPS time synchronization requested */
 181                || ((time_status & (STA_PPSTIME|STA_PPSJITTER))
 182                        == (STA_PPSTIME|STA_PPSJITTER))
 183                /* PPS wander exceeded or calibration error when
 184                 * PPS frequency synchronization requested
 185                 */
 186                || ((time_status & STA_PPSFREQ)
 187                        && (time_status & (STA_PPSWANDER|STA_PPSERROR)));
 188}
 189
 190static inline void pps_fill_timex(struct timex *txc)
 191{
 192        txc->ppsfreq       = shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) *
 193                                         PPM_SCALE_INV, NTP_SCALE_SHIFT);
 194        txc->jitter        = pps_jitter;
 195        if (!(time_status & STA_NANO))
 196                txc->jitter /= NSEC_PER_USEC;
 197        txc->shift         = pps_shift;
 198        txc->stabil        = pps_stabil;
 199        txc->jitcnt        = pps_jitcnt;
 200        txc->calcnt        = pps_calcnt;
 201        txc->errcnt        = pps_errcnt;
 202        txc->stbcnt        = pps_stbcnt;
 203}
 204
 205#else /* !CONFIG_NTP_PPS */
 206
 207static inline s64 ntp_offset_chunk(s64 offset)
 208{
 209        return shift_right(offset, SHIFT_PLL + time_constant);
 210}
 211
 212static inline void pps_reset_freq_interval(void) {}
 213static inline void pps_clear(void) {}
 214static inline void pps_dec_valid(void) {}
 215static inline void pps_set_freq(s64 freq) {}
 216
 217static inline int is_error_status(int status)
 218{
 219        return status & (STA_UNSYNC|STA_CLOCKERR);
 220}
 221
 222static inline void pps_fill_timex(struct timex *txc)
 223{
 224        /* PPS is not implemented, so these are zero */
 225        txc->ppsfreq       = 0;
 226        txc->jitter        = 0;
 227        txc->shift         = 0;
 228        txc->stabil        = 0;
 229        txc->jitcnt        = 0;
 230        txc->calcnt        = 0;
 231        txc->errcnt        = 0;
 232        txc->stbcnt        = 0;
 233}
 234
 235#endif /* CONFIG_NTP_PPS */
 236
 237
 238/**
 239 * ntp_synced - Returns 1 if the NTP status is not UNSYNC
 240 *
 241 */
 242static inline int ntp_synced(void)
 243{
 244        return !(time_status & STA_UNSYNC);
 245}
 246
 247
 248/*
 249 * NTP methods:
 250 */
 251
 252/*
 253 * Update (tick_length, tick_length_base, tick_nsec), based
 254 * on (tick_usec, ntp_tick_adj, time_freq):
 255 */
 256static void ntp_update_frequency(void)
 257{
 258        u64 second_length;
 259        u64 new_base;
 260
 261        second_length            = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
 262                                                << NTP_SCALE_SHIFT;
 263
 264        second_length           += ntp_tick_adj;
 265        second_length           += time_freq;
 266
 267        tick_nsec                = div_u64(second_length, HZ) >> NTP_SCALE_SHIFT;
 268        new_base                 = div_u64(second_length, NTP_INTERVAL_FREQ);
 269
 270        /*
 271         * Don't wait for the next second_overflow, apply
 272         * the change to the tick length immediately:
 273         */
 274        tick_length             += new_base - tick_length_base;
 275        tick_length_base         = new_base;
 276}
 277
 278static inline s64 ntp_update_offset_fll(s64 offset64, long secs)
 279{
 280        time_status &= ~STA_MODE;
 281
 282        if (secs < MINSEC)
 283                return 0;
 284
 285        if (!(time_status & STA_FLL) && (secs <= MAXSEC))
 286                return 0;
 287
 288        time_status |= STA_MODE;
 289
 290        return div64_long(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs);
 291}
 292
 293static void ntp_update_offset(long offset)
 294{
 295        s64 freq_adj;
 296        s64 offset64;
 297        long secs;
 298
 299        if (!(time_status & STA_PLL))
 300                return;
 301
 302        if (!(time_status & STA_NANO))
 303                offset *= NSEC_PER_USEC;
 304
 305        /*
 306         * Scale the phase adjustment and
 307         * clamp to the operating range.
 308         */
 309        offset = min(offset, MAXPHASE);
 310        offset = max(offset, -MAXPHASE);
 311
 312        /*
 313         * Select how the frequency is to be controlled
 314         * and in which mode (PLL or FLL).
 315         */
 316        secs = get_seconds() - time_reftime;
 317        if (unlikely(time_status & STA_FREQHOLD))
 318                secs = 0;
 319
 320        time_reftime = get_seconds();
 321
 322        offset64    = offset;
 323        freq_adj    = ntp_update_offset_fll(offset64, secs);
 324
 325        /*
 326         * Clamp update interval to reduce PLL gain with low
 327         * sampling rate (e.g. intermittent network connection)
 328         * to avoid instability.
 329         */
 330        if (unlikely(secs > 1 << (SHIFT_PLL + 1 + time_constant)))
 331                secs = 1 << (SHIFT_PLL + 1 + time_constant);
 332
 333        freq_adj    += (offset64 * secs) <<
 334                        (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant));
 335
 336        freq_adj    = min(freq_adj + time_freq, MAXFREQ_SCALED);
 337
 338        time_freq   = max(freq_adj, -MAXFREQ_SCALED);
 339
 340        time_offset = div_s64(offset64 << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ);
 341}
 342
 343/**
 344 * ntp_clear - Clears the NTP state variables
 345 */
 346void ntp_clear(void)
 347{
 348        unsigned long flags;
 349
 350        spin_lock_irqsave(&ntp_lock, flags);
 351
 352        time_adjust     = 0;            /* stop active adjtime() */
 353        time_status     |= STA_UNSYNC;
 354        time_maxerror   = NTP_PHASE_LIMIT;
 355        time_esterror   = NTP_PHASE_LIMIT;
 356
 357        ntp_update_frequency();
 358
 359        tick_length     = tick_length_base;
 360        time_offset     = 0;
 361
 362        /* Clear PPS state variables */
 363        pps_clear();
 364        spin_unlock_irqrestore(&ntp_lock, flags);
 365
 366}
 367
 368
 369u64 ntp_tick_length(void)
 370{
 371        unsigned long flags;
 372        s64 ret;
 373
 374        spin_lock_irqsave(&ntp_lock, flags);
 375        ret = tick_length;
 376        spin_unlock_irqrestore(&ntp_lock, flags);
 377        return ret;
 378}
 379
 380
 381/*
 382 * this routine handles the overflow of the microsecond field
 383 *
 384 * The tricky bits of code to handle the accurate clock support
 385 * were provided by Dave Mills (Mills@UDEL.EDU) of NTP fame.
 386 * They were originally developed for SUN and DEC kernels.
 387 * All the kudos should go to Dave for this stuff.
 388 *
 389 * Also handles leap second processing, and returns leap offset
 390 */
 391int second_overflow(unsigned long secs)
 392{
 393        s64 delta;
 394        int leap = 0;
 395        unsigned long flags;
 396
 397        spin_lock_irqsave(&ntp_lock, flags);
 398
 399        /*
 400         * Leap second processing. If in leap-insert state at the end of the
 401         * day, the system clock is set back one second; if in leap-delete
 402         * state, the system clock is set ahead one second.
 403         */
 404        switch (time_state) {
 405        case TIME_OK:
 406                if (time_status & STA_INS)
 407                        time_state = TIME_INS;
 408                else if (time_status & STA_DEL)
 409                        time_state = TIME_DEL;
 410                break;
 411        case TIME_INS:
 412                if (!(time_status & STA_INS))
 413                        time_state = TIME_OK;
 414                else if (secs % 86400 == 0) {
 415                        leap = -1;
 416                        time_state = TIME_OOP;
 417                        time_tai++;
 418                        printk(KERN_NOTICE
 419                                "Clock: inserting leap second 23:59:60 UTC\n");
 420                }
 421                break;
 422        case TIME_DEL:
 423                if (!(time_status & STA_DEL))
 424                        time_state = TIME_OK;
 425                else if ((secs + 1) % 86400 == 0) {
 426                        leap = 1;
 427                        time_tai--;
 428                        time_state = TIME_WAIT;
 429                        printk(KERN_NOTICE
 430                                "Clock: deleting leap second 23:59:59 UTC\n");
 431                }
 432                break;
 433        case TIME_OOP:
 434                time_state = TIME_WAIT;
 435                break;
 436
 437        case TIME_WAIT:
 438                if (!(time_status & (STA_INS | STA_DEL)))
 439                        time_state = TIME_OK;
 440                break;
 441        }
 442
 443
 444        /* Bump the maxerror field */
 445        time_maxerror += MAXFREQ / NSEC_PER_USEC;
 446        if (time_maxerror > NTP_PHASE_LIMIT) {
 447                time_maxerror = NTP_PHASE_LIMIT;
 448                time_status |= STA_UNSYNC;
 449        }
 450
 451        /* Compute the phase adjustment for the next second */
 452        tick_length      = tick_length_base;
 453
 454        delta            = ntp_offset_chunk(time_offset);
 455        time_offset     -= delta;
 456        tick_length     += delta;
 457
 458        /* Check PPS signal */
 459        pps_dec_valid();
 460
 461        if (!time_adjust)
 462                goto out;
 463
 464        if (time_adjust > MAX_TICKADJ) {
 465                time_adjust -= MAX_TICKADJ;
 466                tick_length += MAX_TICKADJ_SCALED;
 467                goto out;
 468        }
 469
 470        if (time_adjust < -MAX_TICKADJ) {
 471                time_adjust += MAX_TICKADJ;
 472                tick_length -= MAX_TICKADJ_SCALED;
 473                goto out;
 474        }
 475
 476        tick_length += (s64)(time_adjust * NSEC_PER_USEC / NTP_INTERVAL_FREQ)
 477                                                         << NTP_SCALE_SHIFT;
 478        time_adjust = 0;
 479
 480out:
 481        spin_unlock_irqrestore(&ntp_lock, flags);
 482
 483        return leap;
 484}
 485
 486#ifdef CONFIG_GENERIC_CMOS_UPDATE
 487
 488static void sync_cmos_clock(struct work_struct *work);
 489
 490static DECLARE_DELAYED_WORK(sync_cmos_work, sync_cmos_clock);
 491
 492static void sync_cmos_clock(struct work_struct *work)
 493{
 494        struct timespec now, next;
 495        int fail = 1;
 496
 497        /*
 498         * If we have an externally synchronized Linux clock, then update
 499         * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
 500         * called as close as possible to 500 ms before the new second starts.
 501         * This code is run on a timer.  If the clock is set, that timer
 502         * may not expire at the correct time.  Thus, we adjust...
 503         */
 504        if (!ntp_synced()) {
 505                /*
 506                 * Not synced, exit, do not restart a timer (if one is
 507                 * running, let it run out).
 508                 */
 509                return;
 510        }
 511
 512        getnstimeofday(&now);
 513        if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
 514                fail = update_persistent_clock(now);
 515
 516        next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec - (TICK_NSEC / 2);
 517        if (next.tv_nsec <= 0)
 518                next.tv_nsec += NSEC_PER_SEC;
 519
 520        if (!fail)
 521                next.tv_sec = 659;
 522        else
 523                next.tv_sec = 0;
 524
 525        if (next.tv_nsec >= NSEC_PER_SEC) {
 526                next.tv_sec++;
 527                next.tv_nsec -= NSEC_PER_SEC;
 528        }
 529        schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next));
 530}
 531
 532static void notify_cmos_timer(void)
 533{
 534        schedule_delayed_work(&sync_cmos_work, 0);
 535}
 536
 537#else
 538static inline void notify_cmos_timer(void) { }
 539#endif
 540
 541
 542/*
 543 * Propagate a new txc->status value into the NTP state:
 544 */
 545static inline void process_adj_status(struct timex *txc, struct timespec *ts)
 546{
 547        if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) {
 548                time_state = TIME_OK;
 549                time_status = STA_UNSYNC;
 550                /* restart PPS frequency calibration */
 551                pps_reset_freq_interval();
 552        }
 553
 554        /*
 555         * If we turn on PLL adjustments then reset the
 556         * reference time to current time.
 557         */
 558        if (!(time_status & STA_PLL) && (txc->status & STA_PLL))
 559                time_reftime = get_seconds();
 560
 561        /* only set allowed bits */
 562        time_status &= STA_RONLY;
 563        time_status |= txc->status & ~STA_RONLY;
 564}
 565
 566/*
 567 * Called with ntp_lock held, so we can access and modify
 568 * all the global NTP state:
 569 */
 570static inline void process_adjtimex_modes(struct timex *txc, struct timespec *ts)
 571{
 572        if (txc->modes & ADJ_STATUS)
 573                process_adj_status(txc, ts);
 574
 575        if (txc->modes & ADJ_NANO)
 576                time_status |= STA_NANO;
 577
 578        if (txc->modes & ADJ_MICRO)
 579                time_status &= ~STA_NANO;
 580
 581        if (txc->modes & ADJ_FREQUENCY) {
 582                time_freq = txc->freq * PPM_SCALE;
 583                time_freq = min(time_freq, MAXFREQ_SCALED);
 584                time_freq = max(time_freq, -MAXFREQ_SCALED);
 585                /* update pps_freq */
 586                pps_set_freq(time_freq);
 587        }
 588
 589        if (txc->modes & ADJ_MAXERROR)
 590                time_maxerror = txc->maxerror;
 591
 592        if (txc->modes & ADJ_ESTERROR)
 593                time_esterror = txc->esterror;
 594
 595        if (txc->modes & ADJ_TIMECONST) {
 596                time_constant = txc->constant;
 597                if (!(time_status & STA_NANO))
 598                        time_constant += 4;
 599                time_constant = min(time_constant, (long)MAXTC);
 600                time_constant = max(time_constant, 0l);
 601        }
 602
 603        if (txc->modes & ADJ_TAI && txc->constant > 0)
 604                time_tai = txc->constant;
 605
 606        if (txc->modes & ADJ_OFFSET)
 607                ntp_update_offset(txc->offset);
 608
 609        if (txc->modes & ADJ_TICK)
 610                tick_usec = txc->tick;
 611
 612        if (txc->modes & (ADJ_TICK|ADJ_FREQUENCY|ADJ_OFFSET))
 613                ntp_update_frequency();
 614}
 615
 616/*
 617 * adjtimex mainly allows reading (and writing, if superuser) of
 618 * kernel time-keeping variables. used by xntpd.
 619 */
 620int do_adjtimex(struct timex *txc)
 621{
 622        struct timespec ts;
 623        int result;
 624
 625        /* Validate the data before disabling interrupts */
 626        if (txc->modes & ADJ_ADJTIME) {
 627                /* singleshot must not be used with any other mode bits */
 628                if (!(txc->modes & ADJ_OFFSET_SINGLESHOT))
 629                        return -EINVAL;
 630                if (!(txc->modes & ADJ_OFFSET_READONLY) &&
 631                    !capable(CAP_SYS_TIME))
 632                        return -EPERM;
 633        } else {
 634                /* In order to modify anything, you gotta be super-user! */
 635                 if (txc->modes && !capable(CAP_SYS_TIME))
 636                        return -EPERM;
 637
 638                /*
 639                 * if the quartz is off by more than 10% then
 640                 * something is VERY wrong!
 641                 */
 642                if (txc->modes & ADJ_TICK &&
 643                    (txc->tick <  900000/USER_HZ ||
 644                     txc->tick > 1100000/USER_HZ))
 645                        return -EINVAL;
 646        }
 647
 648        if (txc->modes & ADJ_SETOFFSET) {
 649                struct timespec delta;
 650                delta.tv_sec  = txc->time.tv_sec;
 651                delta.tv_nsec = txc->time.tv_usec;
 652                if (!capable(CAP_SYS_TIME))
 653                        return -EPERM;
 654                if (!(txc->modes & ADJ_NANO))
 655                        delta.tv_nsec *= 1000;
 656                result = timekeeping_inject_offset(&delta);
 657                if (result)
 658                        return result;
 659        }
 660
 661        getnstimeofday(&ts);
 662
 663        spin_lock_irq(&ntp_lock);
 664
 665        if (txc->modes & ADJ_ADJTIME) {
 666                long save_adjust = time_adjust;
 667
 668                if (!(txc->modes & ADJ_OFFSET_READONLY)) {
 669                        /* adjtime() is independent from ntp_adjtime() */
 670                        time_adjust = txc->offset;
 671                        ntp_update_frequency();
 672                }
 673                txc->offset = save_adjust;
 674        } else {
 675
 676                /* If there are input parameters, then process them: */
 677                if (txc->modes)
 678                        process_adjtimex_modes(txc, &ts);
 679
 680                txc->offset = shift_right(time_offset * NTP_INTERVAL_FREQ,
 681                                  NTP_SCALE_SHIFT);
 682                if (!(time_status & STA_NANO))
 683                        txc->offset /= NSEC_PER_USEC;
 684        }
 685
 686        result = time_state;    /* mostly `TIME_OK' */
 687        /* check for errors */
 688        if (is_error_status(time_status))
 689                result = TIME_ERROR;
 690
 691        txc->freq          = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) *
 692                                         PPM_SCALE_INV, NTP_SCALE_SHIFT);
 693        txc->maxerror      = time_maxerror;
 694        txc->esterror      = time_esterror;
 695        txc->status        = time_status;
 696        txc->constant      = time_constant;
 697        txc->precision     = 1;
 698        txc->tolerance     = MAXFREQ_SCALED / PPM_SCALE;
 699        txc->tick          = tick_usec;
 700        txc->tai           = time_tai;
 701
 702        /* fill PPS status fields */
 703        pps_fill_timex(txc);
 704
 705        spin_unlock_irq(&ntp_lock);
 706
 707        txc->time.tv_sec = ts.tv_sec;
 708        txc->time.tv_usec = ts.tv_nsec;
 709        if (!(time_status & STA_NANO))
 710                txc->time.tv_usec /= NSEC_PER_USEC;
 711
 712        notify_cmos_timer();
 713
 714        return result;
 715}
 716
 717#ifdef  CONFIG_NTP_PPS
 718
 719/* actually struct pps_normtime is good old struct timespec, but it is
 720 * semantically different (and it is the reason why it was invented):
 721 * pps_normtime.nsec has a range of ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ]
 722 * while timespec.tv_nsec has a range of [0, NSEC_PER_SEC) */
 723struct pps_normtime {
 724        __kernel_time_t sec;    /* seconds */
 725        long            nsec;   /* nanoseconds */
 726};
 727
 728/* normalize the timestamp so that nsec is in the
 729   ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] interval */
 730static inline struct pps_normtime pps_normalize_ts(struct timespec ts)
 731{
 732        struct pps_normtime norm = {
 733                .sec = ts.tv_sec,
 734                .nsec = ts.tv_nsec
 735        };
 736
 737        if (norm.nsec > (NSEC_PER_SEC >> 1)) {
 738                norm.nsec -= NSEC_PER_SEC;
 739                norm.sec++;
 740        }
 741
 742        return norm;
 743}
 744
 745/* get current phase correction and jitter */
 746static inline long pps_phase_filter_get(long *jitter)
 747{
 748        *jitter = pps_tf[0] - pps_tf[1];
 749        if (*jitter < 0)
 750                *jitter = -*jitter;
 751
 752        /* TODO: test various filters */
 753        return pps_tf[0];
 754}
 755
 756/* add the sample to the phase filter */
 757static inline void pps_phase_filter_add(long err)
 758{
 759        pps_tf[2] = pps_tf[1];
 760        pps_tf[1] = pps_tf[0];
 761        pps_tf[0] = err;
 762}
 763
 764/* decrease frequency calibration interval length.
 765 * It is halved after four consecutive unstable intervals.
 766 */
 767static inline void pps_dec_freq_interval(void)
 768{
 769        if (--pps_intcnt <= -PPS_INTCOUNT) {
 770                pps_intcnt = -PPS_INTCOUNT;
 771                if (pps_shift > PPS_INTMIN) {
 772                        pps_shift--;
 773                        pps_intcnt = 0;
 774                }
 775        }
 776}
 777
 778/* increase frequency calibration interval length.
 779 * It is doubled after four consecutive stable intervals.
 780 */
 781static inline void pps_inc_freq_interval(void)
 782{
 783        if (++pps_intcnt >= PPS_INTCOUNT) {
 784                pps_intcnt = PPS_INTCOUNT;
 785                if (pps_shift < PPS_INTMAX) {
 786                        pps_shift++;
 787                        pps_intcnt = 0;
 788                }
 789        }
 790}
 791
 792/* update clock frequency based on MONOTONIC_RAW clock PPS signal
 793 * timestamps
 794 *
 795 * At the end of the calibration interval the difference between the
 796 * first and last MONOTONIC_RAW clock timestamps divided by the length
 797 * of the interval becomes the frequency update. If the interval was
 798 * too long, the data are discarded.
 799 * Returns the difference between old and new frequency values.
 800 */
 801static long hardpps_update_freq(struct pps_normtime freq_norm)
 802{
 803        long delta, delta_mod;
 804        s64 ftemp;
 805
 806        /* check if the frequency interval was too long */
 807        if (freq_norm.sec > (2 << pps_shift)) {
 808                time_status |= STA_PPSERROR;
 809                pps_errcnt++;
 810                pps_dec_freq_interval();
 811                pr_err("hardpps: PPSERROR: interval too long - %ld s\n",
 812                                freq_norm.sec);
 813                return 0;
 814        }
 815
 816        /* here the raw frequency offset and wander (stability) is
 817         * calculated. If the wander is less than the wander threshold
 818         * the interval is increased; otherwise it is decreased.
 819         */
 820        ftemp = div_s64(((s64)(-freq_norm.nsec)) << NTP_SCALE_SHIFT,
 821                        freq_norm.sec);
 822        delta = shift_right(ftemp - pps_freq, NTP_SCALE_SHIFT);
 823        pps_freq = ftemp;
 824        if (delta > PPS_MAXWANDER || delta < -PPS_MAXWANDER) {
 825                pr_warning("hardpps: PPSWANDER: change=%ld\n", delta);
 826                time_status |= STA_PPSWANDER;
 827                pps_stbcnt++;
 828                pps_dec_freq_interval();
 829        } else {        /* good sample */
 830                pps_inc_freq_interval();
 831        }
 832
 833        /* the stability metric is calculated as the average of recent
 834         * frequency changes, but is used only for performance
 835         * monitoring
 836         */
 837        delta_mod = delta;
 838        if (delta_mod < 0)
 839                delta_mod = -delta_mod;
 840        pps_stabil += (div_s64(((s64)delta_mod) <<
 841                                (NTP_SCALE_SHIFT - SHIFT_USEC),
 842                                NSEC_PER_USEC) - pps_stabil) >> PPS_INTMIN;
 843
 844        /* if enabled, the system clock frequency is updated */
 845        if ((time_status & STA_PPSFREQ) != 0 &&
 846            (time_status & STA_FREQHOLD) == 0) {
 847                time_freq = pps_freq;
 848                ntp_update_frequency();
 849        }
 850
 851        return delta;
 852}
 853
 854/* correct REALTIME clock phase error against PPS signal */
 855static void hardpps_update_phase(long error)
 856{
 857        long correction = -error;
 858        long jitter;
 859
 860        /* add the sample to the median filter */
 861        pps_phase_filter_add(correction);
 862        correction = pps_phase_filter_get(&jitter);
 863
 864        /* Nominal jitter is due to PPS signal noise. If it exceeds the
 865         * threshold, the sample is discarded; otherwise, if so enabled,
 866         * the time offset is updated.
 867         */
 868        if (jitter > (pps_jitter << PPS_POPCORN)) {
 869                pr_warning("hardpps: PPSJITTER: jitter=%ld, limit=%ld\n",
 870                       jitter, (pps_jitter << PPS_POPCORN));
 871                time_status |= STA_PPSJITTER;
 872                pps_jitcnt++;
 873        } else if (time_status & STA_PPSTIME) {
 874                /* correct the time using the phase offset */
 875                time_offset = div_s64(((s64)correction) << NTP_SCALE_SHIFT,
 876                                NTP_INTERVAL_FREQ);
 877                /* cancel running adjtime() */
 878                time_adjust = 0;
 879        }
 880        /* update jitter */
 881        pps_jitter += (jitter - pps_jitter) >> PPS_INTMIN;
 882}
 883
 884/*
 885 * hardpps() - discipline CPU clock oscillator to external PPS signal
 886 *
 887 * This routine is called at each PPS signal arrival in order to
 888 * discipline the CPU clock oscillator to the PPS signal. It takes two
 889 * parameters: REALTIME and MONOTONIC_RAW clock timestamps. The former
 890 * is used to correct clock phase error and the latter is used to
 891 * correct the frequency.
 892 *
 893 * This code is based on David Mills's reference nanokernel
 894 * implementation. It was mostly rewritten but keeps the same idea.
 895 */
 896void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
 897{
 898        struct pps_normtime pts_norm, freq_norm;
 899        unsigned long flags;
 900
 901        pts_norm = pps_normalize_ts(*phase_ts);
 902
 903        spin_lock_irqsave(&ntp_lock, flags);
 904
 905        /* clear the error bits, they will be set again if needed */
 906        time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR);
 907
 908        /* indicate signal presence */
 909        time_status |= STA_PPSSIGNAL;
 910        pps_valid = PPS_VALID;
 911
 912        /* when called for the first time,
 913         * just start the frequency interval */
 914        if (unlikely(pps_fbase.tv_sec == 0)) {
 915                pps_fbase = *raw_ts;
 916                spin_unlock_irqrestore(&ntp_lock, flags);
 917                return;
 918        }
 919
 920        /* ok, now we have a base for frequency calculation */
 921        freq_norm = pps_normalize_ts(timespec_sub(*raw_ts, pps_fbase));
 922
 923        /* check that the signal is in the range
 924         * [1s - MAXFREQ us, 1s + MAXFREQ us], otherwise reject it */
 925        if ((freq_norm.sec == 0) ||
 926                        (freq_norm.nsec > MAXFREQ * freq_norm.sec) ||
 927                        (freq_norm.nsec < -MAXFREQ * freq_norm.sec)) {
 928                time_status |= STA_PPSJITTER;
 929                /* restart the frequency calibration interval */
 930                pps_fbase = *raw_ts;
 931                spin_unlock_irqrestore(&ntp_lock, flags);
 932                pr_err("hardpps: PPSJITTER: bad pulse\n");
 933                return;
 934        }
 935
 936        /* signal is ok */
 937
 938        /* check if the current frequency interval is finished */
 939        if (freq_norm.sec >= (1 << pps_shift)) {
 940                pps_calcnt++;
 941                /* restart the frequency calibration interval */
 942                pps_fbase = *raw_ts;
 943                hardpps_update_freq(freq_norm);
 944        }
 945
 946        hardpps_update_phase(pts_norm.nsec);
 947
 948        spin_unlock_irqrestore(&ntp_lock, flags);
 949}
 950EXPORT_SYMBOL(hardpps);
 951
 952#endif  /* CONFIG_NTP_PPS */
 953
 954static int __init ntp_tick_adj_setup(char *str)
 955{
 956        ntp_tick_adj = simple_strtol(str, NULL, 0);
 957        ntp_tick_adj <<= NTP_SCALE_SHIFT;
 958
 959        return 1;
 960}
 961
 962__setup("ntp_tick_adj=", ntp_tick_adj_setup);
 963
 964void __init ntp_init(void)
 965{
 966        ntp_clear();
 967}
 968
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.