LCOV - code coverage report
Current view: top level - include/linux - timekeeping.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 15 22 68.2 %
Date: 2021-04-22 12:43:58 Functions: 3 8 37.5 %

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

Generated by: LCOV version 1.14