1 1.21 riastrad /* $NetBSD: ktime.h,v 1.21 2021/12/19 12:30:23 riastradh Exp $ */ 2 1.2 riastrad 3 1.2 riastrad /*- 4 1.2 riastrad * Copyright (c) 2013 The NetBSD Foundation, Inc. 5 1.2 riastrad * All rights reserved. 6 1.2 riastrad * 7 1.2 riastrad * This code is derived from software contributed to The NetBSD Foundation 8 1.2 riastrad * by Taylor R. Campbell. 9 1.2 riastrad * 10 1.2 riastrad * Redistribution and use in source and binary forms, with or without 11 1.2 riastrad * modification, are permitted provided that the following conditions 12 1.2 riastrad * are met: 13 1.2 riastrad * 1. Redistributions of source code must retain the above copyright 14 1.2 riastrad * notice, this list of conditions and the following disclaimer. 15 1.2 riastrad * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 riastrad * notice, this list of conditions and the following disclaimer in the 17 1.2 riastrad * documentation and/or other materials provided with the distribution. 18 1.2 riastrad * 19 1.2 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 riastrad * POSSIBILITY OF SUCH DAMAGE. 30 1.2 riastrad */ 31 1.2 riastrad 32 1.2 riastrad #ifndef _LINUX_KTIME_H_ 33 1.2 riastrad #define _LINUX_KTIME_H_ 34 1.2 riastrad 35 1.2 riastrad #include <sys/types.h> 36 1.2 riastrad #include <sys/endian.h> 37 1.7 riastrad #include <sys/kernel.h> 38 1.2 riastrad #include <sys/time.h> 39 1.20 riastrad #include <sys/timevar.h> 40 1.2 riastrad 41 1.9 maya #include <linux/jiffies.h> 42 1.3 riastrad #include <linux/time.h> 43 1.3 riastrad 44 1.10 riastrad typedef int64_t ktime_t; 45 1.2 riastrad 46 1.6 riastrad static inline int64_t 47 1.6 riastrad ktime_to_ns(ktime_t kt) 48 1.3 riastrad { 49 1.10 riastrad return kt; 50 1.3 riastrad } 51 1.3 riastrad 52 1.2 riastrad static inline int64_t 53 1.6 riastrad ktime_to_us(ktime_t kt) 54 1.2 riastrad { 55 1.6 riastrad return ktime_to_ns(kt)/1000; 56 1.2 riastrad } 57 1.2 riastrad 58 1.15 riastrad static inline int64_t 59 1.15 riastrad ktime_to_ms(ktime_t kt) 60 1.15 riastrad { 61 1.15 riastrad return ktime_to_ns(kt)/1000000; 62 1.15 riastrad } 63 1.15 riastrad 64 1.2 riastrad static inline ktime_t 65 1.2 riastrad ns_to_ktime(int64_t nsec) 66 1.2 riastrad { 67 1.10 riastrad return nsec; 68 1.6 riastrad } 69 1.2 riastrad 70 1.6 riastrad static inline ktime_t 71 1.13 riastrad ktime_add(ktime_t a, ktime_t b) 72 1.13 riastrad { 73 1.13 riastrad return ns_to_ktime(ktime_to_ns(a) + ktime_to_ns(b)); 74 1.13 riastrad } 75 1.13 riastrad 76 1.13 riastrad static inline ktime_t 77 1.6 riastrad ktime_add_ns(ktime_t kt, int64_t nsec) 78 1.6 riastrad { 79 1.6 riastrad return ns_to_ktime(ktime_to_ns(kt) + nsec); 80 1.2 riastrad } 81 1.2 riastrad 82 1.2 riastrad static inline ktime_t 83 1.19 riastrad ktime_add_us(ktime_t kt, int64_t usec) 84 1.19 riastrad { 85 1.19 riastrad return ktime_add_ns(kt, 1000 * usec); 86 1.19 riastrad } 87 1.19 riastrad 88 1.19 riastrad static inline ktime_t 89 1.2 riastrad ktime_sub(ktime_t a, ktime_t b) 90 1.2 riastrad { 91 1.2 riastrad return ns_to_ktime(ktime_to_ns(a) - ktime_to_ns(b)); 92 1.2 riastrad } 93 1.2 riastrad 94 1.2 riastrad static inline ktime_t 95 1.2 riastrad ktime_sub_ns(ktime_t a, int64_t nsec) 96 1.2 riastrad { 97 1.2 riastrad return ns_to_ktime(ktime_to_ns(a) - nsec); 98 1.2 riastrad } 99 1.2 riastrad 100 1.2 riastrad static inline struct timespec 101 1.2 riastrad ktime_to_timespec(ktime_t kt) 102 1.2 riastrad { 103 1.2 riastrad return ns_to_timespec(ktime_to_ns(kt)); 104 1.2 riastrad } 105 1.12 riastrad #define ktime_to_timespec64 ktime_to_timespec 106 1.2 riastrad 107 1.2 riastrad static inline struct timeval 108 1.2 riastrad ktime_to_timeval(ktime_t kt) 109 1.2 riastrad { 110 1.2 riastrad return ns_to_timeval(ktime_to_ns(kt)); 111 1.2 riastrad } 112 1.2 riastrad 113 1.2 riastrad static inline ktime_t 114 1.4 riastrad timespec_to_ktime(struct timespec ts) 115 1.4 riastrad { 116 1.6 riastrad /* XXX Silently truncate? */ 117 1.6 riastrad return ns_to_ktime(1000000000*(int64_t)ts.tv_sec + ts.tv_nsec); 118 1.4 riastrad } 119 1.12 riastrad #define timespec64_to_ktime timespec_to_ktime 120 1.4 riastrad 121 1.4 riastrad static inline ktime_t 122 1.2 riastrad ktime_get(void) 123 1.2 riastrad { 124 1.2 riastrad struct timespec ts; 125 1.2 riastrad 126 1.2 riastrad nanouptime(&ts); 127 1.2 riastrad 128 1.6 riastrad return timespec_to_ktime(ts); 129 1.2 riastrad } 130 1.2 riastrad 131 1.2 riastrad static inline ktime_t 132 1.4 riastrad ktime_get_real(void) 133 1.4 riastrad { 134 1.4 riastrad struct timespec ts; 135 1.4 riastrad 136 1.4 riastrad nanotime(&ts); 137 1.4 riastrad 138 1.6 riastrad return timespec_to_ktime(ts); 139 1.4 riastrad } 140 1.4 riastrad 141 1.14 riastrad static inline ktime_t 142 1.17 riastrad ktime_get_boottime(void) 143 1.17 riastrad { 144 1.17 riastrad /* XXX include time spent in suspend */ 145 1.17 riastrad return ktime_get(); 146 1.17 riastrad } 147 1.17 riastrad 148 1.17 riastrad static inline ktime_t 149 1.14 riastrad ktime_get_raw(void) 150 1.14 riastrad { 151 1.14 riastrad /* XXX */ 152 1.14 riastrad return ktime_get(); 153 1.14 riastrad } 154 1.14 riastrad 155 1.5 riastrad static inline uint64_t 156 1.18 riastrad ktime_get_ns(void) 157 1.18 riastrad { 158 1.18 riastrad return ktime_to_ns(ktime_get()); 159 1.18 riastrad } 160 1.18 riastrad 161 1.18 riastrad static inline uint64_t 162 1.5 riastrad ktime_get_raw_ns(void) 163 1.5 riastrad { 164 1.14 riastrad return ktime_to_ns(ktime_get_raw()); 165 1.5 riastrad } 166 1.5 riastrad 167 1.16 riastrad static inline uint64_t 168 1.16 riastrad ktime_get_mono_fast_ns(void) 169 1.16 riastrad { 170 1.16 riastrad return ktime_get_raw_ns(); 171 1.16 riastrad } 172 1.16 riastrad 173 1.4 riastrad static inline ktime_t 174 1.2 riastrad ktime_get_monotonic_offset(void) 175 1.2 riastrad { 176 1.8 thorpej struct timespec ts; 177 1.8 thorpej 178 1.8 thorpej getnanoboottime(&ts); 179 1.8 thorpej 180 1.8 thorpej return timespec_to_ktime(ts); 181 1.4 riastrad } 182 1.4 riastrad 183 1.4 riastrad static inline ktime_t 184 1.4 riastrad ktime_mono_to_real(ktime_t kt) 185 1.4 riastrad { 186 1.4 riastrad struct timespec ts = ktime_to_timespec(kt); 187 1.8 thorpej struct timespec bts; 188 1.4 riastrad 189 1.8 thorpej getnanoboottime(&bts); 190 1.8 thorpej timespecadd(&ts, &bts, &ts); 191 1.4 riastrad 192 1.4 riastrad return timespec_to_ktime(ts); 193 1.2 riastrad } 194 1.2 riastrad 195 1.6 riastrad static inline int64_t 196 1.6 riastrad ktime_us_delta(ktime_t a, ktime_t b) 197 1.6 riastrad { 198 1.6 riastrad return ktime_to_us(ktime_sub(a, b)); 199 1.6 riastrad } 200 1.6 riastrad 201 1.15 riastrad static inline int64_t 202 1.15 riastrad ktime_ms_delta(ktime_t a, ktime_t b) 203 1.15 riastrad { 204 1.15 riastrad return ktime_to_ms(ktime_sub(a, b)); 205 1.15 riastrad } 206 1.15 riastrad 207 1.15 riastrad 208 1.3 riastrad static inline bool 209 1.3 riastrad time_in_range(unsigned long x, unsigned long a, unsigned long b) 210 1.3 riastrad { 211 1.3 riastrad return ((a <= x) && (x <= b)); 212 1.3 riastrad } 213 1.3 riastrad 214 1.11 riastrad static inline bool 215 1.11 riastrad ktime_after(ktime_t a, ktime_t b) 216 1.11 riastrad { 217 1.11 riastrad return ktime_to_ns(a) > ktime_to_ns(b); 218 1.11 riastrad } 219 1.11 riastrad 220 1.20 riastrad static inline time_t 221 1.20 riastrad ktime_get_real_seconds(void) 222 1.20 riastrad { 223 1.20 riastrad return time_second; 224 1.20 riastrad } 225 1.20 riastrad 226 1.21 riastrad static inline void 227 1.21 riastrad ktime_get_ts64(struct timespec64 *ts) 228 1.21 riastrad { 229 1.21 riastrad 230 1.21 riastrad nanotime(ts); 231 1.21 riastrad } 232 1.21 riastrad 233 1.2 riastrad #endif /* _LINUX_KTIME_H_ */ 234