old-time.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:15k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 1991, 1992, 1995  Linus Torvalds
  3.  * Copyright (C) 1996 - 2000  Ralf Baechle
  4.  * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips
  5.  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
  6.  *
  7.  * Don't use.  Deprecated.  Dead meat.
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/errno.h>
  11. #include <linux/init.h>
  12. #include <linux/sched.h>
  13. #include <linux/kernel.h>
  14. #include <linux/param.h>
  15. #include <linux/string.h>
  16. #include <linux/mm.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/kernel_stat.h>
  19. #include <asm/bootinfo.h>
  20. #include <asm/cpu.h>
  21. #include <asm/mipsregs.h>
  22. #include <asm/io.h>
  23. #include <asm/irq.h>
  24. #include <asm/ddb5074.h>
  25. #include <linux/mc146818rtc.h>
  26. #include <linux/timex.h>
  27. extern volatile unsigned long wall_jiffies;
  28. unsigned long r4k_interval;
  29. extern rwlock_t xtime_lock;
  30. /*
  31.  * Change this if you have some constant time drift
  32.  */
  33. /* This is the value for the PC-style PICs. */
  34. /* #define USECS_PER_JIFFY (1000020/HZ) */
  35. /* This is for machines which generate the exact clock. */
  36. #define USECS_PER_JIFFY (1000000/HZ)
  37. /* Cycle counter value at the previous timer interrupt.. */
  38. static unsigned int timerhi, timerlo;
  39. /*
  40.  * On MIPS only R4000 and better have a cycle counter.
  41.  *
  42.  * FIXME: Does playing with the RP bit in c0_status interfere with this code?
  43.  */
  44. static unsigned long do_fast_gettimeoffset(void)
  45. {
  46. u32 count;
  47. unsigned long res, tmp;
  48. /* Last jiffy when do_fast_gettimeoffset() was called. */
  49. static unsigned long last_jiffies;
  50. unsigned long quotient;
  51. /*
  52.  * Cached "1/(clocks per usec)*2^32" value.
  53.  * It has to be recalculated once each jiffy.
  54.  */
  55. static unsigned long cached_quotient;
  56. tmp = jiffies;
  57. quotient = cached_quotient;
  58. if (tmp && last_jiffies != tmp) {
  59. last_jiffies = tmp;
  60. __asm__(".settnoreordernt"
  61. ".settnoatnt"
  62. ".settmips3nt"
  63. "lwut%0,%2nt"
  64. "dsll32t$1,%1,0nt"
  65. "ort$1,$1,%0nt"
  66. "ddivut$0,$1,%3nt"
  67. "mflot$1nt"
  68. "dsll32t%0,%4,0nt"
  69. "nopnt"
  70. "ddivut$0,%0,$1nt"
  71. "mflot%0nt"
  72. ".settmips0nt"
  73. ".settatnt"
  74. ".settreorder"
  75. :"=&r" (quotient)
  76. :"r" (timerhi),
  77.  "m" (timerlo),
  78.  "r" (tmp),
  79.  "r" (USECS_PER_JIFFY)
  80. :"$1");
  81. cached_quotient = quotient;
  82. }
  83. /* Get last timer tick in absolute kernel time */
  84. count = read_32bit_cp0_register(CP0_COUNT);
  85. /* .. relative to previous jiffy (32 bits is enough) */
  86. count -= timerlo;
  87. __asm__("multut%1,%2nt"
  88. "mfhit%0"
  89. :"=r" (res)
  90. :"r" (count),
  91.  "r" (quotient));
  92. /*
  93.    * Due to possible jiffies inconsistencies, we need to check 
  94.  * the result so that we'll get a timer that is monotonic.
  95.  */
  96. if (res >= USECS_PER_JIFFY)
  97. res = USECS_PER_JIFFY-1;
  98. return res;
  99. }
  100. /* This function must be called with interrupts disabled 
  101.  * It was inspired by Steve McCanne's microtime-i386 for BSD.  -- jrs
  102.  * 
  103.  * However, the pc-audio speaker driver changes the divisor so that
  104.  * it gets interrupted rather more often - it loads 64 into the
  105.  * counter rather than 11932! This has an adverse impact on
  106.  * do_gettimeoffset() -- it stops working! What is also not
  107.  * good is that the interval that our timer function gets called
  108.  * is no longer 10.0002 ms, but 9.9767 ms. To get around this
  109.  * would require using a different timing source. Maybe someone
  110.  * could use the RTC - I know that this can interrupt at frequencies
  111.  * ranging from 8192Hz to 2Hz. If I had the energy, I'd somehow fix
  112.  * it so that at startup, the timer code in sched.c would select
  113.  * using either the RTC or the 8253 timer. The decision would be
  114.  * based on whether there was any other device around that needed
  115.  * to trample on the 8253. I'd set up the RTC to interrupt at 1024 Hz,
  116.  * and then do some jiggery to have a version of do_timer that 
  117.  * advanced the clock by 1/1024 s. Every time that reached over 1/100
  118.  * of a second, then do all the old code. If the time was kept correct
  119.  * then do_gettimeoffset could just return 0 - there is no low order
  120.  * divider that can be accessed.
  121.  *
  122.  * Ideally, you would be able to use the RTC for the speaker driver,
  123.  * but it appears that the speaker driver really needs interrupt more
  124.  * often than every 120 us or so.
  125.  *
  126.  * Anyway, this needs more thought.... pjsg (1993-08-28)
  127.  * 
  128.  * If you are really that interested, you should be reading
  129.  * comp.protocols.time.ntp!
  130.  */
  131. #define TICK_SIZE tick
  132. static unsigned long do_slow_gettimeoffset(void)
  133. {
  134. int count;
  135. static int count_p = LATCH;    /* for the first call after boot */
  136. static unsigned long jiffies_p;
  137. /*
  138.  * cache volatile jiffies temporarily; we have IRQs turned off. 
  139.  */
  140. unsigned long jiffies_t;
  141. /* timer count may underflow right here */
  142. outb_p(0x00, 0x43); /* latch the count ASAP */
  143. count = inb_p(0x40); /* read the latched count */
  144. /*
  145.  * We do this guaranteed double memory access instead of a _p 
  146.  * postfix in the previous port access. Wheee, hackady hack
  147.  */
  148. jiffies_t = jiffies;
  149. count |= inb_p(0x40) << 8;
  150. /*
  151.  * avoiding timer inconsistencies (they are rare, but they happen)...
  152.  * there are two kinds of problems that must be avoided here:
  153.  *  1. the timer counter underflows
  154.  *  2. hardware problem with the timer, not giving us continuous time,
  155.  *     the counter does small "jumps" upwards on some Pentium systems,
  156.  *     (see c't 95/10 page 335 for Neptun bug.)
  157.  */
  158. if( jiffies_t == jiffies_p ) {
  159. if( count > count_p ) {
  160. /* the nutcase */
  161. outb_p(0x0A, 0x20);
  162. /* assumption about timer being IRQ1 */
  163. if (inb(0x20) & 0x01) {
  164. /*
  165.  * We cannot detect lost timer interrupts ... 
  166.  * well, that's why we call them lost, don't we? :)
  167.  * [hmm, on the Pentium and Alpha we can ... sort of]
  168.  */
  169. count -= LATCH;
  170. } else {
  171. printk("do_slow_gettimeoffset(): hardware timer problem?n");
  172. }
  173. }
  174. } else
  175. jiffies_p = jiffies_t;
  176. count_p = count;
  177. count = ((LATCH-1) - count) * TICK_SIZE;
  178. count = (count + LATCH/2) / LATCH;
  179. return count;
  180. }
  181. static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset;
  182. /*
  183.  * This version of gettimeofday has near microsecond resolution.
  184.  */
  185. void do_gettimeofday(struct timeval *tv)
  186. {
  187. unsigned long flags;
  188. read_lock_irqsave (&xtime_lock, flags);
  189. *tv = xtime;
  190. tv->tv_usec += do_gettimeoffset();
  191. /*
  192.  * xtime is atomically updated in timer_bh. jiffies - wall_jiffies
  193.  * is nonzero if the timer bottom half hasnt executed yet.
  194.  */
  195. if (jiffies - wall_jiffies)
  196. tv->tv_usec += USECS_PER_JIFFY;
  197. read_unlock_irqrestore (&xtime_lock, flags);
  198. if (tv->tv_usec >= 1000000) {
  199. tv->tv_usec -= 1000000;
  200. tv->tv_sec++;
  201. }
  202. }
  203. void do_settimeofday(struct timeval *tv)
  204. {
  205. write_lock_irq (&xtime_lock);
  206. /* This is revolting. We need to set the xtime.tv_usec
  207.  * correctly. However, the value in this location is
  208.  * is value at the last tick.
  209.  * Discover what correction gettimeofday
  210.  * would have done, and then undo it!
  211.  */
  212. tv->tv_usec -= do_gettimeoffset();
  213. if (tv->tv_usec < 0) {
  214. tv->tv_usec += 1000000;
  215. tv->tv_sec--;
  216. }
  217. xtime = *tv;
  218. time_adjust = 0; /* stop active adjtime() */
  219. time_status |= STA_UNSYNC;
  220. time_maxerror = NTP_PHASE_LIMIT;
  221. time_esterror = NTP_PHASE_LIMIT;
  222. write_unlock_irq (&xtime_lock);
  223. }
  224. /*
  225.  * In order to set the CMOS clock precisely, set_rtc_mmss has to be
  226.  * called 500 ms after the second nowtime has started, because when
  227.  * nowtime is written into the registers of the CMOS clock, it will
  228.  * jump to the next second precisely 500 ms later. Check the Motorola
  229.  * MC146818A or Dallas DS12887 data sheet for details.
  230.  *
  231.  * BUG: This routine does not handle hour overflow properly; it just
  232.  *      sets the minutes. Usually you won't notice until after reboot!
  233.  */
  234. static int set_rtc_mmss(unsigned long nowtime)
  235. {
  236. int retval = 0;
  237. int real_seconds, real_minutes, cmos_minutes;
  238. unsigned char save_control, save_freq_select;
  239. save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
  240. CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
  241. save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
  242. CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
  243. cmos_minutes = CMOS_READ(RTC_MINUTES);
  244. if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
  245. BCD_TO_BIN(cmos_minutes);
  246. /*
  247.  * since we're only adjusting minutes and seconds,
  248.  * don't interfere with hour overflow. This avoids
  249.  * messing with unknown time zones but requires your
  250.  * RTC not to be off by more than 15 minutes
  251.  */
  252. real_seconds = nowtime % 60;
  253. real_minutes = nowtime / 60;
  254. if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
  255. real_minutes += 30; /* correct for half hour time zone */
  256. real_minutes %= 60;
  257. if (abs(real_minutes - cmos_minutes) < 30) {
  258. if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
  259. BIN_TO_BCD(real_seconds);
  260. BIN_TO_BCD(real_minutes);
  261. }
  262. CMOS_WRITE(real_seconds,RTC_SECONDS);
  263. CMOS_WRITE(real_minutes,RTC_MINUTES);
  264. } else {
  265. printk(KERN_WARNING
  266.        "set_rtc_mmss: can't update from %d to %dn",
  267.        cmos_minutes, real_minutes);
  268.   retval = -1;
  269. }
  270. /* The following flags have to be released exactly in this order,
  271.  * otherwise the DS12887 (popular MC146818A clone with integrated
  272.  * battery and quartz) will not reset the oscillator and will not
  273.  * update precisely 500 ms later. You won't find this mentioned in
  274.  * the Dallas Semiconductor data sheets, but who believes data
  275.  * sheets anyway ...                           -- Markus Kuhn
  276.  */
  277. CMOS_WRITE(save_control, RTC_CONTROL);
  278. CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
  279. return retval;
  280. }
  281. /* last time the cmos clock got updated */
  282. static long last_rtc_update;
  283. /*
  284.  * timer_interrupt() needs to keep up the real-time clock,
  285.  * as well as call the "do_timer()" routine every clocktick
  286.  */
  287. static void inline
  288. timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  289. {
  290. #ifdef CONFIG_DDB5074
  291. static unsigned cnt, period, dist;
  292. if (cnt == 0 || cnt == dist)
  293.     ddb5074_led_d2(1);
  294. else if (cnt == 7 || cnt == dist+7)
  295.     ddb5074_led_d2(0);
  296. if (++cnt > period) {
  297.     cnt = 0;
  298.     /* The hyperbolic function below modifies the heartbeat period
  299.      * length in dependency of the current (5min) load. It goes
  300.      * through the points f(0)=126, f(1)=86, f(5)=51,
  301.      * f(inf)->30. */
  302.      period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30;
  303.      dist = period / 4;
  304. }
  305. #endif
  306. if(!user_mode(regs)) {
  307. if (prof_buffer && current->pid) {
  308. extern int _stext;
  309. unsigned long pc = regs->cp0_epc;
  310. pc -= (unsigned long) &_stext;
  311. pc >>= prof_shift;
  312. /*
  313.  * Dont ignore out-of-bounds pc values silently,
  314.  * put them into the last histogram slot, so if
  315.  * present, they will show up as a sharp peak.
  316.  */
  317. if (pc > prof_len-1)
  318. pc = prof_len-1;
  319. atomic_inc((atomic_t *)&prof_buffer[pc]);
  320. }
  321. }
  322. do_timer(regs);
  323. /*
  324.  * If we have an externally synchronized Linux clock, then update
  325.  * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
  326.  * called as close as possible to 500 ms before the new second starts.
  327.  */
  328. read_lock (&xtime_lock); 
  329. if ((time_status & STA_UNSYNC) == 0 &&
  330.     xtime.tv_sec > last_rtc_update + 660 &&
  331.     xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
  332.     xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
  333.   if (set_rtc_mmss(xtime.tv_sec) == 0)
  334.     last_rtc_update = xtime.tv_sec;
  335.   else
  336.     last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
  337. }
  338. /* As we return to user mode fire off the other CPU schedulers.. this is 
  339.    basically because we don't yet share IRQ's around. This message is
  340.    rigged to be safe on the 386 - basically it's a hack, so don't look
  341.    closely for now.. */
  342. /*smp_message_pass(MSG_ALL_BUT_SELF, MSG_RESCHEDULE, 0L, 0); */
  343. read_unlock (&xtime_lock); 
  344. }
  345. static inline void 
  346. r4k_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  347. {
  348. unsigned int count;
  349. /*
  350.  * The cycle counter is only 32 bit which is good for about
  351.  * a minute at current count rates of upto 150MHz or so.
  352.  */
  353. count = read_32bit_cp0_register(CP0_COUNT);
  354. timerhi += (count < timerlo); /* Wrap around */
  355. timerlo = count;
  356. #ifdef CONFIG_SGI_IP22
  357. /* Since we don't get anything but r4k timer interrupts, we need to
  358.  * set this up so that we'll get one next time. Fortunately since we
  359.  * have timerhi/timerlo, we don't care so much if we miss one. So
  360.  * we need only ask for the next in r4k_interval counts. On other
  361.  * archs we have a real timer, so we don't want this.
  362.  */
  363. write_32bit_cp0_register (CP0_COMPARE, 
  364.   (unsigned long) (count + r4k_interval));
  365.         kstat.irqs[0][irq]++;
  366. #endif
  367. timer_interrupt(irq, dev_id, regs);
  368. if (!jiffies)
  369. {
  370. /*
  371.  * If jiffies has overflowed in this timer_interrupt we must
  372.  * update the timer[hi]/[lo] to make do_fast_gettimeoffset()
  373.  * quotient calc still valid. -arca
  374.  */
  375. timerhi = timerlo = 0;
  376. }
  377. }
  378. void indy_r4k_timer_interrupt (struct pt_regs *regs)
  379. {
  380. static const int INDY_R4K_TIMER_IRQ = 7;
  381. int cpu = smp_processor_id();
  382. r4k_timer_interrupt (INDY_R4K_TIMER_IRQ, NULL, regs);
  383. if (softirq_pending(cpu))
  384. do_softirq();
  385. }
  386. struct irqaction irq0  = { timer_interrupt, SA_INTERRUPT, 0,
  387.                                   "timer", NULL, NULL};
  388. void (*board_time_init)(struct irqaction *irq);
  389. void __init time_init(void)
  390. {
  391. unsigned int epoch = 0, year, mon, day, hour, min, sec;
  392. int i;
  393. /* The Linux interpretation of the CMOS clock register contents:
  394.  * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
  395.  * RTC registers show the second which has precisely just started.
  396.  * Let's hope other operating systems interpret the RTC the same way.
  397.  */
  398. /* read RTC exactly on falling edge of update flag */
  399. for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */
  400. if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
  401. break;
  402. for (i = 0 ; i < 1000000 ; i++) /* must try at least 2.228 ms */
  403. if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
  404. break;
  405. do { /* Isn't this overkill ? UIP above should guarantee consistency */
  406. sec = CMOS_READ(RTC_SECONDS);
  407. min = CMOS_READ(RTC_MINUTES);
  408. hour = CMOS_READ(RTC_HOURS);
  409. day = CMOS_READ(RTC_DAY_OF_MONTH);
  410. mon = CMOS_READ(RTC_MONTH);
  411. year = CMOS_READ(RTC_YEAR);
  412. } while (sec != CMOS_READ(RTC_SECONDS));
  413. if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
  414.   {
  415.     BCD_TO_BIN(sec);
  416.     BCD_TO_BIN(min);
  417.     BCD_TO_BIN(hour);
  418.     BCD_TO_BIN(day);
  419.     BCD_TO_BIN(mon);
  420.     BCD_TO_BIN(year);
  421.   }
  422. /* Attempt to guess the epoch.  This is the same heuristic as in rtc.c so
  423.    no stupid things will happen to timekeeping.  Who knows, maybe Ultrix
  424.       also uses 1952 as epoch ...  */
  425. if (year > 10 && year < 44) {
  426. epoch = 1980;
  427. } else if (year < 96) {
  428. epoch = 1952;
  429. }
  430. year += epoch;
  431. write_lock_irq (&xtime_lock);
  432. xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
  433. xtime.tv_usec = 0;
  434. write_unlock_irq (&xtime_lock);
  435. if (mips_cpu.options & MIPS_CPU_COUNTER) {
  436. write_32bit_cp0_register(CP0_COUNT, 0);
  437. do_gettimeoffset = do_fast_gettimeoffset;
  438. irq0.handler = r4k_timer_interrupt;
  439. }
  440. board_time_init(&irq0);
  441. }