ufs-qcom-trace.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #undef TRACE_SYSTEM
  6. #define TRACE_SYSTEM ufsqcom
  7. #if !defined(_TRACE_UFS_QCOM_H) || defined(TRACE_HEADER_MULTI_READ)
  8. #define _TRACE_UFS_QCOM_H
  9. #include <linux/tracepoint.h>
  10. #define str_opcode(opcode) \
  11. __print_symbolic(opcode, \
  12. { WRITE_16, "WRITE_16" }, \
  13. { WRITE_10, "WRITE_10" }, \
  14. { READ_16, "READ_16" }, \
  15. { READ_10, "READ_10" }, \
  16. { SYNCHRONIZE_CACHE, "SYNC" }, \
  17. { UNMAP, "UNMAP" })
  18. #define UFS_NOTIFY_CHANGE_STATUS \
  19. EM(PRE_CHANGE, "PRE_CHANGE") \
  20. EMe(POST_CHANGE, "POST_CHANGE")
  21. #define UFS_PM_OP \
  22. EM(UFS_RUNTIME_PM, "UFS_RUNTIME_PM") \
  23. EM(UFS_SYSTEM_PM, "UFS_SYSTEM_PM") \
  24. EMe(UFS_SHUTDOWN_PM, "UFS_SHUTDOWN_PM")
  25. #define UFS_LINK_STATES \
  26. EM(UIC_LINK_OFF_STATE, "UIC_LINK_OFF_STATE") \
  27. EM(UIC_LINK_ACTIVE_STATE, "UIC_LINK_ACTIVE_STATE") \
  28. EM(UIC_LINK_HIBERN8_STATE, "UIC_LINK_HIBERN8_STATE") \
  29. EMe(UIC_LINK_BROKEN_STATE, "UIC_LINK_BROKEN_STATE")
  30. #define UFS_PWR_MODES \
  31. EM(UFS_ACTIVE_PWR_MODE, "UFS_ACTIVE_PWR_MODE") \
  32. EM(UFS_SLEEP_PWR_MODE, "UFS_SLEEP_PWR_MODE") \
  33. EM(UFS_POWERDOWN_PWR_MODE, "UFS_POWERDOWN_PWR_MODE") \
  34. EMe(UFS_DEEPSLEEP_PWR_MODE, "UFS_DEEPSLEEP_PWR_MODE")
  35. #define UFS_CMD_TRACE_STRINGS \
  36. EM(UFS_CMD_SEND, "send_req") \
  37. EM(UFS_CMD_COMP, "complete_rsp") \
  38. EM(UFS_DEV_COMP, "dev_complete") \
  39. EM(UFS_QUERY_SEND, "query_send") \
  40. EM(UFS_QUERY_COMP, "query_complete") \
  41. EM(UFS_QUERY_ERR, "query_complete_err") \
  42. EM(UFS_TM_SEND, "tm_send") \
  43. EM(UFS_TM_COMP, "tm_complete") \
  44. EMe(UFS_TM_ERR, "tm_complete_err")
  45. /* Enums require being exported to userspace, for user tool parsing */
  46. #undef EM
  47. #undef EMe
  48. #define EM(a, b) TRACE_DEFINE_ENUM(a);
  49. #define EMe(a, b) TRACE_DEFINE_ENUM(a);
  50. UFS_NOTIFY_CHANGE_STATUS;
  51. UFS_PM_OP;
  52. UFS_LINK_STATES;
  53. UFS_PWR_MODES;
  54. UFS_CMD_TRACE_STRINGS;
  55. /*
  56. * Now redefine the EM() and EMe() macros to map the enums to the strings
  57. * that will be printed in the output.
  58. */
  59. #undef EM
  60. #undef EMe
  61. #define EM(a, b) {a, b},
  62. #define EMe(a, b) {a, b}
  63. TRACE_EVENT(ufs_qcom_pwr_change_notify,
  64. TP_PROTO(const char *dev_name, int status, u32 gear_rx, u32 pwr_rx,
  65. u32 hs_rate, int err),
  66. TP_ARGS(dev_name, status, gear_rx, pwr_rx, hs_rate, err),
  67. TP_STRUCT__entry(
  68. __string(dev_name, dev_name)
  69. __field(int, status)
  70. __field(u32, gear_rx)
  71. __field(u32, pwr_rx)
  72. __field(u32, hs_rate)
  73. __field(int, err)
  74. ),
  75. TP_fast_assign(
  76. __assign_str(dev_name, dev_name);
  77. __entry->status = status;
  78. __entry->gear_rx = gear_rx;
  79. __entry->pwr_rx = pwr_rx;
  80. __entry->hs_rate = hs_rate;
  81. __entry->err = err;
  82. ),
  83. TP_printk("%s: status = %s, gear_rx = %d, pwr_rx = %d, hs_rate = %d, err = %d",
  84. __get_str(dev_name),
  85. __print_symbolic(__entry->status, UFS_NOTIFY_CHANGE_STATUS),
  86. __entry->gear_rx,
  87. __entry->pwr_rx,
  88. __entry->hs_rate,
  89. __entry->err)
  90. );
  91. TRACE_EVENT(ufs_qcom_command,
  92. TP_PROTO(const char *dev_name, int cmd_t, u8 opcode,
  93. unsigned int tag, u32 doorbell, int size),
  94. TP_ARGS(dev_name, cmd_t, opcode, tag, doorbell, size),
  95. TP_STRUCT__entry(
  96. __string(dev_name, dev_name)
  97. __field(int, cmd_t)
  98. __field(u8, opcode)
  99. __field(int, tag)
  100. __field(u32, doorbell)
  101. __field(int, size)
  102. ),
  103. TP_fast_assign(
  104. __assign_str(dev_name, dev_name);
  105. __entry->cmd_t = cmd_t;
  106. __entry->opcode = opcode;
  107. __entry->tag = tag;
  108. __entry->doorbell = doorbell;
  109. __entry->size = size;
  110. ),
  111. TP_printk(
  112. "%s: %s: tag: %d, DB: 0x%x, size: %d, opcode: 0x%x (%s)",
  113. __get_str(dev_name),
  114. __print_symbolic(__entry->cmd_t, UFS_CMD_TRACE_STRINGS),
  115. __entry->tag,
  116. __entry->doorbell,
  117. __entry->size,
  118. (u32)__entry->opcode,
  119. str_opcode(__entry->opcode)
  120. )
  121. );
  122. TRACE_EVENT(ufs_qcom_uic,
  123. TP_PROTO(const char *dev_name, int cmd_t, u32 cmd,
  124. u32 arg1, u32 arg2, u32 arg3),
  125. TP_ARGS(dev_name, cmd_t, cmd, arg1, arg2, arg3),
  126. TP_STRUCT__entry(
  127. __string(dev_name, dev_name)
  128. __field(int, cmd_t)
  129. __field(u32, cmd)
  130. __field(u32, arg1)
  131. __field(u32, arg2)
  132. __field(u32, arg3)
  133. ),
  134. TP_fast_assign(
  135. __assign_str(dev_name, dev_name);
  136. __entry->cmd_t = cmd_t;
  137. __entry->cmd = cmd;
  138. __entry->arg1 = arg1;
  139. __entry->arg2 = arg2;
  140. __entry->arg3 = arg3;
  141. ),
  142. TP_printk(
  143. "%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x",
  144. __get_str(dev_name),
  145. __print_symbolic(__entry->cmd_t, UFS_CMD_TRACE_STRINGS),
  146. __entry->cmd,
  147. __entry->arg1,
  148. __entry->arg2,
  149. __entry->arg3
  150. )
  151. );
  152. TRACE_EVENT(ufs_qcom_hook_check_int_errors,
  153. TP_PROTO(const char *dev_name, u32 err, u32 uic_err),
  154. TP_ARGS(dev_name, err, uic_err),
  155. TP_STRUCT__entry(
  156. __string(dev_name, dev_name)
  157. __field(u32, err)
  158. __field(u32, uic_err)
  159. ),
  160. TP_fast_assign(
  161. __assign_str(dev_name, dev_name);
  162. __entry->err = err;
  163. __entry->uic_err = uic_err;
  164. ),
  165. TP_printk(
  166. "%s: err: 0x%x, uic_err: 0x%x",
  167. __get_str(dev_name),
  168. __entry->err,
  169. __entry->uic_err
  170. )
  171. );
  172. TRACE_EVENT(ufs_qcom_shutdown,
  173. TP_PROTO(const char *dev_name),
  174. TP_ARGS(dev_name),
  175. TP_STRUCT__entry(
  176. __string(dev_name, dev_name)
  177. ),
  178. TP_fast_assign(
  179. __assign_str(dev_name, dev_name);
  180. ),
  181. TP_printk(
  182. "%s: Going to Shutdown!",
  183. __get_str(dev_name)
  184. )
  185. );
  186. DECLARE_EVENT_CLASS(ufs_qcom_clk_template,
  187. TP_PROTO(const char *dev_name, int status, bool on, int err),
  188. TP_ARGS(dev_name, status, on, err),
  189. TP_STRUCT__entry(
  190. __string(dev_name, dev_name)
  191. __field(int, status)
  192. __field(bool, on)
  193. __field(int, err)
  194. ),
  195. TP_fast_assign(
  196. __assign_str(dev_name, dev_name);
  197. __entry->status = status;
  198. __entry->on = on;
  199. __entry->err = err;
  200. ),
  201. TP_printk("%s: status = %s, on= %d, err = %d",
  202. __get_str(dev_name),
  203. __print_symbolic(__entry->status, UFS_NOTIFY_CHANGE_STATUS),
  204. __entry->on,
  205. __entry->err)
  206. );
  207. DEFINE_EVENT(ufs_qcom_clk_template, ufs_qcom_setup_clocks,
  208. TP_PROTO(const char *dev_name, int status, bool on, int err),
  209. TP_ARGS(dev_name, status, on, err));
  210. DEFINE_EVENT(ufs_qcom_clk_template, ufs_qcom_clk_scale_notify,
  211. TP_PROTO(const char *dev_name, int status, bool on, int err),
  212. TP_ARGS(dev_name, status, on, err));
  213. DECLARE_EVENT_CLASS(ufs_qcom_noify_template,
  214. TP_PROTO(const char *dev_name, int status, int err),
  215. TP_ARGS(dev_name, status, err),
  216. TP_STRUCT__entry(
  217. __string(dev_name, dev_name)
  218. __field(int, status)
  219. __field(int, err)
  220. ),
  221. TP_fast_assign(
  222. __assign_str(dev_name, dev_name);
  223. __entry->status = status;
  224. __entry->err = err;
  225. ),
  226. TP_printk("%s: status = %s, err = %d",
  227. __get_str(dev_name),
  228. __print_symbolic(__entry->status, UFS_NOTIFY_CHANGE_STATUS),
  229. __entry->err)
  230. );
  231. DEFINE_EVENT(ufs_qcom_noify_template, ufs_qcom_hce_enable_notify,
  232. TP_PROTO(const char *dev_name, int status, int err),
  233. TP_ARGS(dev_name, status, err));
  234. DEFINE_EVENT(ufs_qcom_noify_template, ufs_qcom_link_startup_notify,
  235. TP_PROTO(const char *dev_name, int status, int err),
  236. TP_ARGS(dev_name, status, err));
  237. DECLARE_EVENT_CLASS(ufs_qcom_pm_template,
  238. TP_PROTO(const char *dev_name, int pm_op, int rpm_lvl, int spm_lvl,
  239. int uic_link_state, int curr_dev_pwr_mode, int err),
  240. TP_ARGS(dev_name, pm_op, rpm_lvl, spm_lvl, uic_link_state,
  241. curr_dev_pwr_mode, err),
  242. TP_STRUCT__entry(
  243. __string(dev_name, dev_name)
  244. __field(int, pm_op)
  245. __field(int, rpm_lvl)
  246. __field(int, spm_lvl)
  247. __field(int, uic_link_state)
  248. __field(int, curr_dev_pwr_mode)
  249. __field(int, err)
  250. ),
  251. TP_fast_assign(
  252. __assign_str(dev_name, dev_name);
  253. __entry->pm_op = pm_op;
  254. __entry->rpm_lvl = rpm_lvl;
  255. __entry->spm_lvl = spm_lvl;
  256. __entry->uic_link_state = uic_link_state;
  257. __entry->curr_dev_pwr_mode = curr_dev_pwr_mode;
  258. __entry->err = err;
  259. ),
  260. TP_printk(
  261. "%s: pm_op = %s, rpm_lvl = %d, spm_lvl = %d, link_state = %s, dev_pwr_mode = %d, err = %d",
  262. __get_str(dev_name),
  263. __print_symbolic(__entry->pm_op, UFS_PM_OP),
  264. __entry->rpm_lvl,
  265. __entry->spm_lvl,
  266. __print_symbolic(__entry->uic_link_state, UFS_LINK_STATES),
  267. __print_symbolic(__entry->curr_dev_pwr_mode, UFS_PWR_MODES),
  268. __entry->err
  269. )
  270. );
  271. DEFINE_EVENT(ufs_qcom_pm_template, ufs_qcom_suspend,
  272. TP_PROTO(const char *dev_name, int pm_op, int rpm_lvl, int spm_lvl,
  273. int uic_link_state, int curr_dev_pwr_mode, int err),
  274. TP_ARGS(dev_name, pm_op, rpm_lvl, spm_lvl, uic_link_state,
  275. curr_dev_pwr_mode, err));
  276. DEFINE_EVENT(ufs_qcom_pm_template, ufs_qcom_resume,
  277. TP_PROTO(const char *dev_name, int pm_op, int rpm_lvl, int spm_lvl,
  278. int uic_link_state, int curr_dev_pwr_mode, int err),
  279. TP_ARGS(dev_name, pm_op, rpm_lvl, spm_lvl, uic_link_state,
  280. curr_dev_pwr_mode, err));
  281. #endif /* if !defined(_TRACE_UFS_QCOM_H) || defined(TRACE_HEADER_MULTI_READ) */
  282. #undef TRACE_INCLUDE_PATH
  283. #define TRACE_INCLUDE_PATH ../../drivers/ufs/host
  284. #undef TRACE_INCLUDE_FILE
  285. #define TRACE_INCLUDE_FILE ufs-qcom-trace
  286. /* This part must be outside protection */
  287. #include <trace/define_trace.h>