home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / timer.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  1.7 KB  |  67 lines

  1. #ifndef _ASM_X86_TIMER_H
  2. #define _ASM_X86_TIMER_H
  3. #include <linux/init.h>
  4. #include <linux/pm.h>
  5. #include <linux/percpu.h>
  6.  
  7. #define TICK_SIZE (tick_nsec / 1000)
  8.  
  9. unsigned long long native_sched_clock(void);
  10. unsigned long native_calibrate_tsc(void);
  11.  
  12. #ifdef CONFIG_X86_32
  13. extern int timer_ack;
  14. extern int recalibrate_cpu_khz(void);
  15. #endif /* CONFIG_X86_32 */
  16.  
  17. extern int no_timer_check;
  18.  
  19. #ifndef CONFIG_PARAVIRT
  20. #define calibrate_tsc() native_calibrate_tsc()
  21. #endif
  22.  
  23. /* Accelerators for sched_clock()
  24.  * convert from cycles(64bits) => nanoseconds (64bits)
  25.  *  basic equation:
  26.  *        ns = cycles / (freq / ns_per_sec)
  27.  *        ns = cycles * (ns_per_sec / freq)
  28.  *        ns = cycles * (10^9 / (cpu_khz * 10^3))
  29.  *        ns = cycles * (10^6 / cpu_khz)
  30.  *
  31.  *    Then we use scaling math (suggested by george@mvista.com) to get:
  32.  *        ns = cycles * (10^6 * SC / cpu_khz) / SC
  33.  *        ns = cycles * cyc2ns_scale / SC
  34.  *
  35.  *    And since SC is a constant power of two, we can convert the div
  36.  *  into a shift.
  37.  *
  38.  *  We can use khz divisor instead of mhz to keep a better precision, since
  39.  *  cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits.
  40.  *  (mathieu.desnoyers@polymtl.ca)
  41.  *
  42.  *            -johnstul@us.ibm.com "math is hard, lets go shopping!"
  43.  */
  44.  
  45. DECLARE_PER_CPU(unsigned long, cyc2ns);
  46.  
  47. #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
  48.  
  49. static inline unsigned long long __cycles_2_ns(unsigned long long cyc)
  50. {
  51.     return cyc * per_cpu(cyc2ns, smp_processor_id()) >> CYC2NS_SCALE_FACTOR;
  52. }
  53.  
  54. static inline unsigned long long cycles_2_ns(unsigned long long cyc)
  55. {
  56.     unsigned long long ns;
  57.     unsigned long flags;
  58.  
  59.     local_irq_save(flags);
  60.     ns = __cycles_2_ns(cyc);
  61.     local_irq_restore(flags);
  62.  
  63.     return ns;
  64. }
  65.  
  66. #endif /* _ASM_X86_TIMER_H */
  67.