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