linux-old/arch/i386/kernel/time.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/i386/kernel/time.c
   3 *
   4 *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
   5 *
   6 * This file contains the PC-specific time handling details:
   7 * reading the RTC at bootup, etc..
   8 * 1994-07-02    Alan Modra
   9 *      fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
  10 * 1995-03-26    Markus Kuhn
  11 *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
  12 *      precision CMOS clock update
  13 * 1996-05-03    Ingo Molnar
  14 *      fixed time warps in do_[slow|fast]_gettimeoffset()
  15 * 1997-09-10   Updated NTP code according to technical memorandum Jan '96
  16 *              "A Kernel Model for Precision Timekeeping" by Dave Mills
  17 * 1998-09-05    (Various)
  18 *      More robust do_fast_gettimeoffset() algorithm implemented
  19 *      (works with APM, Cyrix 6x86MX and Centaur C6),
  20 *      monotonic gettimeofday() with fast_get_timeoffset(),
  21 *      drift-proof precision TSC calibration on boot
  22 *      (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
  23 *      Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
  24 *      ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
  25 * 1998-12-16    Andrea Arcangeli
  26 *      Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
  27 *      because was not accounting lost_ticks.
  28 * 1998-12-24 Copyright (C) 1998  Andrea Arcangeli
  29 *      Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
  30 *      serialize accesses to xtime/lost_ticks).
  31 */
  32
  33#include <linux/errno.h>
  34#include <linux/module.h>
  35#include <linux/sched.h>
  36#include <linux/kernel.h>
  37#include <linux/param.h>
  38#include <linux/string.h>
  39#include <linux/mm.h>
  40#include <linux/interrupt.h>
  41#include <linux/time.h>
  42#include <linux/delay.h>
  43#include <linux/init.h>
  44#include <linux/smp.h>
  45
  46#include <asm/io.h>
  47#include <asm/smp.h>
  48#include <asm/irq.h>
  49#include <asm/msr.h>
  50#include <asm/delay.h>
  51#include <asm/mpspec.h>
  52#include <asm/uaccess.h>
  53#include <asm/processor.h>
  54
  55#include <linux/mc146818rtc.h>
  56#include <linux/timex.h>
  57#include <linux/config.h>
  58
  59#include <asm/fixmap.h>
  60#include <asm/cobalt.h>
  61
  62/*
  63 * for x86_do_profile()
  64 */
  65#include <linux/irq.h>
  66
  67
  68unsigned long cpu_khz;  /* Detected as we calibrate the TSC */
  69
  70/* Number of usecs that the last interrupt was delayed */
  71static int delay_at_last_interrupt;
  72
  73static unsigned long last_tsc_low; /* lsb 32 bits of Time Stamp Counter */
  74
  75/* Cached *multiplier* to convert TSC counts to microseconds.
  76 * (see the equation below).
  77 * Equal to 2^32 * (1 / (clocks per usec) ).
  78 * Initialized in time_init.
  79 */
  80unsigned long fast_gettimeoffset_quotient;
  81
  82extern rwlock_t xtime_lock;
  83extern unsigned long wall_jiffies;
  84
  85spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
  86
  87static inline unsigned long do_fast_gettimeoffset(void)
  88{
  89        register unsigned long eax, edx;
  90
  91        /* Read the Time Stamp Counter */
  92
  93        rdtsc(eax,edx);
  94
  95        /* .. relative to previous jiffy (32 bits is enough) */
  96        eax -= last_tsc_low;    /* tsc_low delta */
  97
  98        /*
  99         * Time offset = (tsc_low delta) * fast_gettimeoffset_quotient
 100         *             = (tsc_low delta) * (usecs_per_clock)
 101         *             = (tsc_low delta) * (usecs_per_jiffy / clocks_per_jiffy)
 102         *
 103         * Using a mull instead of a divl saves up to 31 clock cycles
 104         * in the critical path.
 105         */
 106
 107        __asm__("mull %2"
 108                :"=a" (eax), "=d" (edx)
 109                :"rm" (fast_gettimeoffset_quotient),
 110                 "0" (eax));
 111
 112        /* our adjusted time offset in microseconds */
 113        return delay_at_last_interrupt + edx;
 114}
 115
 116#define TICK_SIZE tick
 117
 118spinlock_t i8253_lock = SPIN_LOCK_UNLOCKED;
 119
 120EXPORT_SYMBOL(i8253_lock);
 121
 122extern spinlock_t i8259A_lock;
 123
 124#ifndef CONFIG_X86_TSC
 125
 126/* This function must be called with interrupts disabled 
 127 * It was inspired by Steve McCanne's microtime-i386 for BSD.  -- jrs
 128 * 
 129 * However, the pc-audio speaker driver changes the divisor so that
 130 * it gets interrupted rather more often - it loads 64 into the
 131 * counter rather than 11932! This has an adverse impact on
 132 * do_gettimeoffset() -- it stops working! What is also not
 133 * good is that the interval that our timer function gets called
 134 * is no longer 10.0002 ms, but 9.9767 ms. To get around this
 135 * would require using a different timing source. Maybe someone
 136 * could use the RTC - I know that this can interrupt at frequencies
 137 * ranging from 8192Hz to 2Hz. If I had the energy, I'd somehow fix
 138 * it so that at startup, the timer code in sched.c would select
 139 * using either the RTC or the 8253 timer. The decision would be
 140 * based on whether there was any other device around that needed
 141 * to trample on the 8253. I'd set up the RTC to interrupt at 1024 Hz,
 142 * and then do some jiggery to have a version of do_timer that 
 143 * advanced the clock by 1/1024 s. Every time that reached over 1/100
 144 * of a second, then do all the old code. If the time was kept correct
 145 * then do_gettimeoffset could just return 0 - there is no low order
 146 * divider that can be accessed.
 147 *
 148 * Ideally, you would be able to use the RTC for the speaker driver,
 149 * but it appears that the speaker driver really needs interrupt more
 150 * often than every 120 us or so.
 151 *
 152 * Anyway, this needs more thought....          pjsg (1993-08-28)
 153 * 
 154 * If you are really that interested, you should be reading
 155 * comp.protocols.time.ntp!
 156 */
 157
 158static unsigned long do_slow_gettimeoffset(void)
 159{
 160        int count;
 161
 162        static int count_p = LATCH;    /* for the first call after boot */
 163        static unsigned long jiffies_p = 0;
 164
 165        /*
 166         * cache volatile jiffies temporarily; we have IRQs turned off. 
 167         */
 168        unsigned long jiffies_t;
 169
 170        /* gets recalled with irq locally disabled */
 171        spin_lock(&i8253_lock);
 172        /* timer count may underflow right here */
 173        outb_p(0x00, 0x43);     /* latch the count ASAP */
 174
 175        count = inb_p(0x40);    /* read the latched count */
 176
 177        /*
 178         * We do this guaranteed double memory access instead of a _p 
 179         * postfix in the previous port access. Wheee, hackady hack
 180         */
 181        jiffies_t = jiffies;
 182
 183        count |= inb_p(0x40) << 8;
 184        
 185        /* VIA686a test code... reset the latch if count > max + 1 */
 186        if (count > LATCH) {
 187                outb_p(0x34, 0x43);
 188                outb_p(LATCH & 0xff, 0x40);
 189                outb(LATCH >> 8, 0x40);
 190                count = LATCH - 1;
 191        }
 192        
 193        spin_unlock(&i8253_lock);
 194
 195        /*
 196         * avoiding timer inconsistencies (they are rare, but they happen)...
 197         * there are two kinds of problems that must be avoided here:
 198         *  1. the timer counter underflows
 199         *  2. hardware problem with the timer, not giving us continuous time,
 200         *     the counter does small "jumps" upwards on some Pentium systems,
 201         *     (see c't 95/10 page 335 for Neptun bug.)
 202         */
 203
 204/* you can safely undefine this if you don't have the Neptune chipset */
 205
 206#define BUGGY_NEPTUN_TIMER
 207
 208        if( jiffies_t == jiffies_p ) {
 209                if( count > count_p ) {
 210                        /* the nutcase */
 211
 212                        int i;
 213
 214                        spin_lock(&i8259A_lock);
 215                        /*
 216                         * This is tricky when I/O APICs are used;
 217                         * see do_timer_interrupt().
 218                         */
 219                        i = inb(0x20);
 220                        spin_unlock(&i8259A_lock);
 221
 222                        /* assumption about timer being IRQ0 */
 223                        if (i & 0x01) {
 224                                /*
 225                                 * We cannot detect lost timer interrupts ... 
 226                                 * well, that's why we call them lost, don't we? :)
 227                                 * [hmm, on the Pentium and Alpha we can ... sort of]
 228                                 */
 229                                count -= LATCH;
 230                        } else {
 231#ifdef BUGGY_NEPTUN_TIMER
 232                                /*
 233                                 * for the Neptun bug we know that the 'latch'
 234                                 * command doesnt latch the high and low value
 235                                 * of the counter atomically. Thus we have to 
 236                                 * substract 256 from the counter 
 237                                 * ... funny, isnt it? :)
 238                                 */
 239
 240                                count -= 256;
 241#else
 242                                printk("do_slow_gettimeoffset(): hardware timer problem?\n");
 243#endif
 244                        }
 245                }
 246        } else
 247                jiffies_p = jiffies_t;
 248
 249        count_p = count;
 250
 251        count = ((LATCH-1) - count) * TICK_SIZE;
 252        count = (count + LATCH/2) / LATCH;
 253
 254        return count;
 255}
 256
 257static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset;
 258
 259
 260/* IBM Summit (EXA) Cyclone Timer code*/
 261#ifdef CONFIG_X86_SUMMIT
 262
 263#define CYCLONE_CBAR_ADDR 0xFEB00CD0
 264#define CYCLONE_PMCC_OFFSET 0x51A0
 265#define CYCLONE_MPMC_OFFSET 0x51D0
 266#define CYCLONE_MPCS_OFFSET 0x51A8
 267#define CYCLONE_TIMER_FREQ 100000000
 268
 269int use_cyclone = 0;
 270int __init cyclone_setup(char *str) 
 271{
 272        use_cyclone = 1;
 273        return 1;
 274}
 275
 276static u32* volatile cyclone_timer;     /* Cyclone MPMC0 register */
 277static u32 last_cyclone_timer;
 278
 279static inline void mark_timeoffset_cyclone(void)
 280{
 281        int count;
 282        unsigned long delta = last_cyclone_timer;
 283        spin_lock(&i8253_lock);
 284        /* quickly read the cyclone timer */
 285        if(cyclone_timer)
 286                last_cyclone_timer = cyclone_timer[0];
 287
 288        /* calculate delay_at_last_interrupt */
 289        outb_p(0x00, 0x43);     /* latch the count ASAP */
 290
 291        count = inb_p(0x40);    /* read the latched count */
 292        count |= inb(0x40) << 8;
 293        spin_unlock(&i8253_lock);
 294
 295        /*lost tick compensation*/
 296        delta = last_cyclone_timer - delta;
 297        if(delta > loops_per_jiffy+2000){
 298                delta = (delta/loops_per_jiffy)-1;
 299                jiffies += delta;
 300        }
 301               
 302        count = ((LATCH-1) - count) * TICK_SIZE;
 303        delay_at_last_interrupt = (count + LATCH/2) / LATCH;
 304}
 305
 306static unsigned long do_gettimeoffset_cyclone(void)
 307{
 308        u32 offset;
 309
 310        if(!cyclone_timer)
 311                return delay_at_last_interrupt;
 312
 313        /* Read the cyclone timer */
 314        offset = cyclone_timer[0];
 315
 316        /* .. relative to previous jiffy */
 317        offset = offset - last_cyclone_timer;
 318
 319        /* convert cyclone ticks to microseconds */     
 320        /* XXX slow, can we speed this up? */
 321        offset = offset/(CYCLONE_TIMER_FREQ/1000000);
 322
 323        /* our adjusted time offset in microseconds */
 324        return delay_at_last_interrupt + offset;
 325}
 326
 327static void __init init_cyclone_clock(void)
 328{
 329        u32* reg;       
 330        u32 base;               /* saved cyclone base address */
 331        u32 pageaddr;   /* page that contains cyclone_timer register */
 332        u32 offset;             /* offset from pageaddr to cyclone_timer register */
 333        int i;
 334        
 335        printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n");
 336
 337        /* find base address */
 338        pageaddr = (CYCLONE_CBAR_ADDR)&PAGE_MASK;
 339        offset = (CYCLONE_CBAR_ADDR)&(~PAGE_MASK);
 340        set_fixmap_nocache(FIX_CYCLONE_TIMER, pageaddr);
 341        reg = (u32*)(fix_to_virt(FIX_CYCLONE_TIMER) + offset);
 342        if(!reg){
 343                printk(KERN_ERR "Summit chipset: Could not find valid CBAR register.\n");
 344                use_cyclone = 0;
 345                return;
 346        }
 347        base = *reg;    
 348        if(!base){
 349                printk(KERN_ERR "Summit chipset: Could not find valid CBAR value.\n");
 350                use_cyclone = 0;
 351                return;
 352        }
 353        
 354        /* setup PMCC */
 355        pageaddr = (base + CYCLONE_PMCC_OFFSET)&PAGE_MASK;
 356        offset = (base + CYCLONE_PMCC_OFFSET)&(~PAGE_MASK);
 357        set_fixmap_nocache(FIX_CYCLONE_TIMER, pageaddr);
 358        reg = (u32*)(fix_to_virt(FIX_CYCLONE_TIMER) + offset);
 359        if(!reg){
 360                printk(KERN_ERR "Summit chipset: Could not find valid PMCC register.\n");
 361                use_cyclone = 0;
 362                return;
 363        }
 364        reg[0] = 0x00000001;
 365
 366        /* setup MPCS */
 367        pageaddr = (base + CYCLONE_MPCS_OFFSET)&PAGE_MASK;
 368        offset = (base + CYCLONE_MPCS_OFFSET)&(~PAGE_MASK);
 369        set_fixmap_nocache(FIX_CYCLONE_TIMER, pageaddr);
 370        reg = (u32*)(fix_to_virt(FIX_CYCLONE_TIMER) + offset);
 371        if(!reg){
 372                printk(KERN_ERR "Summit chipset: Could not find valid MPCS register.\n");
 373                use_cyclone = 0;
 374                return;
 375        }
 376        reg[0] = 0x00000001;
 377
 378        /* map in cyclone_timer */
 379        pageaddr = (base + CYCLONE_MPMC_OFFSET)&PAGE_MASK;
 380        offset = (base + CYCLONE_MPMC_OFFSET)&(~PAGE_MASK);
 381        set_fixmap_nocache(FIX_CYCLONE_TIMER, pageaddr);
 382        cyclone_timer = (u32*)(fix_to_virt(FIX_CYCLONE_TIMER) + offset);
 383        if(!cyclone_timer){
 384                printk(KERN_ERR "Summit chipset: Could not find valid MPMC register.\n");
 385                use_cyclone = 0;
 386                return;
 387        }
 388
 389        /*quick test to make sure its ticking*/
 390        for(i=0; i<3; i++){
 391                u32 old = cyclone_timer[0];
 392                int stall = 100;
 393                while(stall--) barrier();
 394                if(cyclone_timer[0] == old){
 395                        printk(KERN_ERR "Summit chipset: Counter not counting! DISABLED\n");
 396                        cyclone_timer = 0;
 397                        use_cyclone = 0;
 398                        return;
 399                }
 400        }
 401        /* Everything looks good, so set do_gettimeoffset */
 402        do_gettimeoffset = do_gettimeoffset_cyclone;    
 403}
 404void __cyclone_delay(unsigned long loops)
 405{
 406        unsigned long bclock, now;
 407        if(!cyclone_timer)
 408                return;
 409        bclock = cyclone_timer[0];
 410        do {
 411                rep_nop();
 412                now = cyclone_timer[0];
 413        } while ((now-bclock) < loops);
 414}
 415#endif /* CONFIG_X86_SUMMIT */
 416
 417#else
 418
 419#define do_gettimeoffset()      do_fast_gettimeoffset()
 420
 421#endif
 422
 423/* No-cyclone stubs */
 424#ifndef CONFIG_X86_SUMMIT
 425int __init cyclone_setup(char *str) 
 426{
 427        printk(KERN_ERR "cyclone: Kernel not compiled with CONFIG_X86_SUMMIT, cannot use the cyclone-timer.\n");
 428        return 1;
 429}
 430
 431const int use_cyclone = 0;
 432static void mark_timeoffset_cyclone(void) {}
 433static unsigned long do_gettimeoffset_cyclone(void) {return 0;}
 434static void init_cyclone_clock(void) {}
 435void __cyclone_delay(unsigned long loops) {}
 436#endif /* CONFIG_X86_SUMMIT */
 437
 438/*
 439 * This version of gettimeofday has microsecond resolution
 440 * and better than microsecond precision on fast x86 machines with TSC.
 441 */
 442void do_gettimeofday(struct timeval *tv)
 443{
 444        unsigned long flags;
 445        unsigned long usec, sec;
 446
 447        read_lock_irqsave(&xtime_lock, flags);
 448        usec = do_gettimeoffset();
 449        {
 450                unsigned long lost = jiffies - wall_jiffies;
 451                if (lost)
 452                        usec += lost * (1000000 / HZ);
 453        }
 454        sec = xtime.tv_sec;
 455        usec += xtime.tv_usec;
 456        read_unlock_irqrestore(&xtime_lock, flags);
 457
 458        while (usec >= 1000000) {
 459                usec -= 1000000;
 460                sec++;
 461        }
 462
 463        tv->tv_sec = sec;
 464        tv->tv_usec = usec;
 465}
 466
 467void do_settimeofday(struct timeval *tv)
 468{
 469        write_lock_irq(&xtime_lock);
 470        /*
 471         * This is revolting. We need to set "xtime" correctly. However, the
 472         * value in this location is the value at the most recent update of
 473         * wall time.  Discover what correction gettimeofday() would have
 474         * made, and then undo it!
 475         */
 476        tv->tv_usec -= do_gettimeoffset();
 477        tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
 478
 479        while (tv->tv_usec < 0) {
 480                tv->tv_usec += 1000000;
 481                tv->tv_sec--;
 482        }
 483
 484        xtime = *tv;
 485        time_adjust = 0;                /* stop active adjtime() */
 486        time_status |= STA_UNSYNC;
 487        time_maxerror = NTP_PHASE_LIMIT;
 488        time_esterror = NTP_PHASE_LIMIT;
 489        write_unlock_irq(&xtime_lock);
 490}
 491
 492/*
 493 * In order to set the CMOS clock precisely, set_rtc_mmss has to be
 494 * called 500 ms after the second nowtime has started, because when
 495 * nowtime is written into the registers of the CMOS clock, it will
 496 * jump to the next second precisely 500 ms later. Check the Motorola
 497 * MC146818A or Dallas DS12887 data sheet for details.
 498 *
 499 * BUG: This routine does not handle hour overflow properly; it just
 500 *      sets the minutes. Usually you'll only notice that after reboot!
 501 */
 502static int set_rtc_mmss(unsigned long nowtime)
 503{
 504        int retval = 0;
 505        int real_seconds, real_minutes, cmos_minutes;
 506        unsigned char save_control, save_freq_select;
 507
 508        /* gets recalled with irq locally disabled */
 509        spin_lock(&rtc_lock);
 510        save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
 511        CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
 512
 513        save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
 514        CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
 515
 516        cmos_minutes = CMOS_READ(RTC_MINUTES);
 517        if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
 518                BCD_TO_BIN(cmos_minutes);
 519
 520        /*
 521         * since we're only adjusting minutes and seconds,
 522         * don't interfere with hour overflow. This avoids
 523         * messing with unknown time zones but requires your
 524         * RTC not to be off by more than 15 minutes
 525         */
 526        real_seconds = nowtime % 60;
 527        real_minutes = nowtime / 60;
 528        if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
 529                real_minutes += 30;             /* correct for half hour time zone */
 530        real_minutes %= 60;
 531
 532        if (abs(real_minutes - cmos_minutes) < 30) {
 533                if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
 534                        BIN_TO_BCD(real_seconds);
 535                        BIN_TO_BCD(real_minutes);
 536                }
 537                CMOS_WRITE(real_seconds,RTC_SECONDS);
 538                CMOS_WRITE(real_minutes,RTC_MINUTES);
 539        } else {
 540                printk(KERN_WARNING
 541                       "set_rtc_mmss: can't update from %d to %d\n",
 542                       cmos_minutes, real_minutes);
 543                retval = -1;
 544        }
 545
 546        /* The following flags have to be released exactly in this order,
 547         * otherwise the DS12887 (popular MC146818A clone with integrated
 548         * battery and quartz) will not reset the oscillator and will not
 549         * update precisely 500 ms later. You won't find this mentioned in
 550         * the Dallas Semiconductor data sheets, but who believes data
 551         * sheets anyway ...                           -- Markus Kuhn
 552         */
 553        CMOS_WRITE(save_control, RTC_CONTROL);
 554        CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
 555        spin_unlock(&rtc_lock);
 556
 557        return retval;
 558}
 559
 560/* last time the cmos clock got updated */
 561static long last_rtc_update;
 562
 563int timer_ack;
 564
 565/*
 566 * timer_interrupt() needs to keep up the real-time clock,
 567 * as well as call the "do_timer()" routine every clocktick
 568 */
 569static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 570{
 571#ifdef CONFIG_X86_IO_APIC
 572        if (timer_ack) {
 573                /*
 574                 * Subtle, when I/O APICs are used we have to ack timer IRQ
 575                 * manually to reset the IRR bit for do_slow_gettimeoffset().
 576                 * This will also deassert NMI lines for the watchdog if run
 577                 * on an 82489DX-based system.
 578                 */
 579                spin_lock(&i8259A_lock);
 580                outb(0x0c, 0x20);
 581                /* Ack the IRQ; AEOI will end it automatically. */
 582                inb(0x20);
 583                spin_unlock(&i8259A_lock);
 584        }
 585#endif
 586
 587#ifdef CONFIG_VISWS
 588        /* Clear the interrupt */
 589        co_cpu_write(CO_CPU_STAT,co_cpu_read(CO_CPU_STAT) & ~CO_STAT_TIMEINTR);
 590#endif
 591        do_timer(regs);
 592/*
 593 * In the SMP case we use the local APIC timer interrupt to do the
 594 * profiling, except when we simulate SMP mode on a uniprocessor
 595 * system, in that case we have to call the local interrupt handler.
 596 */
 597#ifndef CONFIG_X86_LOCAL_APIC
 598        if (!user_mode(regs))
 599                x86_do_profile(regs->eip);
 600#else
 601        if (!using_apic_timer)
 602                smp_local_timer_interrupt(regs);
 603#endif
 604
 605        /*
 606         * If we have an externally synchronized Linux clock, then update
 607         * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
 608         * called as close as possible to 500 ms before the new second starts.
 609         */
 610        if ((time_status & STA_UNSYNC) == 0 &&
 611            xtime.tv_sec > last_rtc_update + 660 &&
 612            xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
 613            xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
 614                if (set_rtc_mmss(xtime.tv_sec) == 0)
 615                        last_rtc_update = xtime.tv_sec;
 616                else
 617                        last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
 618        }
 619            
 620#ifdef CONFIG_MCA
 621        if( MCA_bus ) {
 622                /* The PS/2 uses level-triggered interrupts.  You can't
 623                turn them off, nor would you want to (any attempt to
 624                enable edge-triggered interrupts usually gets intercepted by a
 625                special hardware circuit).  Hence we have to acknowledge
 626                the timer interrupt.  Through some incredibly stupid
 627                design idea, the reset for IRQ 0 is done by setting the
 628                high bit of the PPI port B (0x61).  Note that some PS/2s,
 629                notably the 55SX, work fine if this is removed.  */
 630
 631                irq = inb_p( 0x61 );    /* read the current state */
 632                outb_p( irq|0x80, 0x61 );       /* reset the IRQ */
 633        }
 634#endif
 635}
 636
 637static int use_tsc;
 638
 639/*
 640 * This is the same as the above, except we _also_ save the current
 641 * Time Stamp Counter value at the time of the timer interrupt, so that
 642 * we later on can estimate the time of day more exactly.
 643 */
 644static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 645{
 646        int count;
 647
 648        /*
 649         * Here we are in the timer irq handler. We just have irqs locally
 650         * disabled but we don't know if the timer_bh is running on the other
 651         * CPU. We need to avoid to SMP race with it. NOTE: we don' t need
 652         * the irq version of write_lock because as just said we have irq
 653         * locally disabled. -arca
 654         */
 655        write_lock(&xtime_lock);
 656
 657        if(use_cyclone)
 658                mark_timeoffset_cyclone();
 659        else if (use_tsc) {
 660                /*
 661                 * It is important that these two operations happen almost at
 662                 * the same time. We do the RDTSC stuff first, since it's
 663                 * faster. To avoid any inconsistencies, we need interrupts
 664                 * disabled locally.
 665                 */
 666
 667                /*
 668                 * Interrupts are just disabled locally since the timer irq
 669                 * has the SA_INTERRUPT flag set. -arca
 670                 */
 671        
 672                /* read Pentium cycle counter */
 673
 674                rdtscl(last_tsc_low);
 675
 676                spin_lock(&i8253_lock);
 677                outb_p(0x00, 0x43);     /* latch the count ASAP */
 678
 679                count = inb_p(0x40);    /* read the latched count */
 680                count |= inb(0x40) << 8;
 681
 682                /* Any unpaired read will cause the above to swap MSB/LSB
 683                   forever.  Try to detect this and reset the counter. 
 684                   
 685                   This happens very occasionally with buggy SMM bios
 686                   code at least */
 687                   
 688                if (count > LATCH) {
 689                        printk(KERN_WARNING 
 690                               "i8253 count too high! resetting..\n");
 691                        outb_p(0x34, 0x43);
 692                        outb_p(LATCH & 0xff, 0x40);
 693                        outb(LATCH >> 8, 0x40);
 694                        count = LATCH - 1;
 695                }
 696
 697                spin_unlock(&i8253_lock);
 698
 699                /* Some i8253 clones hold the LATCH value visible
 700                   momentarily as they flip back to zero */
 701                if (count == LATCH) {
 702                        count--;
 703                }
 704
 705                count = ((LATCH-1) - count) * TICK_SIZE;
 706                delay_at_last_interrupt = (count + LATCH/2) / LATCH;
 707        }
 708
 709        do_timer_interrupt(irq, NULL, regs);
 710
 711        write_unlock(&xtime_lock);
 712
 713}
 714
 715/* not static: needed by APM */
 716unsigned long get_cmos_time(void)
 717{
 718        unsigned int year, mon, day, hour, min, sec;
 719        int i;
 720
 721        spin_lock(&rtc_lock);
 722        /* The Linux interpretation of the CMOS clock register contents:
 723         * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
 724         * RTC registers show the second which has precisely just started.
 725         * Let's hope other operating systems interpret the RTC the same way.
 726         */
 727        /* read RTC exactly on falling edge of update flag */
 728        for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */
 729                if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
 730                        break;
 731        for (i = 0 ; i < 1000000 ; i++) /* must try at least 2.228 ms */
 732                if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
 733                        break;
 734        do { /* Isn't this overkill ? UIP above should guarantee consistency */
 735                sec = CMOS_READ(RTC_SECONDS);
 736                min = CMOS_READ(RTC_MINUTES);
 737                hour = CMOS_READ(RTC_HOURS);
 738                day = CMOS_READ(RTC_DAY_OF_MONTH);
 739                mon = CMOS_READ(RTC_MONTH);
 740                year = CMOS_READ(RTC_YEAR);
 741        } while (sec != CMOS_READ(RTC_SECONDS));
 742        if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
 743          {
 744            BCD_TO_BIN(sec);
 745            BCD_TO_BIN(min);
 746            BCD_TO_BIN(hour);
 747            BCD_TO_BIN(day);
 748            BCD_TO_BIN(mon);
 749            BCD_TO_BIN(year);
 750          }
 751        spin_unlock(&rtc_lock);
 752        if ((year += 1900) < 1970)
 753                year += 100;
 754        return mktime(year, mon, day, hour, min, sec);
 755}
 756
 757static struct irqaction irq0  = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL};
 758
 759/* ------ Calibrate the TSC ------- 
 760 * Return 2^32 * (1 / (TSC clocks per usec)) for do_fast_gettimeoffset().
 761 * Too much 64-bit arithmetic here to do this cleanly in C, and for
 762 * accuracy's sake we want to keep the overhead on the CTC speaker (channel 2)
 763 * output busy loop as low as possible. We avoid reading the CTC registers
 764 * directly because of the awkward 8-bit access mechanism of the 82C54
 765 * device.
 766 */
 767
 768#define CALIBRATE_LATCH (5 * LATCH)
 769#define CALIBRATE_TIME  (5 * 1000020/HZ)
 770
 771static unsigned long __init calibrate_tsc(void)
 772{
 773       /* Set the Gate high, disable speaker */
 774        outb((inb(0x61) & ~0x02) | 0x01, 0x61);
 775
 776        /*
 777         * Now let's take care of CTC channel 2
 778         *
 779         * Set the Gate high, program CTC channel 2 for mode 0,
 780         * (interrupt on terminal count mode), binary count,
 781         * load 5 * LATCH count, (LSB and MSB) to begin countdown.
 782         */
 783        outb(0xb0, 0x43);                       /* binary, mode 0, LSB/MSB, Ch 2 */
 784        outb(CALIBRATE_LATCH & 0xff, 0x42);     /* LSB of count */
 785        outb(CALIBRATE_LATCH >> 8, 0x42);       /* MSB of count */
 786
 787        {
 788                unsigned long startlow, starthigh;
 789                unsigned long endlow, endhigh;
 790                unsigned long count;
 791
 792                rdtsc(startlow,starthigh);
 793                count = 0;
 794                do {
 795                        count++;
 796                } while ((inb(0x61) & 0x20) == 0);
 797                rdtsc(endlow,endhigh);
 798
 799                last_tsc_low = endlow;
 800
 801                /* Error: ECTCNEVERSET */
 802                if (count <= 1)
 803                        goto bad_ctc;
 804
 805                /* 64-bit subtract - gcc just messes up with long longs */
 806                __asm__("subl %2,%0\n\t"
 807                        "sbbl %3,%1"
 808                        :"=a" (endlow), "=d" (endhigh)
 809                        :"g" (startlow), "g" (starthigh),
 810                         "0" (endlow), "1" (endhigh));
 811
 812                /* Error: ECPUTOOFAST */
 813                if (endhigh)
 814                        goto bad_ctc;
 815
 816                /* Error: ECPUTOOSLOW */
 817                if (endlow <= CALIBRATE_TIME)
 818                        goto bad_ctc;
 819
 820                __asm__("divl %2"
 821                        :"=a" (endlow), "=d" (endhigh)
 822                        :"r" (endlow), "0" (0), "1" (CALIBRATE_TIME));
 823
 824                return endlow;
 825        }
 826
 827        /*
 828         * The CTC wasn't reliable: we got a hit on the very first read,
 829         * or the CPU was so fast/slow that the quotient wouldn't fit in
 830         * 32 bits..
 831         */
 832bad_ctc:
 833        return 0;
 834}
 835
 836void __init time_init(void)
 837{
 838        extern int x86_udelay_tsc;
 839        
 840        xtime.tv_sec = get_cmos_time();
 841        xtime.tv_usec = 0;
 842
 843/*
 844 * If we have APM enabled or the CPU clock speed is variable
 845 * (CPU stops clock on HLT or slows clock to save power)
 846 * then the TSC timestamps may diverge by up to 1 jiffy from
 847 * 'real time' but nothing will break.
 848 * The most frequent case is that the CPU is "woken" from a halt
 849 * state by the timer interrupt itself, so we get 0 error. In the
 850 * rare cases where a driver would "wake" the CPU and request a
 851 * timestamp, the maximum error is < 1 jiffy. But timestamps are
 852 * still perfectly ordered.
 853 * Note that the TSC counter will be reset if APM suspends
 854 * to disk; this won't break the kernel, though, 'cuz we're
 855 * smart.  See arch/i386/kernel/apm.c.
 856 */
 857        /*
 858         *      Firstly we have to do a CPU check for chips with
 859         *      a potentially buggy TSC. At this point we haven't run
 860         *      the ident/bugs checks so we must run this hook as it
 861         *      may turn off the TSC flag.
 862         *
 863         *      NOTE: this doesnt yet handle SMP 486 machines where only
 864         *      some CPU's have a TSC. Thats never worked and nobody has
 865         *      moaned if you have the only one in the world - you fix it!
 866         */
 867 
 868        dodgy_tsc();
 869
 870        if(use_cyclone)
 871                init_cyclone_clock();
 872                
 873        if (cpu_has_tsc) {
 874                unsigned long tsc_quotient = calibrate_tsc();
 875                if (tsc_quotient) {
 876                        fast_gettimeoffset_quotient = tsc_quotient;
 877                        /* XXX: This is messy
 878                         * However, we want to allow for the cyclone timer 
 879                         * to work w/ or w/o the TSCs being avaliable
 880                         *      -johnstul@us.ibm.com
 881                         */
 882                        if(!use_cyclone){
 883                                /*
 884                                 *      We could be more selective here I suspect
 885                                 *      and just enable this for the next intel chips ?
 886                                 */
 887                                use_tsc = 1;
 888                                x86_udelay_tsc = 1;
 889#ifndef do_gettimeoffset
 890                                do_gettimeoffset = do_fast_gettimeoffset;
 891#endif
 892                        }
 893                        /* report CPU clock rate in Hz.
 894                         * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
 895                         * clock/second. Our precision is about 100 ppm.
 896                         */
 897                        {       unsigned long eax=0, edx=1000;
 898                                __asm__("divl %2"
 899                                :"=a" (cpu_khz), "=d" (edx)
 900                                :"r" (tsc_quotient),
 901                                "0" (eax), "1" (edx));
 902                                printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);
 903                        }
 904                }
 905        }
 906
 907
 908#ifdef CONFIG_VISWS
 909        printk("Starting Cobalt Timer system clock\n");
 910
 911        /* Set the countdown value */
 912        co_cpu_write(CO_CPU_TIMEVAL, CO_TIME_HZ/HZ);
 913
 914        /* Start the timer */
 915        co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) | CO_CTRL_TIMERUN);
 916
 917        /* Enable (unmask) the timer interrupt */
 918        co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK);
 919
 920        /* Wire cpu IDT entry to s/w handler (and Cobalt APIC to IDT) */
 921        setup_irq(CO_IRQ_TIMER, &irq0);
 922#else
 923        setup_irq(0, &irq0);
 924#endif
 925}
 926
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.