xref: /wlan-driver/qca-wifi-host-cmn/qdf/inc/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: qdf_time
22*5113495bSYour Name  * This file abstracts time related functionality.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _QDF_OS_TIME_H
26*5113495bSYour Name #define _QDF_OS_TIME_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <i_qdf_time.h>
29*5113495bSYour Name 
30*5113495bSYour Name typedef __qdf_time_t qdf_time_t;
31*5113495bSYour Name typedef __qdf_ktime_t qdf_ktime_t;
32*5113495bSYour Name typedef __qdf_timespec_t qdf_timespec_t;
33*5113495bSYour Name typedef __qdf_work_struct_t qdf_work_struct_t;
34*5113495bSYour Name 
35*5113495bSYour Name #define qdf_time_uint_to_ms(tu) (((tu) * 1024) / 1000)
36*5113495bSYour Name 
37*5113495bSYour Name #ifdef ENHANCED_OS_ABSTRACTION
38*5113495bSYour Name /**
39*5113495bSYour Name  * qdf_ns_to_ktime() - Converts nanoseconds to a qdf_ktime_t object
40*5113495bSYour Name  * @ns: time in nanoseconds
41*5113495bSYour Name  *
42*5113495bSYour Name  * Return: nanoseconds as qdf_ktime_t object
43*5113495bSYour Name  */
44*5113495bSYour Name qdf_ktime_t qdf_ns_to_ktime(uint64_t ns);
45*5113495bSYour Name 
46*5113495bSYour Name /**
47*5113495bSYour Name  * qdf_ktime_add() - Adds two qdf_ktime_t objects and returns
48*5113495bSYour Name  * a qdf_ktime_t object
49*5113495bSYour Name  * @ktime1: time as qdf_ktime_t object
50*5113495bSYour Name  * @ktime2: time as qdf_ktime_t object
51*5113495bSYour Name  *
52*5113495bSYour Name  * Return: sum of both qdf_ktime_t as qdf_ktime_t object
53*5113495bSYour Name  */
54*5113495bSYour Name qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2);
55*5113495bSYour Name 
56*5113495bSYour Name /**
57*5113495bSYour Name  * qdf_ktime_get() - Gets the current time as qdf_ktime_t object
58*5113495bSYour Name  *
59*5113495bSYour Name  * Return: current time as qdf_ktime_t object
60*5113495bSYour Name  */
61*5113495bSYour Name qdf_ktime_t qdf_ktime_get(void);
62*5113495bSYour Name 
63*5113495bSYour Name /**
64*5113495bSYour Name  * qdf_ktime_real_get() - Gets the current wall clock as qdf_ktime_t object
65*5113495bSYour Name  *
66*5113495bSYour Name  * Return: current wall clock as qdf_ktime_t object
67*5113495bSYour Name  */
68*5113495bSYour Name qdf_ktime_t qdf_ktime_real_get(void);
69*5113495bSYour Name 
70*5113495bSYour Name /**
71*5113495bSYour Name  * qdf_ktime_add_ns() - Adds qdf_ktime_t object and nanoseconds value and
72*5113495bSYour Name  * returns the qdf_ktime_t object
73*5113495bSYour Name  * @ktime: time as qdf_ktime_t object
74*5113495bSYour Name  * @ns: time in nanoseconds
75*5113495bSYour Name  *
76*5113495bSYour Name  * Return: qdf_ktime_t object
77*5113495bSYour Name  */
78*5113495bSYour Name qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns);
79*5113495bSYour Name 
80*5113495bSYour Name /**
81*5113495bSYour Name  * qdf_ktime_to_ms() - Convert the qdf_ktime_t object into milliseconds
82*5113495bSYour Name  * @ktime: time as qdf_ktime_t object
83*5113495bSYour Name  *
84*5113495bSYour Name  * Return: qdf_ktime_t in milliseconds
85*5113495bSYour Name  */
86*5113495bSYour Name int64_t qdf_ktime_to_ms(qdf_ktime_t ktime);
87*5113495bSYour Name 
88*5113495bSYour Name /**
89*5113495bSYour Name  * qdf_ktime_to_us() - Convert the qdf_ktime_t object into microseconds
90*5113495bSYour Name  * @ktime: time as qdf_ktime_t object
91*5113495bSYour Name  *
92*5113495bSYour Name  * Return: qdf_ktime_t in microseconds
93*5113495bSYour Name  */
94*5113495bSYour Name int64_t qdf_ktime_to_us(qdf_ktime_t ktime);
95*5113495bSYour Name 
96*5113495bSYour Name /**
97*5113495bSYour Name  * qdf_ktime_to_ns() - Convert the qdf_ktime_t object into nanoseconds
98*5113495bSYour Name  * @ktime: time as qdf_ktime_t object
99*5113495bSYour Name  *
100*5113495bSYour Name  * Return: qdf_ktime_t in nanoseconds
101*5113495bSYour Name  */
102*5113495bSYour Name int64_t qdf_ktime_to_ns(qdf_ktime_t ktime);
103*5113495bSYour Name 
104*5113495bSYour Name /**
105*5113495bSYour Name  * qdf_time_ktime_set() - Set a ktime_t variable from a seconds/nanoseconds
106*5113495bSYour Name  * value
107*5113495bSYour Name  * @secs: seconds to set
108*5113495bSYour Name  * @nsecs: nanoseconds to set
109*5113495bSYour Name  *
110*5113495bSYour Name  * Return: The qdf_ktime_t representation of the value.
111*5113495bSYour Name  */
112*5113495bSYour Name qdf_ktime_t qdf_time_ktime_set(const s64 secs, const unsigned long nsecs);
113*5113495bSYour Name 
114*5113495bSYour Name /**
115*5113495bSYour Name  * qdf_ktime_get_real_ns() - Gets the current time in ns using UTC
116*5113495bSYour Name  *
117*5113495bSYour Name  * Return: qdf_ktime_t in nano sec
118*5113495bSYour Name  */
119*5113495bSYour Name qdf_ktime_t qdf_ktime_get_real_ns(void);
120*5113495bSYour Name 
121*5113495bSYour Name /**
122*5113495bSYour Name  * qdf_ktime_get_ns() - Gets the current time nano seconds
123*5113495bSYour Name  *
124*5113495bSYour Name  * Return: qdf_ktime_t in nano sec
125*5113495bSYour Name  */
126*5113495bSYour Name qdf_ktime_t qdf_ktime_get_ns(void);
127*5113495bSYour Name 
128*5113495bSYour Name /**
129*5113495bSYour Name  * qdf_system_ticks - Count the number of ticks elapsed from the time when
130*5113495bSYour Name  * the system booted
131*5113495bSYour Name  *
132*5113495bSYour Name  * Return: ticks
133*5113495bSYour Name  */
134*5113495bSYour Name qdf_time_t qdf_system_ticks(void);
135*5113495bSYour Name 
136*5113495bSYour Name #define qdf_system_ticks_per_sec __qdf_system_ticks_per_sec
137*5113495bSYour Name 
138*5113495bSYour Name /**
139*5113495bSYour Name  * qdf_system_ticks_to_msecs() - convert ticks to milliseconds
140*5113495bSYour Name  * @clock_ticks: Number of ticks
141*5113495bSYour Name  *
142*5113495bSYour Name  * Return: unsigned int Time in milliseconds
143*5113495bSYour Name  */
144*5113495bSYour Name uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks);
145*5113495bSYour Name 
146*5113495bSYour Name /**
147*5113495bSYour Name  * qdf_system_ticks_to_nsecs() - convert ticks to nanoseconds
148*5113495bSYour Name  * @clock_ticks: Number of ticks
149*5113495bSYour Name  *
150*5113495bSYour Name  * Return: unsigned int Time in nanoseconds
151*5113495bSYour Name  */
152*5113495bSYour Name uint32_t qdf_system_ticks_to_nsecs(unsigned long clock_ticks);
153*5113495bSYour Name 
154*5113495bSYour Name /**
155*5113495bSYour Name  * qdf_system_msecs_to_ticks() - convert milliseconds to ticks
156*5113495bSYour Name  * @msecs: Time in milliseconds
157*5113495bSYour Name  *
158*5113495bSYour Name  * Return: unsigned long number of ticks
159*5113495bSYour Name  */
160*5113495bSYour Name qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs);
161*5113495bSYour Name 
162*5113495bSYour Name /**
163*5113495bSYour Name  * qdf_get_system_uptime() - Return a monotonically increasing time
164*5113495bSYour Name  * This increments once per HZ ticks
165*5113495bSYour Name  *
166*5113495bSYour Name  * Return: qdf_time_t system up time in ticks
167*5113495bSYour Name  */
168*5113495bSYour Name qdf_time_t qdf_get_system_uptime(void);
169*5113495bSYour Name 
170*5113495bSYour Name /**
171*5113495bSYour Name  * qdf_get_bootbased_boottime_ns() - Get the bootbased time in nanoseconds
172*5113495bSYour Name  *
173*5113495bSYour Name  * qdf_get_bootbased_boottime_ns() function returns the number of nanoseconds
174*5113495bSYour Name  * that have elapsed since the system was booted. It also includes the time when
175*5113495bSYour Name  * system was suspended.
176*5113495bSYour Name  *
177*5113495bSYour Name  * Return:
178*5113495bSYour Name  * The time since system booted in nanoseconds
179*5113495bSYour Name  */
180*5113495bSYour Name uint64_t qdf_get_bootbased_boottime_ns(void);
181*5113495bSYour Name 
182*5113495bSYour Name /**
183*5113495bSYour Name  * qdf_get_system_timestamp() - Return current timestamp
184*5113495bSYour Name  *
185*5113495bSYour Name  * Return: unsigned long timestamp in ms.
186*5113495bSYour Name  */
187*5113495bSYour Name unsigned long qdf_get_system_timestamp(void);
188*5113495bSYour Name 
189*5113495bSYour Name /**
190*5113495bSYour Name  * qdf_udelay() - delay in microseconds
191*5113495bSYour Name  * @usecs: Number of microseconds to delay
192*5113495bSYour Name  *
193*5113495bSYour Name  * Return: none
194*5113495bSYour Name  */
195*5113495bSYour Name void qdf_udelay(int usecs);
196*5113495bSYour Name 
197*5113495bSYour Name /**
198*5113495bSYour Name  * qdf_mdelay() - Delay in milliseconds.
199*5113495bSYour Name  * @msecs: Number of milliseconds to delay
200*5113495bSYour Name  *
201*5113495bSYour Name  * Return: none
202*5113495bSYour Name  */
203*5113495bSYour Name void qdf_mdelay(int msecs);
204*5113495bSYour Name 
205*5113495bSYour Name /**
206*5113495bSYour Name  * qdf_system_time_after() - Check if a is later than b
207*5113495bSYour Name  * @a: Time stamp value a
208*5113495bSYour Name  * @b: Time stamp value b
209*5113495bSYour Name  *
210*5113495bSYour Name  * Return: true if a < b else false
211*5113495bSYour Name  */
212*5113495bSYour Name bool qdf_system_time_after(qdf_time_t a, qdf_time_t b);
213*5113495bSYour Name 
214*5113495bSYour Name /**
215*5113495bSYour Name  * qdf_system_time_before() - Check if a is before b
216*5113495bSYour Name  * @a: Time stamp value a
217*5113495bSYour Name  * @b: Time stamp value b
218*5113495bSYour Name  *
219*5113495bSYour Name  * Return: true if a is before b else false
220*5113495bSYour Name  */
221*5113495bSYour Name bool qdf_system_time_before(qdf_time_t a, qdf_time_t b);
222*5113495bSYour Name 
223*5113495bSYour Name /**
224*5113495bSYour Name  * qdf_system_time_after_eq() - Check if a atleast as recent as b, if not
225*5113495bSYour Name  * later
226*5113495bSYour Name  * @a: Time stamp value a
227*5113495bSYour Name  * @b: Time stamp value b
228*5113495bSYour Name  *
229*5113495bSYour Name  * Return: true if a >= b else false
230*5113495bSYour Name  */
231*5113495bSYour Name bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b);
232*5113495bSYour Name 
233*5113495bSYour Name /**
234*5113495bSYour Name  * enum qdf_timestamp_unit - what unit the qdf timestamp is in
235*5113495bSYour Name  * @KERNEL_LOG: boottime time in uS (micro seconds)
236*5113495bSYour Name  * @QTIMER: QTIME in (1/19200)S
237*5113495bSYour Name  *
238*5113495bSYour Name  * This enum is used to distinguish which timer source is used.
239*5113495bSYour Name  */
240*5113495bSYour Name enum qdf_timestamp_unit {
241*5113495bSYour Name 	KERNEL_LOG,
242*5113495bSYour Name 	QTIMER,
243*5113495bSYour Name };
244*5113495bSYour Name 
245*5113495bSYour Name #ifdef MSM_PLATFORM
246*5113495bSYour Name #define QDF_LOG_TIMESTAMP_UNIT QTIMER
247*5113495bSYour Name #define QDF_LOG_TIMESTAMP_CYCLES_PER_10_US 192
248*5113495bSYour Name #else
249*5113495bSYour Name #define QDF_LOG_TIMESTAMP_UNIT KERNEL_LOG
250*5113495bSYour Name #define QDF_LOG_TIMESTAMP_CYCLES_PER_10_US 10
251*5113495bSYour Name #endif /* end of MSM_PLATFORM */
252*5113495bSYour Name 
253*5113495bSYour Name uint64_t qdf_log_timestamp_to_usecs(uint64_t time);
254*5113495bSYour Name 
255*5113495bSYour Name /**
256*5113495bSYour Name  * qdf_log_timestamp_to_secs() - get time stamp for logging in seconds
257*5113495bSYour Name  * @time: logging timestamp
258*5113495bSYour Name  * @secs: pointer to write seconds
259*5113495bSYour Name  * @usecs: pointer to write microseconds
260*5113495bSYour Name  *
261*5113495bSYour Name  * Return: void. The normalized time is returned in @secs and @usecs
262*5113495bSYour Name  */
263*5113495bSYour Name void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs,
264*5113495bSYour Name 			       uint64_t *usecs);
265*5113495bSYour Name 
266*5113495bSYour Name uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs);
267*5113495bSYour Name 
268*5113495bSYour Name /**
269*5113495bSYour Name  * qdf_get_log_timestamp() - get time stamp for logging
270*5113495bSYour Name  * For adrastea this API returns QTIMER tick which is needed to synchronize
271*5113495bSYour Name  * host and fw log timestamps
272*5113495bSYour Name  * For ROME and other discrete solution this API returns system boot time stamp
273*5113495bSYour Name  *
274*5113495bSYour Name  * Return:
275*5113495bSYour Name  * QTIMER ticks(19.2MHz) for adrastea
276*5113495bSYour Name  * System tick for rome and other future discrete solutions
277*5113495bSYour Name  */
278*5113495bSYour Name uint64_t qdf_get_log_timestamp(void);
279*5113495bSYour Name 
280*5113495bSYour Name /**
281*5113495bSYour Name  * qdf_get_log_timestamp_usecs() - get time stamp for logging in microseconds
282*5113495bSYour Name  *
283*5113495bSYour Name  * Return: The current logging timestamp normalized to microsecond precision
284*5113495bSYour Name  */
285*5113495bSYour Name uint64_t qdf_get_log_timestamp_usecs(void);
286*5113495bSYour Name 
287*5113495bSYour Name /**
288*5113495bSYour Name  * qdf_get_log_timestamp_lightweight() - get time stamp for logging
289*5113495bSYour Name  */
290*5113495bSYour Name #define qdf_get_log_timestamp_lightweight() qdf_get_log_timestamp()
291*5113495bSYour Name 
292*5113495bSYour Name /**
293*5113495bSYour Name  * qdf_get_monotonic_boottime() - get monotonic kernel boot time
294*5113495bSYour Name  * This API is similar to qdf_get_system_boottime but it includes
295*5113495bSYour Name  * time spent in suspend.
296*5113495bSYour Name  *
297*5113495bSYour Name  * Return: Time in microseconds
298*5113495bSYour Name  */
299*5113495bSYour Name uint64_t qdf_get_monotonic_boottime(void);
300*5113495bSYour Name 
301*5113495bSYour Name /**
302*5113495bSYour Name  * qdf_time_ktime_get_real_time() - Get the time of day in qdf_timespec_t
303*5113495bSYour Name  * @ts: pointer to the qdf_timespec_t
304*5113495bSYour Name  *
305*5113495bSYour Name  * Return: None
306*5113495bSYour Name  */
307*5113495bSYour Name void qdf_time_ktime_get_real_time(qdf_timespec_t *ts);
308*5113495bSYour Name 
309*5113495bSYour Name /**
310*5113495bSYour Name  * qdf_time_sched_clock() - scheduler clock
311*5113495bSYour Name  *
312*5113495bSYour Name  * Return: current time in nanosec units.
313*5113495bSYour Name  */
314*5113495bSYour Name unsigned long long qdf_time_sched_clock(void);
315*5113495bSYour Name 
316*5113495bSYour Name /**
317*5113495bSYour Name  * qdf_usleep_range - introduce sleep with min and max time
318*5113495bSYour Name  * @min: Minimum time in usecs to sleep
319*5113495bSYour Name  * @max: Maximum time in usecs to sleep
320*5113495bSYour Name  *
321*5113495bSYour Name  * Return: none
322*5113495bSYour Name  */
323*5113495bSYour Name void qdf_usleep_range(unsigned long min, unsigned long max);
324*5113495bSYour Name 
325*5113495bSYour Name /**
326*5113495bSYour Name  *  qdf_ktime_compare - compare two qdf_ktime_t objects
327*5113495bSYour Name  *  @ktime1: time as qdf_ktime_t object
328*5113495bSYour Name  *  @ktime2: time as qdf_ktime_t object
329*5113495bSYour Name  *
330*5113495bSYour Name  *  Return:
331*5113495bSYour Name  * * ktime1  < ktime2 - return <0
332*5113495bSYour Name  * * ktime1 == ktime2 - return 0
333*5113495bSYour Name  * * ktime1  > ktime2 - return >0
334*5113495bSYour Name  */
335*5113495bSYour Name int qdf_ktime_compare(qdf_ktime_t ktime1, qdf_ktime_t ktime2);
336*5113495bSYour Name 
337*5113495bSYour Name #else
qdf_ns_to_ktime(uint64_t ns)338*5113495bSYour Name static inline qdf_ktime_t qdf_ns_to_ktime(uint64_t ns)
339*5113495bSYour Name {
340*5113495bSYour Name 	return __qdf_ns_to_ktime(ns);
341*5113495bSYour Name }
342*5113495bSYour Name 
qdf_ktime_add(qdf_ktime_t ktime1,qdf_ktime_t ktime2)343*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
344*5113495bSYour Name {
345*5113495bSYour Name 	return __qdf_ktime_add(ktime1, ktime2);
346*5113495bSYour Name }
347*5113495bSYour Name 
qdf_ktime_get(void)348*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_get(void)
349*5113495bSYour Name {
350*5113495bSYour Name 	return __qdf_ktime_get();
351*5113495bSYour Name }
352*5113495bSYour Name 
qdf_ktime_real_get(void)353*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_real_get(void)
354*5113495bSYour Name {
355*5113495bSYour Name 	return __qdf_ktime_real_get();
356*5113495bSYour Name }
357*5113495bSYour Name 
qdf_ktime_get_real_ns(void)358*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_get_real_ns(void)
359*5113495bSYour Name {
360*5113495bSYour Name 	return __qdf_ktime_get_real_ns();
361*5113495bSYour Name }
362*5113495bSYour Name 
qdf_ktime_get_ns(void)363*5113495bSYour Name static inline uint64_t qdf_ktime_get_ns(void)
364*5113495bSYour Name {
365*5113495bSYour Name 	return __qdf_ktime_get_ns();
366*5113495bSYour Name }
367*5113495bSYour Name 
qdf_ktime_compare(qdf_ktime_t ktime1,qdf_ktime_t ktime2)368*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_compare(qdf_ktime_t ktime1,
369*5113495bSYour Name 					    qdf_ktime_t ktime2)
370*5113495bSYour Name {
371*5113495bSYour Name 	return __qdf_ktime_compare(ktime1, ktime2);
372*5113495bSYour Name }
373*5113495bSYour Name 
qdf_ktime_add_ns(qdf_ktime_t ktime,int64_t ns)374*5113495bSYour Name static inline qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns)
375*5113495bSYour Name {
376*5113495bSYour Name 	return __qdf_ktime_add_ns(ktime, ns);
377*5113495bSYour Name }
378*5113495bSYour Name 
qdf_ktime_to_ms(qdf_ktime_t ktime)379*5113495bSYour Name static inline int64_t qdf_ktime_to_ms(qdf_ktime_t ktime)
380*5113495bSYour Name {
381*5113495bSYour Name 	return __qdf_ktime_to_ms(ktime);
382*5113495bSYour Name }
383*5113495bSYour Name 
qdf_ktime_to_us(qdf_ktime_t ktime)384*5113495bSYour Name static inline int64_t qdf_ktime_to_us(qdf_ktime_t ktime)
385*5113495bSYour Name {
386*5113495bSYour Name 	return __qdf_time_ktime_to_us(ktime);
387*5113495bSYour Name }
388*5113495bSYour Name 
qdf_ktime_to_ns(qdf_ktime_t ktime)389*5113495bSYour Name static inline int64_t qdf_ktime_to_ns(qdf_ktime_t ktime)
390*5113495bSYour Name {
391*5113495bSYour Name 	return __qdf_ktime_to_ns(ktime);
392*5113495bSYour Name }
393*5113495bSYour Name 
qdf_system_ticks(void)394*5113495bSYour Name static inline qdf_time_t qdf_system_ticks(void)
395*5113495bSYour Name {
396*5113495bSYour Name 	return __qdf_system_ticks();
397*5113495bSYour Name }
398*5113495bSYour Name 
399*5113495bSYour Name #define qdf_system_ticks_per_sec __qdf_system_ticks_per_sec
qdf_system_ticks_to_msecs(unsigned long clock_ticks)400*5113495bSYour Name static inline uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks)
401*5113495bSYour Name {
402*5113495bSYour Name 	return __qdf_system_ticks_to_msecs(clock_ticks);
403*5113495bSYour Name }
404*5113495bSYour Name 
qdf_system_msecs_to_ticks(uint32_t msecs)405*5113495bSYour Name static inline qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs)
406*5113495bSYour Name {
407*5113495bSYour Name 	return __qdf_system_msecs_to_ticks(msecs);
408*5113495bSYour Name }
409*5113495bSYour Name 
qdf_get_system_uptime(void)410*5113495bSYour Name static inline qdf_time_t qdf_get_system_uptime(void)
411*5113495bSYour Name {
412*5113495bSYour Name 	return __qdf_get_system_uptime();
413*5113495bSYour Name }
414*5113495bSYour Name 
qdf_get_bootbased_boottime_ns(void)415*5113495bSYour Name static inline uint64_t qdf_get_bootbased_boottime_ns(void)
416*5113495bSYour Name {
417*5113495bSYour Name 	return __qdf_get_bootbased_boottime_ns();
418*5113495bSYour Name }
419*5113495bSYour Name 
qdf_get_system_timestamp(void)420*5113495bSYour Name static inline unsigned long qdf_get_system_timestamp(void)
421*5113495bSYour Name {
422*5113495bSYour Name 	return __qdf_get_system_timestamp();
423*5113495bSYour Name }
424*5113495bSYour Name 
qdf_udelay(int usecs)425*5113495bSYour Name static inline void qdf_udelay(int usecs)
426*5113495bSYour Name {
427*5113495bSYour Name 	__qdf_udelay(usecs);
428*5113495bSYour Name }
429*5113495bSYour Name 
qdf_mdelay(int msecs)430*5113495bSYour Name static inline void qdf_mdelay(int msecs)
431*5113495bSYour Name {
432*5113495bSYour Name 	__qdf_mdelay(msecs);
433*5113495bSYour Name }
434*5113495bSYour Name 
qdf_system_time_after(qdf_time_t a,qdf_time_t b)435*5113495bSYour Name static inline bool qdf_system_time_after(qdf_time_t a, qdf_time_t b)
436*5113495bSYour Name {
437*5113495bSYour Name 	return __qdf_system_time_after(a, b);
438*5113495bSYour Name }
439*5113495bSYour Name 
qdf_system_time_before(qdf_time_t a,qdf_time_t b)440*5113495bSYour Name static inline bool qdf_system_time_before(qdf_time_t a, qdf_time_t b)
441*5113495bSYour Name {
442*5113495bSYour Name 	return __qdf_system_time_before(a, b);
443*5113495bSYour Name }
444*5113495bSYour Name 
qdf_system_time_after_eq(qdf_time_t a,qdf_time_t b)445*5113495bSYour Name static inline bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b)
446*5113495bSYour Name {
447*5113495bSYour Name 	return __qdf_system_time_after_eq(a, b);
448*5113495bSYour Name }
449*5113495bSYour Name 
450*5113495bSYour Name /**
451*5113495bSYour Name  * qdf_sched_clock() - use light weight timer to get timestamp for logging
452*5113495bSYour Name  *
453*5113495bSYour Name  * Return: timestamp in ns
454*5113495bSYour Name  */
qdf_sched_clock(void)455*5113495bSYour Name static inline uint64_t qdf_sched_clock(void)
456*5113495bSYour Name {
457*5113495bSYour Name 	return __qdf_sched_clock();
458*5113495bSYour Name }
459*5113495bSYour Name 
460*5113495bSYour Name /**
461*5113495bSYour Name  * enum qdf_timestamp_unit - what unit the qdf timestamp is in
462*5113495bSYour Name  * @KERNEL_LOG: boottime time in uS (micro seconds)
463*5113495bSYour Name  * @QTIMER: QTIME in (1/19200)S
464*5113495bSYour Name  *
465*5113495bSYour Name  * This enum is used to distinguish which timer source is used.
466*5113495bSYour Name  */
467*5113495bSYour Name enum qdf_timestamp_unit {
468*5113495bSYour Name 	KERNEL_LOG,
469*5113495bSYour Name 	QTIMER,
470*5113495bSYour Name };
471*5113495bSYour Name 
472*5113495bSYour Name #ifdef MSM_PLATFORM
473*5113495bSYour Name #define QDF_LOG_TIMESTAMP_UNIT QTIMER
474*5113495bSYour Name #define QDF_LOG_TIMESTAMP_CYCLES_PER_10_US 192
475*5113495bSYour Name 
qdf_log_timestamp_to_usecs(uint64_t time)476*5113495bSYour Name static inline uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
477*5113495bSYour Name {
478*5113495bSYour Name 	/*
479*5113495bSYour Name 	 * Try to preserve precision by multiplying by 10 first.
480*5113495bSYour Name 	 * If that would cause a wrap around, divide first instead.
481*5113495bSYour Name 	 */
482*5113495bSYour Name 	if (time * 10 < time) {
483*5113495bSYour Name 		do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
484*5113495bSYour Name 		return time * 10;
485*5113495bSYour Name 	}
486*5113495bSYour Name 
487*5113495bSYour Name 	time = time * 10;
488*5113495bSYour Name 	do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
489*5113495bSYour Name 
490*5113495bSYour Name 	return time;
491*5113495bSYour Name }
492*5113495bSYour Name 
493*5113495bSYour Name /**
494*5113495bSYour Name  * qdf_get_log_timestamp_lightweight() - get time stamp for logging
495*5113495bSYour Name  * For adrastea this API returns QTIMER tick which is needed to synchronize
496*5113495bSYour Name  * host and fw log timestamps
497*5113495bSYour Name  * For ROME and other discrete solution this API returns system boot time stamp
498*5113495bSYour Name  *
499*5113495bSYour Name  * Return:
500*5113495bSYour Name  * QTIMER ticks(19.2MHz) for adrastea
501*5113495bSYour Name  * System tick for rome and other 3rd party platform solutions
502*5113495bSYour Name  */
qdf_get_log_timestamp_lightweight(void)503*5113495bSYour Name static inline uint64_t qdf_get_log_timestamp_lightweight(void)
504*5113495bSYour Name {
505*5113495bSYour Name 	return __qdf_get_log_timestamp();
506*5113495bSYour Name }
507*5113495bSYour Name #else
508*5113495bSYour Name #define QDF_LOG_TIMESTAMP_UNIT KERNEL_LOG
509*5113495bSYour Name #define QDF_LOG_TIMESTAMP_CYCLES_PER_10_US 10
510*5113495bSYour Name 
qdf_log_timestamp_to_usecs(uint64_t time)511*5113495bSYour Name static inline uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
512*5113495bSYour Name {
513*5113495bSYour Name 	/* timestamps are already in micro seconds */
514*5113495bSYour Name 	return time;
515*5113495bSYour Name }
516*5113495bSYour Name 
qdf_get_log_timestamp_lightweight(void)517*5113495bSYour Name static inline uint64_t qdf_get_log_timestamp_lightweight(void)
518*5113495bSYour Name {
519*5113495bSYour Name 	uint64_t timestamp_us;
520*5113495bSYour Name 
521*5113495bSYour Name 	/* explicitly change to uint64_t, otherwise it will assign
522*5113495bSYour Name 	 * uint32_t to timestamp_us, which lose high 32bits.
523*5113495bSYour Name 	 * on 64bit platform, it will only use low 32bits jiffies in
524*5113495bSYour Name 	 * jiffies_to_msecs.
525*5113495bSYour Name 	 * eg: HZ=250, it will overflow every (0xffff ffff<<2==0x3fff ffff)
526*5113495bSYour Name 	 * ticks. it is 1193 hours.
527*5113495bSYour Name 	 */
528*5113495bSYour Name 	timestamp_us =
529*5113495bSYour Name 	(uint64_t)__qdf_system_ticks_to_msecs(qdf_system_ticks()) * 1000;
530*5113495bSYour Name 	return timestamp_us;
531*5113495bSYour Name }
532*5113495bSYour Name #endif /* end of MSM_PLATFORM */
533*5113495bSYour Name 
qdf_log_timestamp_to_secs(uint64_t time,uint64_t * secs,uint64_t * usecs)534*5113495bSYour Name static inline void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs,
535*5113495bSYour Name 					     uint64_t *usecs)
536*5113495bSYour Name {
537*5113495bSYour Name 	*secs = qdf_log_timestamp_to_usecs(time);
538*5113495bSYour Name 	*usecs = do_div(*secs, 1000000ul);
539*5113495bSYour Name }
540*5113495bSYour Name 
qdf_usecs_to_log_timestamp(uint64_t usecs)541*5113495bSYour Name static inline uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs)
542*5113495bSYour Name {
543*5113495bSYour Name 	return (usecs * QDF_LOG_TIMESTAMP_CYCLES_PER_10_US) / 10;
544*5113495bSYour Name }
545*5113495bSYour Name 
qdf_get_log_timestamp(void)546*5113495bSYour Name static inline uint64_t qdf_get_log_timestamp(void)
547*5113495bSYour Name {
548*5113495bSYour Name 	return __qdf_get_log_timestamp();
549*5113495bSYour Name }
550*5113495bSYour Name 
qdf_get_log_timestamp_usecs(void)551*5113495bSYour Name static inline uint64_t qdf_get_log_timestamp_usecs(void)
552*5113495bSYour Name {
553*5113495bSYour Name 	return qdf_log_timestamp_to_usecs(qdf_get_log_timestamp());
554*5113495bSYour Name }
555*5113495bSYour Name 
qdf_get_monotonic_boottime(void)556*5113495bSYour Name static inline uint64_t qdf_get_monotonic_boottime(void)
557*5113495bSYour Name {
558*5113495bSYour Name 	return __qdf_get_monotonic_boottime();
559*5113495bSYour Name }
560*5113495bSYour Name 
qdf_time_ktime_get_real_time(qdf_timespec_t * ts)561*5113495bSYour Name static inline void qdf_time_ktime_get_real_time(qdf_timespec_t *ts)
562*5113495bSYour Name {
563*5113495bSYour Name 	return __qdf_time_ktime_get_real_time(ts);
564*5113495bSYour Name }
565*5113495bSYour Name 
qdf_time_sched_clock(void)566*5113495bSYour Name static inline unsigned long long qdf_time_sched_clock(void)
567*5113495bSYour Name {
568*5113495bSYour Name 	return __qdf_time_sched_clock();
569*5113495bSYour Name }
570*5113495bSYour Name 
qdf_usleep_range(unsigned long min,unsigned long max)571*5113495bSYour Name static inline void qdf_usleep_range(unsigned long min, unsigned long max)
572*5113495bSYour Name {
573*5113495bSYour Name 	__qdf_usleep_range(min, max);
574*5113495bSYour Name }
575*5113495bSYour Name #endif
576*5113495bSYour Name #endif
577