qdf_time.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. * DOC: qdf_time
  21. * QCA driver framework (QDF) timer APIs
  22. */
  23. #include <i_qdf_time.h>
  24. #include "qdf_time.h"
  25. #include <qdf_module.h>
  26. qdf_ktime_t qdf_ns_to_ktime(uint64_t ns)
  27. {
  28. return __qdf_ns_to_ktime(ns);
  29. }
  30. qdf_export_symbol(qdf_ns_to_ktime);
  31. qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
  32. {
  33. return __qdf_ktime_add(ktime1, ktime2);
  34. }
  35. qdf_export_symbol(qdf_ktime_add);
  36. qdf_ktime_t qdf_ktime_get(void)
  37. {
  38. return __qdf_ktime_get();
  39. }
  40. qdf_export_symbol(qdf_ktime_get);
  41. qdf_ktime_t qdf_ktime_real_get(void)
  42. {
  43. return __qdf_ktime_real_get();
  44. }
  45. qdf_export_symbol(qdf_ktime_real_get);
  46. qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns)
  47. {
  48. return __qdf_ktime_add_ns(ktime, ns);
  49. }
  50. qdf_export_symbol(qdf_ktime_add_ns);
  51. int64_t qdf_ktime_to_ms(qdf_ktime_t ktime)
  52. {
  53. return __qdf_ktime_to_ms(ktime);
  54. }
  55. qdf_export_symbol(qdf_ktime_to_ms);
  56. int64_t qdf_ktime_to_us(qdf_ktime_t ktime)
  57. {
  58. return __qdf_time_ktime_to_us(ktime);
  59. }
  60. qdf_export_symbol(qdf_ktime_to_us);
  61. int64_t qdf_ktime_to_ns(qdf_ktime_t ktime)
  62. {
  63. return __qdf_ktime_to_ns(ktime);
  64. }
  65. qdf_export_symbol(qdf_ktime_to_ns);
  66. qdf_ktime_t qdf_time_ktime_set(const s64 secs, const unsigned long nsecs)
  67. {
  68. return __qdf_time_ktime_set(secs, nsecs);
  69. }
  70. qdf_export_symbol(qdf_time_ktime_set);
  71. qdf_time_t qdf_system_ticks(void)
  72. {
  73. return __qdf_system_ticks();
  74. }
  75. qdf_export_symbol(qdf_system_ticks);
  76. uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks)
  77. {
  78. return __qdf_system_ticks_to_msecs(clock_ticks);
  79. }
  80. qdf_export_symbol(qdf_system_ticks_to_msecs);
  81. uint32_t qdf_system_ticks_to_nsecs(unsigned long clock_ticks)
  82. {
  83. return __qdf_system_ticks_to_nsecs(clock_ticks);
  84. }
  85. qdf_export_symbol(qdf_system_ticks_to_nsecs);
  86. qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs)
  87. {
  88. return __qdf_system_msecs_to_ticks(msecs);
  89. }
  90. qdf_export_symbol(qdf_system_msecs_to_ticks);
  91. qdf_time_t qdf_get_system_uptime(void)
  92. {
  93. return __qdf_get_system_uptime();
  94. }
  95. qdf_export_symbol(qdf_get_system_uptime);
  96. uint64_t qdf_get_bootbased_boottime_ns(void)
  97. {
  98. return __qdf_get_bootbased_boottime_ns();
  99. }
  100. qdf_export_symbol(qdf_get_bootbased_boottime_ns);
  101. unsigned long qdf_get_system_timestamp(void)
  102. {
  103. return __qdf_get_system_timestamp();
  104. }
  105. qdf_export_symbol(qdf_get_system_timestamp);
  106. void qdf_udelay(int usecs)
  107. {
  108. __qdf_udelay(usecs);
  109. }
  110. qdf_export_symbol(qdf_udelay);
  111. void qdf_mdelay(int msecs)
  112. {
  113. __qdf_mdelay(msecs);
  114. }
  115. qdf_export_symbol(qdf_mdelay);
  116. bool qdf_system_time_after(qdf_time_t a, qdf_time_t b)
  117. {
  118. return __qdf_system_time_after(a, b);
  119. }
  120. qdf_export_symbol(qdf_system_time_after);
  121. bool qdf_system_time_before(qdf_time_t a, qdf_time_t b)
  122. {
  123. return __qdf_system_time_before(a, b);
  124. }
  125. qdf_export_symbol(qdf_system_time_before);
  126. bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b)
  127. {
  128. return __qdf_system_time_after_eq(a, b);
  129. }
  130. qdf_export_symbol(qdf_system_time_after_eq);
  131. #ifdef MSM_PLATFORM
  132. uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
  133. {
  134. /*
  135. * Try to preserve precision by multiplying by 10 first.
  136. * If that would cause a wrap around, divide first instead.
  137. */
  138. if (time * 10 < time) {
  139. do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
  140. return time * 10;
  141. }
  142. time = time * 10;
  143. do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
  144. return time;
  145. }
  146. qdf_export_symbol(qdf_log_timestamp_to_usecs);
  147. #else
  148. uint64_t qdf_log_timestamp_to_usecs(uint64_t time)
  149. {
  150. /* timestamps are already in micro seconds */
  151. return time;
  152. }
  153. qdf_export_symbol(qdf_log_timestamp_to_usecs);
  154. #endif /* end of MSM_PLATFORM */
  155. void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs,
  156. uint64_t *usecs)
  157. {
  158. *secs = qdf_log_timestamp_to_usecs(time);
  159. *usecs = do_div(*secs, 1000000ul);
  160. }
  161. qdf_export_symbol(qdf_log_timestamp_to_secs);
  162. uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs)
  163. {
  164. uint64_t ts;
  165. ts = (usecs * QDF_LOG_TIMESTAMP_CYCLES_PER_10_US);
  166. return do_div(ts, 10ul);
  167. }
  168. qdf_export_symbol(qdf_usecs_to_log_timestamp);
  169. uint64_t qdf_get_log_timestamp(void)
  170. {
  171. return __qdf_get_log_timestamp();
  172. }
  173. qdf_export_symbol(qdf_get_log_timestamp);
  174. uint64_t qdf_get_log_timestamp_usecs(void)
  175. {
  176. return qdf_log_timestamp_to_usecs(qdf_get_log_timestamp());
  177. }
  178. qdf_export_symbol(qdf_get_log_timestamp_usecs);
  179. uint64_t qdf_get_monotonic_boottime(void)
  180. {
  181. return __qdf_get_monotonic_boottime();
  182. }
  183. qdf_export_symbol(qdf_get_monotonic_boottime);
  184. void qdf_time_ktime_get_real_time(qdf_timespec_t *ts)
  185. {
  186. return __qdf_time_ktime_get_real_time(ts);
  187. }
  188. qdf_export_symbol(qdf_time_ktime_get_real_time);
  189. unsigned long long qdf_time_sched_clock(void)
  190. {
  191. return __qdf_time_sched_clock();
  192. }
  193. qdf_export_symbol(qdf_time_sched_clock);
  194. void qdf_usleep_range(unsigned long min, unsigned long max)
  195. {
  196. __qdf_usleep_range(min, max);
  197. }
  198. qdf_export_symbol(qdf_usleep_range);
  199. qdf_ktime_t qdf_ktime_get_ns(void)
  200. {
  201. return __qdf_ktime_get_ns();
  202. }
  203. qdf_export_symbol(qdf_ktime_get_ns);
  204. qdf_ktime_t qdf_ktime_get_real_ns(void)
  205. {
  206. return __qdf_ktime_get_real_ns();
  207. }
  208. qdf_export_symbol(qdf_ktime_get_real_ns);
  209. int qdf_ktime_compare(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
  210. {
  211. return __qdf_ktime_compare(ktime1, ktime2);
  212. }
  213. qdf_export_symbol(qdf_ktime_compare);