xref: /OK3568_Linux_fs/kernel/include/linux/timekeeping.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _LINUX_TIMEKEEPING_H
3*4882a593Smuzhiyun #define _LINUX_TIMEKEEPING_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/errno.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun /* Included from linux/ktime.h */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun void timekeeping_init(void);
10*4882a593Smuzhiyun extern int timekeeping_suspended;
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /* Architecture timer tick functions: */
13*4882a593Smuzhiyun extern void update_process_times(int user);
14*4882a593Smuzhiyun extern void xtime_update(unsigned long ticks);
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  * Get and set timeofday
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun extern int do_settimeofday64(const struct timespec64 *ts);
20*4882a593Smuzhiyun extern int do_sys_settimeofday64(const struct timespec64 *tv,
21*4882a593Smuzhiyun 				 const struct timezone *tz);
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun  * ktime_get() family: read the current time in a multitude of ways,
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  * The default time reference is CLOCK_MONOTONIC, starting at
27*4882a593Smuzhiyun  * boot time but not counting the time spent in suspend.
28*4882a593Smuzhiyun  * For other references, use the functions with "real", "clocktai",
29*4882a593Smuzhiyun  * "boottime" and "raw" suffixes.
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * To get the time in a different format, use the ones wit
32*4882a593Smuzhiyun  * "ns", "ts64" and "seconds" suffix.
33*4882a593Smuzhiyun  *
34*4882a593Smuzhiyun  * See Documentation/core-api/timekeeping.rst for more details.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /*
39*4882a593Smuzhiyun  * timespec64 based interfaces
40*4882a593Smuzhiyun  */
41*4882a593Smuzhiyun extern void ktime_get_raw_ts64(struct timespec64 *ts);
42*4882a593Smuzhiyun extern void ktime_get_ts64(struct timespec64 *ts);
43*4882a593Smuzhiyun extern void ktime_get_real_ts64(struct timespec64 *tv);
44*4882a593Smuzhiyun extern void ktime_get_coarse_ts64(struct timespec64 *ts);
45*4882a593Smuzhiyun extern void ktime_get_coarse_real_ts64(struct timespec64 *ts);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun void getboottime64(struct timespec64 *ts);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun  * time64_t base interfaces
51*4882a593Smuzhiyun  */
52*4882a593Smuzhiyun extern time64_t ktime_get_seconds(void);
53*4882a593Smuzhiyun extern time64_t __ktime_get_real_seconds(void);
54*4882a593Smuzhiyun extern time64_t ktime_get_real_seconds(void);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun  * ktime_t based interfaces
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun enum tk_offsets {
61*4882a593Smuzhiyun 	TK_OFFS_REAL,
62*4882a593Smuzhiyun 	TK_OFFS_BOOT,
63*4882a593Smuzhiyun 	TK_OFFS_TAI,
64*4882a593Smuzhiyun 	TK_OFFS_MAX,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun extern ktime_t ktime_get(void);
68*4882a593Smuzhiyun extern ktime_t ktime_get_with_offset(enum tk_offsets offs);
69*4882a593Smuzhiyun extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs);
70*4882a593Smuzhiyun extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs);
71*4882a593Smuzhiyun extern ktime_t ktime_get_raw(void);
72*4882a593Smuzhiyun extern u32 ktime_get_resolution_ns(void);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /**
75*4882a593Smuzhiyun  * ktime_get_real - get the real (wall-) time in ktime_t format
76*4882a593Smuzhiyun  */
ktime_get_real(void)77*4882a593Smuzhiyun static inline ktime_t ktime_get_real(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	return ktime_get_with_offset(TK_OFFS_REAL);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
ktime_get_coarse_real(void)82*4882a593Smuzhiyun static inline ktime_t ktime_get_coarse_real(void)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	return ktime_get_coarse_with_offset(TK_OFFS_REAL);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /**
88*4882a593Smuzhiyun  * ktime_get_boottime - Returns monotonic time since boot in ktime_t format
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  * This is similar to CLOCK_MONTONIC/ktime_get, but also includes the
91*4882a593Smuzhiyun  * time spent in suspend.
92*4882a593Smuzhiyun  */
ktime_get_boottime(void)93*4882a593Smuzhiyun static inline ktime_t ktime_get_boottime(void)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	return ktime_get_with_offset(TK_OFFS_BOOT);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
ktime_get_coarse_boottime(void)98*4882a593Smuzhiyun static inline ktime_t ktime_get_coarse_boottime(void)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	return ktime_get_coarse_with_offset(TK_OFFS_BOOT);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /**
104*4882a593Smuzhiyun  * ktime_get_clocktai - Returns the TAI time of day in ktime_t format
105*4882a593Smuzhiyun  */
ktime_get_clocktai(void)106*4882a593Smuzhiyun static inline ktime_t ktime_get_clocktai(void)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	return ktime_get_with_offset(TK_OFFS_TAI);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
ktime_get_coarse_clocktai(void)111*4882a593Smuzhiyun static inline ktime_t ktime_get_coarse_clocktai(void)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	return ktime_get_coarse_with_offset(TK_OFFS_TAI);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
ktime_get_coarse(void)116*4882a593Smuzhiyun static inline ktime_t ktime_get_coarse(void)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun 	struct timespec64 ts;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	ktime_get_coarse_ts64(&ts);
121*4882a593Smuzhiyun 	return timespec64_to_ktime(ts);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
ktime_get_coarse_ns(void)124*4882a593Smuzhiyun static inline u64 ktime_get_coarse_ns(void)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_coarse());
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun 
ktime_get_coarse_real_ns(void)129*4882a593Smuzhiyun static inline u64 ktime_get_coarse_real_ns(void)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_coarse_real());
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
ktime_get_coarse_boottime_ns(void)134*4882a593Smuzhiyun static inline u64 ktime_get_coarse_boottime_ns(void)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_coarse_boottime());
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
ktime_get_coarse_clocktai_ns(void)139*4882a593Smuzhiyun static inline u64 ktime_get_coarse_clocktai_ns(void)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_coarse_clocktai());
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /**
145*4882a593Smuzhiyun  * ktime_mono_to_real - Convert monotonic time to clock realtime
146*4882a593Smuzhiyun  */
ktime_mono_to_real(ktime_t mono)147*4882a593Smuzhiyun static inline ktime_t ktime_mono_to_real(ktime_t mono)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	return ktime_mono_to_any(mono, TK_OFFS_REAL);
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
ktime_get_ns(void)152*4882a593Smuzhiyun static inline u64 ktime_get_ns(void)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get());
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
ktime_get_real_ns(void)157*4882a593Smuzhiyun static inline u64 ktime_get_real_ns(void)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_real());
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
ktime_get_boottime_ns(void)162*4882a593Smuzhiyun static inline u64 ktime_get_boottime_ns(void)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_boottime());
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
ktime_get_clocktai_ns(void)167*4882a593Smuzhiyun static inline u64 ktime_get_clocktai_ns(void)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_clocktai());
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun 
ktime_get_raw_ns(void)172*4882a593Smuzhiyun static inline u64 ktime_get_raw_ns(void)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun 	return ktime_to_ns(ktime_get_raw());
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun extern u64 ktime_get_mono_fast_ns(void);
178*4882a593Smuzhiyun extern u64 ktime_get_raw_fast_ns(void);
179*4882a593Smuzhiyun extern u64 ktime_get_boot_fast_ns(void);
180*4882a593Smuzhiyun extern u64 ktime_get_real_fast_ns(void);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /*
183*4882a593Smuzhiyun  * timespec64/time64_t interfaces utilizing the ktime based ones
184*4882a593Smuzhiyun  * for API completeness, these could be implemented more efficiently
185*4882a593Smuzhiyun  * if needed.
186*4882a593Smuzhiyun  */
ktime_get_boottime_ts64(struct timespec64 * ts)187*4882a593Smuzhiyun static inline void ktime_get_boottime_ts64(struct timespec64 *ts)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun 	*ts = ktime_to_timespec64(ktime_get_boottime());
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
ktime_get_coarse_boottime_ts64(struct timespec64 * ts)192*4882a593Smuzhiyun static inline void ktime_get_coarse_boottime_ts64(struct timespec64 *ts)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	*ts = ktime_to_timespec64(ktime_get_coarse_boottime());
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun 
ktime_get_boottime_seconds(void)197*4882a593Smuzhiyun static inline time64_t ktime_get_boottime_seconds(void)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun 	return ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC);
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun 
ktime_get_clocktai_ts64(struct timespec64 * ts)202*4882a593Smuzhiyun static inline void ktime_get_clocktai_ts64(struct timespec64 *ts)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	*ts = ktime_to_timespec64(ktime_get_clocktai());
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
ktime_get_coarse_clocktai_ts64(struct timespec64 * ts)207*4882a593Smuzhiyun static inline void ktime_get_coarse_clocktai_ts64(struct timespec64 *ts)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun 	*ts = ktime_to_timespec64(ktime_get_coarse_clocktai());
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
ktime_get_clocktai_seconds(void)212*4882a593Smuzhiyun static inline time64_t ktime_get_clocktai_seconds(void)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	return ktime_divns(ktime_get_coarse_clocktai(), NSEC_PER_SEC);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /*
218*4882a593Smuzhiyun  * RTC specific
219*4882a593Smuzhiyun  */
220*4882a593Smuzhiyun extern bool timekeeping_rtc_skipsuspend(void);
221*4882a593Smuzhiyun extern bool timekeeping_rtc_skipresume(void);
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun extern void timekeeping_inject_sleeptime64(const struct timespec64 *delta);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun /*
226*4882a593Smuzhiyun  * struct ktime_timestanps - Simultaneous mono/boot/real timestamps
227*4882a593Smuzhiyun  * @mono:	Monotonic timestamp
228*4882a593Smuzhiyun  * @boot:	Boottime timestamp
229*4882a593Smuzhiyun  * @real:	Realtime timestamp
230*4882a593Smuzhiyun  */
231*4882a593Smuzhiyun struct ktime_timestamps {
232*4882a593Smuzhiyun 	u64		mono;
233*4882a593Smuzhiyun 	u64		boot;
234*4882a593Smuzhiyun 	u64		real;
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /**
238*4882a593Smuzhiyun  * struct system_time_snapshot - simultaneous raw/real time capture with
239*4882a593Smuzhiyun  *				 counter value
240*4882a593Smuzhiyun  * @cycles:	Clocksource counter value to produce the system times
241*4882a593Smuzhiyun  * @real:	Realtime system time
242*4882a593Smuzhiyun  * @raw:	Monotonic raw system time
243*4882a593Smuzhiyun  * @clock_was_set_seq:	The sequence number of clock was set events
244*4882a593Smuzhiyun  * @cs_was_changed_seq:	The sequence number of clocksource change events
245*4882a593Smuzhiyun  */
246*4882a593Smuzhiyun struct system_time_snapshot {
247*4882a593Smuzhiyun 	u64		cycles;
248*4882a593Smuzhiyun 	ktime_t		real;
249*4882a593Smuzhiyun 	ktime_t		raw;
250*4882a593Smuzhiyun 	unsigned int	clock_was_set_seq;
251*4882a593Smuzhiyun 	u8		cs_was_changed_seq;
252*4882a593Smuzhiyun };
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun  * struct system_device_crosststamp - system/device cross-timestamp
256*4882a593Smuzhiyun  *				      (synchronized capture)
257*4882a593Smuzhiyun  * @device:		Device time
258*4882a593Smuzhiyun  * @sys_realtime:	Realtime simultaneous with device time
259*4882a593Smuzhiyun  * @sys_monoraw:	Monotonic raw simultaneous with device time
260*4882a593Smuzhiyun  */
261*4882a593Smuzhiyun struct system_device_crosststamp {
262*4882a593Smuzhiyun 	ktime_t device;
263*4882a593Smuzhiyun 	ktime_t sys_realtime;
264*4882a593Smuzhiyun 	ktime_t sys_monoraw;
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun /**
268*4882a593Smuzhiyun  * struct system_counterval_t - system counter value with the pointer to the
269*4882a593Smuzhiyun  *				corresponding clocksource
270*4882a593Smuzhiyun  * @cycles:	System counter value
271*4882a593Smuzhiyun  * @cs:		Clocksource corresponding to system counter value. Used by
272*4882a593Smuzhiyun  *		timekeeping code to verify comparibility of two cycle values
273*4882a593Smuzhiyun  */
274*4882a593Smuzhiyun struct system_counterval_t {
275*4882a593Smuzhiyun 	u64			cycles;
276*4882a593Smuzhiyun 	struct clocksource	*cs;
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun /*
280*4882a593Smuzhiyun  * Get cross timestamp between system clock and device clock
281*4882a593Smuzhiyun  */
282*4882a593Smuzhiyun extern int get_device_system_crosststamp(
283*4882a593Smuzhiyun 			int (*get_time_fn)(ktime_t *device_time,
284*4882a593Smuzhiyun 				struct system_counterval_t *system_counterval,
285*4882a593Smuzhiyun 				void *ctx),
286*4882a593Smuzhiyun 			void *ctx,
287*4882a593Smuzhiyun 			struct system_time_snapshot *history,
288*4882a593Smuzhiyun 			struct system_device_crosststamp *xtstamp);
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /*
291*4882a593Smuzhiyun  * Simultaneously snapshot realtime and monotonic raw clocks
292*4882a593Smuzhiyun  */
293*4882a593Smuzhiyun extern void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun /* NMI safe mono/boot/realtime timestamps */
296*4882a593Smuzhiyun extern void ktime_get_fast_timestamps(struct ktime_timestamps *snap);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun /*
299*4882a593Smuzhiyun  * Persistent clock related interfaces
300*4882a593Smuzhiyun  */
301*4882a593Smuzhiyun extern int persistent_clock_is_local;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun extern void read_persistent_clock64(struct timespec64 *ts);
304*4882a593Smuzhiyun void read_persistent_wall_and_boot_offset(struct timespec64 *wall_clock,
305*4882a593Smuzhiyun 					  struct timespec64 *boot_offset);
306*4882a593Smuzhiyun extern int update_persistent_clock64(struct timespec64 now);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun #endif
309