LCOV - code coverage report
Current view: top level - include/linux - timekeeping.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 15 26.7 %
Date: 2023-03-27 20:00:47 Functions: 0 5 0.0 %

          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             : #include <linux/clocksource_ids.h>
       7             : 
       8             : /* Included from linux/ktime.h */
       9             : 
      10             : void timekeeping_init(void);
      11             : extern int timekeeping_suspended;
      12             : 
      13             : /* Architecture timer tick functions: */
      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           0 : static inline ktime_t ktime_get_real(void)
      78             : {
      79           1 :         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           0 : static inline ktime_t ktime_get_boottime(void)
      94             : {
      95         340 :         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           0 : static inline ktime_t ktime_get_clocktai(void)
     107             : {
     108           0 :         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           0 :         return ktime_mono_to_any(mono, TK_OFFS_REAL);
     150             : }
     151             : 
     152             : static inline u64 ktime_get_ns(void)
     153             : {
     154         340 :         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         340 :         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           0 : static inline void ktime_get_boottime_ts64(struct timespec64 *ts)
     189             : {
     190           0 :         *ts = ktime_to_timespec64(ktime_get_boottime());
     191           0 : }
     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           0 : static inline void ktime_get_clocktai_ts64(struct timespec64 *ts)
     204             : {
     205           0 :         *ts = ktime_to_timespec64(ktime_get_clocktai());
     206           0 : }
     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             : /* NMI safe mono/boot/realtime timestamps */
     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

Generated by: LCOV version 1.14