1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * NVM Express device driver tracepoints
4*4882a593Smuzhiyun * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <asm/unaligned.h>
8*4882a593Smuzhiyun #include "trace.h"
9*4882a593Smuzhiyun
nvme_trace_delete_sq(struct trace_seq * p,u8 * cdw10)10*4882a593Smuzhiyun static const char *nvme_trace_delete_sq(struct trace_seq *p, u8 *cdw10)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
13*4882a593Smuzhiyun u16 sqid = get_unaligned_le16(cdw10);
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun trace_seq_printf(p, "sqid=%u", sqid);
16*4882a593Smuzhiyun trace_seq_putc(p, 0);
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun return ret;
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
nvme_trace_create_sq(struct trace_seq * p,u8 * cdw10)21*4882a593Smuzhiyun static const char *nvme_trace_create_sq(struct trace_seq *p, u8 *cdw10)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
24*4882a593Smuzhiyun u16 sqid = get_unaligned_le16(cdw10);
25*4882a593Smuzhiyun u16 qsize = get_unaligned_le16(cdw10 + 2);
26*4882a593Smuzhiyun u16 sq_flags = get_unaligned_le16(cdw10 + 4);
27*4882a593Smuzhiyun u16 cqid = get_unaligned_le16(cdw10 + 6);
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u",
31*4882a593Smuzhiyun sqid, qsize, sq_flags, cqid);
32*4882a593Smuzhiyun trace_seq_putc(p, 0);
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun return ret;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
nvme_trace_delete_cq(struct trace_seq * p,u8 * cdw10)37*4882a593Smuzhiyun static const char *nvme_trace_delete_cq(struct trace_seq *p, u8 *cdw10)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
40*4882a593Smuzhiyun u16 cqid = get_unaligned_le16(cdw10);
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun trace_seq_printf(p, "cqid=%u", cqid);
43*4882a593Smuzhiyun trace_seq_putc(p, 0);
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun return ret;
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun
nvme_trace_create_cq(struct trace_seq * p,u8 * cdw10)48*4882a593Smuzhiyun static const char *nvme_trace_create_cq(struct trace_seq *p, u8 *cdw10)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
51*4882a593Smuzhiyun u16 cqid = get_unaligned_le16(cdw10);
52*4882a593Smuzhiyun u16 qsize = get_unaligned_le16(cdw10 + 2);
53*4882a593Smuzhiyun u16 cq_flags = get_unaligned_le16(cdw10 + 4);
54*4882a593Smuzhiyun u16 irq_vector = get_unaligned_le16(cdw10 + 6);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u",
57*4882a593Smuzhiyun cqid, qsize, cq_flags, irq_vector);
58*4882a593Smuzhiyun trace_seq_putc(p, 0);
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun return ret;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun
nvme_trace_admin_identify(struct trace_seq * p,u8 * cdw10)63*4882a593Smuzhiyun static const char *nvme_trace_admin_identify(struct trace_seq *p, u8 *cdw10)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
66*4882a593Smuzhiyun u8 cns = cdw10[0];
67*4882a593Smuzhiyun u16 ctrlid = get_unaligned_le16(cdw10 + 2);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, ctrlid);
70*4882a593Smuzhiyun trace_seq_putc(p, 0);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun return ret;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
nvme_trace_admin_get_features(struct trace_seq * p,u8 * cdw10)75*4882a593Smuzhiyun static const char *nvme_trace_admin_get_features(struct trace_seq *p,
76*4882a593Smuzhiyun u8 *cdw10)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
79*4882a593Smuzhiyun u8 fid = cdw10[0];
80*4882a593Smuzhiyun u8 sel = cdw10[1] & 0x7;
81*4882a593Smuzhiyun u32 cdw11 = get_unaligned_le32(cdw10 + 4);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun trace_seq_printf(p, "fid=0x%x sel=0x%x cdw11=0x%x", fid, sel, cdw11);
84*4882a593Smuzhiyun trace_seq_putc(p, 0);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun return ret;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
nvme_trace_get_lba_status(struct trace_seq * p,u8 * cdw10)89*4882a593Smuzhiyun static const char *nvme_trace_get_lba_status(struct trace_seq *p,
90*4882a593Smuzhiyun u8 *cdw10)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
93*4882a593Smuzhiyun u64 slba = get_unaligned_le64(cdw10);
94*4882a593Smuzhiyun u32 mndw = get_unaligned_le32(cdw10 + 8);
95*4882a593Smuzhiyun u16 rl = get_unaligned_le16(cdw10 + 12);
96*4882a593Smuzhiyun u8 atype = cdw10[15];
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun trace_seq_printf(p, "slba=0x%llx, mndw=0x%x, rl=0x%x, atype=%u",
99*4882a593Smuzhiyun slba, mndw, rl, atype);
100*4882a593Smuzhiyun trace_seq_putc(p, 0);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun return ret;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
nvme_trace_read_write(struct trace_seq * p,u8 * cdw10)105*4882a593Smuzhiyun static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
108*4882a593Smuzhiyun u64 slba = get_unaligned_le64(cdw10);
109*4882a593Smuzhiyun u16 length = get_unaligned_le16(cdw10 + 8);
110*4882a593Smuzhiyun u16 control = get_unaligned_le16(cdw10 + 10);
111*4882a593Smuzhiyun u32 dsmgmt = get_unaligned_le32(cdw10 + 12);
112*4882a593Smuzhiyun u32 reftag = get_unaligned_le32(cdw10 + 16);
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun trace_seq_printf(p,
115*4882a593Smuzhiyun "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u",
116*4882a593Smuzhiyun slba, length, control, dsmgmt, reftag);
117*4882a593Smuzhiyun trace_seq_putc(p, 0);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun return ret;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
nvme_trace_dsm(struct trace_seq * p,u8 * cdw10)122*4882a593Smuzhiyun static const char *nvme_trace_dsm(struct trace_seq *p, u8 *cdw10)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun trace_seq_printf(p, "nr=%u, attributes=%u",
127*4882a593Smuzhiyun get_unaligned_le32(cdw10),
128*4882a593Smuzhiyun get_unaligned_le32(cdw10 + 4));
129*4882a593Smuzhiyun trace_seq_putc(p, 0);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun return ret;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
nvme_trace_common(struct trace_seq * p,u8 * cdw10)134*4882a593Smuzhiyun static const char *nvme_trace_common(struct trace_seq *p, u8 *cdw10)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun trace_seq_printf(p, "cdw10=%*ph", 24, cdw10);
139*4882a593Smuzhiyun trace_seq_putc(p, 0);
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun return ret;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
nvme_trace_parse_admin_cmd(struct trace_seq * p,u8 opcode,u8 * cdw10)144*4882a593Smuzhiyun const char *nvme_trace_parse_admin_cmd(struct trace_seq *p,
145*4882a593Smuzhiyun u8 opcode, u8 *cdw10)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun switch (opcode) {
148*4882a593Smuzhiyun case nvme_admin_delete_sq:
149*4882a593Smuzhiyun return nvme_trace_delete_sq(p, cdw10);
150*4882a593Smuzhiyun case nvme_admin_create_sq:
151*4882a593Smuzhiyun return nvme_trace_create_sq(p, cdw10);
152*4882a593Smuzhiyun case nvme_admin_delete_cq:
153*4882a593Smuzhiyun return nvme_trace_delete_cq(p, cdw10);
154*4882a593Smuzhiyun case nvme_admin_create_cq:
155*4882a593Smuzhiyun return nvme_trace_create_cq(p, cdw10);
156*4882a593Smuzhiyun case nvme_admin_identify:
157*4882a593Smuzhiyun return nvme_trace_admin_identify(p, cdw10);
158*4882a593Smuzhiyun case nvme_admin_get_features:
159*4882a593Smuzhiyun return nvme_trace_admin_get_features(p, cdw10);
160*4882a593Smuzhiyun case nvme_admin_get_lba_status:
161*4882a593Smuzhiyun return nvme_trace_get_lba_status(p, cdw10);
162*4882a593Smuzhiyun default:
163*4882a593Smuzhiyun return nvme_trace_common(p, cdw10);
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
nvme_trace_parse_nvm_cmd(struct trace_seq * p,u8 opcode,u8 * cdw10)167*4882a593Smuzhiyun const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p,
168*4882a593Smuzhiyun u8 opcode, u8 *cdw10)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun switch (opcode) {
171*4882a593Smuzhiyun case nvme_cmd_read:
172*4882a593Smuzhiyun case nvme_cmd_write:
173*4882a593Smuzhiyun case nvme_cmd_write_zeroes:
174*4882a593Smuzhiyun return nvme_trace_read_write(p, cdw10);
175*4882a593Smuzhiyun case nvme_cmd_dsm:
176*4882a593Smuzhiyun return nvme_trace_dsm(p, cdw10);
177*4882a593Smuzhiyun default:
178*4882a593Smuzhiyun return nvme_trace_common(p, cdw10);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
nvme_trace_fabrics_property_set(struct trace_seq * p,u8 * spc)182*4882a593Smuzhiyun static const char *nvme_trace_fabrics_property_set(struct trace_seq *p, u8 *spc)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
185*4882a593Smuzhiyun u8 attrib = spc[0];
186*4882a593Smuzhiyun u32 ofst = get_unaligned_le32(spc + 4);
187*4882a593Smuzhiyun u64 value = get_unaligned_le64(spc + 8);
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun trace_seq_printf(p, "attrib=%u, ofst=0x%x, value=0x%llx",
190*4882a593Smuzhiyun attrib, ofst, value);
191*4882a593Smuzhiyun trace_seq_putc(p, 0);
192*4882a593Smuzhiyun return ret;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
nvme_trace_fabrics_connect(struct trace_seq * p,u8 * spc)195*4882a593Smuzhiyun static const char *nvme_trace_fabrics_connect(struct trace_seq *p, u8 *spc)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
198*4882a593Smuzhiyun u16 recfmt = get_unaligned_le16(spc);
199*4882a593Smuzhiyun u16 qid = get_unaligned_le16(spc + 2);
200*4882a593Smuzhiyun u16 sqsize = get_unaligned_le16(spc + 4);
201*4882a593Smuzhiyun u8 cattr = spc[6];
202*4882a593Smuzhiyun u32 kato = get_unaligned_le32(spc + 8);
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun trace_seq_printf(p, "recfmt=%u, qid=%u, sqsize=%u, cattr=%u, kato=%u",
205*4882a593Smuzhiyun recfmt, qid, sqsize, cattr, kato);
206*4882a593Smuzhiyun trace_seq_putc(p, 0);
207*4882a593Smuzhiyun return ret;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
nvme_trace_fabrics_property_get(struct trace_seq * p,u8 * spc)210*4882a593Smuzhiyun static const char *nvme_trace_fabrics_property_get(struct trace_seq *p, u8 *spc)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
213*4882a593Smuzhiyun u8 attrib = spc[0];
214*4882a593Smuzhiyun u32 ofst = get_unaligned_le32(spc + 4);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun trace_seq_printf(p, "attrib=%u, ofst=0x%x", attrib, ofst);
217*4882a593Smuzhiyun trace_seq_putc(p, 0);
218*4882a593Smuzhiyun return ret;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
nvme_trace_fabrics_common(struct trace_seq * p,u8 * spc)221*4882a593Smuzhiyun static const char *nvme_trace_fabrics_common(struct trace_seq *p, u8 *spc)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun trace_seq_printf(p, "specific=%*ph", 24, spc);
226*4882a593Smuzhiyun trace_seq_putc(p, 0);
227*4882a593Smuzhiyun return ret;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
nvme_trace_parse_fabrics_cmd(struct trace_seq * p,u8 fctype,u8 * spc)230*4882a593Smuzhiyun const char *nvme_trace_parse_fabrics_cmd(struct trace_seq *p,
231*4882a593Smuzhiyun u8 fctype, u8 *spc)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun switch (fctype) {
234*4882a593Smuzhiyun case nvme_fabrics_type_property_set:
235*4882a593Smuzhiyun return nvme_trace_fabrics_property_set(p, spc);
236*4882a593Smuzhiyun case nvme_fabrics_type_connect:
237*4882a593Smuzhiyun return nvme_trace_fabrics_connect(p, spc);
238*4882a593Smuzhiyun case nvme_fabrics_type_property_get:
239*4882a593Smuzhiyun return nvme_trace_fabrics_property_get(p, spc);
240*4882a593Smuzhiyun default:
241*4882a593Smuzhiyun return nvme_trace_fabrics_common(p, spc);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
nvme_trace_disk_name(struct trace_seq * p,char * name)245*4882a593Smuzhiyun const char *nvme_trace_disk_name(struct trace_seq *p, char *name)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if (*name)
250*4882a593Smuzhiyun trace_seq_printf(p, "disk=%s, ", name);
251*4882a593Smuzhiyun trace_seq_putc(p, 0);
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun return ret;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun EXPORT_TRACEPOINT_SYMBOL_GPL(nvme_sq);
257