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