libata-trace.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * libata-trace.c - trace functions for libata
  4. *
  5. * Copyright 2015 Hannes Reinecke
  6. * Copyright 2015 SUSE Linux GmbH
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/trace_seq.h>
  10. #include <trace/events/libata.h>
  11. const char *
  12. libata_trace_parse_status(struct trace_seq *p, unsigned char status)
  13. {
  14. const char *ret = trace_seq_buffer_ptr(p);
  15. trace_seq_printf(p, "{ ");
  16. if (status & ATA_BUSY)
  17. trace_seq_printf(p, "BUSY ");
  18. if (status & ATA_DRDY)
  19. trace_seq_printf(p, "DRDY ");
  20. if (status & ATA_DF)
  21. trace_seq_printf(p, "DF ");
  22. if (status & ATA_DSC)
  23. trace_seq_printf(p, "DSC ");
  24. if (status & ATA_DRQ)
  25. trace_seq_printf(p, "DRQ ");
  26. if (status & ATA_CORR)
  27. trace_seq_printf(p, "CORR ");
  28. if (status & ATA_SENSE)
  29. trace_seq_printf(p, "SENSE ");
  30. if (status & ATA_ERR)
  31. trace_seq_printf(p, "ERR ");
  32. trace_seq_putc(p, '}');
  33. trace_seq_putc(p, 0);
  34. return ret;
  35. }
  36. const char *
  37. libata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat)
  38. {
  39. const char *ret = trace_seq_buffer_ptr(p);
  40. trace_seq_printf(p, "{ ");
  41. if (host_stat & ATA_DMA_INTR)
  42. trace_seq_printf(p, "INTR ");
  43. if (host_stat & ATA_DMA_ERR)
  44. trace_seq_printf(p, "ERR ");
  45. if (host_stat & ATA_DMA_ACTIVE)
  46. trace_seq_printf(p, "ACTIVE ");
  47. trace_seq_putc(p, '}');
  48. trace_seq_putc(p, 0);
  49. return ret;
  50. }
  51. const char *
  52. libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)
  53. {
  54. const char *ret = trace_seq_buffer_ptr(p);
  55. trace_seq_printf(p, "%x", eh_action);
  56. if (eh_action) {
  57. trace_seq_printf(p, "{ ");
  58. if (eh_action & ATA_EH_REVALIDATE)
  59. trace_seq_printf(p, "REVALIDATE ");
  60. if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET))
  61. trace_seq_printf(p, "RESET ");
  62. else if (eh_action & ATA_EH_SOFTRESET)
  63. trace_seq_printf(p, "SOFTRESET ");
  64. else if (eh_action & ATA_EH_HARDRESET)
  65. trace_seq_printf(p, "HARDRESET ");
  66. if (eh_action & ATA_EH_ENABLE_LINK)
  67. trace_seq_printf(p, "ENABLE_LINK ");
  68. if (eh_action & ATA_EH_PARK)
  69. trace_seq_printf(p, "PARK ");
  70. trace_seq_putc(p, '}');
  71. }
  72. trace_seq_putc(p, 0);
  73. return ret;
  74. }
  75. const char *
  76. libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask)
  77. {
  78. const char *ret = trace_seq_buffer_ptr(p);
  79. trace_seq_printf(p, "%x", eh_err_mask);
  80. if (eh_err_mask) {
  81. trace_seq_printf(p, "{ ");
  82. if (eh_err_mask & AC_ERR_DEV)
  83. trace_seq_printf(p, "DEV ");
  84. if (eh_err_mask & AC_ERR_HSM)
  85. trace_seq_printf(p, "HSM ");
  86. if (eh_err_mask & AC_ERR_TIMEOUT)
  87. trace_seq_printf(p, "TIMEOUT ");
  88. if (eh_err_mask & AC_ERR_MEDIA)
  89. trace_seq_printf(p, "MEDIA ");
  90. if (eh_err_mask & AC_ERR_ATA_BUS)
  91. trace_seq_printf(p, "ATA_BUS ");
  92. if (eh_err_mask & AC_ERR_HOST_BUS)
  93. trace_seq_printf(p, "HOST_BUS ");
  94. if (eh_err_mask & AC_ERR_SYSTEM)
  95. trace_seq_printf(p, "SYSTEM ");
  96. if (eh_err_mask & AC_ERR_INVALID)
  97. trace_seq_printf(p, "INVALID ");
  98. if (eh_err_mask & AC_ERR_OTHER)
  99. trace_seq_printf(p, "OTHER ");
  100. if (eh_err_mask & AC_ERR_NODEV_HINT)
  101. trace_seq_printf(p, "NODEV_HINT ");
  102. if (eh_err_mask & AC_ERR_NCQ)
  103. trace_seq_printf(p, "NCQ ");
  104. trace_seq_putc(p, '}');
  105. }
  106. trace_seq_putc(p, 0);
  107. return ret;
  108. }
  109. const char *
  110. libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
  111. {
  112. const char *ret = trace_seq_buffer_ptr(p);
  113. trace_seq_printf(p, "%x", qc_flags);
  114. if (qc_flags) {
  115. trace_seq_printf(p, "{ ");
  116. if (qc_flags & ATA_QCFLAG_ACTIVE)
  117. trace_seq_printf(p, "ACTIVE ");
  118. if (qc_flags & ATA_QCFLAG_DMAMAP)
  119. trace_seq_printf(p, "DMAMAP ");
  120. if (qc_flags & ATA_QCFLAG_IO)
  121. trace_seq_printf(p, "IO ");
  122. if (qc_flags & ATA_QCFLAG_RESULT_TF)
  123. trace_seq_printf(p, "RESULT_TF ");
  124. if (qc_flags & ATA_QCFLAG_CLEAR_EXCL)
  125. trace_seq_printf(p, "CLEAR_EXCL ");
  126. if (qc_flags & ATA_QCFLAG_QUIET)
  127. trace_seq_printf(p, "QUIET ");
  128. if (qc_flags & ATA_QCFLAG_RETRY)
  129. trace_seq_printf(p, "RETRY ");
  130. if (qc_flags & ATA_QCFLAG_FAILED)
  131. trace_seq_printf(p, "FAILED ");
  132. if (qc_flags & ATA_QCFLAG_SENSE_VALID)
  133. trace_seq_printf(p, "SENSE_VALID ");
  134. if (qc_flags & ATA_QCFLAG_EH_SCHEDULED)
  135. trace_seq_printf(p, "EH_SCHEDULED ");
  136. trace_seq_putc(p, '}');
  137. }
  138. trace_seq_putc(p, 0);
  139. return ret;
  140. }
  141. const char *
  142. libata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags)
  143. {
  144. const char *ret = trace_seq_buffer_ptr(p);
  145. trace_seq_printf(p, "%x", tf_flags);
  146. if (tf_flags) {
  147. trace_seq_printf(p, "{ ");
  148. if (tf_flags & ATA_TFLAG_LBA48)
  149. trace_seq_printf(p, "LBA48 ");
  150. if (tf_flags & ATA_TFLAG_ISADDR)
  151. trace_seq_printf(p, "ISADDR ");
  152. if (tf_flags & ATA_TFLAG_DEVICE)
  153. trace_seq_printf(p, "DEV ");
  154. if (tf_flags & ATA_TFLAG_WRITE)
  155. trace_seq_printf(p, "WRITE ");
  156. if (tf_flags & ATA_TFLAG_LBA)
  157. trace_seq_printf(p, "LBA ");
  158. if (tf_flags & ATA_TFLAG_FUA)
  159. trace_seq_printf(p, "FUA ");
  160. if (tf_flags & ATA_TFLAG_POLLING)
  161. trace_seq_printf(p, "POLL ");
  162. trace_seq_putc(p, '}');
  163. }
  164. trace_seq_putc(p, 0);
  165. return ret;
  166. }
  167. const char *
  168. libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
  169. unsigned char feature, unsigned char hob_nsect)
  170. {
  171. const char *ret = trace_seq_buffer_ptr(p);
  172. switch (cmd) {
  173. case ATA_CMD_FPDMA_RECV:
  174. switch (hob_nsect & 0x5f) {
  175. case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:
  176. trace_seq_printf(p, " READ_LOG_DMA_EXT");
  177. break;
  178. case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN:
  179. trace_seq_printf(p, " ZAC_MGMT_IN");
  180. break;
  181. }
  182. break;
  183. case ATA_CMD_FPDMA_SEND:
  184. switch (hob_nsect & 0x5f) {
  185. case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:
  186. trace_seq_printf(p, " WRITE_LOG_DMA_EXT");
  187. break;
  188. case ATA_SUBCMD_FPDMA_SEND_DSM:
  189. trace_seq_printf(p, " DATASET_MANAGEMENT");
  190. break;
  191. }
  192. break;
  193. case ATA_CMD_NCQ_NON_DATA:
  194. switch (feature) {
  195. case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:
  196. trace_seq_printf(p, " ABORT_QUEUE");
  197. break;
  198. case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:
  199. trace_seq_printf(p, " SET_FEATURES");
  200. break;
  201. case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:
  202. trace_seq_printf(p, " ZERO_EXT");
  203. break;
  204. case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT:
  205. trace_seq_printf(p, " ZAC_MGMT_OUT");
  206. break;
  207. }
  208. break;
  209. case ATA_CMD_ZAC_MGMT_IN:
  210. switch (feature) {
  211. case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES:
  212. trace_seq_printf(p, " REPORT_ZONES");
  213. break;
  214. }
  215. break;
  216. case ATA_CMD_ZAC_MGMT_OUT:
  217. switch (feature) {
  218. case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE:
  219. trace_seq_printf(p, " CLOSE_ZONE");
  220. break;
  221. case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE:
  222. trace_seq_printf(p, " FINISH_ZONE");
  223. break;
  224. case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE:
  225. trace_seq_printf(p, " OPEN_ZONE");
  226. break;
  227. case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER:
  228. trace_seq_printf(p, " RESET_WRITE_POINTER");
  229. break;
  230. }
  231. break;
  232. }
  233. trace_seq_putc(p, 0);
  234. return ret;
  235. }