linux/arch/powerpc/kernel/time.c
<<
>>
Prefs
   1/*
   2 * Common time routines among all ppc machines.
   3 *
   4 * Written by Cort Dougan (cort@cs.nmt.edu) to merge
   5 * Paul Mackerras' version and mine for PReP and Pmac.
   6 * MPC8xx/MBX changes by Dan Malek (dmalek@jlc.net).
   7 * Converted for 64-bit by Mike Corrigan (mikejc@us.ibm.com)
   8 *
   9 * First round of bugfixes by Gabriel Paubert (paubert@iram.es)
  10 * to make clock more stable (2.4.0-test5). The only thing
  11 * that this code assumes is that the timebases have been synchronized
  12 * by firmware on SMP and are never stopped (never do sleep
  13 * on SMP then, nap and doze are OK).
  14 * 
  15 * Speeded up do_gettimeofday by getting rid of references to
  16 * xtime (which required locks for consistency). (mikejc@us.ibm.com)
  17 *
  18 * TODO (not necessarily in this file):
  19 * - improve precision and reproducibility of timebase frequency
  20 * measurement at boot time. (for iSeries, we calibrate the timebase
  21 * against the Titan chip's clock.)
  22 * - for astronomical applications: add a new function to get
  23 * non ambiguous timestamps even around leap seconds. This needs
  24 * a new timestamp format and a good name.
  25 *
  26 * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
  27 *             "A Kernel Model for Precision Timekeeping" by Dave Mills
  28 *
  29 *      This program is free software; you can redistribute it and/or
  30 *      modify it under the terms of the GNU General Public License
  31 *      as published by the Free Software Foundation; either version
  32 *      2 of the License, or (at your option) any later version.
  33 */
  34
  35#include <linux/errno.h>
  36#include <linux/module.h>
  37#include <linux/sched.h>
  38#include <linux/kernel.h>
  39#include <linux/param.h>
  40#include <linux/string.h>
  41#include <linux/mm.h>
  42#include <linux/interrupt.h>
  43#include <linux/timex.h>
  44#include <linux/kernel_stat.h>
  45#include <linux/time.h>
  46#include <linux/init.h>
  47#include <linux/profile.h>
  48#include <linux/cpu.h>
  49#include <linux/security.h>
  50#include <linux/percpu.h>
  51#include <linux/rtc.h>
  52#include <linux/jiffies.h>
  53#include <linux/posix-timers.h>
  54#include <linux/irq.h>
  55
  56#include <asm/io.h>
  57#include <asm/processor.h>
  58#include <asm/nvram.h>
  59#include <asm/cache.h>
  60#include <asm/machdep.h>
  61#include <asm/uaccess.h>
  62#include <asm/time.h>
  63#include <asm/prom.h>
  64#include <asm/irq.h>
  65#include <asm/div64.h>
  66#include <asm/smp.h>
  67#include <asm/vdso_datapage.h>
  68#include <asm/firmware.h>
  69#include <asm/cputime.h>
  70#ifdef CONFIG_PPC_ISERIES
  71#include <asm/iseries/it_lp_queue.h>
  72#include <asm/iseries/hv_call_xm.h>
  73#endif
  74
  75/* powerpc clocksource/clockevent code */
  76
  77#include <linux/clockchips.h>
  78#include <linux/clocksource.h>
  79
  80static cycle_t rtc_read(void);
  81static struct clocksource clocksource_rtc = {
  82        .name         = "rtc",
  83        .rating       = 400,
  84        .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
  85        .mask         = CLOCKSOURCE_MASK(64),
  86        .shift        = 22,
  87        .mult         = 0,      /* To be filled in */
  88        .read         = rtc_read,
  89};
  90
  91static cycle_t timebase_read(void);
  92static struct clocksource clocksource_timebase = {
  93        .name         = "timebase",
  94        .rating       = 400,
  95        .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
  96        .mask         = CLOCKSOURCE_MASK(64),
  97        .shift        = 22,
  98        .mult         = 0,      /* To be filled in */
  99        .read         = timebase_read,
 100};
 101
 102#define DECREMENTER_MAX 0x7fffffff
 103
 104static int decrementer_set_next_event(unsigned long evt,
 105                                      struct clock_event_device *dev);
 106static void decrementer_set_mode(enum clock_event_mode mode,
 107                                 struct clock_event_device *dev);
 108
 109static struct clock_event_device decrementer_clockevent = {
 110       .name           = "decrementer",
 111       .rating         = 200,
 112       .shift          = 16,
 113       .mult           = 0,     /* To be filled in */
 114       .irq            = 0,
 115       .set_next_event = decrementer_set_next_event,
 116       .set_mode       = decrementer_set_mode,
 117       .features       = CLOCK_EVT_FEAT_ONESHOT,
 118};
 119
 120struct decrementer_clock {
 121        struct clock_event_device event;
 122        u64 next_tb;
 123};
 124
 125static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
 126
 127#ifdef CONFIG_PPC_ISERIES
 128static unsigned long __initdata iSeries_recal_titan;
 129static signed long __initdata iSeries_recal_tb;
 130
 131/* Forward declaration is only needed for iSereis compiles */
 132static void __init clocksource_init(void);
 133#endif
 134
 135#define XSEC_PER_SEC (1024*1024)
 136
 137#ifdef CONFIG_PPC64
 138#define SCALE_XSEC(xsec, max)   (((xsec) * max) / XSEC_PER_SEC)
 139#else
 140/* compute ((xsec << 12) * max) >> 32 */
 141#define SCALE_XSEC(xsec, max)   mulhwu((xsec) << 12, max)
 142#endif
 143
 144unsigned long tb_ticks_per_jiffy;
 145unsigned long tb_ticks_per_usec = 100; /* sane default */
 146EXPORT_SYMBOL(tb_ticks_per_usec);
 147unsigned long tb_ticks_per_sec;
 148EXPORT_SYMBOL(tb_ticks_per_sec);        /* for cputime_t conversions */
 149u64 tb_to_xs;
 150unsigned tb_to_us;
 151
 152#define TICKLEN_SCALE   NTP_SCALE_SHIFT
 153static u64 last_tick_len;       /* units are ns / 2^TICKLEN_SCALE */
 154static u64 ticklen_to_xs;       /* 0.64 fraction */
 155
 156/* If last_tick_len corresponds to about 1/HZ seconds, then
 157   last_tick_len << TICKLEN_SHIFT will be about 2^63. */
 158#define TICKLEN_SHIFT   (63 - 30 - TICKLEN_SCALE + SHIFT_HZ)
 159
 160DEFINE_SPINLOCK(rtc_lock);
 161EXPORT_SYMBOL_GPL(rtc_lock);
 162
 163static u64 tb_to_ns_scale __read_mostly;
 164static unsigned tb_to_ns_shift __read_mostly;
 165static unsigned long boot_tb __read_mostly;
 166
 167extern struct timezone sys_tz;
 168static long timezone_offset;
 169
 170unsigned long ppc_proc_freq;
 171EXPORT_SYMBOL(ppc_proc_freq);
 172unsigned long ppc_tb_freq;
 173
 174static u64 tb_last_jiffy __cacheline_aligned_in_smp;
 175static DEFINE_PER_CPU(u64, last_jiffy);
 176
 177#ifdef CONFIG_VIRT_CPU_ACCOUNTING
 178/*
 179 * Factors for converting from cputime_t (timebase ticks) to
 180 * jiffies, milliseconds, seconds, and clock_t (1/USER_HZ seconds).
 181 * These are all stored as 0.64 fixed-point binary fractions.
 182 */
 183u64 __cputime_jiffies_factor;
 184EXPORT_SYMBOL(__cputime_jiffies_factor);
 185u64 __cputime_msec_factor;
 186EXPORT_SYMBOL(__cputime_msec_factor);
 187u64 __cputime_sec_factor;
 188EXPORT_SYMBOL(__cputime_sec_factor);
 189u64 __cputime_clockt_factor;
 190EXPORT_SYMBOL(__cputime_clockt_factor);
 191DEFINE_PER_CPU(unsigned long, cputime_last_delta);
 192DEFINE_PER_CPU(unsigned long, cputime_scaled_last_delta);
 193
 194static void calc_cputime_factors(void)
 195{
 196        struct div_result res;
 197
 198        div128_by_32(HZ, 0, tb_ticks_per_sec, &res);
 199        __cputime_jiffies_factor = res.result_low;
 200        div128_by_32(1000, 0, tb_ticks_per_sec, &res);
 201        __cputime_msec_factor = res.result_low;
 202        div128_by_32(1, 0, tb_ticks_per_sec, &res);
 203        __cputime_sec_factor = res.result_low;
 204        div128_by_32(USER_HZ, 0, tb_ticks_per_sec, &res);
 205        __cputime_clockt_factor = res.result_low;
 206}
 207
 208/*
 209 * Read the PURR on systems that have it, otherwise the timebase.
 210 */
 211static u64 read_purr(void)
 212{
 213        if (cpu_has_feature(CPU_FTR_PURR))
 214                return mfspr(SPRN_PURR);
 215        return mftb();
 216}
 217
 218/*
 219 * Read the SPURR on systems that have it, otherwise the purr
 220 */
 221static u64 read_spurr(u64 purr)
 222{
 223        /*
 224         * cpus without PURR won't have a SPURR
 225         * We already know the former when we use this, so tell gcc
 226         */
 227        if (cpu_has_feature(CPU_FTR_PURR) && cpu_has_feature(CPU_FTR_SPURR))
 228                return mfspr(SPRN_SPURR);
 229        return purr;
 230}
 231
 232/*
 233 * Account time for a transition between system, hard irq
 234 * or soft irq state.
 235 */
 236void account_system_vtime(struct task_struct *tsk)
 237{
 238        u64 now, nowscaled, delta, deltascaled, sys_time;
 239        unsigned long flags;
 240
 241        local_irq_save(flags);
 242        now = read_purr();
 243        nowscaled = read_spurr(now);
 244        delta = now - get_paca()->startpurr;
 245        deltascaled = nowscaled - get_paca()->startspurr;
 246        get_paca()->startpurr = now;
 247        get_paca()->startspurr = nowscaled;
 248        if (!in_interrupt()) {
 249                /* deltascaled includes both user and system time.
 250                 * Hence scale it based on the purr ratio to estimate
 251                 * the system time */
 252                sys_time = get_paca()->system_time;
 253                if (get_paca()->user_time)
 254                        deltascaled = deltascaled * sys_time /
 255                             (sys_time + get_paca()->user_time);
 256                delta += sys_time;
 257                get_paca()->system_time = 0;
 258        }
 259        if (in_irq() || idle_task(smp_processor_id()) != tsk)
 260                account_system_time(tsk, 0, delta, deltascaled);
 261        else
 262                account_idle_time(delta);
 263        per_cpu(cputime_last_delta, smp_processor_id()) = delta;
 264        per_cpu(cputime_scaled_last_delta, smp_processor_id()) = deltascaled;
 265        local_irq_restore(flags);
 266}
 267
 268/*
 269 * Transfer the user and system times accumulated in the paca
 270 * by the exception entry and exit code to the generic process
 271 * user and system time records.
 272 * Must be called with interrupts disabled.
 273 */
 274void account_process_tick(struct task_struct *tsk, int user_tick)
 275{
 276        cputime_t utime, utimescaled;
 277
 278        utime = get_paca()->user_time;
 279        get_paca()->user_time = 0;
 280        utimescaled = cputime_to_scaled(utime);
 281        account_user_time(tsk, utime, utimescaled);
 282}
 283
 284/*
 285 * Stuff for accounting stolen time.
 286 */
 287struct cpu_purr_data {
 288        int     initialized;                    /* thread is running */
 289        u64     tb;                     /* last TB value read */
 290        u64     purr;                   /* last PURR value read */
 291        u64     spurr;                  /* last SPURR value read */
 292};
 293
 294/*
 295 * Each entry in the cpu_purr_data array is manipulated only by its
 296 * "owner" cpu -- usually in the timer interrupt but also occasionally
 297 * in process context for cpu online.  As long as cpus do not touch
 298 * each others' cpu_purr_data, disabling local interrupts is
 299 * sufficient to serialize accesses.
 300 */
 301static DEFINE_PER_CPU(struct cpu_purr_data, cpu_purr_data);
 302
 303static void snapshot_tb_and_purr(void *data)
 304{
 305        unsigned long flags;
 306        struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data);
 307
 308        local_irq_save(flags);
 309        p->tb = get_tb_or_rtc();
 310        p->purr = mfspr(SPRN_PURR);
 311        wmb();
 312        p->initialized = 1;
 313        local_irq_restore(flags);
 314}
 315
 316/*
 317 * Called during boot when all cpus have come up.
 318 */
 319void snapshot_timebases(void)
 320{
 321        if (!cpu_has_feature(CPU_FTR_PURR))
 322                return;
 323        on_each_cpu(snapshot_tb_and_purr, NULL, 1);
 324}
 325
 326/*
 327 * Must be called with interrupts disabled.
 328 */
 329void calculate_steal_time(void)
 330{
 331        u64 tb, purr;
 332        s64 stolen;
 333        struct cpu_purr_data *pme;
 334
 335        pme = &__get_cpu_var(cpu_purr_data);
 336        if (!pme->initialized)
 337                return;         /* !CPU_FTR_PURR or early in early boot */
 338        tb = mftb();
 339        purr = mfspr(SPRN_PURR);
 340        stolen = (tb - pme->tb) - (purr - pme->purr);
 341        if (stolen > 0) {
 342                if (idle_task(smp_processor_id()) != current)
 343                        account_steal_time(stolen);
 344                else
 345                        account_idle_time(stolen);
 346        }
 347        pme->tb = tb;
 348        pme->purr = purr;
 349}
 350
 351#ifdef CONFIG_PPC_SPLPAR
 352/*
 353 * Must be called before the cpu is added to the online map when
 354 * a cpu is being brought up at runtime.
 355 */
 356static void snapshot_purr(void)
 357{
 358        struct cpu_purr_data *pme;
 359        unsigned long flags;
 360
 361        if (!cpu_has_feature(CPU_FTR_PURR))
 362                return;
 363        local_irq_save(flags);
 364        pme = &__get_cpu_var(cpu_purr_data);
 365        pme->tb = mftb();
 366        pme->purr = mfspr(SPRN_PURR);
 367        pme->initialized = 1;
 368        local_irq_restore(flags);
 369}
 370
 371#endif /* CONFIG_PPC_SPLPAR */
 372
 373#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
 374#define calc_cputime_factors()
 375#define calculate_steal_time()          do { } while (0)
 376#endif
 377
 378#if !(defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(CONFIG_PPC_SPLPAR))
 379#define snapshot_purr()                 do { } while (0)
 380#endif
 381
 382/*
 383 * Called when a cpu comes up after the system has finished booting,
 384 * i.e. as a result of a hotplug cpu action.
 385 */
 386void snapshot_timebase(void)
 387{
 388        __get_cpu_var(last_jiffy) = get_tb_or_rtc();
 389        snapshot_purr();
 390}
 391
 392void __delay(unsigned long loops)
 393{
 394        unsigned long start;
 395        int diff;
 396
 397        if (__USE_RTC()) {
 398                start = get_rtcl();
 399                do {
 400                        /* the RTCL register wraps at 1000000000 */
 401                        diff = get_rtcl() - start;
 402                        if (diff < 0)
 403                                diff += 1000000000;
 404                } while (diff < loops);
 405        } else {
 406                start = get_tbl();
 407                while (get_tbl() - start < loops)
 408                        HMT_low();
 409                HMT_medium();
 410        }
 411}
 412EXPORT_SYMBOL(__delay);
 413
 414void udelay(unsigned long usecs)
 415{
 416        __delay(tb_ticks_per_usec * usecs);
 417}
 418EXPORT_SYMBOL(udelay);
 419
 420static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
 421                               u64 new_tb_to_xs)
 422{
 423        /*
 424         * tb_update_count is used to allow the userspace gettimeofday code
 425         * to assure itself that it sees a consistent view of the tb_to_xs and
 426         * stamp_xsec variables.  It reads the tb_update_count, then reads
 427         * tb_to_xs and stamp_xsec and then reads tb_update_count again.  If
 428         * the two values of tb_update_count match and are even then the
 429         * tb_to_xs and stamp_xsec values are consistent.  If not, then it
 430         * loops back and reads them again until this criteria is met.
 431         * We expect the caller to have done the first increment of
 432         * vdso_data->tb_update_count already.
 433         */
 434        vdso_data->tb_orig_stamp = new_tb_stamp;
 435        vdso_data->stamp_xsec = new_stamp_xsec;
 436        vdso_data->tb_to_xs = new_tb_to_xs;
 437        vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
 438        vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
 439        vdso_data->stamp_xtime = xtime;
 440        smp_wmb();
 441        ++(vdso_data->tb_update_count);
 442}
 443
 444#ifdef CONFIG_SMP
 445unsigned long profile_pc(struct pt_regs *regs)
 446{
 447        unsigned long pc = instruction_pointer(regs);
 448
 449        if (in_lock_functions(pc))
 450                return regs->link;
 451
 452        return pc;
 453}
 454EXPORT_SYMBOL(profile_pc);
 455#endif
 456
 457#ifdef CONFIG_PPC_ISERIES
 458
 459/* 
 460 * This function recalibrates the timebase based on the 49-bit time-of-day
 461 * value in the Titan chip.  The Titan is much more accurate than the value
 462 * returned by the service processor for the timebase frequency.  
 463 */
 464
 465static int __init iSeries_tb_recal(void)
 466{
 467        struct div_result divres;
 468        unsigned long titan, tb;
 469
 470        /* Make sure we only run on iSeries */
 471        if (!firmware_has_feature(FW_FEATURE_ISERIES))
 472                return -ENODEV;
 473
 474        tb = get_tb();
 475        titan = HvCallXm_loadTod();
 476        if ( iSeries_recal_titan ) {
 477                unsigned long tb_ticks = tb - iSeries_recal_tb;
 478                unsigned long titan_usec = (titan - iSeries_recal_titan) >> 12;
 479                unsigned long new_tb_ticks_per_sec   = (tb_ticks * USEC_PER_SEC)/titan_usec;
 480                unsigned long new_tb_ticks_per_jiffy = (new_tb_ticks_per_sec+(HZ/2))/HZ;
 481                long tick_diff = new_tb_ticks_per_jiffy - tb_ticks_per_jiffy;
 482                char sign = '+';                
 483                /* make sure tb_ticks_per_sec and tb_ticks_per_jiffy are consistent */
 484                new_tb_ticks_per_sec = new_tb_ticks_per_jiffy * HZ;
 485
 486                if ( tick_diff < 0 ) {
 487                        tick_diff = -tick_diff;
 488                        sign = '-';
 489                }
 490                if ( tick_diff ) {
 491                        if ( tick_diff < tb_ticks_per_jiffy/25 ) {
 492                                printk( "Titan recalibrate: new tb_ticks_per_jiffy = %lu (%c%ld)\n",
 493                                                new_tb_ticks_per_jiffy, sign, tick_diff );
 494                                tb_ticks_per_jiffy = new_tb_ticks_per_jiffy;
 495                                tb_ticks_per_sec   = new_tb_ticks_per_sec;
 496                                calc_cputime_factors();
 497                                div128_by_32( XSEC_PER_SEC, 0, tb_ticks_per_sec, &divres );
 498                                tb_to_xs = divres.result_low;
 499                                vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
 500                                vdso_data->tb_to_xs = tb_to_xs;
 501                        }
 502                        else {
 503                                printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
 504                                        "                   new tb_ticks_per_jiffy = %lu\n"
 505                                        "                   old tb_ticks_per_jiffy = %lu\n",
 506                                        new_tb_ticks_per_jiffy, tb_ticks_per_jiffy );
 507                        }
 508                }
 509        }
 510        iSeries_recal_titan = titan;
 511        iSeries_recal_tb = tb;
 512
 513        /* Called here as now we know accurate values for the timebase */
 514        clocksource_init();
 515        return 0;
 516}
 517late_initcall(iSeries_tb_recal);
 518
 519/* Called from platform early init */
 520void __init iSeries_time_init_early(void)
 521{
 522        iSeries_recal_tb = get_tb();
 523        iSeries_recal_titan = HvCallXm_loadTod();
 524}
 525#endif /* CONFIG_PPC_ISERIES */
 526
 527/*
 528 * For iSeries shared processors, we have to let the hypervisor
 529 * set the hardware decrementer.  We set a virtual decrementer
 530 * in the lppaca and call the hypervisor if the virtual
 531 * decrementer is less than the current value in the hardware
 532 * decrementer. (almost always the new decrementer value will
 533 * be greater than the current hardware decementer so the hypervisor
 534 * call will not be needed)
 535 */
 536
 537/*
 538 * timer_interrupt - gets called when the decrementer overflows,
 539 * with interrupts disabled.
 540 */
 541void timer_interrupt(struct pt_regs * regs)
 542{
 543        struct pt_regs *old_regs;
 544        struct decrementer_clock *decrementer =  &__get_cpu_var(decrementers);
 545        struct clock_event_device *evt = &decrementer->event;
 546        u64 now;
 547
 548        /* Ensure a positive value is written to the decrementer, or else
 549         * some CPUs will continuue to take decrementer exceptions */
 550        set_dec(DECREMENTER_MAX);
 551
 552#ifdef CONFIG_PPC32
 553        if (atomic_read(&ppc_n_lost_interrupts) != 0)
 554                do_IRQ(regs);
 555#endif
 556
 557        now = get_tb_or_rtc();
 558        if (now < decrementer->next_tb) {
 559                /* not time for this event yet */
 560                now = decrementer->next_tb - now;
 561                if (now <= DECREMENTER_MAX)
 562                        set_dec((int)now);
 563                return;
 564        }
 565        old_regs = set_irq_regs(regs);
 566        irq_enter();
 567
 568        calculate_steal_time();
 569
 570#ifdef CONFIG_PPC_ISERIES
 571        if (firmware_has_feature(FW_FEATURE_ISERIES))
 572                get_lppaca()->int_dword.fields.decr_int = 0;
 573#endif
 574
 575        if (evt->event_handler)
 576                evt->event_handler(evt);
 577
 578#ifdef CONFIG_PPC_ISERIES
 579        if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
 580                process_hvlpevents();
 581#endif
 582
 583#ifdef CONFIG_PPC64
 584        /* collect purr register values often, for accurate calculations */
 585        if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
 586                struct cpu_usage *cu = &__get_cpu_var(cpu_usage_array);
 587                cu->current_tb = mfspr(SPRN_PURR);
 588        }
 589#endif
 590
 591        irq_exit();
 592        set_irq_regs(old_regs);
 593}
 594
 595void wakeup_decrementer(void)
 596{
 597        unsigned long ticks;
 598
 599        /*
 600         * The timebase gets saved on sleep and restored on wakeup,
 601         * so all we need to do is to reset the decrementer.
 602         */
 603        ticks = tb_ticks_since(__get_cpu_var(last_jiffy));
 604        if (ticks < tb_ticks_per_jiffy)
 605                ticks = tb_ticks_per_jiffy - ticks;
 606        else
 607                ticks = 1;
 608        set_dec(ticks);
 609}
 610
 611#ifdef CONFIG_SUSPEND
 612void generic_suspend_disable_irqs(void)
 613{
 614        preempt_disable();
 615
 616        /* Disable the decrementer, so that it doesn't interfere
 617         * with suspending.
 618         */
 619
 620        set_dec(0x7fffffff);
 621        local_irq_disable();
 622        set_dec(0x7fffffff);
 623}
 624
 625void generic_suspend_enable_irqs(void)
 626{
 627        wakeup_decrementer();
 628
 629        local_irq_enable();
 630        preempt_enable();
 631}
 632
 633/* Overrides the weak version in kernel/power/main.c */
 634void arch_suspend_disable_irqs(void)
 635{
 636        if (ppc_md.suspend_disable_irqs)
 637                ppc_md.suspend_disable_irqs();
 638        generic_suspend_disable_irqs();
 639}
 640
 641/* Overrides the weak version in kernel/power/main.c */
 642void arch_suspend_enable_irqs(void)
 643{
 644        generic_suspend_enable_irqs();
 645        if (ppc_md.suspend_enable_irqs)
 646                ppc_md.suspend_enable_irqs();
 647}
 648#endif
 649
 650#ifdef CONFIG_SMP
 651void __init smp_space_timers(unsigned int max_cpus)
 652{
 653        int i;
 654        u64 previous_tb = per_cpu(last_jiffy, boot_cpuid);
 655
 656        /* make sure tb > per_cpu(last_jiffy, cpu) for all cpus always */
 657        previous_tb -= tb_ticks_per_jiffy;
 658
 659        for_each_possible_cpu(i) {
 660                if (i == boot_cpuid)
 661                        continue;
 662                per_cpu(last_jiffy, i) = previous_tb;
 663        }
 664}
 665#endif
 666
 667/*
 668 * Scheduler clock - returns current time in nanosec units.
 669 *
 670 * Note: mulhdu(a, b) (multiply high double unsigned) returns
 671 * the high 64 bits of a * b, i.e. (a * b) >> 64, where a and b
 672 * are 64-bit unsigned numbers.
 673 */
 674unsigned long long sched_clock(void)
 675{
 676        if (__USE_RTC())
 677                return get_rtc();
 678        return mulhdu(get_tb() - boot_tb, tb_to_ns_scale) << tb_to_ns_shift;
 679}
 680
 681static int __init get_freq(char *name, int cells, unsigned long *val)
 682{
 683        struct device_node *cpu;
 684        const unsigned int *fp;
 685        int found = 0;
 686
 687        /* The cpu node should have timebase and clock frequency properties */
 688        cpu = of_find_node_by_type(NULL, "cpu");
 689
 690        if (cpu) {
 691                fp = of_get_property(cpu, name, NULL);
 692                if (fp) {
 693                        found = 1;
 694                        *val = of_read_ulong(fp, cells);
 695                }
 696
 697                of_node_put(cpu);
 698        }
 699
 700        return found;
 701}
 702
 703void __init generic_calibrate_decr(void)
 704{
 705        ppc_tb_freq = DEFAULT_TB_FREQ;          /* hardcoded default */
 706
 707        if (!get_freq("ibm,extended-timebase-frequency", 2, &ppc_tb_freq) &&
 708            !get_freq("timebase-frequency", 1, &ppc_tb_freq)) {
 709
 710                printk(KERN_ERR "WARNING: Estimating decrementer frequency "
 711                                "(not found)\n");
 712        }
 713
 714        ppc_proc_freq = DEFAULT_PROC_FREQ;      /* hardcoded default */
 715
 716        if (!get_freq("ibm,extended-clock-frequency", 2, &ppc_proc_freq) &&
 717            !get_freq("clock-frequency", 1, &ppc_proc_freq)) {
 718
 719                printk(KERN_ERR "WARNING: Estimating processor frequency "
 720                                "(not found)\n");
 721        }
 722
 723#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
 724        /* Clear any pending timer interrupts */
 725        mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS);
 726
 727        /* Enable decrementer interrupt */
 728        mtspr(SPRN_TCR, TCR_DIE);
 729#endif
 730}
 731
 732int update_persistent_clock(struct timespec now)
 733{
 734        struct rtc_time tm;
 735
 736        if (!ppc_md.set_rtc_time)
 737                return 0;
 738
 739        to_tm(now.tv_sec + 1 + timezone_offset, &tm);
 740        tm.tm_year -= 1900;
 741        tm.tm_mon -= 1;
 742
 743        return ppc_md.set_rtc_time(&tm);
 744}
 745
 746unsigned long read_persistent_clock(void)
 747{
 748        struct rtc_time tm;
 749        static int first = 1;
 750
 751        /* XXX this is a litle fragile but will work okay in the short term */
 752        if (first) {
 753                first = 0;
 754                if (ppc_md.time_init)
 755                        timezone_offset = ppc_md.time_init();
 756
 757                /* get_boot_time() isn't guaranteed to be safe to call late */
 758                if (ppc_md.get_boot_time)
 759                        return ppc_md.get_boot_time() -timezone_offset;
 760        }
 761        if (!ppc_md.get_rtc_time)
 762                return 0;
 763        ppc_md.get_rtc_time(&tm);
 764        return mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
 765                      tm.tm_hour, tm.tm_min, tm.tm_sec);
 766}
 767
 768/* clocksource code */
 769static cycle_t rtc_read(void)
 770{
 771        return (cycle_t)get_rtc();
 772}
 773
 774static cycle_t timebase_read(void)
 775{
 776        return (cycle_t)get_tb();
 777}
 778
 779void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
 780{
 781        u64 t2x, stamp_xsec;
 782
 783        if (clock != &clocksource_timebase)
 784                return;
 785
 786        /* Make userspace gettimeofday spin until we're done. */
 787        ++vdso_data->tb_update_count;
 788        smp_mb();
 789
 790        /* XXX this assumes clock->shift == 22 */
 791        /* 4611686018 ~= 2^(20+64-22) / 1e9 */
 792        t2x = (u64) clock->mult * 4611686018ULL;
 793        stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
 794        do_div(stamp_xsec, 1000000000);
 795        stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
 796        update_gtod(clock->cycle_last, stamp_xsec, t2x);
 797}
 798
 799void update_vsyscall_tz(void)
 800{
 801        /* Make userspace gettimeofday spin until we're done. */
 802        ++vdso_data->tb_update_count;
 803        smp_mb();
 804        vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
 805        vdso_data->tz_dsttime = sys_tz.tz_dsttime;
 806        smp_mb();
 807        ++vdso_data->tb_update_count;
 808}
 809
 810static void __init clocksource_init(void)
 811{
 812        struct clocksource *clock;
 813
 814        if (__USE_RTC())
 815                clock = &clocksource_rtc;
 816        else
 817                clock = &clocksource_timebase;
 818
 819        clock->mult = clocksource_hz2mult(tb_ticks_per_sec, clock->shift);
 820
 821        if (clocksource_register(clock)) {
 822                printk(KERN_ERR "clocksource: %s is already registered\n",
 823                       clock->name);
 824                return;
 825        }
 826
 827        printk(KERN_INFO "clocksource: %s mult[%x] shift[%d] registered\n",
 828               clock->name, clock->mult, clock->shift);
 829}
 830
 831static int decrementer_set_next_event(unsigned long evt,
 832                                      struct clock_event_device *dev)
 833{
 834        __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
 835        set_dec(evt);
 836        return 0;
 837}
 838
 839static void decrementer_set_mode(enum clock_event_mode mode,
 840                                 struct clock_event_device *dev)
 841{
 842        if (mode != CLOCK_EVT_MODE_ONESHOT)
 843                decrementer_set_next_event(DECREMENTER_MAX, dev);
 844}
 845
 846static void register_decrementer_clockevent(int cpu)
 847{
 848        struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
 849
 850        *dec = decrementer_clockevent;
 851        dec->cpumask = cpumask_of(cpu);
 852
 853        printk(KERN_DEBUG "clockevent: %s mult[%lx] shift[%d] cpu[%d]\n",
 854               dec->name, dec->mult, dec->shift, cpu);
 855
 856        clockevents_register_device(dec);
 857}
 858
 859static void __init init_decrementer_clockevent(void)
 860{
 861        int cpu = smp_processor_id();
 862
 863        decrementer_clockevent.mult = div_sc(ppc_tb_freq, NSEC_PER_SEC,
 864                                             decrementer_clockevent.shift);
 865        decrementer_clockevent.max_delta_ns =
 866                clockevent_delta2ns(DECREMENTER_MAX, &decrementer_clockevent);
 867        decrementer_clockevent.min_delta_ns =
 868                clockevent_delta2ns(2, &decrementer_clockevent);
 869
 870        register_decrementer_clockevent(cpu);
 871}
 872
 873void secondary_cpu_time_init(void)
 874{
 875        /* FIME: Should make unrelatred change to move snapshot_timebase
 876         * call here ! */
 877        register_decrementer_clockevent(smp_processor_id());
 878}
 879
 880/* This function is only called on the boot processor */
 881void __init time_init(void)
 882{
 883        unsigned long flags;
 884        struct div_result res;
 885        u64 scale, x;
 886        unsigned shift;
 887
 888        if (__USE_RTC()) {
 889                /* 601 processor: dec counts down by 128 every 128ns */
 890                ppc_tb_freq = 1000000000;
 891                tb_last_jiffy = get_rtcl();
 892        } else {
 893                /* Normal PowerPC with timebase register */
 894                ppc_md.calibrate_decr();
 895                printk(KERN_DEBUG "time_init: decrementer frequency = %lu.%.6lu MHz\n",
 896                       ppc_tb_freq / 1000000, ppc_tb_freq % 1000000);
 897                printk(KERN_DEBUG "time_init: processor frequency   = %lu.%.6lu MHz\n",
 898                       ppc_proc_freq / 1000000, ppc_proc_freq % 1000000);
 899                tb_last_jiffy = get_tb();
 900        }
 901
 902        tb_ticks_per_jiffy = ppc_tb_freq / HZ;
 903        tb_ticks_per_sec = ppc_tb_freq;
 904        tb_ticks_per_usec = ppc_tb_freq / 1000000;
 905        tb_to_us = mulhwu_scale_factor(ppc_tb_freq, 1000000);
 906        calc_cputime_factors();
 907
 908        /*
 909         * Calculate the length of each tick in ns.  It will not be
 910         * exactly 1e9/HZ unless ppc_tb_freq is divisible by HZ.
 911         * We compute 1e9 * tb_ticks_per_jiffy / ppc_tb_freq,
 912         * rounded up.
 913         */
 914        x = (u64) NSEC_PER_SEC * tb_ticks_per_jiffy + ppc_tb_freq - 1;
 915        do_div(x, ppc_tb_freq);
 916        tick_nsec = x;
 917        last_tick_len = x << TICKLEN_SCALE;
 918
 919        /*
 920         * Compute ticklen_to_xs, which is a factor which gets multiplied
 921         * by (last_tick_len << TICKLEN_SHIFT) to get a tb_to_xs value.
 922         * It is computed as:
 923         * ticklen_to_xs = 2^N / (tb_ticks_per_jiffy * 1e9)
 924         * where N = 64 + 20 - TICKLEN_SCALE - TICKLEN_SHIFT
 925         * which turns out to be N = 51 - SHIFT_HZ.
 926         * This gives the result as a 0.64 fixed-point fraction.
 927         * That value is reduced by an offset amounting to 1 xsec per
 928         * 2^31 timebase ticks to avoid problems with time going backwards
 929         * by 1 xsec when we do timer_recalc_offset due to losing the
 930         * fractional xsec.  That offset is equal to ppc_tb_freq/2^51
 931         * since there are 2^20 xsec in a second.
 932         */
 933        div128_by_32((1ULL << 51) - ppc_tb_freq, 0,
 934                     tb_ticks_per_jiffy << SHIFT_HZ, &res);
 935        div128_by_32(res.result_high, res.result_low, NSEC_PER_SEC, &res);
 936        ticklen_to_xs = res.result_low;
 937
 938        /* Compute tb_to_xs from tick_nsec */
 939        tb_to_xs = mulhdu(last_tick_len << TICKLEN_SHIFT, ticklen_to_xs);
 940
 941        /*
 942         * Compute scale factor for sched_clock.
 943         * The calibrate_decr() function has set tb_ticks_per_sec,
 944         * which is the timebase frequency.
 945         * We compute 1e9 * 2^64 / tb_ticks_per_sec and interpret
 946         * the 128-bit result as a 64.64 fixed-point number.
 947         * We then shift that number right until it is less than 1.0,
 948         * giving us the scale factor and shift count to use in
 949         * sched_clock().
 950         */
 951        div128_by_32(1000000000, 0, tb_ticks_per_sec, &res);
 952        scale = res.result_low;
 953        for (shift = 0; res.result_high != 0; ++shift) {
 954                scale = (scale >> 1) | (res.result_high << 63);
 955                res.result_high >>= 1;
 956        }
 957        tb_to_ns_scale = scale;
 958        tb_to_ns_shift = shift;
 959        /* Save the current timebase to pretty up CONFIG_PRINTK_TIME */
 960        boot_tb = get_tb_or_rtc();
 961
 962        write_seqlock_irqsave(&xtime_lock, flags);
 963
 964        /* If platform provided a timezone (pmac), we correct the time */
 965        if (timezone_offset) {
 966                sys_tz.tz_minuteswest = -timezone_offset / 60;
 967                sys_tz.tz_dsttime = 0;
 968        }
 969
 970        vdso_data->tb_orig_stamp = tb_last_jiffy;
 971        vdso_data->tb_update_count = 0;
 972        vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
 973        vdso_data->stamp_xsec = (u64) xtime.tv_sec * XSEC_PER_SEC;
 974        vdso_data->tb_to_xs = tb_to_xs;
 975
 976        write_sequnlock_irqrestore(&xtime_lock, flags);
 977
 978        /* Register the clocksource, if we're not running on iSeries */
 979        if (!firmware_has_feature(FW_FEATURE_ISERIES))
 980                clocksource_init();
 981
 982        init_decrementer_clockevent();
 983}
 984
 985
 986#define FEBRUARY        2
 987#define STARTOFTIME     1970
 988#define SECDAY          86400L
 989#define SECYR           (SECDAY * 365)
 990#define leapyear(year)          ((year) % 4 == 0 && \
 991                                 ((year) % 100 != 0 || (year) % 400 == 0))
 992#define days_in_year(a)         (leapyear(a) ? 366 : 365)
 993#define days_in_month(a)        (month_days[(a) - 1])
 994
 995static int month_days[12] = {
 996        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
 997};
 998
 999/*
1000 * This only works for the Gregorian calendar - i.e. after 1752 (in the UK)
1001 */
1002void GregorianDay(struct rtc_time * tm)
1003{
1004        int leapsToDate;
1005        int lastYear;
1006        int day;
1007        int MonthOffset[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
1008
1009        lastYear = tm->tm_year - 1;
1010
1011        /*
1012         * Number of leap corrections to apply up to end of last year
1013         */
1014        leapsToDate = lastYear / 4 - lastYear / 100 + lastYear / 400;
1015
1016        /*
1017         * This year is a leap year if it is divisible by 4 except when it is
1018         * divisible by 100 unless it is divisible by 400
1019         *
1020         * e.g. 1904 was a leap year, 1900 was not, 1996 is, and 2000 was
1021         */
1022        day = tm->tm_mon > 2 && leapyear(tm->tm_year);
1023
1024        day += lastYear*365 + leapsToDate + MonthOffset[tm->tm_mon-1] +
1025                   tm->tm_mday;
1026
1027        tm->tm_wday = day % 7;
1028}
1029
1030void to_tm(int tim, struct rtc_time * tm)
1031{
1032        register int    i;
1033        register long   hms, day;
1034
1035        day = tim / SECDAY;
1036        hms = tim % SECDAY;
1037
1038        /* Hours, minutes, seconds are easy */
1039        tm->tm_hour = hms / 3600;
1040        tm->tm_min = (hms % 3600) / 60;
1041        tm->tm_sec = (hms % 3600) % 60;
1042
1043        /* Number of years in days */
1044        for (i = STARTOFTIME; day >= days_in_year(i); i++)
1045                day -= days_in_year(i);
1046        tm->tm_year = i;
1047
1048        /* Number of months in days left */
1049        if (leapyear(tm->tm_year))
1050                days_in_month(FEBRUARY) = 29;
1051        for (i = 1; day >= days_in_month(i); i++)
1052                day -= days_in_month(i);
1053        days_in_month(FEBRUARY) = 28;
1054        tm->tm_mon = i;
1055
1056        /* Days are what is left over (+1) from all that. */
1057        tm->tm_mday = day + 1;
1058
1059        /*
1060         * Determine the day of week
1061         */
1062        GregorianDay(tm);
1063}
1064
1065/* Auxiliary function to compute scaling factors */
1066/* Actually the choice of a timebase running at 1/4 the of the bus
1067 * frequency giving resolution of a few tens of nanoseconds is quite nice.
1068 * It makes this computation very precise (27-28 bits typically) which
1069 * is optimistic considering the stability of most processor clock
1070 * oscillators and the precision with which the timebase frequency
1071 * is measured but does not harm.
1072 */
1073unsigned mulhwu_scale_factor(unsigned inscale, unsigned outscale)
1074{
1075        unsigned mlt=0, tmp, err;
1076        /* No concern for performance, it's done once: use a stupid
1077         * but safe and compact method to find the multiplier.
1078         */
1079  
1080        for (tmp = 1U<<31; tmp != 0; tmp >>= 1) {
1081                if (mulhwu(inscale, mlt|tmp) < outscale)
1082                        mlt |= tmp;
1083        }
1084  
1085        /* We might still be off by 1 for the best approximation.
1086         * A side effect of this is that if outscale is too large
1087         * the returned value will be zero.
1088         * Many corner cases have been checked and seem to work,
1089         * some might have been forgotten in the test however.
1090         */
1091  
1092        err = inscale * (mlt+1);
1093        if (err <= inscale/2)
1094                mlt++;
1095        return mlt;
1096}
1097
1098/*
1099 * Divide a 128-bit dividend by a 32-bit divisor, leaving a 128 bit
1100 * result.
1101 */
1102void div128_by_32(u64 dividend_high, u64 dividend_low,
1103                  unsigned divisor, struct div_result *dr)
1104{
1105        unsigned long a, b, c, d;
1106        unsigned long w, x, y, z;
1107        u64 ra, rb, rc;
1108
1109        a = dividend_high >> 32;
1110        b = dividend_high & 0xffffffff;
1111        c = dividend_low >> 32;
1112        d = dividend_low & 0xffffffff;
1113
1114        w = a / divisor;
1115        ra = ((u64)(a - (w * divisor)) << 32) + b;
1116
1117        rb = ((u64) do_div(ra, divisor) << 32) + c;
1118        x = ra;
1119
1120        rc = ((u64) do_div(rb, divisor) << 32) + d;
1121        y = rb;
1122
1123        do_div(rc, divisor);
1124        z = rc;
1125
1126        dr->result_high = ((u64)w << 32) + x;
1127        dr->result_low  = ((u64)y << 32) + z;
1128
1129}
1130
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.