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