time.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:23k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * 
  3.  * Common time routines among all ppc machines.
  4.  *
  5.  * Written by Cort Dougan (cort@cs.nmt.edu) to merge
  6.  * Paul Mackerras' version and mine for PReP and Pmac.
  7.  * MPC8xx/MBX changes by Dan Malek (dmalek@jlc.net).
  8.  * Converted for 64-bit by Mike Corrigan (mikejc@us.ibm.com)
  9.  *
  10.  * First round of bugfixes by Gabriel Paubert (paubert@iram.es)
  11.  * to make clock more stable (2.4.0-test5). The only thing
  12.  * that this code assumes is that the timebases have been synchronized
  13.  * by firmware on SMP and are never stopped (never do sleep
  14.  * on SMP then, nap and doze are OK).
  15.  * 
  16.  * Speeded up do_gettimeofday by getting rid of references to
  17.  * xtime (which required locks for consistency). (mikejc@us.ibm.com)
  18.  *
  19.  * TODO (not necessarily in this file):
  20.  * - improve precision and reproducibility of timebase frequency
  21.  * measurement at boot time. (for iSeries, we calibrate the timebase
  22.  * against the Titan chip's clock.)
  23.  * - for astronomical applications: add a new function to get
  24.  * non ambiguous timestamps even around leap seconds. This needs
  25.  * a new timestamp format and a good name.
  26.  *
  27.  * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
  28.  *             "A Kernel Model for Precision Timekeeping" by Dave Mills
  29.  *
  30.  *      This program is free software; you can redistribute it and/or
  31.  *      modify it under the terms of the GNU General Public License
  32.  *      as published by the Free Software Foundation; either version
  33.  *      2 of the License, or (at your option) any later version.
  34.  */
  35. #include <linux/config.h>
  36. #include <linux/errno.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/mc146818rtc.h>
  46. #include <linux/time.h>
  47. #include <linux/init.h>
  48. #include <asm/naca.h>
  49. #include <asm/segment.h>
  50. #include <asm/io.h>
  51. #include <asm/processor.h>
  52. #include <asm/nvram.h>
  53. #include <asm/cache.h>
  54. #include <asm/machdep.h>
  55. #include <asm/init.h>
  56. #ifdef CONFIG_PPC_ISERIES
  57. #include <asm/iSeries/HvCallXm.h>
  58. #endif
  59. #include <asm/uaccess.h>
  60. #include <asm/time.h>
  61. #include <asm/ppcdebug.h>
  62. void smp_local_timer_interrupt(struct pt_regs *);
  63. extern void setup_before_console_init();
  64. /* keep track of when we need to update the rtc */
  65. time_t last_rtc_update;
  66. extern rwlock_t xtime_lock;
  67. extern int piranha_simulator;
  68. #ifdef CONFIG_PPC_ISERIES
  69. unsigned long iSeries_recal_titan = 0;
  70. unsigned long iSeries_recal_tb = 0; 
  71. static unsigned long first_settimeofday = 1;
  72. #endif
  73. #define XSEC_PER_SEC (1024*1024)
  74. #define USEC_PER_SEC (1000000)
  75. unsigned long tb_ticks_per_jiffy;
  76. unsigned long tb_ticks_per_usec;
  77. unsigned long tb_ticks_per_sec;
  78. unsigned long next_xtime_sync_tb;
  79. unsigned long xtime_sync_interval;
  80. unsigned long tb_to_xs;
  81. unsigned long processor_freq;
  82. spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
  83. extern unsigned long wall_jiffies;
  84. extern unsigned long lpEvent_count;
  85. extern int smp_tb_synchronized;
  86. extern unsigned long prof_cpu_mask;
  87. extern unsigned int * prof_buffer;
  88. extern unsigned long prof_len;
  89. extern unsigned long prof_shift;
  90. extern char _stext;
  91. extern struct timezone sys_tz;
  92. void ppc_adjtimex(void);
  93. static unsigned adjusting_time = 0;
  94. static void ppc_do_profile (unsigned long nip)
  95. {
  96. /*
  97.  * Only measure the CPUs specified by /proc/irq/prof_cpu_mask.
  98.  * (default is all CPUs.)
  99.  */
  100. if (!((1<<smp_processor_id()) & prof_cpu_mask))
  101. return;
  102. nip -= (unsigned long) &_stext;
  103. nip >>= prof_shift;
  104. /*
  105.  * Don't ignore out-of-bounds EIP values silently,
  106.  * put them into the last histogram slot, so if
  107.  * present, they will show up as a sharp peak.
  108.  */
  109. if (nip > prof_len-1)
  110. nip = prof_len-1;
  111. atomic_inc((atomic_t *)&prof_buffer[nip]);
  112. }
  113. static __inline__ void timer_check_rtc(void)
  114. {
  115.         /*
  116.          * update the rtc when needed, this should be performed on the
  117.          * right fraction of a second. Half or full second ?
  118.          * Full second works on mk48t59 clocks, others need testing.
  119.          * Note that this update is basically only used through 
  120.          * the adjtimex system calls. Setting the HW clock in
  121.          * any other way is a /dev/rtc and userland business.
  122.          * This is still wrong by -0.5/+1.5 jiffies because of the
  123.          * timer interrupt resolution and possible delay, but here we 
  124.          * hit a quantization limit which can only be solved by higher
  125.          * resolution timers and decoupling time management from timer
  126.          * interrupts. This is also wrong on the clocks
  127.          * which require being written at the half second boundary.
  128.          * We should have an rtc call that only sets the minutes and
  129.          * seconds like on Intel to avoid problems with non UTC clocks.
  130.          */
  131.         if ( (time_status & STA_UNSYNC) == 0 &&
  132.              xtime.tv_sec - last_rtc_update >= 659 &&
  133.              abs(xtime.tv_usec - (1000000-1000000/HZ)) < 500000/HZ &&
  134.              jiffies - wall_jiffies == 1) {
  135.     struct rtc_time tm;
  136.     to_tm(xtime.tv_sec+1, &tm);
  137.     tm.tm_year -= 1900;
  138.     tm.tm_mon -= 1;
  139.             if (ppc_md.set_rtc_time(&tm) == 0)
  140.                 last_rtc_update = xtime.tv_sec+1;
  141.             else
  142.                 /* Try again one minute later */
  143.                 last_rtc_update += 60;
  144.         }
  145. }
  146. /* Synchronize xtime with do_gettimeofday */ 
  147. static __inline__ void timer_sync_xtime( unsigned long cur_tb )
  148. {
  149. struct timeval my_tv;
  150. if ( cur_tb > next_xtime_sync_tb ) {
  151. next_xtime_sync_tb = cur_tb + xtime_sync_interval;
  152. do_gettimeofday( &my_tv );
  153. if ( xtime.tv_sec <= my_tv.tv_sec ) {
  154. xtime.tv_sec = my_tv.tv_sec;
  155. xtime.tv_usec = my_tv.tv_usec;
  156. }
  157. }
  158. }
  159. #ifdef CONFIG_PPC_ISERIES
  160. /* 
  161.  * This function recalibrates the timebase based on the 49-bit time-of-day
  162.  * value in the Titan chip.  The Titan is much more accurate than the value
  163.  * returned by the service processor for the timebase frequency.  
  164.  */
  165. static void iSeries_tb_recal(void)
  166. {
  167. struct div_result divres;
  168. unsigned long titan, tb;
  169. tb = get_tb();
  170. titan = HvCallXm_loadTod();
  171. if ( iSeries_recal_titan ) {
  172. unsigned long tb_ticks = tb - iSeries_recal_tb;
  173. unsigned long titan_usec = (titan - iSeries_recal_titan) >> 12;
  174. unsigned long new_tb_ticks_per_sec   = (tb_ticks * USEC_PER_SEC)/titan_usec;
  175. unsigned long new_tb_ticks_per_jiffy = (new_tb_ticks_per_sec+(HZ/2))/HZ;
  176. long tick_diff = new_tb_ticks_per_jiffy - tb_ticks_per_jiffy;
  177. char sign = '+';
  178. /* make sure tb_ticks_per_sec and tb_ticks_per_jiffy are consistent */
  179. new_tb_ticks_per_sec = new_tb_ticks_per_jiffy * HZ;
  180. if ( tick_diff < 0 ) {
  181. tick_diff = -tick_diff;
  182. sign = '-';
  183. }
  184. if ( tick_diff ) {
  185. if ( tick_diff < tb_ticks_per_jiffy/25 ) {
  186. printk( "Titan recalibrate: new tb_ticks_per_jiffy = %lu (%c%ld)n",
  187. new_tb_ticks_per_jiffy, sign, tick_diff );
  188. tb_ticks_per_jiffy = new_tb_ticks_per_jiffy;
  189. tb_ticks_per_sec   = new_tb_ticks_per_sec;
  190. div128_by_32( XSEC_PER_SEC, 0, tb_ticks_per_sec, &divres );
  191. naca->tb_ticks_per_sec = tb_ticks_per_sec;
  192. tb_to_xs = divres.result_low;
  193. naca->tb_to_xs = tb_to_xs;
  194. }
  195. else {
  196. printk( "Titan recalibrate: FAILED (difference > 4 percent)n"
  197. "                   new tb_ticks_per_jiffy = %lun"
  198. "                   old tb_ticks_per_jiffy = %lun",
  199. new_tb_ticks_per_jiffy, tb_ticks_per_jiffy );
  200. }
  201. }
  202. }
  203. iSeries_recal_titan = titan;
  204. iSeries_recal_tb = tb;
  205. }
  206. #endif
  207. /*
  208.  * For iSeries shared processors, we have to let the hypervisor
  209.  * set the hardware decrementer.  We set a virtual decrementer
  210.  * in the ItLpPaca and call the hypervisor if the virtual
  211.  * decrementer is less than the current value in the hardware
  212.  * decrementer. (almost always the new decrementer value will
  213.  * be greater than the current hardware decementer so the hypervisor
  214.  * call will not be needed)
  215.  */
  216. unsigned long tb_last_stamp=0;
  217. /*
  218.  * timer_interrupt - gets called when the decrementer overflows,
  219.  * with interrupts disabled.
  220.  */
  221. int timer_interrupt(struct pt_regs * regs)
  222. {
  223. int next_dec;
  224. unsigned long cur_tb;
  225. struct paca_struct *lpaca = get_paca();
  226. unsigned long cpu = lpaca->xPacaIndex;
  227. struct ItLpQueue * lpq;
  228. irq_enter(cpu);
  229. if ((!user_mode(regs)) && (prof_buffer))
  230. ppc_do_profile(instruction_pointer(regs));
  231. lpaca->xLpPaca.xIntDword.xFields.xDecrInt = 0;
  232. while (lpaca->next_jiffy_update_tb <= (cur_tb = get_tb())) {
  233. #ifdef CONFIG_SMP
  234. smp_local_timer_interrupt(regs);
  235. #endif
  236. if (cpu == 0) {
  237. write_lock(&xtime_lock);
  238. tb_last_stamp = lpaca->next_jiffy_update_tb;
  239. do_timer(regs);
  240. timer_sync_xtime( cur_tb );
  241. timer_check_rtc();
  242. write_unlock(&xtime_lock);
  243. if ( adjusting_time && (time_adjust == 0) )
  244. ppc_adjtimex();
  245. }
  246. lpaca->next_jiffy_update_tb += tb_ticks_per_jiffy;
  247. }
  248. next_dec = lpaca->next_jiffy_update_tb - cur_tb;
  249. if (next_dec > lpaca->default_decr)
  250.          next_dec = lpaca->default_decr;
  251. set_dec(next_dec);
  252. lpq = lpaca->lpQueuePtr;
  253. if (lpq && ItLpQueue_isLpIntPending(lpq))
  254. lpEvent_count += ItLpQueue_process(lpq, regs); 
  255. irq_exit(cpu);
  256. if (softirq_pending(cpu))
  257. do_softirq();
  258. return 1;
  259. }
  260. /*
  261.  * This version of gettimeofday has microsecond resolution.
  262.  */
  263. void do_gettimeofday(struct timeval *tv)
  264. {
  265.         unsigned long sec, usec, tb_ticks;
  266. unsigned long xsec, tb_xsec;
  267. unsigned long temp_tb_to_xs, temp_stamp_xsec;
  268. unsigned long tb_count_1, tb_count_2;
  269. unsigned long always_zero;
  270. struct naca_struct *gtdp;
  271. gtdp = (struct naca_struct *)0xC000000000004000;
  272. /* 
  273.  * The following loop guarantees that we see a consistent view of the
  274.  * tb_to_xs and stamp_xsec variables.  These two variables can change
  275.  * (eg. when xntpd adjusts the clock frequency) and an inconsistent
  276.  * view (one variable changed, the other not) could result in a wildly
  277.  * wrong result for do_gettimeofday. 
  278.  *
  279.  * The code which updates these variables (ppc_adjtimex below)
  280.  * increments tb_update_count, then updates the two variables and then
  281.  * increments tb_update_count again.  This code reads tb_update_count,
  282.  * reads the two variables and then reads tb_update_count again.  It
  283.  * loops doing this until the two reads of tb_update_count yield the
  284.  * same value and that value is even.  This ensures a consistent view
  285.  * of the two variables.
  286.  *
  287.  * The strange looking assembler code below causes the hardware to
  288.  * think that reading the two variables is dependent on the first read
  289.  * of tb_update_count and that the second reading of tb_update_count is
  290.  * dependent on reading the two variables.  This assures ordering
  291.  * without the need for a lwsync, which is much more expensive.
  292.  */
  293. do {
  294. tb_ticks = get_tb() - gtdp->tb_orig_stamp;
  295. tb_count_1 = gtdp->tb_update_count;
  296. __asm__ __volatile__ (
  297. " andc  %0,%2,%2n
  298. add %1,%3,%0n
  299. " : "=&r"(always_zero), "=r"(gtdp)
  300. : "r"(tb_count_1), "r"(gtdp) );
  301. temp_tb_to_xs = gtdp->tb_to_xs;
  302. temp_stamp_xsec = gtdp->stamp_xsec;
  303. __asm__ __volatile__ (
  304. " add %0,%2,%3n
  305. andc %0,%0,%0n
  306. add %1,%4,%0n
  307. " : "=&r"(always_zero), "=r"(gtdp)
  308. : "r"(temp_stamp_xsec), "r"(temp_tb_to_xs), "r"(gtdp) );
  309. tb_count_2 = gtdp->tb_update_count;
  310. } while ( tb_count_2 - ( tb_count_1 & 0xfffffffffffffffe ) ); 
  311. /* These calculations are faster (gets rid of divides)
  312.  * if done in units of 1/2^20 rather than microseconds.
  313.  * The conversion to microseconds at the end is done
  314.  * without a divide (and in fact, without a multiply) */
  315. tb_xsec = mulhdu( tb_ticks, temp_tb_to_xs );
  316. xsec = temp_stamp_xsec + tb_xsec;
  317. sec = xsec / XSEC_PER_SEC;
  318. xsec -= sec * XSEC_PER_SEC;
  319. usec = (xsec * USEC_PER_SEC)/XSEC_PER_SEC;
  320.         tv->tv_sec = sec;
  321.         tv->tv_usec = usec;
  322. }
  323. void do_settimeofday(struct timeval *tv)
  324. {
  325. unsigned long flags;
  326. unsigned long delta_xsec;
  327. long int tb_delta, new_usec, new_sec;
  328. unsigned long new_xsec;
  329. write_lock_irqsave(&xtime_lock, flags);
  330. /* Updating the RTC is not the job of this code. If the time is
  331.  * stepped under NTP, the RTC will be update after STA_UNSYNC
  332.  * is cleared. Tool like clock/hwclock either copy the RTC
  333.  * to the system time, in which case there is no point in writing
  334.  * to the RTC again, or write to the RTC but then they don't call
  335.  * settimeofday to perform this operation.
  336.  */
  337. #ifdef CONFIG_PPC_ISERIES
  338. if ( first_settimeofday ) {
  339. iSeries_tb_recal();
  340. first_settimeofday = 0;
  341. }
  342. #endif
  343. tb_delta = tb_ticks_since(tb_last_stamp);
  344. tb_delta += (jiffies - wall_jiffies) * tb_ticks_per_jiffy;
  345. new_sec = tv->tv_sec;
  346. new_usec = tv->tv_usec - tb_delta / tb_ticks_per_usec;
  347. while (new_usec <0) {
  348. new_sec--; 
  349. new_usec += USEC_PER_SEC;
  350. }
  351. xtime.tv_usec = new_usec;
  352. xtime.tv_sec = new_sec;
  353. /* In case of a large backwards jump in time with NTP, we want the 
  354.  * clock to be updated as soon as the PLL is again in lock.
  355.  */
  356. last_rtc_update = new_sec - 658;
  357. time_adjust = 0;                /* stop active adjtime() */
  358. time_status |= STA_UNSYNC;
  359. time_maxerror = NTP_PHASE_LIMIT;
  360. time_esterror = NTP_PHASE_LIMIT;
  361. delta_xsec = mulhdu( (tb_last_stamp-naca->tb_orig_stamp), naca->tb_to_xs );
  362. new_xsec = (new_usec * XSEC_PER_SEC) / USEC_PER_SEC;
  363. new_xsec += new_sec * XSEC_PER_SEC;
  364. if ( new_xsec > delta_xsec ) {
  365. naca->stamp_xsec = new_xsec - delta_xsec;
  366. }
  367. else {
  368. /* This is only for the case where the user is setting the time
  369.  * way back to a time such that the boot time would have been
  370.  * before 1970 ... eg. we booted ten days ago, and we are
  371.  * setting the time to Jan 5, 1970 */
  372. naca->stamp_xsec = new_xsec;
  373. naca->tb_orig_stamp = tb_last_stamp;
  374. }
  375. naca->tz_minuteswest = sys_tz.tz_minuteswest;
  376. naca->tz_dsttime = sys_tz.tz_dsttime;
  377. write_unlock_irqrestore(&xtime_lock, flags);
  378. }
  379. /*
  380.  * This function is a copy of the architecture independent function
  381.  * but which calls do_settimeofday rather than setting the xtime
  382.  * fields itself.  This way, the fields which are used for 
  383.  * do_settimeofday get updated too.
  384.  */
  385. long ppc64_sys32_stime(int* tptr)
  386. {
  387. int value;
  388. struct timeval myTimeval;
  389. if (!capable(CAP_SYS_TIME))
  390. return -EPERM;
  391. if (get_user(value, tptr))
  392. return -EFAULT;
  393. myTimeval.tv_sec = value;
  394. myTimeval.tv_usec = 0;
  395. do_settimeofday(&myTimeval);
  396. return 0;
  397. }
  398. /*
  399.  * This function is a copy of the architecture independent function
  400.  * but which calls do_settimeofday rather than setting the xtime
  401.  * fields itself.  This way, the fields which are used for 
  402.  * do_settimeofday get updated too.
  403.  */
  404. long ppc64_sys_stime(long* tptr)
  405. {
  406. long value;
  407. struct timeval myTimeval;
  408. if (!capable(CAP_SYS_TIME))
  409. return -EPERM;
  410. if (get_user(value, tptr))
  411. return -EFAULT;
  412. myTimeval.tv_sec = value;
  413. myTimeval.tv_usec = 0;
  414. do_settimeofday(&myTimeval);
  415. return 0;
  416. }
  417. void __init time_init(void)
  418. {
  419. /* This function is only called on the boot processor */
  420. unsigned long flags;
  421. struct rtc_time tm;
  422. ppc_md.calibrate_decr();
  423. if ( ! piranha_simulator ) {
  424. ppc_md.get_boot_time(&tm);
  425. }
  426. write_lock_irqsave(&xtime_lock, flags);
  427. xtime.tv_sec = mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  428.       tm.tm_hour, tm.tm_min, tm.tm_sec);
  429. tb_last_stamp = get_tb();
  430. naca->tb_orig_stamp = tb_last_stamp;
  431. naca->tb_update_count = 0;
  432. naca->tb_ticks_per_sec = tb_ticks_per_sec;
  433. naca->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
  434. naca->tb_to_xs = tb_to_xs;
  435. xtime_sync_interval = tb_ticks_per_sec - (tb_ticks_per_sec/8);
  436. next_xtime_sync_tb = tb_last_stamp + xtime_sync_interval;
  437. time_freq = 0;
  438. xtime.tv_usec = 0;
  439. last_rtc_update = xtime.tv_sec;
  440. write_unlock_irqrestore(&xtime_lock, flags);
  441. /* Not exact, but the timer interrupt takes care of this */
  442. set_dec(tb_ticks_per_jiffy);
  443. /* This horrible hack gives setup a hook just before console_init */
  444. setup_before_console_init();
  445. }
  446. /* 
  447.  * After adjtimex is called, adjust the conversion of tb ticks
  448.  * to microseconds to keep do_gettimeofday synchronized 
  449.  * with ntpd.
  450.  *
  451.  * Use the time_adjust, time_freq and time_offset computed by adjtimex to 
  452.  * adjust the frequency.
  453.  */
  454. /* #define DEBUG_PPC_ADJTIMEX 1 */
  455. void ppc_adjtimex(void)
  456. {
  457. unsigned long den, new_tb_ticks_per_sec, tb_ticks, old_xsec, new_tb_to_xs, new_xsec, new_stamp_xsec;
  458. unsigned long tb_ticks_per_sec_delta;
  459. long delta_freq, ltemp;
  460. struct div_result divres; 
  461. unsigned long flags;
  462. long singleshot_ppm = 0;
  463. /* Compute parts per million frequency adjustment to accomplish the time adjustment
  464.    implied by time_offset to be applied over the elapsed time indicated by time_constant.
  465.    Use SHIFT_USEC to get it into the same units as time_freq. */
  466. if ( time_offset < 0 ) {
  467. ltemp = -time_offset;
  468. ltemp <<= SHIFT_USEC - SHIFT_UPDATE;
  469. ltemp >>= SHIFT_KG + time_constant;
  470. ltemp = -ltemp;
  471. }
  472. else {
  473. ltemp = time_offset;
  474. ltemp <<= SHIFT_USEC - SHIFT_UPDATE;
  475. ltemp >>= SHIFT_KG + time_constant;
  476. }
  477. /* If there is a single shot time adjustment in progress */
  478. if ( time_adjust ) {
  479. #ifdef DEBUG_PPC_ADJTIMEX
  480. printk("ppc_adjtimex: ");
  481. if ( adjusting_time == 0 )
  482. printk("starting ");
  483. printk("single shot time_adjust = %ldn", time_adjust);
  484. #endif
  485. adjusting_time = 1;
  486. /* Compute parts per million frequency adjustment to match time_adjust */
  487. singleshot_ppm = tickadj * HZ;
  488. /*
  489.  * The adjustment should be tickadj*HZ to match the code in
  490.  * linux/kernel/timer.c, but experiments show that this is too
  491.  * large. 3/4 of tickadj*HZ seems about right
  492.  */
  493. singleshot_ppm -= singleshot_ppm / 4;
  494. /* Use SHIFT_USEC to get it into the same units as time_freq */
  495. singleshot_ppm <<= SHIFT_USEC;
  496. if ( time_adjust < 0 )
  497. singleshot_ppm = -singleshot_ppm;
  498. }
  499. else {
  500. #ifdef DEBUG_PPC_ADJTIMEX
  501. if ( adjusting_time )
  502. printk("ppc_adjtimex: ending single shot time_adjustn");
  503. #endif
  504. adjusting_time = 0;
  505. }
  506. /* Add up all of the frequency adjustments */
  507. delta_freq = time_freq + ltemp + singleshot_ppm;
  508. /* Compute a new value for tb_ticks_per_sec based on the frequency adjustment */
  509. den = 1000000 * (1 << (SHIFT_USEC - 8));
  510. if ( delta_freq < 0 ) {
  511. tb_ticks_per_sec_delta = ( tb_ticks_per_sec * ( (-delta_freq) >> (SHIFT_USEC - 8))) / den;
  512. new_tb_ticks_per_sec = tb_ticks_per_sec + tb_ticks_per_sec_delta;
  513. }
  514. else {
  515. tb_ticks_per_sec_delta = ( tb_ticks_per_sec * ( delta_freq >> (SHIFT_USEC - 8))) / den;
  516. new_tb_ticks_per_sec = tb_ticks_per_sec - tb_ticks_per_sec_delta;
  517. }
  518. #ifdef DEBUG_PPC_ADJTIMEX
  519. printk("ppc_adjtimex: ltemp = %ld, time_freq = %ld, singleshot_ppm = %ldn", ltemp, time_freq, singleshot_ppm);
  520. printk("ppc_adjtimex: tb_ticks_per_sec - base = %ld  new = %ldn", tb_ticks_per_sec, new_tb_ticks_per_sec);
  521. #endif
  522. /*
  523.  * Compute a new value of tb_to_xs (used to convert tb to microseconds
  524.  * and a new value of stamp_xsec which is the time (in 1/2^20 second
  525.  * units) corresponding to tb_orig_stamp.  This new value of stamp_xsec
  526.  * compensates for the change in frequency (implied by the new
  527.  * tb_to_xs) and so guarantees that the current time remains the same
  528.  *
  529.  */ 
  530. tb_ticks = get_tb() - naca->tb_orig_stamp;
  531. div128_by_32( 1024*1024, 0, new_tb_ticks_per_sec, &divres );
  532. new_tb_to_xs = divres.result_low;
  533. new_xsec = mulhdu( tb_ticks, new_tb_to_xs );
  534. write_lock_irqsave( &xtime_lock, flags );
  535. old_xsec = mulhdu( tb_ticks, naca->tb_to_xs );
  536. new_stamp_xsec = naca->stamp_xsec + old_xsec - new_xsec;
  537. /*
  538.  * tb_update_count is used to allow the problem state gettimeofday code
  539.  * to assure itself that it sees a consistent view of the tb_to_xs and
  540.  * stamp_xsec variables.  It reads the tb_update_count, then reads
  541.  * tb_to_xs and stamp_xsec and then reads tb_update_count again.  If
  542.  * the two values of tb_update_count match and are even then the
  543.  * tb_to_xs and stamp_xsec values are consistent.  If not, then it
  544.  * loops back and reads them again until this criteria is met.
  545.  */
  546. ++(naca->tb_update_count);
  547. wmb();
  548. naca->tb_to_xs = new_tb_to_xs;
  549. naca->stamp_xsec = new_stamp_xsec;
  550. wmb();
  551. ++(naca->tb_update_count);
  552. write_unlock_irqrestore( &xtime_lock, flags );
  553. }
  554. #define TICK_SIZE tick
  555. #define FEBRUARY 2
  556. #define STARTOFTIME 1970
  557. #define SECDAY 86400L
  558. #define SECYR (SECDAY * 365)
  559. #define leapyear(year) ((year) % 4 == 0)
  560. #define days_in_year(a)  (leapyear(a) ? 366 : 365)
  561. #define days_in_month(a)  (month_days[(a) - 1])
  562. static int month_days[12] = {
  563. 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  564. };
  565. /*
  566.  * This only works for the Gregorian calendar - i.e. after 1752 (in the UK)
  567.  */
  568. void GregorianDay(struct rtc_time * tm)
  569. {
  570. int leapsToDate;
  571. int lastYear;
  572. int day;
  573. int MonthOffset[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
  574. lastYear=tm->tm_year-1;
  575. /*
  576.  * Number of leap corrections to apply up to end of last year
  577.  */
  578. leapsToDate = lastYear/4 - lastYear/100 + lastYear/400;
  579. /*
  580.  * This year is a leap year if it is divisible by 4 except when it is
  581.  * divisible by 100 unless it is divisible by 400
  582.  *
  583.  * e.g. 1904 was a leap year, 1900 was not, 1996 is, and 2000 will be
  584.  */
  585. if((tm->tm_year%4==0) &&
  586.    ((tm->tm_year%100!=0) || (tm->tm_year%400==0)) &&
  587.    (tm->tm_mon>2))
  588. {
  589. /*
  590.  * We are past Feb. 29 in a leap year
  591.  */
  592. day=1;
  593. }
  594. else
  595. {
  596. day=0;
  597. }
  598. day += lastYear*365 + leapsToDate + MonthOffset[tm->tm_mon-1] +
  599.    tm->tm_mday;
  600. tm->tm_wday=day%7;
  601. }
  602. void to_tm(int tim, struct rtc_time * tm)
  603. {
  604. register int    i;
  605. register long   hms, day;
  606. day = tim / SECDAY;
  607. hms = tim % SECDAY;
  608. /* Hours, minutes, seconds are easy */
  609. tm->tm_hour = hms / 3600;
  610. tm->tm_min = (hms % 3600) / 60;
  611. tm->tm_sec = (hms % 3600) % 60;
  612. /* Number of years in days */
  613. for (i = STARTOFTIME; day >= days_in_year(i); i++)
  614. day -= days_in_year(i);
  615. tm->tm_year = i;
  616. /* Number of months in days left */
  617. if (leapyear(tm->tm_year))
  618. days_in_month(FEBRUARY) = 29;
  619. for (i = 1; day >= days_in_month(i); i++)
  620. day -= days_in_month(i);
  621. days_in_month(FEBRUARY) = 28;
  622. tm->tm_mon = i;
  623. /* Days are what is left over (+1) from all that. */
  624. tm->tm_mday = day + 1;
  625. /*
  626.  * Determine the day of week
  627.  */
  628. GregorianDay(tm);
  629. }
  630. #if 0
  631. /* Auxiliary function to compute scaling factors */
  632. /* Actually the choice of a timebase running at 1/4 the of the bus
  633.  * frequency giving resolution of a few tens of nanoseconds is quite nice.
  634.  * It makes this computation very precise (27-28 bits typically) which
  635.  * is optimistic considering the stability of most processor clock
  636.  * oscillators and the precision with which the timebase frequency
  637.  * is measured but does not harm.
  638.  */
  639. unsigned mulhwu_scale_factor(unsigned inscale, unsigned outscale) {
  640.         unsigned mlt=0, tmp, err;
  641.         /* No concern for performance, it's done once: use a stupid
  642.          * but safe and compact method to find the multiplier.
  643.          */
  644.   
  645.         for (tmp = 1U<<31; tmp != 0; tmp >>= 1) {
  646.                 if (mulhwu(inscale, mlt|tmp) < outscale) mlt|=tmp;
  647.         }
  648.   
  649.         /* We might still be off by 1 for the best approximation.
  650.          * A side effect of this is that if outscale is too large
  651.          * the returned value will be zero.
  652.          * Many corner cases have been checked and seem to work,
  653.          * some might have been forgotten in the test however.
  654.          */
  655.   
  656.         err = inscale*(mlt+1);
  657.         if (err <= inscale/2) mlt++;
  658.         return mlt;
  659.   }
  660. #endif
  661. /*
  662.  * Divide a 128-bit dividend by a 32-bit divisor, leaving a 128 bit
  663.  * result.
  664.  */
  665. void div128_by_32( unsigned long dividend_high, unsigned long dividend_low,
  666.    unsigned divisor, struct div_result *dr )
  667. {
  668. unsigned long a,b,c,d, w,x,y,z, ra,rb,rc;
  669. a = dividend_high >> 32;
  670. b = dividend_high & 0xffffffff;
  671. c = dividend_low >> 32;
  672. d = dividend_low & 0xffffffff;
  673. w = a/divisor;
  674. ra = (a - (w * divisor)) << 32;
  675. x = (ra + b)/divisor;
  676. rb = ((ra + b) - (x * divisor)) << 32;
  677. y = (rb + c)/divisor;
  678. rc = ((rb + b) - (y * divisor)) << 32;
  679. z = (rc + d)/divisor;
  680. dr->result_high = (w << 32) + x;
  681. dr->result_low  = (y << 32) + z;
  682. }