ufs_trace.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  4. */
  5. #undef TRACE_SYSTEM
  6. #define TRACE_SYSTEM ufs
  7. #if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ)
  8. #define _TRACE_UFS_H
  9. #include <ufs/ufs.h>
  10. #include <linux/tracepoint.h>
  11. #define str_opcode(opcode) \
  12. __print_symbolic(opcode, \
  13. { WRITE_16, "WRITE_16" }, \
  14. { WRITE_10, "WRITE_10" }, \
  15. { READ_16, "READ_16" }, \
  16. { READ_10, "READ_10" }, \
  17. { SYNCHRONIZE_CACHE, "SYNC" }, \
  18. { UNMAP, "UNMAP" })
  19. #define UFS_LINK_STATES \
  20. EM(UIC_LINK_OFF_STATE, "UIC_LINK_OFF_STATE") \
  21. EM(UIC_LINK_ACTIVE_STATE, "UIC_LINK_ACTIVE_STATE") \
  22. EMe(UIC_LINK_HIBERN8_STATE, "UIC_LINK_HIBERN8_STATE")
  23. #define UFS_PWR_MODES \
  24. EM(UFS_ACTIVE_PWR_MODE, "UFS_ACTIVE_PWR_MODE") \
  25. EM(UFS_SLEEP_PWR_MODE, "UFS_SLEEP_PWR_MODE") \
  26. EM(UFS_POWERDOWN_PWR_MODE, "UFS_POWERDOWN_PWR_MODE") \
  27. EMe(UFS_DEEPSLEEP_PWR_MODE, "UFS_DEEPSLEEP_PWR_MODE")
  28. #define UFSCHD_CLK_GATING_STATES \
  29. EM(CLKS_OFF, "CLKS_OFF") \
  30. EM(CLKS_ON, "CLKS_ON") \
  31. EM(REQ_CLKS_OFF, "REQ_CLKS_OFF") \
  32. EMe(REQ_CLKS_ON, "REQ_CLKS_ON")
  33. #define UFS_CMD_TRACE_STRINGS \
  34. EM(UFS_CMD_SEND, "send_req") \
  35. EM(UFS_CMD_COMP, "complete_rsp") \
  36. EM(UFS_DEV_COMP, "dev_complete") \
  37. EM(UFS_QUERY_SEND, "query_send") \
  38. EM(UFS_QUERY_COMP, "query_complete") \
  39. EM(UFS_QUERY_ERR, "query_complete_err") \
  40. EM(UFS_TM_SEND, "tm_send") \
  41. EM(UFS_TM_COMP, "tm_complete") \
  42. EMe(UFS_TM_ERR, "tm_complete_err")
  43. #define UFS_CMD_TRACE_TSF_TYPES \
  44. EM(UFS_TSF_CDB, "CDB") \
  45. EM(UFS_TSF_OSF, "OSF") \
  46. EM(UFS_TSF_TM_INPUT, "TM_INPUT") \
  47. EMe(UFS_TSF_TM_OUTPUT, "TM_OUTPUT")
  48. /* Enums require being exported to userspace, for user tool parsing */
  49. #undef EM
  50. #undef EMe
  51. #define EM(a, b) TRACE_DEFINE_ENUM(a);
  52. #define EMe(a, b) TRACE_DEFINE_ENUM(a);
  53. UFS_LINK_STATES;
  54. UFS_PWR_MODES;
  55. UFSCHD_CLK_GATING_STATES;
  56. UFS_CMD_TRACE_STRINGS
  57. UFS_CMD_TRACE_TSF_TYPES
  58. /*
  59. * Now redefine the EM() and EMe() macros to map the enums to the strings
  60. * that will be printed in the output.
  61. */
  62. #undef EM
  63. #undef EMe
  64. #define EM(a, b) {a, b},
  65. #define EMe(a, b) {a, b}
  66. #define show_ufs_cmd_trace_str(str_t) \
  67. __print_symbolic(str_t, UFS_CMD_TRACE_STRINGS)
  68. #define show_ufs_cmd_trace_tsf(tsf) \
  69. __print_symbolic(tsf, UFS_CMD_TRACE_TSF_TYPES)
  70. TRACE_EVENT(ufshcd_clk_gating,
  71. TP_PROTO(const char *dev_name, int state),
  72. TP_ARGS(dev_name, state),
  73. TP_STRUCT__entry(
  74. __string(dev_name, dev_name)
  75. __field(int, state)
  76. ),
  77. TP_fast_assign(
  78. __assign_str(dev_name);
  79. __entry->state = state;
  80. ),
  81. TP_printk("%s: gating state changed to %s",
  82. __get_str(dev_name),
  83. __print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES))
  84. );
  85. TRACE_EVENT(ufshcd_clk_scaling,
  86. TP_PROTO(const char *dev_name, const char *state, const char *clk,
  87. u32 prev_state, u32 curr_state),
  88. TP_ARGS(dev_name, state, clk, prev_state, curr_state),
  89. TP_STRUCT__entry(
  90. __string(dev_name, dev_name)
  91. __string(state, state)
  92. __string(clk, clk)
  93. __field(u32, prev_state)
  94. __field(u32, curr_state)
  95. ),
  96. TP_fast_assign(
  97. __assign_str(dev_name);
  98. __assign_str(state);
  99. __assign_str(clk);
  100. __entry->prev_state = prev_state;
  101. __entry->curr_state = curr_state;
  102. ),
  103. TP_printk("%s: %s %s from %u to %u Hz",
  104. __get_str(dev_name), __get_str(state), __get_str(clk),
  105. __entry->prev_state, __entry->curr_state)
  106. );
  107. TRACE_EVENT(ufshcd_auto_bkops_state,
  108. TP_PROTO(const char *dev_name, const char *state),
  109. TP_ARGS(dev_name, state),
  110. TP_STRUCT__entry(
  111. __string(dev_name, dev_name)
  112. __string(state, state)
  113. ),
  114. TP_fast_assign(
  115. __assign_str(dev_name);
  116. __assign_str(state);
  117. ),
  118. TP_printk("%s: auto bkops - %s",
  119. __get_str(dev_name), __get_str(state))
  120. );
  121. DECLARE_EVENT_CLASS(ufshcd_profiling_template,
  122. TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
  123. int err),
  124. TP_ARGS(dev_name, profile_info, time_us, err),
  125. TP_STRUCT__entry(
  126. __string(dev_name, dev_name)
  127. __string(profile_info, profile_info)
  128. __field(s64, time_us)
  129. __field(int, err)
  130. ),
  131. TP_fast_assign(
  132. __assign_str(dev_name);
  133. __assign_str(profile_info);
  134. __entry->time_us = time_us;
  135. __entry->err = err;
  136. ),
  137. TP_printk("%s: %s: took %lld usecs, err %d",
  138. __get_str(dev_name), __get_str(profile_info),
  139. __entry->time_us, __entry->err)
  140. );
  141. DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8,
  142. TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
  143. int err),
  144. TP_ARGS(dev_name, profile_info, time_us, err));
  145. DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating,
  146. TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
  147. int err),
  148. TP_ARGS(dev_name, profile_info, time_us, err));
  149. DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling,
  150. TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
  151. int err),
  152. TP_ARGS(dev_name, profile_info, time_us, err));
  153. DECLARE_EVENT_CLASS(ufshcd_template,
  154. TP_PROTO(const char *dev_name, int err, s64 usecs,
  155. int dev_state, int link_state),
  156. TP_ARGS(dev_name, err, usecs, dev_state, link_state),
  157. TP_STRUCT__entry(
  158. __field(s64, usecs)
  159. __field(int, err)
  160. __string(dev_name, dev_name)
  161. __field(int, dev_state)
  162. __field(int, link_state)
  163. ),
  164. TP_fast_assign(
  165. __entry->usecs = usecs;
  166. __entry->err = err;
  167. __assign_str(dev_name);
  168. __entry->dev_state = dev_state;
  169. __entry->link_state = link_state;
  170. ),
  171. TP_printk(
  172. "%s: took %lld usecs, dev_state: %s, link_state: %s, err %d",
  173. __get_str(dev_name),
  174. __entry->usecs,
  175. __print_symbolic(__entry->dev_state, UFS_PWR_MODES),
  176. __print_symbolic(__entry->link_state, UFS_LINK_STATES),
  177. __entry->err
  178. )
  179. );
  180. DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend,
  181. TP_PROTO(const char *dev_name, int err, s64 usecs,
  182. int dev_state, int link_state),
  183. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  184. DEFINE_EVENT(ufshcd_template, ufshcd_system_resume,
  185. TP_PROTO(const char *dev_name, int err, s64 usecs,
  186. int dev_state, int link_state),
  187. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  188. DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend,
  189. TP_PROTO(const char *dev_name, int err, s64 usecs,
  190. int dev_state, int link_state),
  191. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  192. DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume,
  193. TP_PROTO(const char *dev_name, int err, s64 usecs,
  194. int dev_state, int link_state),
  195. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  196. DEFINE_EVENT(ufshcd_template, ufshcd_init,
  197. TP_PROTO(const char *dev_name, int err, s64 usecs,
  198. int dev_state, int link_state),
  199. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  200. DEFINE_EVENT(ufshcd_template, ufshcd_wl_suspend,
  201. TP_PROTO(const char *dev_name, int err, s64 usecs,
  202. int dev_state, int link_state),
  203. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  204. DEFINE_EVENT(ufshcd_template, ufshcd_wl_resume,
  205. TP_PROTO(const char *dev_name, int err, s64 usecs,
  206. int dev_state, int link_state),
  207. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  208. DEFINE_EVENT(ufshcd_template, ufshcd_wl_runtime_suspend,
  209. TP_PROTO(const char *dev_name, int err, s64 usecs,
  210. int dev_state, int link_state),
  211. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  212. DEFINE_EVENT(ufshcd_template, ufshcd_wl_runtime_resume,
  213. TP_PROTO(const char *dev_name, int err, s64 usecs,
  214. int dev_state, int link_state),
  215. TP_ARGS(dev_name, err, usecs, dev_state, link_state));
  216. TRACE_EVENT(ufshcd_command,
  217. TP_PROTO(struct scsi_device *sdev, enum ufs_trace_str_t str_t,
  218. unsigned int tag, u32 doorbell, u32 hwq_id, int transfer_len,
  219. u32 intr, u64 lba, u8 opcode, u8 group_id),
  220. TP_ARGS(sdev, str_t, tag, doorbell, hwq_id, transfer_len, intr, lba,
  221. opcode, group_id),
  222. TP_STRUCT__entry(
  223. __field(struct scsi_device *, sdev)
  224. __field(enum ufs_trace_str_t, str_t)
  225. __field(unsigned int, tag)
  226. __field(u32, doorbell)
  227. __field(u32, hwq_id)
  228. __field(u32, intr)
  229. __field(u64, lba)
  230. __field(int, transfer_len)
  231. __field(u8, opcode)
  232. __field(u8, group_id)
  233. ),
  234. TP_fast_assign(
  235. __entry->sdev = sdev;
  236. __entry->str_t = str_t;
  237. __entry->tag = tag;
  238. __entry->doorbell = doorbell;
  239. __entry->hwq_id = hwq_id;
  240. __entry->intr = intr;
  241. __entry->lba = lba;
  242. __entry->transfer_len = transfer_len;
  243. __entry->opcode = opcode;
  244. __entry->group_id = group_id;
  245. ),
  246. TP_printk(
  247. "%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x, hwq_id: %d",
  248. show_ufs_cmd_trace_str(__entry->str_t),
  249. dev_name(&__entry->sdev->sdev_dev), __entry->tag,
  250. __entry->doorbell, __entry->transfer_len, __entry->intr,
  251. __entry->lba, (u32)__entry->opcode, str_opcode(__entry->opcode),
  252. (u32)__entry->group_id, __entry->hwq_id
  253. )
  254. );
  255. TRACE_EVENT(ufshcd_uic_command,
  256. TP_PROTO(const char *dev_name, enum ufs_trace_str_t str_t, u32 cmd,
  257. u32 arg1, u32 arg2, u32 arg3),
  258. TP_ARGS(dev_name, str_t, cmd, arg1, arg2, arg3),
  259. TP_STRUCT__entry(
  260. __string(dev_name, dev_name)
  261. __field(enum ufs_trace_str_t, str_t)
  262. __field(u32, cmd)
  263. __field(u32, arg1)
  264. __field(u32, arg2)
  265. __field(u32, arg3)
  266. ),
  267. TP_fast_assign(
  268. __assign_str(dev_name);
  269. __entry->str_t = str_t;
  270. __entry->cmd = cmd;
  271. __entry->arg1 = arg1;
  272. __entry->arg2 = arg2;
  273. __entry->arg3 = arg3;
  274. ),
  275. TP_printk(
  276. "%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x",
  277. show_ufs_cmd_trace_str(__entry->str_t), __get_str(dev_name),
  278. __entry->cmd, __entry->arg1, __entry->arg2, __entry->arg3
  279. )
  280. );
  281. TRACE_EVENT(ufshcd_upiu,
  282. TP_PROTO(const char *dev_name, enum ufs_trace_str_t str_t, void *hdr,
  283. void *tsf, enum ufs_trace_tsf_t tsf_t),
  284. TP_ARGS(dev_name, str_t, hdr, tsf, tsf_t),
  285. TP_STRUCT__entry(
  286. __string(dev_name, dev_name)
  287. __field(enum ufs_trace_str_t, str_t)
  288. __array(unsigned char, hdr, 12)
  289. __array(unsigned char, tsf, 16)
  290. __field(enum ufs_trace_tsf_t, tsf_t)
  291. ),
  292. TP_fast_assign(
  293. __assign_str(dev_name);
  294. __entry->str_t = str_t;
  295. memcpy(__entry->hdr, hdr, sizeof(__entry->hdr));
  296. memcpy(__entry->tsf, tsf, sizeof(__entry->tsf));
  297. __entry->tsf_t = tsf_t;
  298. ),
  299. TP_printk(
  300. "%s: %s: HDR:%s, %s:%s",
  301. show_ufs_cmd_trace_str(__entry->str_t), __get_str(dev_name),
  302. __print_hex(__entry->hdr, sizeof(__entry->hdr)),
  303. show_ufs_cmd_trace_tsf(__entry->tsf_t),
  304. __print_hex(__entry->tsf, sizeof(__entry->tsf))
  305. )
  306. );
  307. TRACE_EVENT(ufshcd_exception_event,
  308. TP_PROTO(const char *dev_name, u16 status),
  309. TP_ARGS(dev_name, status),
  310. TP_STRUCT__entry(
  311. __string(dev_name, dev_name)
  312. __field(u16, status)
  313. ),
  314. TP_fast_assign(
  315. __assign_str(dev_name);
  316. __entry->status = status;
  317. ),
  318. TP_printk("%s: status 0x%x",
  319. __get_str(dev_name), __entry->status
  320. )
  321. );
  322. #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */
  323. #undef TRACE_INCLUDE_PATH
  324. #define TRACE_INCLUDE_PATH ../../drivers/ufs/core
  325. #undef TRACE_INCLUDE_FILE
  326. #define TRACE_INCLUDE_FILE ufs_trace
  327. /* This part must be outside protection */
  328. #include <trace/define_trace.h>