1 /* 2 * Copyright (c) 2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022 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_time_t qdf_system_ticks(void) 86 { 87 return __qdf_system_ticks(); 88 } 89 90 qdf_export_symbol(qdf_system_ticks); 91 92 uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks) 93 { 94 return __qdf_system_ticks_to_msecs(clock_ticks); 95 } 96 97 qdf_export_symbol(qdf_system_ticks_to_msecs); 98 99 qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs) 100 { 101 return __qdf_system_msecs_to_ticks(msecs); 102 } 103 104 qdf_export_symbol(qdf_system_msecs_to_ticks); 105 106 qdf_time_t qdf_get_system_uptime(void) 107 { 108 return __qdf_get_system_uptime(); 109 } 110 111 qdf_export_symbol(qdf_get_system_uptime); 112 113 uint64_t qdf_get_bootbased_boottime_ns(void) 114 { 115 return __qdf_get_bootbased_boottime_ns(); 116 } 117 118 qdf_export_symbol(qdf_get_bootbased_boottime_ns); 119 120 unsigned long qdf_get_system_timestamp(void) 121 { 122 return __qdf_get_system_timestamp(); 123 } 124 125 qdf_export_symbol(qdf_get_system_timestamp); 126 127 void qdf_udelay(int usecs) 128 { 129 __qdf_udelay(usecs); 130 } 131 132 qdf_export_symbol(qdf_udelay); 133 134 void qdf_mdelay(int msecs) 135 { 136 __qdf_mdelay(msecs); 137 } 138 139 qdf_export_symbol(qdf_mdelay); 140 141 bool qdf_system_time_after(qdf_time_t a, qdf_time_t b) 142 { 143 return __qdf_system_time_after(a, b); 144 } 145 146 qdf_export_symbol(qdf_system_time_after); 147 148 bool qdf_system_time_before(qdf_time_t a, qdf_time_t b) 149 { 150 return __qdf_system_time_before(a, b); 151 } 152 153 qdf_export_symbol(qdf_system_time_before); 154 155 bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b) 156 { 157 return __qdf_system_time_after_eq(a, b); 158 } 159 160 qdf_export_symbol(qdf_system_time_after_eq); 161 162 #ifdef MSM_PLATFORM 163 uint64_t qdf_log_timestamp_to_usecs(uint64_t time) 164 { 165 /* 166 * Try to preserve precision by multiplying by 10 first. 167 * If that would cause a wrap around, divide first instead. 168 */ 169 if (time * 10 < time) { 170 do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); 171 return time * 10; 172 } 173 174 time = time * 10; 175 do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); 176 177 return time; 178 } 179 180 qdf_export_symbol(qdf_log_timestamp_to_usecs); 181 #else 182 uint64_t qdf_log_timestamp_to_usecs(uint64_t time) 183 { 184 /* timestamps are already in micro seconds */ 185 return time; 186 } 187 188 qdf_export_symbol(qdf_log_timestamp_to_usecs); 189 #endif /* end of MSM_PLATFORM */ 190 191 void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs, 192 uint64_t *usecs) 193 { 194 *secs = qdf_log_timestamp_to_usecs(time); 195 *usecs = do_div(*secs, 1000000ul); 196 } 197 198 qdf_export_symbol(qdf_log_timestamp_to_secs); 199 200 uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs) 201 { 202 uint64_t ts; 203 204 ts = (usecs * QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); 205 206 return do_div(ts, 10ul); 207 } 208 209 qdf_export_symbol(qdf_usecs_to_log_timestamp); 210 211 uint64_t qdf_get_log_timestamp(void) 212 { 213 return __qdf_get_log_timestamp(); 214 } 215 216 qdf_export_symbol(qdf_get_log_timestamp); 217 218 uint64_t qdf_get_log_timestamp_usecs(void) 219 { 220 return qdf_log_timestamp_to_usecs(qdf_get_log_timestamp()); 221 } 222 223 qdf_export_symbol(qdf_get_log_timestamp_usecs); 224 225 uint64_t qdf_get_monotonic_boottime(void) 226 { 227 return __qdf_get_monotonic_boottime(); 228 } 229 230 qdf_export_symbol(qdf_get_monotonic_boottime); 231 232 void qdf_time_ktime_get_real_time(qdf_timespec_t *ts) 233 { 234 return __qdf_time_ktime_get_real_time(ts); 235 } 236 237 qdf_export_symbol(qdf_time_ktime_get_real_time); 238 239 unsigned long long qdf_time_sched_clock(void) 240 { 241 return __qdf_time_sched_clock(); 242 } 243 244 qdf_export_symbol(qdf_time_sched_clock); 245