Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2967 Serge 1
#ifndef _LINUX_JIFFIES_H
2
#define _LINUX_JIFFIES_H
3
 
4103 Serge 4
#include 
2967 Serge 5
#include 
6
#include 
4103 Serge 7
#include 
6936 serge 8
#include 
2967 Serge 9
//#include          /* 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
 
4103 Serge 57
/* LATCH is used in the interval timer and ftape setup. */
58
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)	/* For divider */
2967 Serge 59
 
4103 Serge 60
extern int register_refined_jiffies(long clock_tick_rate);
2967 Serge 61
 
4103 Serge 62
/* TICK_NSEC is the time between ticks in nsec assuming SHIFTED_HZ */
63
#define TICK_NSEC ((NSEC_PER_SEC+HZ/2)/HZ)
64
 
2967 Serge 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
 
4103 Serge 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")))
2967 Serge 73
 
4103 Serge 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.
5056 serge 78
 */
5270 serge 79
extern u64 __jiffy_data jiffies_64;
80
extern unsigned long volatile __jiffy_data jiffies;
5056 serge 81
 
82
#if (BITS_PER_LONG < 64)
83
u64 get_jiffies_64(void);
84
#else
2967 Serge 85
static inline u64 get_jiffies_64(void)
86
{
5056 serge 87
	return (u64)jiffies;
2967 Serge 88
}
5056 serge 89
#endif
2967 Serge 90
 
91
/*
6082 serge 92
 *	These inlines deal with timer wrapping correctly. You are
2967 Serge 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) && \
4103 Serge 107
	 ((long)((b) - (a)) < 0))
2967 Serge 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) && \
4103 Serge 113
	 ((long)((a) - (b)) >= 0))
2967 Serge 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) && \
4103 Serge 136
	 ((__s64)((b) - (a)) < 0))
2967 Serge 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) && \
4103 Serge 142
	 ((__s64)((a) - (b)) >= 0))
2967 Serge 143
#define time_before_eq64(a,b)	time_after_eq64(b,a)
144
 
4065 Serge 145
#define time_in_range64(a, b, c) \
146
	(time_after_eq64(a, b) && \
147
	 time_before_eq64(a, c))
148
 
2967 Serge 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);
5056 serge 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
 
6082 serge 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
 */
6934 serge 356
static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
6082 serge 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
 
2967 Serge 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);
3031 serge 436
 
2967 Serge 437
extern clock_t jiffies_to_clock_t(unsigned long x);
3031 serge 438
static inline clock_t jiffies_delta_to_clock_t(long delta)
439
{
440
	return jiffies_to_clock_t(max(0L, delta));
441
}
442
 
2967 Serge 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