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