xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_time.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: i_qdf_time
22*5113495bSYour Name  * This file provides OS dependent time API's.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _I_QDF_TIME_H
26*5113495bSYour Name #define _I_QDF_TIME_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <linux/version.h>
29*5113495bSYour Name #include <linux/jiffies.h>
30*5113495bSYour Name #include <linux/delay.h>
31*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))
32*5113495bSYour Name #include <linux/sched/clock.h>
33*5113495bSYour Name #else
34*5113495bSYour Name #include <linux/sched.h>
35*5113495bSYour Name #endif
36*5113495bSYour Name #include <linux/ktime.h>
37*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
38*5113495bSYour Name #include <linux/timekeeping.h>
39*5113495bSYour Name #else
40*5113495bSYour Name #include <linux/hrtimer.h>
41*5113495bSYour Name #endif
42*5113495bSYour Name #ifdef MSM_PLATFORM
43*5113495bSYour Name #include <asm/arch_timer.h>
44*5113495bSYour Name #endif
45*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
46*5113495bSYour Name #include <linux/sched/clock.h>
47*5113495bSYour Name #else
48*5113495bSYour Name #include <linux/sched.h>
49*5113495bSYour Name #endif
50*5113495bSYour Name 
51*5113495bSYour Name typedef unsigned long __qdf_time_t;
52*5113495bSYour Name typedef ktime_t  __qdf_ktime_t;
53*5113495bSYour Name 
54*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
55*5113495bSYour Name typedef struct timespec64 __qdf_timespec_t;
56*5113495bSYour Name #else
57*5113495bSYour Name typedef struct timeval __qdf_timespec_t;
58*5113495bSYour Name #endif
59*5113495bSYour Name 
60*5113495bSYour Name typedef struct work_struct __qdf_work_struct_t;
61*5113495bSYour Name 
62*5113495bSYour Name /**
63*5113495bSYour Name  * __qdf_ns_to_ktime() - Converts nanoseconds to a ktime object
64*5113495bSYour Name  * @ns: time in nanoseconds
65*5113495bSYour Name  *
66*5113495bSYour Name  * Return: nanoseconds as ktime object
67*5113495bSYour Name  */
__qdf_ns_to_ktime(uint64_t ns)68*5113495bSYour Name static inline ktime_t __qdf_ns_to_ktime(uint64_t ns)
69*5113495bSYour Name {
70*5113495bSYour Name 	return ns_to_ktime(ns);
71*5113495bSYour Name }
72*5113495bSYour Name 
73*5113495bSYour Name /**
74*5113495bSYour Name  * __qdf_ktime_add() - Adds two ktime objects and returns
75*5113495bSYour Name  * a ktime object
76*5113495bSYour Name  * @ktime1: time as ktime object
77*5113495bSYour Name  * @ktime2: time as ktime object
78*5113495bSYour Name  *
79*5113495bSYour Name  * Return: sum of ktime objects as ktime object
80*5113495bSYour Name  */
__qdf_ktime_add(ktime_t ktime1,ktime_t ktime2)81*5113495bSYour Name static inline ktime_t __qdf_ktime_add(ktime_t ktime1, ktime_t ktime2)
82*5113495bSYour Name {
83*5113495bSYour Name 	return ktime_add(ktime1, ktime2);
84*5113495bSYour Name }
85*5113495bSYour Name 
86*5113495bSYour Name /**
87*5113495bSYour Name  * __qdf_ktime_get() - Gets the current time as ktime object
88*5113495bSYour Name  *
89*5113495bSYour Name  * Return: current time as ktime object
90*5113495bSYour Name  */
__qdf_ktime_get(void)91*5113495bSYour Name static inline ktime_t __qdf_ktime_get(void)
92*5113495bSYour Name {
93*5113495bSYour Name 	return ktime_get();
94*5113495bSYour Name }
95*5113495bSYour Name 
96*5113495bSYour Name /**
97*5113495bSYour Name  * __qdf_ktime_real_get() - Gets the current wall clock as ktime object
98*5113495bSYour Name  *
99*5113495bSYour Name  * Return: current wall clock as ktime object
100*5113495bSYour Name  */
__qdf_ktime_real_get(void)101*5113495bSYour Name static inline ktime_t __qdf_ktime_real_get(void)
102*5113495bSYour Name {
103*5113495bSYour Name 	return ktime_get_real();
104*5113495bSYour Name }
105*5113495bSYour Name 
106*5113495bSYour Name /**
107*5113495bSYour Name  * __qdf_ktime_get_ns() - Gets the current time nano seconds
108*5113495bSYour Name  *
109*5113495bSYour Name  * Return: ktime in nano sec
110*5113495bSYour Name  */
__qdf_ktime_get_ns(void)111*5113495bSYour Name static inline ktime_t __qdf_ktime_get_ns(void)
112*5113495bSYour Name {
113*5113495bSYour Name 	return ktime_get_ns();
114*5113495bSYour Name }
115*5113495bSYour Name 
116*5113495bSYour Name /**
117*5113495bSYour Name  * __qdf_ktime_get_real_ns() - Gets the current time in ns using UTC
118*5113495bSYour Name  *
119*5113495bSYour Name  * Return: ktime in nano sec
120*5113495bSYour Name  */
__qdf_ktime_get_real_ns(void)121*5113495bSYour Name static inline ktime_t __qdf_ktime_get_real_ns(void)
122*5113495bSYour Name {
123*5113495bSYour Name 	return ktime_get_real_ns();
124*5113495bSYour Name }
125*5113495bSYour Name 
126*5113495bSYour Name /**
127*5113495bSYour Name  * __qdf_ktime_compare - compare two qdf_ktime_t objects
128*5113495bSYour Name  * @ktime1: time as qdf_ktime_t object
129*5113495bSYour Name  * @ktime2: time as qdf_ktime_t object
130*5113495bSYour Name  *
131*5113495bSYour Name  * Return:
132*5113495bSYour Name  * * ktime1  < ktime2 - return <0
133*5113495bSYour Name  * * ktime1 == ktime2 - return 0
134*5113495bSYour Name  * * ktime1  > ktime2 - return >0
135*5113495bSYour Name  */
__qdf_ktime_compare(ktime_t ktime1,ktime_t ktime2)136*5113495bSYour Name static inline int __qdf_ktime_compare(ktime_t ktime1, ktime_t ktime2)
137*5113495bSYour Name {
138*5113495bSYour Name 	return ktime_compare(ktime1, ktime2);
139*5113495bSYour Name }
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * __qdf_ktime_add_ns() - Adds ktime object and nanoseconds value and
143*5113495bSYour Name  *                        returns the ktime object
144*5113495bSYour Name  * @ktime: time as ktime object
145*5113495bSYour Name  * @ns: time in nanoseconds
146*5113495bSYour Name  *
147*5113495bSYour Name  * Return: ktime object
148*5113495bSYour Name  */
__qdf_ktime_add_ns(ktime_t ktime,int64_t ns)149*5113495bSYour Name static inline ktime_t __qdf_ktime_add_ns(ktime_t ktime, int64_t ns)
150*5113495bSYour Name {
151*5113495bSYour Name 	return ktime_add_ns(ktime, ns);
152*5113495bSYour Name }
153*5113495bSYour Name 
154*5113495bSYour Name /**
155*5113495bSYour Name  * __qdf_ktime_to_ns() - convert ktime to nanoseconds
156*5113495bSYour Name  * @ktime: time as ktime object
157*5113495bSYour Name  *
158*5113495bSYour Name  * Return: ktime in nanoseconds
159*5113495bSYour Name  */
__qdf_ktime_to_ns(ktime_t ktime)160*5113495bSYour Name static inline int64_t __qdf_ktime_to_ns(ktime_t ktime)
161*5113495bSYour Name {
162*5113495bSYour Name 	return ktime_to_ns(ktime);
163*5113495bSYour Name }
164*5113495bSYour Name 
165*5113495bSYour Name /**
166*5113495bSYour Name  * __qdf_ktime_to_ms() - convert ktime to milliseconds
167*5113495bSYour Name  * @ktime: time as ktime object
168*5113495bSYour Name  *
169*5113495bSYour Name  * Return: ktime in milliseconds
170*5113495bSYour Name  */
__qdf_ktime_to_ms(ktime_t ktime)171*5113495bSYour Name static inline int64_t __qdf_ktime_to_ms(ktime_t ktime)
172*5113495bSYour Name {
173*5113495bSYour Name 	return ktime_to_ms(ktime);
174*5113495bSYour Name }
175*5113495bSYour Name 
176*5113495bSYour Name /**
177*5113495bSYour Name  * __qdf_system_ticks() - get system ticks
178*5113495bSYour Name  *
179*5113495bSYour Name  * Return: system tick in jiffies
180*5113495bSYour Name  */
__qdf_system_ticks(void)181*5113495bSYour Name static inline __qdf_time_t __qdf_system_ticks(void)
182*5113495bSYour Name {
183*5113495bSYour Name 	return jiffies;
184*5113495bSYour Name }
185*5113495bSYour Name 
186*5113495bSYour Name #define __qdf_system_ticks_per_sec HZ
187*5113495bSYour Name /**
188*5113495bSYour Name  * __qdf_system_ticks_to_msecs() - convert system ticks into milli seconds
189*5113495bSYour Name  * @ticks: System ticks
190*5113495bSYour Name  *
191*5113495bSYour Name  * Return: system tick converted into milli seconds
192*5113495bSYour Name  */
__qdf_system_ticks_to_msecs(unsigned long ticks)193*5113495bSYour Name static inline uint32_t __qdf_system_ticks_to_msecs(unsigned long ticks)
194*5113495bSYour Name {
195*5113495bSYour Name 	return jiffies_to_msecs(ticks);
196*5113495bSYour Name }
197*5113495bSYour Name 
198*5113495bSYour Name /**
199*5113495bSYour Name  * __qdf_system_ticks_to_nsecs() - convert system ticks into nano seconds
200*5113495bSYour Name  * @ticks: System ticks
201*5113495bSYour Name  *
202*5113495bSYour Name  * Return: system tick converted into nano seconds
203*5113495bSYour Name  */
__qdf_system_ticks_to_nsecs(unsigned long ticks)204*5113495bSYour Name static inline uint32_t __qdf_system_ticks_to_nsecs(unsigned long ticks)
205*5113495bSYour Name {
206*5113495bSYour Name 	return jiffies_to_nsecs(ticks);
207*5113495bSYour Name }
208*5113495bSYour Name 
209*5113495bSYour Name /**
210*5113495bSYour Name  * __qdf_system_msecs_to_ticks() - convert milli seconds into system ticks
211*5113495bSYour Name  * @msecs: Milli seconds
212*5113495bSYour Name  *
213*5113495bSYour Name  * Return: milli seconds converted into system ticks
214*5113495bSYour Name  */
__qdf_system_msecs_to_ticks(uint32_t msecs)215*5113495bSYour Name static inline __qdf_time_t __qdf_system_msecs_to_ticks(uint32_t msecs)
216*5113495bSYour Name {
217*5113495bSYour Name 	return msecs_to_jiffies(msecs);
218*5113495bSYour Name }
219*5113495bSYour Name 
220*5113495bSYour Name /**
221*5113495bSYour Name  * __qdf_get_system_uptime() - get system uptime
222*5113495bSYour Name  *
223*5113495bSYour Name  * Return: system uptime in jiffies
224*5113495bSYour Name  */
__qdf_get_system_uptime(void)225*5113495bSYour Name static inline __qdf_time_t __qdf_get_system_uptime(void)
226*5113495bSYour Name {
227*5113495bSYour Name 	return jiffies;
228*5113495bSYour Name }
229*5113495bSYour Name 
__qdf_get_system_timestamp(void)230*5113495bSYour Name static inline unsigned long __qdf_get_system_timestamp(void)
231*5113495bSYour Name {
232*5113495bSYour Name 	return (jiffies / HZ) * 1000 + (jiffies % HZ) * (1000 / HZ);
233*5113495bSYour Name }
234*5113495bSYour Name 
235*5113495bSYour Name #ifdef CONFIG_ARM
236*5113495bSYour Name /**
237*5113495bSYour Name  * __qdf_udelay() - delay execution for given microseconds
238*5113495bSYour Name  * @usecs: Micro seconds to delay
239*5113495bSYour Name  *
240*5113495bSYour Name  * Return: none
241*5113495bSYour Name  */
__qdf_udelay(uint32_t usecs)242*5113495bSYour Name static inline void __qdf_udelay(uint32_t usecs)
243*5113495bSYour Name {
244*5113495bSYour Name 	/*
245*5113495bSYour Name 	 * This is in support of XScale build.  They have a limit on the udelay
246*5113495bSYour Name 	 * value, so we have to make sure we don't approach the limit
247*5113495bSYour Name 	 */
248*5113495bSYour Name 	uint32_t mticks;
249*5113495bSYour Name 	uint32_t leftover;
250*5113495bSYour Name 	int i;
251*5113495bSYour Name 	/* slice into 1024 usec chunks (simplifies calculation) */
252*5113495bSYour Name 	mticks = usecs >> 10;
253*5113495bSYour Name 	leftover = usecs - (mticks << 10);
254*5113495bSYour Name 	for (i = 0; i < mticks; i++)
255*5113495bSYour Name 		udelay(1024);
256*5113495bSYour Name 	udelay(leftover);
257*5113495bSYour Name }
258*5113495bSYour Name #else
__qdf_udelay(uint32_t usecs)259*5113495bSYour Name static inline void __qdf_udelay(uint32_t usecs)
260*5113495bSYour Name {
261*5113495bSYour Name 	/* Normal Delay functions. Time specified in microseconds */
262*5113495bSYour Name 	udelay(usecs);
263*5113495bSYour Name }
264*5113495bSYour Name #endif
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * __qdf_mdelay() - delay execution for given milliseconds
268*5113495bSYour Name  * @msecs: Milliseconds to delay
269*5113495bSYour Name  *
270*5113495bSYour Name  * Return: none
271*5113495bSYour Name  */
__qdf_mdelay(uint32_t msecs)272*5113495bSYour Name static inline void __qdf_mdelay(uint32_t msecs)
273*5113495bSYour Name {
274*5113495bSYour Name 	mdelay(msecs);
275*5113495bSYour Name }
276*5113495bSYour Name 
277*5113495bSYour Name /**
278*5113495bSYour Name  * __qdf_system_time_after() - Check if a is later than b
279*5113495bSYour Name  * @a: Time stamp value a
280*5113495bSYour Name  * @b: Time stamp value b
281*5113495bSYour Name  *
282*5113495bSYour Name  * Return:
283*5113495bSYour Name  * true if a > b else false
284*5113495bSYour Name  */
__qdf_system_time_after(__qdf_time_t a,__qdf_time_t b)285*5113495bSYour Name static inline bool __qdf_system_time_after(__qdf_time_t a, __qdf_time_t b)
286*5113495bSYour Name {
287*5113495bSYour Name 	return (long)((b) - (a)) < 0;
288*5113495bSYour Name }
289*5113495bSYour Name 
290*5113495bSYour Name /**
291*5113495bSYour Name  * __qdf_system_time_before() - Check if a is before b
292*5113495bSYour Name  * @a: Time stamp value a
293*5113495bSYour Name  * @b: Time stamp value b
294*5113495bSYour Name  *
295*5113495bSYour Name  * Return:
296*5113495bSYour Name  * true if a is before b else false
297*5113495bSYour Name  */
__qdf_system_time_before(__qdf_time_t a,__qdf_time_t b)298*5113495bSYour Name static inline bool __qdf_system_time_before(__qdf_time_t a, __qdf_time_t b)
299*5113495bSYour Name {
300*5113495bSYour Name 	return __qdf_system_time_after(b, a);
301*5113495bSYour Name }
302*5113495bSYour Name 
303*5113495bSYour Name /**
304*5113495bSYour Name  * __qdf_system_time_after_eq() - Check if a atleast as recent as b, if not
305*5113495bSYour Name  * later
306*5113495bSYour Name  * @a: Time stamp value a
307*5113495bSYour Name  * @b: Time stamp value b
308*5113495bSYour Name  *
309*5113495bSYour Name  * Return:
310*5113495bSYour Name  * true if a >= b else false
311*5113495bSYour Name  */
__qdf_system_time_after_eq(__qdf_time_t a,__qdf_time_t b)312*5113495bSYour Name static inline bool __qdf_system_time_after_eq(__qdf_time_t a, __qdf_time_t b)
313*5113495bSYour Name {
314*5113495bSYour Name 	return (long)((a) - (b)) >= 0;
315*5113495bSYour Name }
316*5113495bSYour Name 
317*5113495bSYour Name /**
318*5113495bSYour Name  * __qdf_sched_clock() - use light weight timer to get timestamp
319*5113495bSYour Name  *
320*5113495bSYour Name  * Return: timestamp in ns
321*5113495bSYour Name  */
__qdf_sched_clock(void)322*5113495bSYour Name static inline uint64_t __qdf_sched_clock(void)
323*5113495bSYour Name {
324*5113495bSYour Name 	return sched_clock();
325*5113495bSYour Name }
326*5113495bSYour Name 
327*5113495bSYour Name /**
328*5113495bSYour Name  * __qdf_get_monotonic_boottime() - get monotonic kernel boot time
329*5113495bSYour Name  * This API is similar to qdf_get_system_boottime but it includes
330*5113495bSYour Name  * time spent in suspend.
331*5113495bSYour Name  *
332*5113495bSYour Name  * Return: Time in microseconds
333*5113495bSYour Name  */
__qdf_get_monotonic_boottime(void)334*5113495bSYour Name static inline uint64_t __qdf_get_monotonic_boottime(void)
335*5113495bSYour Name {
336*5113495bSYour Name 	return (uint64_t)ktime_to_us(ktime_get_boottime());
337*5113495bSYour Name }
338*5113495bSYour Name 
339*5113495bSYour Name #if defined (MSM_PLATFORM)
340*5113495bSYour Name /**
341*5113495bSYour Name  * __qdf_get_log_timestamp() - get msm timer ticks
342*5113495bSYour Name  *
343*5113495bSYour Name  * Returns QTIMER(19.2 MHz) clock ticks. To convert it into seconds
344*5113495bSYour Name  * divide it by 19200.
345*5113495bSYour Name  *
346*5113495bSYour Name  * Return: QTIMER(19.2 MHz) clock ticks
347*5113495bSYour Name  */
348*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0))
__qdf_get_log_timestamp(void)349*5113495bSYour Name static inline uint64_t __qdf_get_log_timestamp(void)
350*5113495bSYour Name {
351*5113495bSYour Name 	return __arch_counter_get_cntvct();
352*5113495bSYour Name }
353*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
__qdf_get_log_timestamp(void)354*5113495bSYour Name static inline uint64_t __qdf_get_log_timestamp(void)
355*5113495bSYour Name {
356*5113495bSYour Name 	return arch_counter_get_cntvct();
357*5113495bSYour Name }
358*5113495bSYour Name #else
__qdf_get_log_timestamp(void)359*5113495bSYour Name static inline uint64_t __qdf_get_log_timestamp(void)
360*5113495bSYour Name {
361*5113495bSYour Name 	return arch_counter_get_cntpct();
362*5113495bSYour Name }
363*5113495bSYour Name #endif /* LINUX_VERSION_CODE */
364*5113495bSYour Name #else
365*5113495bSYour Name 
366*5113495bSYour Name /**
367*5113495bSYour Name  * __qdf_get_log_timestamp - get time stamp for logging
368*5113495bSYour Name  *
369*5113495bSYour Name  * Return: system tick for non MSM platforms
370*5113495bSYour Name  */
371*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
__qdf_get_log_timestamp(void)372*5113495bSYour Name static inline uint64_t __qdf_get_log_timestamp(void)
373*5113495bSYour Name {
374*5113495bSYour Name 	struct timespec64 ts;
375*5113495bSYour Name 
376*5113495bSYour Name 	ktime_get_ts64(&ts);
377*5113495bSYour Name 
378*5113495bSYour Name 	return ((uint64_t)ts.tv_sec * 1000000) + (ts.tv_nsec / 1000);
379*5113495bSYour Name }
380*5113495bSYour Name #else
__qdf_get_log_timestamp(void)381*5113495bSYour Name static inline uint64_t __qdf_get_log_timestamp(void)
382*5113495bSYour Name {
383*5113495bSYour Name 	struct timespec ts;
384*5113495bSYour Name 
385*5113495bSYour Name 	ktime_get_ts(&ts);
386*5113495bSYour Name 
387*5113495bSYour Name 	return ((uint64_t) ts.tv_sec * 1000000) + (ts.tv_nsec / 1000);
388*5113495bSYour Name }
389*5113495bSYour Name #endif
390*5113495bSYour Name #endif
391*5113495bSYour Name 
392*5113495bSYour Name /**
393*5113495bSYour Name  * __qdf_get_bootbased_boottime_ns() - Get the bootbased time in nanoseconds
394*5113495bSYour Name  *
395*5113495bSYour Name  * __qdf_get_bootbased_boottime_ns() function returns the number of nanoseconds
396*5113495bSYour Name  * that have elapsed since the system was booted. It also includes the time when
397*5113495bSYour Name  * system was suspended.
398*5113495bSYour Name  *
399*5113495bSYour Name  * Return:
400*5113495bSYour Name  * The time since system booted in nanoseconds
401*5113495bSYour Name  */
402*5113495bSYour Name 
403*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0))
__qdf_get_bootbased_boottime_ns(void)404*5113495bSYour Name static inline uint64_t __qdf_get_bootbased_boottime_ns(void)
405*5113495bSYour Name {
406*5113495bSYour Name 	return ktime_get_boottime_ns();
407*5113495bSYour Name }
408*5113495bSYour Name 
409*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
__qdf_get_bootbased_boottime_ns(void)410*5113495bSYour Name static inline uint64_t __qdf_get_bootbased_boottime_ns(void)
411*5113495bSYour Name {
412*5113495bSYour Name 	return ktime_get_boot_ns();
413*5113495bSYour Name }
414*5113495bSYour Name 
415*5113495bSYour Name #else
__qdf_get_bootbased_boottime_ns(void)416*5113495bSYour Name static inline uint64_t __qdf_get_bootbased_boottime_ns(void)
417*5113495bSYour Name {
418*5113495bSYour Name 	return ktime_to_ns(ktime_get_boottime());
419*5113495bSYour Name }
420*5113495bSYour Name #endif
421*5113495bSYour Name 
422*5113495bSYour Name /**
423*5113495bSYour Name  * __qdf_time_ms_to_ktime() - Converts milliseconds to a ktime object
424*5113495bSYour Name  * @ms: time in milliseconds
425*5113495bSYour Name  *
426*5113495bSYour Name  * Return: milliseconds as ktime object
427*5113495bSYour Name  */
__qdf_time_ms_to_ktime(uint64_t ms)428*5113495bSYour Name static inline ktime_t __qdf_time_ms_to_ktime(uint64_t ms)
429*5113495bSYour Name {
430*5113495bSYour Name 	return ms_to_ktime(ms);
431*5113495bSYour Name }
432*5113495bSYour Name 
433*5113495bSYour Name /**
434*5113495bSYour Name  * __qdf_time_ktime_real_get() - Gets the current wall clock as ktime object
435*5113495bSYour Name  *
436*5113495bSYour Name  * Return: current wall clock as ktime object
437*5113495bSYour Name  */
__qdf_time_ktime_real_get(void)438*5113495bSYour Name static inline ktime_t __qdf_time_ktime_real_get(void)
439*5113495bSYour Name {
440*5113495bSYour Name 	return ktime_get_real();
441*5113495bSYour Name }
442*5113495bSYour Name 
443*5113495bSYour Name /**
444*5113495bSYour Name  * __qdf_time_sched_clock() - schedule clock
445*5113495bSYour Name  *
446*5113495bSYour Name  * Return: returns current time in nanosec units.
447*5113495bSYour Name  */
__qdf_time_sched_clock(void)448*5113495bSYour Name static inline unsigned long long __qdf_time_sched_clock(void)
449*5113495bSYour Name {
450*5113495bSYour Name 	return sched_clock();
451*5113495bSYour Name }
452*5113495bSYour Name 
453*5113495bSYour Name /**
454*5113495bSYour Name  * __qdf_time_ktime_sub() - Subtract two ktime objects and returns
455*5113495bSYour Name  * a ktime object
456*5113495bSYour Name  * @ktime1: time as ktime object
457*5113495bSYour Name  * @ktime2: time as ktime object
458*5113495bSYour Name  *
459*5113495bSYour Name  * Return: subtraction of ktime objects as ktime object
460*5113495bSYour Name  */
__qdf_time_ktime_sub(ktime_t ktime1,ktime_t ktime2)461*5113495bSYour Name static inline ktime_t __qdf_time_ktime_sub(ktime_t ktime1, ktime_t ktime2)
462*5113495bSYour Name {
463*5113495bSYour Name 	return ktime_sub(ktime1, ktime2);
464*5113495bSYour Name }
465*5113495bSYour Name 
466*5113495bSYour Name /**
467*5113495bSYour Name  * __qdf_time_ktime_set() - Set a ktime_t variable from a seconds/nanoseconds
468*5113495bSYour Name  * value
469*5113495bSYour Name  * @secs: seconds to set
470*5113495bSYour Name  * @nsecs: nanoseconds to set
471*5113495bSYour Name  *
472*5113495bSYour Name  * Return: The ktime_t representation of the value.
473*5113495bSYour Name  */
__qdf_time_ktime_set(const s64 secs,const unsigned long nsecs)474*5113495bSYour Name static inline ktime_t __qdf_time_ktime_set(const s64 secs,
475*5113495bSYour Name 					   const unsigned long nsecs)
476*5113495bSYour Name {
477*5113495bSYour Name 	return ktime_set(secs, nsecs);
478*5113495bSYour Name }
479*5113495bSYour Name 
480*5113495bSYour Name /**
481*5113495bSYour Name  * __qdf_time_ktime_to_us() - Convert the ktime_t object into microseconds
482*5113495bSYour Name  * @ktime: time as ktime_t object
483*5113495bSYour Name  *
484*5113495bSYour Name  * Return: ktime_t in microseconds
485*5113495bSYour Name  */
__qdf_time_ktime_to_us(ktime_t ktime)486*5113495bSYour Name static inline int64_t __qdf_time_ktime_to_us(ktime_t ktime)
487*5113495bSYour Name {
488*5113495bSYour Name 	return ktime_to_us(ktime);
489*5113495bSYour Name }
490*5113495bSYour Name 
491*5113495bSYour Name /**
492*5113495bSYour Name  * __qdf_time_ktime_get_real_time() - Get the time of day in qdf_timespec_t
493*5113495bSYour Name  * @ts: pointer to the qdf_timespec_t to be set
494*5113495bSYour Name  *
495*5113495bSYour Name  * Return: none
496*5113495bSYour Name  */
497*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
__qdf_time_ktime_get_real_time(__qdf_timespec_t * ts)498*5113495bSYour Name static inline void __qdf_time_ktime_get_real_time(__qdf_timespec_t *ts)
499*5113495bSYour Name {
500*5113495bSYour Name 	ktime_get_real_ts64(ts);
501*5113495bSYour Name }
502*5113495bSYour Name #else
__qdf_time_ktime_get_real_time(__qdf_timespec_t * ts)503*5113495bSYour Name static inline void __qdf_time_ktime_get_real_time(__qdf_timespec_t *ts)
504*5113495bSYour Name {
505*5113495bSYour Name 	do_gettimeofday(ts);
506*5113495bSYour Name }
507*5113495bSYour Name #endif
508*5113495bSYour Name 
__qdf_usleep_range(unsigned long min,unsigned long max)509*5113495bSYour Name static inline void __qdf_usleep_range(unsigned long min, unsigned long max)
510*5113495bSYour Name {
511*5113495bSYour Name 	usleep_range(min, max);
512*5113495bSYour Name }
513*5113495bSYour Name #endif
514