Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * NVM Express device driver tracepoints
0004  * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
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);