Subversion Repositories Kolibri OS

Rev

Rev 6934 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #ifndef _LINUX_JIFFIES_H
  2. #define _LINUX_JIFFIES_H
  3.  
  4. #include <linux/math64.h>
  5. #include <linux/kernel.h>
  6. #include <linux/types.h>
  7. #include <linux/time.h>
  8. #include <linux/timex.h>
  9. //#include <asm/param.h>         /* for HZ */
  10.  
  11.  
  12. #define HZ              100
  13.  
  14. /*
  15.  * The following defines establish the engineering parameters of the PLL
  16.  * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
  17.  * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
  18.  * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
  19.  * nearest power of two in order to avoid hardware multiply operations.
  20.  */
  21. #if HZ >= 12 && HZ < 24
  22. # define SHIFT_HZ       4
  23. #elif HZ >= 24 && HZ < 48
  24. # define SHIFT_HZ       5
  25. #elif HZ >= 48 && HZ < 96
  26. # define SHIFT_HZ       6
  27. #elif HZ >= 96 && HZ < 192
  28. # define SHIFT_HZ       7
  29. #elif HZ >= 192 && HZ < 384
  30. # define SHIFT_HZ       8
  31. #elif HZ >= 384 && HZ < 768
  32. # define SHIFT_HZ       9
  33. #elif HZ >= 768 && HZ < 1536
  34. # define SHIFT_HZ       10
  35. #elif HZ >= 1536 && HZ < 3072
  36. # define SHIFT_HZ       11
  37. #elif HZ >= 3072 && HZ < 6144
  38. # define SHIFT_HZ       12
  39. #elif HZ >= 6144 && HZ < 12288
  40. # define SHIFT_HZ       13
  41. #else
  42. # error Invalid value of HZ.
  43. #endif
  44.  
  45. /* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can
  46.  * improve accuracy by shifting LSH bits, hence calculating:
  47.  *     (NOM << LSH) / DEN
  48.  * This however means trouble for large NOM, because (NOM << LSH) may no
  49.  * longer fit in 32 bits. The following way of calculating this gives us
  50.  * some slack, under the following conditions:
  51.  *   - (NOM / DEN) fits in (32 - LSH) bits.
  52.  *   - (NOM % DEN) fits in (32 - LSH) bits.
  53.  */
  54. #define SH_DIV(NOM,DEN,LSH) (   (((NOM) / (DEN)) << (LSH))              \
  55.                              + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
  56.  
  57. /* LATCH is used in the interval timer and ftape setup. */
  58. #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)   /* For divider */
  59.  
  60. extern int register_refined_jiffies(long clock_tick_rate);
  61.  
  62. /* TICK_NSEC is the time between ticks in nsec assuming SHIFTED_HZ */
  63. #define TICK_NSEC ((NSEC_PER_SEC+HZ/2)/HZ)
  64.  
  65. /* TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
  66. #define TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
  67.  
  68. /* some arch's have a small-data section that can be accessed register-relative
  69.  * but that can only take up to, say, 4-byte variables. jiffies being part of
  70.  * an 8-byte variable may not be correctly accessed unless we force the issue
  71.  */
  72. #define __jiffy_data  __attribute__((section(".data")))
  73.  
  74. /*
  75.  * The 64-bit value is not atomic - you MUST NOT read it
  76.  * without sampling the sequence number in jiffies_lock.
  77.  * get_jiffies_64() will do this for you as appropriate.
  78.  */
  79. extern u64 __jiffy_data jiffies_64;
  80. extern unsigned long volatile __jiffy_data jiffies;
  81.  
  82. #if (BITS_PER_LONG < 64)
  83. u64 get_jiffies_64(void);
  84. #else
  85. static inline u64 get_jiffies_64(void)
  86. {
  87.         return (u64)jiffies;
  88. }
  89. #endif
  90.  
  91. /*
  92.  *      These inlines deal with timer wrapping correctly. You are
  93.  *      strongly encouraged to use them
  94.  *      1. Because people otherwise forget
  95.  *      2. Because if the timer wrap changes in future you won't have to
  96.  *         alter your driver code.
  97.  *
  98.  * time_after(a,b) returns true if the time a is after time b.
  99.  *
  100.  * Do this with "<0" and ">=0" to only test the sign of the result. A
  101.  * good compiler would generate better code (and a really good compiler
  102.  * wouldn't care). Gcc is currently neither.
  103.  */
  104. #define time_after(a,b)         \
  105.         (typecheck(unsigned long, a) && \
  106.          typecheck(unsigned long, b) && \
  107.          ((long)((b) - (a)) < 0))
  108. #define time_before(a,b)        time_after(b,a)
  109.  
  110. #define time_after_eq(a,b)      \
  111.         (typecheck(unsigned long, a) && \
  112.          typecheck(unsigned long, b) && \
  113.          ((long)((a) - (b)) >= 0))
  114. #define time_before_eq(a,b)     time_after_eq(b,a)
  115.  
  116. /*
  117.  * Calculate whether a is in the range of [b, c].
  118.  */
  119. #define time_in_range(a,b,c) \
  120.         (time_after_eq(a,b) && \
  121.          time_before_eq(a,c))
  122.  
  123. /*
  124.  * Calculate whether a is in the range of [b, c).
  125.  */
  126. #define time_in_range_open(a,b,c) \
  127.         (time_after_eq(a,b) && \
  128.          time_before(a,c))
  129.  
  130. /* Same as above, but does so with platform independent 64bit types.
  131.  * These must be used when utilizing jiffies_64 (i.e. return value of
  132.  * get_jiffies_64() */
  133. #define time_after64(a,b)       \
  134.         (typecheck(__u64, a) && \
  135.          typecheck(__u64, b) && \
  136.          ((__s64)((b) - (a)) < 0))
  137. #define time_before64(a,b)      time_after64(b,a)
  138.  
  139. #define time_after_eq64(a,b)    \
  140.         (typecheck(__u64, a) && \
  141.          typecheck(__u64, b) && \
  142.          ((__s64)((a) - (b)) >= 0))
  143. #define time_before_eq64(a,b)   time_after_eq64(b,a)
  144.  
  145. #define time_in_range64(a, b, c) \
  146.         (time_after_eq64(a, b) && \
  147.          time_before_eq64(a, c))
  148.  
  149. /*
  150.  * These four macros compare jiffies and 'a' for convenience.
  151.  */
  152.  
  153. /* time_is_before_jiffies(a) return true if a is before jiffies */
  154. #define time_is_before_jiffies(a) time_after(jiffies, a)
  155.  
  156. /* time_is_after_jiffies(a) return true if a is after jiffies */
  157. #define time_is_after_jiffies(a) time_before(jiffies, a)
  158.  
  159. /* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
  160. #define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
  161.  
  162. /* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
  163. #define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
  164.  
  165. /*
  166.  * Have the 32 bit jiffies value wrap 5 minutes after boot
  167.  * so jiffies wrap bugs show up earlier.
  168.  */
  169. #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
  170.  
  171. /*
  172.  * Change timeval to jiffies, trying to avoid the
  173.  * most obvious overflows..
  174.  *
  175.  * And some not so obvious.
  176.  *
  177.  * Note that we don't want to return LONG_MAX, because
  178.  * for various timeout reasons we often end up having
  179.  * to wait "jiffies+1" in order to guarantee that we wait
  180.  * at _least_ "jiffies" - so "jiffies+1" had better still
  181.  * be positive.
  182.  */
  183. #define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
  184.  
  185. extern unsigned long preset_lpj;
  186.  
  187. /*
  188.  * We want to do realistic conversions of time so we need to use the same
  189.  * values the update wall clock code uses as the jiffies size.  This value
  190.  * is: TICK_NSEC (which is defined in timex.h).  This
  191.  * is a constant and is in nanoseconds.  We will use scaled math
  192.  * with a set of scales defined here as SEC_JIFFIE_SC,  USEC_JIFFIE_SC and
  193.  * NSEC_JIFFIE_SC.  Note that these defines contain nothing but
  194.  * constants and so are computed at compile time.  SHIFT_HZ (computed in
  195.  * timex.h) adjusts the scaling for different HZ values.
  196.  
  197.  * Scaled math???  What is that?
  198.  *
  199.  * Scaled math is a way to do integer math on values that would,
  200.  * otherwise, either overflow, underflow, or cause undesired div
  201.  * instructions to appear in the execution path.  In short, we "scale"
  202.  * up the operands so they take more bits (more precision, less
  203.  * underflow), do the desired operation and then "scale" the result back
  204.  * by the same amount.  If we do the scaling by shifting we avoid the
  205.  * costly mpy and the dastardly div instructions.
  206.  
  207.  * Suppose, for example, we want to convert from seconds to jiffies
  208.  * where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE.  The
  209.  * simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
  210.  * observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
  211.  * might calculate at compile time, however, the result will only have
  212.  * about 3-4 bits of precision (less for smaller values of HZ).
  213.  *
  214.  * So, we scale as follows:
  215.  * jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
  216.  * jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
  217.  * Then we make SCALE a power of two so:
  218.  * jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
  219.  * Now we define:
  220.  * #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
  221.  * jiff = (sec * SEC_CONV) >> SCALE;
  222.  *
  223.  * Often the math we use will expand beyond 32-bits so we tell C how to
  224.  * do this and pass the 64-bit result of the mpy through the ">> SCALE"
  225.  * which should take the result back to 32-bits.  We want this expansion
  226.  * to capture as much precision as possible.  At the same time we don't
  227.  * want to overflow so we pick the SCALE to avoid this.  In this file,
  228.  * that means using a different scale for each range of HZ values (as
  229.  * defined in timex.h).
  230.  *
  231.  * For those who want to know, gcc will give a 64-bit result from a "*"
  232.  * operator if the result is a long long AND at least one of the
  233.  * operands is cast to long long (usually just prior to the "*" so as
  234.  * not to confuse it into thinking it really has a 64-bit operand,
  235.  * which, buy the way, it can do, but it takes more code and at least 2
  236.  * mpys).
  237.  
  238.  * We also need to be aware that one second in nanoseconds is only a
  239.  * couple of bits away from overflowing a 32-bit word, so we MUST use
  240.  * 64-bits to get the full range time in nanoseconds.
  241.  
  242.  */
  243.  
  244. /*
  245.  * Here are the scales we will use.  One for seconds, nanoseconds and
  246.  * microseconds.
  247.  *
  248.  * Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
  249.  * check if the sign bit is set.  If not, we bump the shift count by 1.
  250.  * (Gets an extra bit of precision where we can use it.)
  251.  * We know it is set for HZ = 1024 and HZ = 100 not for 1000.
  252.  * Haven't tested others.
  253.  
  254.  * Limits of cpp (for #if expressions) only long (no long long), but
  255.  * then we only need the most signicant bit.
  256.  */
  257.  
  258. #define SEC_JIFFIE_SC (31 - SHIFT_HZ)
  259. #if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
  260. #undef SEC_JIFFIE_SC
  261. #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
  262. #endif
  263. #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
  264. #define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
  265.                                 TICK_NSEC -1) / (u64)TICK_NSEC))
  266.  
  267. #define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
  268.                                         TICK_NSEC -1) / (u64)TICK_NSEC))
  269. /*
  270.  * The maximum jiffie value is (MAX_INT >> 1).  Here we translate that
  271.  * into seconds.  The 64-bit case will overflow if we are not careful,
  272.  * so use the messy SH_DIV macro to do it.  Still all constants.
  273.  */
  274. #if BITS_PER_LONG < 64
  275. # define MAX_SEC_IN_JIFFIES \
  276.         (long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_SEC)
  277. #else   /* take care of overflow on 64 bits machines */
  278. # define MAX_SEC_IN_JIFFIES \
  279.         (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1)
  280.  
  281. #endif
  282.  
  283. /*
  284.  * Convert various time units to each other:
  285.  */
  286. extern unsigned int jiffies_to_msecs(const unsigned long j);
  287. extern unsigned int jiffies_to_usecs(const unsigned long j);
  288.  
  289. static inline u64 jiffies_to_nsecs(const unsigned long j)
  290. {
  291.         return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
  292. }
  293.  
  294. extern unsigned long __msecs_to_jiffies(const unsigned int m);
  295. #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
  296. /*
  297.  * HZ is equal to or smaller than 1000, and 1000 is a nice round
  298.  * multiple of HZ, divide with the factor between them, but round
  299.  * upwards:
  300.  */
  301. static inline unsigned long _msecs_to_jiffies(const unsigned int m)
  302. {
  303.         return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
  304. }
  305. #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
  306. /*
  307.  * HZ is larger than 1000, and HZ is a nice round multiple of 1000 -
  308.  * simply multiply with the factor between them.
  309.  *
  310.  * But first make sure the multiplication result cannot overflow:
  311.  */
  312. static inline unsigned long _msecs_to_jiffies(const unsigned int m)
  313. {
  314.         if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
  315.                 return MAX_JIFFY_OFFSET;
  316.         return m * (HZ / MSEC_PER_SEC);
  317. }
  318. #else
  319. /*
  320.  * Generic case - multiply, round and divide. But first check that if
  321.  * we are doing a net multiplication, that we wouldn't overflow:
  322.  */
  323. static inline unsigned long _msecs_to_jiffies(const unsigned int m)
  324. {
  325.         if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
  326.                 return MAX_JIFFY_OFFSET;
  327.  
  328.         return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) >> MSEC_TO_HZ_SHR32;
  329. }
  330. #endif
  331. /**
  332.  * msecs_to_jiffies: - convert milliseconds to jiffies
  333.  * @m:  time in milliseconds
  334.  *
  335.  * conversion is done as follows:
  336.  *
  337.  * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
  338.  *
  339.  * - 'too large' values [that would result in larger than
  340.  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
  341.  *
  342.  * - all other values are converted to jiffies by either multiplying
  343.  *   the input value by a factor or dividing it with a factor and
  344.  *   handling any 32-bit overflows.
  345.  *   for the details see __msecs_to_jiffies()
  346.  *
  347.  * msecs_to_jiffies() checks for the passed in value being a constant
  348.  * via __builtin_constant_p() allowing gcc to eliminate most of the
  349.  * code, __msecs_to_jiffies() is called if the value passed does not
  350.  * allow constant folding and the actual conversion must be done at
  351.  * runtime.
  352.  * the HZ range specific helpers _msecs_to_jiffies() are called both
  353.  * directly here and from __msecs_to_jiffies() in the case where
  354.  * constant folding is not possible.
  355.  */
  356. static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
  357. {
  358.         if (__builtin_constant_p(m)) {
  359.                 if ((int)m < 0)
  360.                         return MAX_JIFFY_OFFSET;
  361.                 return _msecs_to_jiffies(m);
  362.         } else {
  363.                 return __msecs_to_jiffies(m);
  364.         }
  365. }
  366.  
  367. extern unsigned long __usecs_to_jiffies(const unsigned int u);
  368. #if !(USEC_PER_SEC % HZ)
  369. static inline unsigned long _usecs_to_jiffies(const unsigned int u)
  370. {
  371.         return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
  372. }
  373. #else
  374. static inline unsigned long _usecs_to_jiffies(const unsigned int u)
  375. {
  376.         return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
  377.                 >> USEC_TO_HZ_SHR32;
  378. }
  379. #endif
  380.  
  381. /**
  382.  * usecs_to_jiffies: - convert microseconds to jiffies
  383.  * @u:  time in microseconds
  384.  *
  385.  * conversion is done as follows:
  386.  *
  387.  * - 'too large' values [that would result in larger than
  388.  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
  389.  *
  390.  * - all other values are converted to jiffies by either multiplying
  391.  *   the input value by a factor or dividing it with a factor and
  392.  *   handling any 32-bit overflows as for msecs_to_jiffies.
  393.  *
  394.  * usecs_to_jiffies() checks for the passed in value being a constant
  395.  * via __builtin_constant_p() allowing gcc to eliminate most of the
  396.  * code, __usecs_to_jiffies() is called if the value passed does not
  397.  * allow constant folding and the actual conversion must be done at
  398.  * runtime.
  399.  * the HZ range specific helpers _usecs_to_jiffies() are called both
  400.  * directly here and from __msecs_to_jiffies() in the case where
  401.  * constant folding is not possible.
  402.  */
  403. static __always_inline unsigned long usecs_to_jiffies(const unsigned int u)
  404. {
  405.         if (__builtin_constant_p(u)) {
  406.                 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
  407.                         return MAX_JIFFY_OFFSET;
  408.                 return _usecs_to_jiffies(u);
  409.         } else {
  410.                 return __usecs_to_jiffies(u);
  411.         }
  412. }
  413.  
  414. extern unsigned long timespec64_to_jiffies(const struct timespec64 *value);
  415. extern void jiffies_to_timespec64(const unsigned long jiffies,
  416.                                   struct timespec64 *value);
  417. static inline unsigned long timespec_to_jiffies(const struct timespec *value)
  418. {
  419.         struct timespec64 ts = timespec_to_timespec64(*value);
  420.  
  421.         return timespec64_to_jiffies(&ts);
  422. }
  423.  
  424. static inline void jiffies_to_timespec(const unsigned long jiffies,
  425.                                        struct timespec *value)
  426. {
  427.         struct timespec64 ts;
  428.  
  429.         jiffies_to_timespec64(jiffies, &ts);
  430.         *value = timespec64_to_timespec(ts);
  431. }
  432.  
  433. extern unsigned long timeval_to_jiffies(const struct timeval *value);
  434. extern void jiffies_to_timeval(const unsigned long jiffies,
  435.                                struct timeval *value);
  436.  
  437. extern clock_t jiffies_to_clock_t(unsigned long x);
  438. static inline clock_t jiffies_delta_to_clock_t(long delta)
  439. {
  440.         return jiffies_to_clock_t(max(0L, delta));
  441. }
  442.  
  443. extern unsigned long clock_t_to_jiffies(unsigned long x);
  444. extern u64 jiffies_64_to_clock_t(u64 x);
  445. extern u64 nsec_to_clock_t(u64 x);
  446. extern u64 nsecs_to_jiffies64(u64 n);
  447. extern unsigned long nsecs_to_jiffies(u64 n);
  448.  
  449. #define TIMESTAMP_SIZE  30
  450.  
  451. #endif
  452.