clocksource: Delay clocksource down rating to late boot
[deliverable/linux.git] / include / linux / time.h
CommitLineData
1da177e4
LT
1#ifndef _LINUX_TIME_H
2#define _LINUX_TIME_H
3
4#include <linux/types.h>
5
6#ifdef __KERNEL__
82644459 7# include <linux/cache.h>
57a55875 8# include <linux/seqlock.h>
f595ec96 9# include <linux/math64.h>
1da177e4
LT
10#endif
11
12#ifndef _STRUCT_TIMESPEC
13#define _STRUCT_TIMESPEC
14struct timespec {
85efde6f
AB
15 __kernel_time_t tv_sec; /* seconds */
16 long tv_nsec; /* nanoseconds */
1da177e4 17};
57a55875 18#endif
1da177e4
LT
19
20struct timeval {
85efde6f
AB
21 __kernel_time_t tv_sec; /* seconds */
22 __kernel_suseconds_t tv_usec; /* microseconds */
1da177e4
LT
23};
24
25struct timezone {
26 int tz_minuteswest; /* minutes west of Greenwich */
27 int tz_dsttime; /* type of dst correction */
28};
29
30#ifdef __KERNEL__
31
b418da16
CH
32extern struct timezone sys_tz;
33
57a55875 34/* Parameters used to convert the timespec values: */
05ebb761
VP
35#define MSEC_PER_SEC 1000L
36#define USEC_PER_MSEC 1000L
37#define NSEC_PER_USEC 1000L
38#define NSEC_PER_MSEC 1000000L
39#define USEC_PER_SEC 1000000L
40#define NSEC_PER_SEC 1000000000L
41#define FSEC_PER_SEC 1000000000000000L
1da177e4 42
df0cc053
TG
43#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
44
5b78cc9a
JE
45static inline int timespec_equal(const struct timespec *a,
46 const struct timespec *b)
57a55875 47{
1da177e4 48 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a55875 49}
1da177e4 50
643a6545
AM
51/*
52 * lhs < rhs: return <0
53 * lhs == rhs: return 0
54 * lhs > rhs: return >0
55 */
77adbfbf 56static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a6545
AM
57{
58 if (lhs->tv_sec < rhs->tv_sec)
59 return -1;
60 if (lhs->tv_sec > rhs->tv_sec)
61 return 1;
62 return lhs->tv_nsec - rhs->tv_nsec;
63}
64
77adbfbf 65static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a6545
AM
66{
67 if (lhs->tv_sec < rhs->tv_sec)
68 return -1;
69 if (lhs->tv_sec > rhs->tv_sec)
70 return 1;
71 return lhs->tv_usec - rhs->tv_usec;
72}
73
f4818900
IM
74extern unsigned long mktime(const unsigned int year, const unsigned int mon,
75 const unsigned int day, const unsigned int hour,
76 const unsigned int min, const unsigned int sec);
77
78extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
df0cc053
TG
79extern struct timespec timespec_add_safe(const struct timespec lhs,
80 const struct timespec rhs);
1da177e4 81
ca74e92b
SN
82/*
83 * sub = lhs - rhs, in normalized form
84 */
85static inline struct timespec timespec_sub(struct timespec lhs,
86 struct timespec rhs)
87{
88 struct timespec ts_delta;
89 set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
90 lhs.tv_nsec - rhs.tv_nsec);
91 return ts_delta;
92}
93
5f82b2b7
TG
94/*
95 * Returns true if the timespec is norm, false if denorm:
96 */
97#define timespec_valid(ts) \
bd3f8f2b 98 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 99
1da177e4
LT
100extern struct timespec xtime;
101extern struct timespec wall_to_monotonic;
ba2a631b 102extern seqlock_t xtime_lock;
1da177e4 103
d4f587c6 104extern void read_persistent_clock(struct timespec *ts);
23970e38 105extern void read_boot_clock(struct timespec *ts);
82644459
TG
106extern int update_persistent_clock(struct timespec now);
107extern int no_sync_cmos_clock __read_mostly;
ad596171 108void timekeeping_init(void);
1c5745aa 109extern int timekeeping_suspended;
ad596171 110
17c38b74 111unsigned long get_seconds(void);
1da177e4 112struct timespec current_kernel_time(void);
da15cfda 113struct timespec __current_kernel_time(void); /* does not hold xtime_lock */
114struct timespec get_monotonic_coarse(void);
1da177e4 115
57a55875 116#define CURRENT_TIME (current_kernel_time())
2c6b47de 117#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 })
1da177e4 118
7d27558c 119/* Some architectures do not supply their own clocksource.
120 * This is mainly the case in architectures that get their
121 * inter-tick times by reading the counter on their interval
122 * timer. Since these timers wrap every tick, they're not really
123 * useful as clocksources. Wrapping them to act like one is possible
124 * but not very efficient. So we provide a callout these arches
125 * can implement for use with the jiffies clocksource to provide
126 * finer then tick granular time.
127 */
128#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
129extern u32 arch_gettimeoffset(void);
130#else
131static inline u32 arch_gettimeoffset(void) { return 0; }
132#endif
133
1da177e4
LT
134extern void do_gettimeofday(struct timeval *tv);
135extern int do_settimeofday(struct timespec *tv);
136extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
becf8b5d 137#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
1c710c89 138extern long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags);
1da177e4 139struct itimerval;
57a55875
IM
140extern int do_setitimer(int which, struct itimerval *value,
141 struct itimerval *ovalue);
c08b8a49 142extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 143extern int do_getitimer(int which, struct itimerval *value);
57a55875 144extern void getnstimeofday(struct timespec *tv);
2d42244a 145extern void getrawmonotonic(struct timespec *ts);
7c3f1a57
TJ
146extern void getboottime(struct timespec *ts);
147extern void monotonic_to_bootbased(struct timespec *ts);
1da177e4
LT
148
149extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf4fc6cb 150extern int timekeeping_valid_for_hres(void);
8524070b 151extern void update_wall_time(void);
1001d0a9 152extern void update_xtime_cache(u64 nsec);
31089c13 153extern void timekeeping_leap_insert(int leapsecond);
1da177e4 154
f06febc9
FM
155struct tms;
156extern void do_sys_times(struct tms *);
157
f8f46da3
TG
158/**
159 * timespec_to_ns - Convert timespec to nanoseconds
160 * @ts: pointer to the timespec variable to be converted
161 *
162 * Returns the scalar nanosecond representation of the timespec
163 * parameter.
164 */
df869b63 165static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 166{
df869b63 167 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
168}
169
170/**
171 * timeval_to_ns - Convert timeval to nanoseconds
172 * @ts: pointer to the timeval variable to be converted
173 *
174 * Returns the scalar nanosecond representation of the timeval
175 * parameter.
176 */
df869b63 177static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 178{
df869b63 179 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
180 tv->tv_usec * NSEC_PER_USEC;
181}
182
183/**
184 * ns_to_timespec - Convert nanoseconds to timespec
185 * @nsec: the nanoseconds value to be converted
186 *
187 * Returns the timespec representation of the nsec parameter.
188 */
df869b63 189extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
190
191/**
192 * ns_to_timeval - Convert nanoseconds to timeval
193 * @nsec: the nanoseconds value to be converted
194 *
195 * Returns the timeval representation of the nsec parameter.
196 */
df869b63 197extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 198
cf3c769b 199/**
200 * timespec_add_ns - Adds nanoseconds to a timespec
201 * @a: pointer to timespec to be incremented
202 * @ns: unsigned nanoseconds value to be added
9412e286
JF
203 *
204 * This must always be inlined because its used from the x86-64 vdso,
205 * which cannot call other kernel functions.
cf3c769b 206 */
9412e286 207static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
cf3c769b 208{
9412e286 209 a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
cf3c769b 210 a->tv_nsec = ns;
211}
1da177e4
LT
212#endif /* __KERNEL__ */
213
214#define NFDBITS __NFDBITS
215
216#define FD_SETSIZE __FD_SETSIZE
217#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
218#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
219#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
220#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
221
222/*
223 * Names of the interval timers, and structure
57a55875 224 * defining a timer setting:
1da177e4 225 */
57a55875
IM
226#define ITIMER_REAL 0
227#define ITIMER_VIRTUAL 1
228#define ITIMER_PROF 2
1da177e4 229
57a55875
IM
230struct itimerspec {
231 struct timespec it_interval; /* timer period */
232 struct timespec it_value; /* timer expiration */
1da177e4
LT
233};
234
57a55875
IM
235struct itimerval {
236 struct timeval it_interval; /* timer interval */
237 struct timeval it_value; /* current value */
1da177e4
LT
238};
239
1da177e4 240/*
57a55875 241 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 242 */
1ad106ca
IM
243#define CLOCK_REALTIME 0
244#define CLOCK_MONOTONIC 1
245#define CLOCK_PROCESS_CPUTIME_ID 2
246#define CLOCK_THREAD_CPUTIME_ID 3
2d42244a 247#define CLOCK_MONOTONIC_RAW 4
da15cfda 248#define CLOCK_REALTIME_COARSE 5
249#define CLOCK_MONOTONIC_COARSE 6
1da177e4
LT
250
251/*
57a55875 252 * The IDs of various hardware clocks:
1da177e4 253 */
1ad106ca
IM
254#define CLOCK_SGI_CYCLE 10
255#define MAX_CLOCKS 16
256#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
257#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
258
259/*
57a55875 260 * The various flags for setting POSIX.1b interval timers:
1da177e4 261 */
1ad106ca 262#define TIMER_ABSTIME 0x01
1da177e4
LT
263
264#endif
This page took 0.684693 seconds and 5 git commands to generate.