xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/qdf_time.c (revision 5db38f17138c409346f0ba0d72e13640f35d04b5)
1 /*
2  * Copyright (c) 2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: qdf_time
22  * QCA driver framework (QDF) timer APIs
23  */
24 
25 #include <i_qdf_time.h>
26 #include "qdf_time.h"
27 #include <qdf_module.h>
28 
29 qdf_ktime_t qdf_ns_to_ktime(uint64_t ns)
30 {
31 	return __qdf_ns_to_ktime(ns);
32 }
33 
34 qdf_export_symbol(qdf_ns_to_ktime);
35 
36 qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
37 {
38 	return __qdf_ktime_add(ktime1, ktime2);
39 }
40 
41 qdf_export_symbol(qdf_ktime_add);
42 
43 qdf_ktime_t qdf_ktime_get(void)
44 {
45 	return __qdf_ktime_get();
46 }
47 
48 qdf_export_symbol(qdf_ktime_get);
49 
50 qdf_ktime_t qdf_ktime_real_get(void)
51 {
52 	return __qdf_ktime_real_get();
53 }
54 
55 qdf_export_symbol(qdf_ktime_real_get);
56 
57 qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns)
58 {
59 	return __qdf_ktime_add_ns(ktime, ns);
60 }
61 
62 qdf_export_symbol(qdf_ktime_add_ns);
63 
64 int64_t qdf_ktime_to_ms(qdf_ktime_t ktime)
65 {
66 	return __qdf_ktime_to_ms(ktime);
67 }
68 
69 qdf_export_symbol(qdf_ktime_to_ms);
70 
71 int64_t qdf_ktime_to_us(qdf_ktime_t ktime)
72 {
73 	return __qdf_time_ktime_to_us(ktime);
74 }
75 
76 qdf_export_symbol(qdf_ktime_to_us);
77 
78 int64_t qdf_ktime_to_ns(qdf_ktime_t ktime)
79 {
80 	return __qdf_ktime_to_ns(ktime);
81 }
82 
83 qdf_export_symbol(qdf_ktime_to_ns);
84 
85 qdf_ktime_t qdf_time_ktime_set(const s64 secs, const unsigned long nsecs)
86 {
87 	return __qdf_time_ktime_set(secs, nsecs);
88 }
89 
90 qdf_export_symbol(qdf_time_ktime_set);
91 
92 qdf_time_t qdf_system_ticks(void)
93 {
94 	return __qdf_system_ticks();
95 }
96 
97 qdf_export_symbol(qdf_system_ticks);
98 
99 uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks)
100 {
101 	return __qdf_system_ticks_to_msecs(clock_ticks);
102 }
103 
104 qdf_export_symbol(qdf_system_ticks_to_msecs);
105 
106 uint32_t qdf_system_ticks_to_nsecs(unsigned long clock_ticks)
107 {
108 	return __qdf_system_ticks_to_nsecs(clock_ticks);
109 }
110 
111 qdf_export_symbol(qdf_system_ticks_to_nsecs);
112 
113 qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs)
114 {
115 	return __qdf_system_msecs_to_ticks(msecs);
116 }
117 
118 qdf_export_symbol(qdf_system_msecs_to_ticks);
119 
120 qdf_time_t qdf_get_system_uptime(void)
121 {
122 	return __qdf_get_system_uptime();
123 }
124 
125 qdf_export_symbol(qdf_get_system_uptime);
126 
127 uint64_t qdf_get_bootbased_boottime_ns(void)
128 {
129 	return __qdf_get_bootbased_boottime_ns();
130 }
131 
132 qdf_export_symbol(qdf_get_bootbased_boottime_ns);
133 
134 unsigned long qdf_get_system_timestamp(void)
135 {
136 	return __qdf_get_system_timestamp();
137 }
138 
139 qdf_export_symbol(qdf_get_system_timestamp);
140 
141 void qdf_udelay(int usecs)
142 {
143 	__qdf_udelay(usecs);
144 }
145 
146 qdf_export_symbol(qdf_udelay);
147 
148 void qdf_mdelay(int msecs)
149 {
150 	__qdf_mdelay(msecs);
151 }
152 
153 qdf_export_symbol(qdf_mdelay);
154 
155 bool qdf_system_time_after(qdf_time_t a, qdf_time_t b)
156 {
157 	return __qdf_system_time_after(a, b);
158 }
159 
160 qdf_export_symbol(qdf_system_time_after);
161 
162 bool qdf_system_time_before(qdf_time_t a, qdf_time_t b)
163 {
164 	return __qdf_system_time_before(a, b);
165 }
166 
167 qdf_export_symbol(qdf_system_time_before);
168 
169 bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b)
170 {
171 	return __qdf_system_time_after_eq(a, b);
172 }
173 
174 qdf_export_symbol(qdf_system_time_after_eq);
175 
176 #ifdef MSM_PLATFORM
177 uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
178 {
179 	/*
180 	 * Try to preserve precision by multiplying by 10 first.
181 	 * If that would cause a wrap around, divide first instead.
182 	 */
183 	if (time * 10 < time) {
184 		do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
185 		return time * 10;
186 	}
187 
188 	time = time * 10;
189 	do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
190 
191 	return time;
192 }
193 
194 qdf_export_symbol(qdf_log_timestamp_to_usecs);
195 #else
196 uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
197 {
198 	/* timestamps are already in micro seconds */
199 	return time;
200 }
201 
202 qdf_export_symbol(qdf_log_timestamp_to_usecs);
203 #endif /* end of MSM_PLATFORM */
204 
205 void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs,
206 			       uint64_t *usecs)
207 {
208 	*secs = qdf_log_timestamp_to_usecs(time);
209 	*usecs = do_div(*secs, 1000000ul);
210 }
211 
212 qdf_export_symbol(qdf_log_timestamp_to_secs);
213 
214 uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs)
215 {
216 	uint64_t ts;
217 
218 	ts = (usecs * QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
219 
220 	do_div(ts, 10ul);
221 	return ts;
222 }
223 
224 qdf_export_symbol(qdf_usecs_to_log_timestamp);
225 
226 uint64_t qdf_get_log_timestamp(void)
227 {
228 	return __qdf_get_log_timestamp();
229 }
230 
231 qdf_export_symbol(qdf_get_log_timestamp);
232 
233 uint64_t qdf_get_log_timestamp_usecs(void)
234 {
235 	return qdf_log_timestamp_to_usecs(qdf_get_log_timestamp());
236 }
237 
238 qdf_export_symbol(qdf_get_log_timestamp_usecs);
239 
240 uint64_t qdf_get_monotonic_boottime(void)
241 {
242 	return __qdf_get_monotonic_boottime();
243 }
244 
245 qdf_export_symbol(qdf_get_monotonic_boottime);
246 
247 void qdf_time_ktime_get_real_time(qdf_timespec_t *ts)
248 {
249 	return __qdf_time_ktime_get_real_time(ts);
250 }
251 
252 qdf_export_symbol(qdf_time_ktime_get_real_time);
253 
254 unsigned long long qdf_time_sched_clock(void)
255 {
256 	return __qdf_time_sched_clock();
257 }
258 
259 qdf_export_symbol(qdf_time_sched_clock);
260 
261 void qdf_usleep_range(unsigned long min, unsigned long max)
262 {
263 	__qdf_usleep_range(min, max);
264 }
265 
266 qdf_export_symbol(qdf_usleep_range);
267 
268 qdf_ktime_t qdf_ktime_get_ns(void)
269 {
270 	return __qdf_ktime_get_ns();
271 }
272 
273 qdf_export_symbol(qdf_ktime_get_ns);
274 
275 qdf_ktime_t qdf_ktime_get_real_ns(void)
276 {
277 	return __qdf_ktime_get_real_ns();
278 }
279 
280 qdf_export_symbol(qdf_ktime_get_real_ns);
281 
282 int qdf_ktime_compare(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
283 {
284 	return __qdf_ktime_compare(ktime1, ktime2);
285 }
286 
287 qdf_export_symbol(qdf_ktime_compare);
288