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