at v2.6.14 14 kB view raw
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 * 8 * First round of bugfixes by Gabriel Paubert (paubert@iram.es) 9 * to make clock more stable (2.4.0-test5). The only thing 10 * that this code assumes is that the timebases have been synchronized 11 * by firmware on SMP and are never stopped (never do sleep 12 * on SMP then, nap and doze are OK). 13 * 14 * TODO (not necessarily in this file): 15 * - improve precision and reproducibility of timebase frequency 16 * measurement at boot time. 17 * - get rid of xtime_lock for gettimeofday (generic kernel problem 18 * to be implemented on all architectures for SMP scalability and 19 * eventually implementing gettimeofday without entering the kernel). 20 * - put all time/clock related variables in a single structure 21 * to minimize number of cache lines touched by gettimeofday() 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 * 27 * The following comment is partially obsolete (at least the long wait 28 * is no more a valid reason): 29 * Since the MPC8xx has a programmable interrupt timer, I decided to 30 * use that rather than the decrementer. Two reasons: 1.) the clock 31 * frequency is low, causing 2.) a long wait in the timer interrupt 32 * while ((d = get_dec()) == dval) 33 * loop. The MPC8xx can be driven from a variety of input clocks, 34 * so a number of assumptions have been made here because the kernel 35 * parameter HZ is a constant. We assume (correctly, today :-) that 36 * the MPC8xx on the MBX board is driven from a 32.768 kHz crystal. 37 * This is then divided by 4, providing a 8192 Hz clock into the PIT. 38 * Since it is not possible to get a nice 100 Hz clock out of this, without 39 * creating a software PLL, I have set HZ to 128. -- Dan 40 * 41 * 1997-09-10 Updated NTP code according to technical memorandum Jan '96 42 * "A Kernel Model for Precision Timekeeping" by Dave Mills 43 */ 44 45#include <linux/config.h> 46#include <linux/errno.h> 47#include <linux/sched.h> 48#include <linux/kernel.h> 49#include <linux/param.h> 50#include <linux/string.h> 51#include <linux/mm.h> 52#include <linux/module.h> 53#include <linux/interrupt.h> 54#include <linux/timex.h> 55#include <linux/kernel_stat.h> 56#include <linux/mc146818rtc.h> 57#include <linux/time.h> 58#include <linux/init.h> 59#include <linux/profile.h> 60 61#include <asm/io.h> 62#include <asm/nvram.h> 63#include <asm/cache.h> 64#include <asm/8xx_immap.h> 65#include <asm/machdep.h> 66 67#include <asm/time.h> 68 69/* XXX false sharing with below? */ 70u64 jiffies_64 = INITIAL_JIFFIES; 71 72EXPORT_SYMBOL(jiffies_64); 73 74unsigned long disarm_decr[NR_CPUS]; 75 76extern struct timezone sys_tz; 77 78/* keep track of when we need to update the rtc */ 79time_t last_rtc_update; 80 81/* The decrementer counts down by 128 every 128ns on a 601. */ 82#define DECREMENTER_COUNT_601 (1000000000 / HZ) 83 84unsigned tb_ticks_per_jiffy; 85unsigned tb_to_us; 86unsigned tb_last_stamp; 87unsigned long tb_to_ns_scale; 88 89extern unsigned long wall_jiffies; 90 91/* used for timezone offset */ 92static long timezone_offset; 93 94DEFINE_SPINLOCK(rtc_lock); 95 96EXPORT_SYMBOL(rtc_lock); 97 98/* Timer interrupt helper function */ 99static inline int tb_delta(unsigned *jiffy_stamp) { 100 int delta; 101 if (__USE_RTC()) { 102 delta = get_rtcl(); 103 if (delta < *jiffy_stamp) *jiffy_stamp -= 1000000000; 104 delta -= *jiffy_stamp; 105 } else { 106 delta = get_tbl() - *jiffy_stamp; 107 } 108 return delta; 109} 110 111#ifdef CONFIG_SMP 112unsigned long profile_pc(struct pt_regs *regs) 113{ 114 unsigned long pc = instruction_pointer(regs); 115 116 if (in_lock_functions(pc)) 117 return regs->link; 118 119 return pc; 120} 121EXPORT_SYMBOL(profile_pc); 122#endif 123 124/* 125 * timer_interrupt - gets called when the decrementer overflows, 126 * with interrupts disabled. 127 * We set it up to overflow again in 1/HZ seconds. 128 */ 129void timer_interrupt(struct pt_regs * regs) 130{ 131 int next_dec; 132 unsigned long cpu = smp_processor_id(); 133 unsigned jiffy_stamp = last_jiffy_stamp(cpu); 134 extern void do_IRQ(struct pt_regs *); 135 136 if (atomic_read(&ppc_n_lost_interrupts) != 0) 137 do_IRQ(regs); 138 139 irq_enter(); 140 141 while ((next_dec = tb_ticks_per_jiffy - tb_delta(&jiffy_stamp)) <= 0) { 142 jiffy_stamp += tb_ticks_per_jiffy; 143 144 profile_tick(CPU_PROFILING, regs); 145 update_process_times(user_mode(regs)); 146 147 if (smp_processor_id()) 148 continue; 149 150 /* We are in an interrupt, no need to save/restore flags */ 151 write_seqlock(&xtime_lock); 152 tb_last_stamp = jiffy_stamp; 153 do_timer(regs); 154 155 /* 156 * update the rtc when needed, this should be performed on the 157 * right fraction of a second. Half or full second ? 158 * Full second works on mk48t59 clocks, others need testing. 159 * Note that this update is basically only used through 160 * the adjtimex system calls. Setting the HW clock in 161 * any other way is a /dev/rtc and userland business. 162 * This is still wrong by -0.5/+1.5 jiffies because of the 163 * timer interrupt resolution and possible delay, but here we 164 * hit a quantization limit which can only be solved by higher 165 * resolution timers and decoupling time management from timer 166 * interrupts. This is also wrong on the clocks 167 * which require being written at the half second boundary. 168 * We should have an rtc call that only sets the minutes and 169 * seconds like on Intel to avoid problems with non UTC clocks. 170 */ 171 if ( ppc_md.set_rtc_time && ntp_synced() && 172 xtime.tv_sec - last_rtc_update >= 659 && 173 abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ && 174 jiffies - wall_jiffies == 1) { 175 if (ppc_md.set_rtc_time(xtime.tv_sec+1 + timezone_offset) == 0) 176 last_rtc_update = xtime.tv_sec+1; 177 else 178 /* Try again one minute later */ 179 last_rtc_update += 60; 180 } 181 write_sequnlock(&xtime_lock); 182 } 183 if ( !disarm_decr[smp_processor_id()] ) 184 set_dec(next_dec); 185 last_jiffy_stamp(cpu) = jiffy_stamp; 186 187 if (ppc_md.heartbeat && !ppc_md.heartbeat_count--) 188 ppc_md.heartbeat(); 189 190 irq_exit(); 191} 192 193/* 194 * This version of gettimeofday has microsecond resolution. 195 */ 196void do_gettimeofday(struct timeval *tv) 197{ 198 unsigned long flags; 199 unsigned long seq; 200 unsigned delta, lost_ticks, usec, sec; 201 202 do { 203 seq = read_seqbegin_irqsave(&xtime_lock, flags); 204 sec = xtime.tv_sec; 205 usec = (xtime.tv_nsec / 1000); 206 delta = tb_ticks_since(tb_last_stamp); 207#ifdef CONFIG_SMP 208 /* As long as timebases are not in sync, gettimeofday can only 209 * have jiffy resolution on SMP. 210 */ 211 if (!smp_tb_synchronized) 212 delta = 0; 213#endif /* CONFIG_SMP */ 214 lost_ticks = jiffies - wall_jiffies; 215 } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); 216 217 usec += mulhwu(tb_to_us, tb_ticks_per_jiffy * lost_ticks + delta); 218 while (usec >= 1000000) { 219 sec++; 220 usec -= 1000000; 221 } 222 tv->tv_sec = sec; 223 tv->tv_usec = usec; 224} 225 226EXPORT_SYMBOL(do_gettimeofday); 227 228int do_settimeofday(struct timespec *tv) 229{ 230 time_t wtm_sec, new_sec = tv->tv_sec; 231 long wtm_nsec, new_nsec = tv->tv_nsec; 232 unsigned long flags; 233 int tb_delta; 234 235 if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) 236 return -EINVAL; 237 238 write_seqlock_irqsave(&xtime_lock, flags); 239 /* Updating the RTC is not the job of this code. If the time is 240 * stepped under NTP, the RTC will be update after STA_UNSYNC 241 * is cleared. Tool like clock/hwclock either copy the RTC 242 * to the system time, in which case there is no point in writing 243 * to the RTC again, or write to the RTC but then they don't call 244 * settimeofday to perform this operation. Note also that 245 * we don't touch the decrementer since: 246 * a) it would lose timer interrupt synchronization on SMP 247 * (if it is working one day) 248 * b) it could make one jiffy spuriously shorter or longer 249 * which would introduce another source of uncertainty potentially 250 * harmful to relatively short timers. 251 */ 252 253 /* This works perfectly on SMP only if the tb are in sync but 254 * guarantees an error < 1 jiffy even if they are off by eons, 255 * still reasonable when gettimeofday resolution is 1 jiffy. 256 */ 257 tb_delta = tb_ticks_since(last_jiffy_stamp(smp_processor_id())); 258 tb_delta += (jiffies - wall_jiffies) * tb_ticks_per_jiffy; 259 260 new_nsec -= 1000 * mulhwu(tb_to_us, tb_delta); 261 262 wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - new_sec); 263 wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - new_nsec); 264 265 set_normalized_timespec(&xtime, new_sec, new_nsec); 266 set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); 267 268 /* In case of a large backwards jump in time with NTP, we want the 269 * clock to be updated as soon as the PLL is again in lock. 270 */ 271 last_rtc_update = new_sec - 658; 272 273 ntp_clear(); 274 write_sequnlock_irqrestore(&xtime_lock, flags); 275 clock_was_set(); 276 return 0; 277} 278 279EXPORT_SYMBOL(do_settimeofday); 280 281/* This function is only called on the boot processor */ 282void __init time_init(void) 283{ 284 time_t sec, old_sec; 285 unsigned old_stamp, stamp, elapsed; 286 287 if (ppc_md.time_init != NULL) 288 timezone_offset = ppc_md.time_init(); 289 290 if (__USE_RTC()) { 291 /* 601 processor: dec counts down by 128 every 128ns */ 292 tb_ticks_per_jiffy = DECREMENTER_COUNT_601; 293 /* mulhwu_scale_factor(1000000000, 1000000) is 0x418937 */ 294 tb_to_us = 0x418937; 295 } else { 296 ppc_md.calibrate_decr(); 297 tb_to_ns_scale = mulhwu(tb_to_us, 1000 << 10); 298 } 299 300 /* Now that the decrementer is calibrated, it can be used in case the 301 * clock is stuck, but the fact that we have to handle the 601 302 * makes things more complex. Repeatedly read the RTC until the 303 * next second boundary to try to achieve some precision. If there 304 * is no RTC, we still need to set tb_last_stamp and 305 * last_jiffy_stamp(cpu 0) to the current stamp. 306 */ 307 stamp = get_native_tbl(); 308 if (ppc_md.get_rtc_time) { 309 sec = ppc_md.get_rtc_time(); 310 elapsed = 0; 311 do { 312 old_stamp = stamp; 313 old_sec = sec; 314 stamp = get_native_tbl(); 315 if (__USE_RTC() && stamp < old_stamp) 316 old_stamp -= 1000000000; 317 elapsed += stamp - old_stamp; 318 sec = ppc_md.get_rtc_time(); 319 } while ( sec == old_sec && elapsed < 2*HZ*tb_ticks_per_jiffy); 320 if (sec==old_sec) 321 printk("Warning: real time clock seems stuck!\n"); 322 xtime.tv_sec = sec; 323 xtime.tv_nsec = 0; 324 /* No update now, we just read the time from the RTC ! */ 325 last_rtc_update = xtime.tv_sec; 326 } 327 last_jiffy_stamp(0) = tb_last_stamp = stamp; 328 329 /* Not exact, but the timer interrupt takes care of this */ 330 set_dec(tb_ticks_per_jiffy); 331 332 /* If platform provided a timezone (pmac), we correct the time */ 333 if (timezone_offset) { 334 sys_tz.tz_minuteswest = -timezone_offset / 60; 335 sys_tz.tz_dsttime = 0; 336 xtime.tv_sec -= timezone_offset; 337 } 338 set_normalized_timespec(&wall_to_monotonic, 339 -xtime.tv_sec, -xtime.tv_nsec); 340} 341 342#define FEBRUARY 2 343#define STARTOFTIME 1970 344#define SECDAY 86400L 345#define SECYR (SECDAY * 365) 346 347/* 348 * Note: this is wrong for 2100, but our signed 32-bit time_t will 349 * have overflowed long before that, so who cares. -- paulus 350 */ 351#define leapyear(year) ((year) % 4 == 0) 352#define days_in_year(a) (leapyear(a) ? 366 : 365) 353#define days_in_month(a) (month_days[(a) - 1]) 354 355static int month_days[12] = { 356 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 357}; 358 359void to_tm(int tim, struct rtc_time * tm) 360{ 361 register int i; 362 register long hms, day, gday; 363 364 gday = day = tim / SECDAY; 365 hms = tim % SECDAY; 366 367 /* Hours, minutes, seconds are easy */ 368 tm->tm_hour = hms / 3600; 369 tm->tm_min = (hms % 3600) / 60; 370 tm->tm_sec = (hms % 3600) % 60; 371 372 /* Number of years in days */ 373 for (i = STARTOFTIME; day >= days_in_year(i); i++) 374 day -= days_in_year(i); 375 tm->tm_year = i; 376 377 /* Number of months in days left */ 378 if (leapyear(tm->tm_year)) 379 days_in_month(FEBRUARY) = 29; 380 for (i = 1; day >= days_in_month(i); i++) 381 day -= days_in_month(i); 382 days_in_month(FEBRUARY) = 28; 383 tm->tm_mon = i; 384 385 /* Days are what is left over (+1) from all that. */ 386 tm->tm_mday = day + 1; 387 388 /* 389 * Determine the day of week. Jan. 1, 1970 was a Thursday. 390 */ 391 tm->tm_wday = (gday + 4) % 7; 392} 393 394/* Auxiliary function to compute scaling factors */ 395/* Actually the choice of a timebase running at 1/4 the of the bus 396 * frequency giving resolution of a few tens of nanoseconds is quite nice. 397 * It makes this computation very precise (27-28 bits typically) which 398 * is optimistic considering the stability of most processor clock 399 * oscillators and the precision with which the timebase frequency 400 * is measured but does not harm. 401 */ 402unsigned mulhwu_scale_factor(unsigned inscale, unsigned outscale) { 403 unsigned mlt=0, tmp, err; 404 /* No concern for performance, it's done once: use a stupid 405 * but safe and compact method to find the multiplier. 406 */ 407 for (tmp = 1U<<31; tmp != 0; tmp >>= 1) { 408 if (mulhwu(inscale, mlt|tmp) < outscale) mlt|=tmp; 409 } 410 /* We might still be off by 1 for the best approximation. 411 * A side effect of this is that if outscale is too large 412 * the returned value will be zero. 413 * Many corner cases have been checked and seem to work, 414 * some might have been forgotten in the test however. 415 */ 416 err = inscale*(mlt+1); 417 if (err <= inscale/2) mlt++; 418 return mlt; 419} 420 421unsigned long long sched_clock(void) 422{ 423 unsigned long lo, hi, hi2; 424 unsigned long long tb; 425 426 if (!__USE_RTC()) { 427 do { 428 hi = get_tbu(); 429 lo = get_tbl(); 430 hi2 = get_tbu(); 431 } while (hi2 != hi); 432 tb = ((unsigned long long) hi << 32) | lo; 433 tb = (tb * tb_to_ns_scale) >> 10; 434 } else { 435 do { 436 hi = get_rtcu(); 437 lo = get_rtcl(); 438 hi2 = get_rtcu(); 439 } while (hi2 != hi); 440 tb = ((unsigned long long) hi) * 1000000000 + lo; 441 } 442 return tb; 443}