0001
0002
0003
0004
0005
0006
0007 #include <asm/unaligned.h>
0008 #include "trace.h"
0009
0010 static const char *nvme_trace_delete_sq(struct trace_seq *p, u8 *cdw10)
0011 {
0012 const char *ret = trace_seq_buffer_ptr(p);
0013 u16 sqid = get_unaligned_le16(cdw10);
0014
0015 trace_seq_printf(p, "sqid=%u", sqid);
0016 trace_seq_putc(p, 0);
0017
0018 return ret;
0019 }
0020
0021 static const char *nvme_trace_create_sq(struct trace_seq *p, u8 *cdw10)
0022 {
0023 const char *ret = trace_seq_buffer_ptr(p);
0024 u16 sqid = get_unaligned_le16(cdw10);
0025 u16 qsize = get_unaligned_le16(cdw10 + 2);
0026 u16 sq_flags = get_unaligned_le16(cdw10 + 4);
0027 u16 cqid = get_unaligned_le16(cdw10 + 6);
0028
0029
0030 trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u",
0031 sqid, qsize, sq_flags, cqid);
0032 trace_seq_putc(p, 0);
0033
0034 return ret;
0035 }
0036
0037 static const char *nvme_trace_delete_cq(struct trace_seq *p, u8 *cdw10)
0038 {
0039 const char *ret = trace_seq_buffer_ptr(p);
0040 u16 cqid = get_unaligned_le16(cdw10);
0041
0042 trace_seq_printf(p, "cqid=%u", cqid);
0043 trace_seq_putc(p, 0);
0044
0045 return ret;
0046 }
0047
0048 static const char *nvme_trace_create_cq(struct trace_seq *p, u8 *cdw10)
0049 {
0050 const char *ret = trace_seq_buffer_ptr(p);
0051 u16 cqid = get_unaligned_le16(cdw10);
0052 u16 qsize = get_unaligned_le16(cdw10 + 2);
0053 u16 cq_flags = get_unaligned_le16(cdw10 + 4);
0054 u16 irq_vector = get_unaligned_le16(cdw10 + 6);
0055
0056 trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u",
0057 cqid, qsize, cq_flags, irq_vector);
0058 trace_seq_putc(p, 0);
0059
0060 return ret;
0061 }
0062
0063 static const char *nvme_trace_admin_identify(struct trace_seq *p, u8 *cdw10)
0064 {
0065 const char *ret = trace_seq_buffer_ptr(p);
0066 u8 cns = cdw10[0];
0067 u16 ctrlid = get_unaligned_le16(cdw10 + 2);
0068
0069 trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, ctrlid);
0070 trace_seq_putc(p, 0);
0071
0072 return ret;
0073 }
0074
0075 static const char *nvme_trace_admin_set_features(struct trace_seq *p,
0076 u8 *cdw10)
0077 {
0078 const char *ret = trace_seq_buffer_ptr(p);
0079 u8 fid = cdw10[0];
0080 u8 sv = cdw10[3] & 0x8;
0081 u32 cdw11 = get_unaligned_le32(cdw10 + 4);
0082
0083 trace_seq_printf(p, "fid=0x%x, sv=0x%x, cdw11=0x%x", fid, sv, cdw11);
0084 trace_seq_putc(p, 0);
0085
0086 return ret;
0087 }
0088
0089 static const char *nvme_trace_admin_get_features(struct trace_seq *p,
0090 u8 *cdw10)
0091 {
0092 const char *ret = trace_seq_buffer_ptr(p);
0093 u8 fid = cdw10[0];
0094 u8 sel = cdw10[1] & 0x7;
0095 u32 cdw11 = get_unaligned_le32(cdw10 + 4);
0096
0097 trace_seq_printf(p, "fid=0x%x, sel=0x%x, cdw11=0x%x", fid, sel, cdw11);
0098 trace_seq_putc(p, 0);
0099
0100 return ret;
0101 }
0102
0103 static const char *nvme_trace_get_lba_status(struct trace_seq *p,
0104 u8 *cdw10)
0105 {
0106 const char *ret = trace_seq_buffer_ptr(p);
0107 u64 slba = get_unaligned_le64(cdw10);
0108 u32 mndw = get_unaligned_le32(cdw10 + 8);
0109 u16 rl = get_unaligned_le16(cdw10 + 12);
0110 u8 atype = cdw10[15];
0111
0112 trace_seq_printf(p, "slba=0x%llx, mndw=0x%x, rl=0x%x, atype=%u",
0113 slba, mndw, rl, atype);
0114 trace_seq_putc(p, 0);
0115
0116 return ret;
0117 }
0118
0119 static const char *nvme_trace_admin_format_nvm(struct trace_seq *p, u8 *cdw10)
0120 {
0121 const char *ret = trace_seq_buffer_ptr(p);
0122 u8 lbaf = cdw10[0] & 0xF;
0123 u8 mset = (cdw10[0] >> 4) & 0x1;
0124 u8 pi = (cdw10[0] >> 5) & 0x7;
0125 u8 pil = cdw10[1] & 0x1;
0126 u8 ses = (cdw10[1] >> 1) & 0x7;
0127
0128 trace_seq_printf(p, "lbaf=%u, mset=%u, pi=%u, pil=%u, ses=%u",
0129 lbaf, mset, pi, pil, ses);
0130
0131 trace_seq_putc(p, 0);
0132
0133 return ret;
0134 }
0135
0136 static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10)
0137 {
0138 const char *ret = trace_seq_buffer_ptr(p);
0139 u64 slba = get_unaligned_le64(cdw10);
0140 u16 length = get_unaligned_le16(cdw10 + 8);
0141 u16 control = get_unaligned_le16(cdw10 + 10);
0142 u32 dsmgmt = get_unaligned_le32(cdw10 + 12);
0143 u32 reftag = get_unaligned_le32(cdw10 + 16);
0144
0145 trace_seq_printf(p,
0146 "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u",
0147 slba, length, control, dsmgmt, reftag);
0148 trace_seq_putc(p, 0);
0149
0150 return ret;
0151 }
0152
0153 static const char *nvme_trace_dsm(struct trace_seq *p, u8 *cdw10)
0154 {
0155 const char *ret = trace_seq_buffer_ptr(p);
0156
0157 trace_seq_printf(p, "nr=%u, attributes=%u",
0158 get_unaligned_le32(cdw10),
0159 get_unaligned_le32(cdw10 + 4));
0160 trace_seq_putc(p, 0);
0161
0162 return ret;
0163 }
0164
0165 static const char *nvme_trace_zone_mgmt_send(struct trace_seq *p, u8 *cdw10)
0166 {
0167 const char *ret = trace_seq_buffer_ptr(p);
0168 u64 slba = get_unaligned_le64(cdw10);
0169 u8 zsa = cdw10[12];
0170 u8 all = cdw10[13];
0171
0172 trace_seq_printf(p, "slba=%llu, zsa=%u, all=%u", slba, zsa, all);
0173 trace_seq_putc(p, 0);
0174
0175 return ret;
0176 }
0177
0178 static const char *nvme_trace_zone_mgmt_recv(struct trace_seq *p, u8 *cdw10)
0179 {
0180 const char *ret = trace_seq_buffer_ptr(p);
0181 u64 slba = get_unaligned_le64(cdw10);
0182 u32 numd = get_unaligned_le32(cdw10 + 8);
0183 u8 zra = cdw10[12];
0184 u8 zrasf = cdw10[13];
0185 u8 pr = cdw10[14];
0186
0187 trace_seq_printf(p, "slba=%llu, numd=%u, zra=%u, zrasf=%u, pr=%u",
0188 slba, numd, zra, zrasf, pr);
0189 trace_seq_putc(p, 0);
0190
0191 return ret;
0192 }
0193
0194 static const char *nvme_trace_common(struct trace_seq *p, u8 *cdw10)
0195 {
0196 const char *ret = trace_seq_buffer_ptr(p);
0197
0198 trace_seq_printf(p, "cdw10=%*ph", 24, cdw10);
0199 trace_seq_putc(p, 0);
0200
0201 return ret;
0202 }
0203
0204 const char *nvme_trace_parse_admin_cmd(struct trace_seq *p,
0205 u8 opcode, u8 *cdw10)
0206 {
0207 switch (opcode) {
0208 case nvme_admin_delete_sq:
0209 return nvme_trace_delete_sq(p, cdw10);
0210 case nvme_admin_create_sq:
0211 return nvme_trace_create_sq(p, cdw10);
0212 case nvme_admin_delete_cq:
0213 return nvme_trace_delete_cq(p, cdw10);
0214 case nvme_admin_create_cq:
0215 return nvme_trace_create_cq(p, cdw10);
0216 case nvme_admin_identify:
0217 return nvme_trace_admin_identify(p, cdw10);
0218 case nvme_admin_set_features:
0219 return nvme_trace_admin_set_features(p, cdw10);
0220 case nvme_admin_get_features:
0221 return nvme_trace_admin_get_features(p, cdw10);
0222 case nvme_admin_get_lba_status:
0223 return nvme_trace_get_lba_status(p, cdw10);
0224 case nvme_admin_format_nvm:
0225 return nvme_trace_admin_format_nvm(p, cdw10);
0226 default:
0227 return nvme_trace_common(p, cdw10);
0228 }
0229 }
0230
0231 const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p,
0232 u8 opcode, u8 *cdw10)
0233 {
0234 switch (opcode) {
0235 case nvme_cmd_read:
0236 case nvme_cmd_write:
0237 case nvme_cmd_write_zeroes:
0238 case nvme_cmd_zone_append:
0239 return nvme_trace_read_write(p, cdw10);
0240 case nvme_cmd_dsm:
0241 return nvme_trace_dsm(p, cdw10);
0242 case nvme_cmd_zone_mgmt_send:
0243 return nvme_trace_zone_mgmt_send(p, cdw10);
0244 case nvme_cmd_zone_mgmt_recv:
0245 return nvme_trace_zone_mgmt_recv(p, cdw10);
0246 default:
0247 return nvme_trace_common(p, cdw10);
0248 }
0249 }
0250
0251 static const char *nvme_trace_fabrics_property_set(struct trace_seq *p, u8 *spc)
0252 {
0253 const char *ret = trace_seq_buffer_ptr(p);
0254 u8 attrib = spc[0];
0255 u32 ofst = get_unaligned_le32(spc + 4);
0256 u64 value = get_unaligned_le64(spc + 8);
0257
0258 trace_seq_printf(p, "attrib=%u, ofst=0x%x, value=0x%llx",
0259 attrib, ofst, value);
0260 trace_seq_putc(p, 0);
0261 return ret;
0262 }
0263
0264 static const char *nvme_trace_fabrics_connect(struct trace_seq *p, u8 *spc)
0265 {
0266 const char *ret = trace_seq_buffer_ptr(p);
0267 u16 recfmt = get_unaligned_le16(spc);
0268 u16 qid = get_unaligned_le16(spc + 2);
0269 u16 sqsize = get_unaligned_le16(spc + 4);
0270 u8 cattr = spc[6];
0271 u32 kato = get_unaligned_le32(spc + 8);
0272
0273 trace_seq_printf(p, "recfmt=%u, qid=%u, sqsize=%u, cattr=%u, kato=%u",
0274 recfmt, qid, sqsize, cattr, kato);
0275 trace_seq_putc(p, 0);
0276 return ret;
0277 }
0278
0279 static const char *nvme_trace_fabrics_property_get(struct trace_seq *p, u8 *spc)
0280 {
0281 const char *ret = trace_seq_buffer_ptr(p);
0282 u8 attrib = spc[0];
0283 u32 ofst = get_unaligned_le32(spc + 4);
0284
0285 trace_seq_printf(p, "attrib=%u, ofst=0x%x", attrib, ofst);
0286 trace_seq_putc(p, 0);
0287 return ret;
0288 }
0289
0290 static const char *nvme_trace_fabrics_auth_send(struct trace_seq *p, u8 *spc)
0291 {
0292 const char *ret = trace_seq_buffer_ptr(p);
0293 u8 spsp0 = spc[1];
0294 u8 spsp1 = spc[2];
0295 u8 secp = spc[3];
0296 u32 tl = get_unaligned_le32(spc + 4);
0297
0298 trace_seq_printf(p, "spsp0=%02x, spsp1=%02x, secp=%02x, tl=%u",
0299 spsp0, spsp1, secp, tl);
0300 trace_seq_putc(p, 0);
0301 return ret;
0302 }
0303
0304 static const char *nvme_trace_fabrics_auth_receive(struct trace_seq *p, u8 *spc)
0305 {
0306 const char *ret = trace_seq_buffer_ptr(p);
0307 u8 spsp0 = spc[1];
0308 u8 spsp1 = spc[2];
0309 u8 secp = spc[3];
0310 u32 al = get_unaligned_le32(spc + 4);
0311
0312 trace_seq_printf(p, "spsp0=%02x, spsp1=%02x, secp=%02x, al=%u",
0313 spsp0, spsp1, secp, al);
0314 trace_seq_putc(p, 0);
0315 return ret;
0316 }
0317
0318 static const char *nvme_trace_fabrics_common(struct trace_seq *p, u8 *spc)
0319 {
0320 const char *ret = trace_seq_buffer_ptr(p);
0321
0322 trace_seq_printf(p, "specific=%*ph", 24, spc);
0323 trace_seq_putc(p, 0);
0324 return ret;
0325 }
0326
0327 const char *nvme_trace_parse_fabrics_cmd(struct trace_seq *p,
0328 u8 fctype, u8 *spc)
0329 {
0330 switch (fctype) {
0331 case nvme_fabrics_type_property_set:
0332 return nvme_trace_fabrics_property_set(p, spc);
0333 case nvme_fabrics_type_connect:
0334 return nvme_trace_fabrics_connect(p, spc);
0335 case nvme_fabrics_type_property_get:
0336 return nvme_trace_fabrics_property_get(p, spc);
0337 case nvme_fabrics_type_auth_send:
0338 return nvme_trace_fabrics_auth_send(p, spc);
0339 case nvme_fabrics_type_auth_receive:
0340 return nvme_trace_fabrics_auth_receive(p, spc);
0341 default:
0342 return nvme_trace_fabrics_common(p, spc);
0343 }
0344 }
0345
0346 const char *nvme_trace_disk_name(struct trace_seq *p, char *name)
0347 {
0348 const char *ret = trace_seq_buffer_ptr(p);
0349
0350 if (*name)
0351 trace_seq_printf(p, "disk=%s, ", name);
0352 trace_seq_putc(p, 0);
0353
0354 return ret;
0355 }
0356
0357 EXPORT_TRACEPOINT_SYMBOL_GPL(nvme_sq);