| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * NVM Express device driver tracepoints |
|---|
| 3 | 4 | * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 6 | | - * under the terms and conditions of the GNU General Public License, |
|---|
| 7 | | - * version 2, as published by the Free Software Foundation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is distributed in the hope it will be useful, but WITHOUT |
|---|
| 10 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|---|
| 11 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|---|
| 12 | | - * more details. |
|---|
| 13 | 5 | */ |
|---|
| 14 | 6 | |
|---|
| 15 | 7 | #include <asm/unaligned.h> |
|---|
| 16 | 8 | #include "trace.h" |
|---|
| 9 | + |
|---|
| 10 | +static const char *nvme_trace_delete_sq(struct trace_seq *p, u8 *cdw10) |
|---|
| 11 | +{ |
|---|
| 12 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 13 | + u16 sqid = get_unaligned_le16(cdw10); |
|---|
| 14 | + |
|---|
| 15 | + trace_seq_printf(p, "sqid=%u", sqid); |
|---|
| 16 | + trace_seq_putc(p, 0); |
|---|
| 17 | + |
|---|
| 18 | + return ret; |
|---|
| 19 | +} |
|---|
| 17 | 20 | |
|---|
| 18 | 21 | static const char *nvme_trace_create_sq(struct trace_seq *p, u8 *cdw10) |
|---|
| 19 | 22 | { |
|---|
| .. | .. |
|---|
| 26 | 29 | |
|---|
| 27 | 30 | trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u", |
|---|
| 28 | 31 | sqid, qsize, sq_flags, cqid); |
|---|
| 32 | + trace_seq_putc(p, 0); |
|---|
| 33 | + |
|---|
| 34 | + return ret; |
|---|
| 35 | +} |
|---|
| 36 | + |
|---|
| 37 | +static const char *nvme_trace_delete_cq(struct trace_seq *p, u8 *cdw10) |
|---|
| 38 | +{ |
|---|
| 39 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 40 | + u16 cqid = get_unaligned_le16(cdw10); |
|---|
| 41 | + |
|---|
| 42 | + trace_seq_printf(p, "cqid=%u", cqid); |
|---|
| 29 | 43 | trace_seq_putc(p, 0); |
|---|
| 30 | 44 | |
|---|
| 31 | 45 | return ret; |
|---|
| .. | .. |
|---|
| 58 | 72 | return ret; |
|---|
| 59 | 73 | } |
|---|
| 60 | 74 | |
|---|
| 75 | +static const char *nvme_trace_admin_get_features(struct trace_seq *p, |
|---|
| 76 | + u8 *cdw10) |
|---|
| 77 | +{ |
|---|
| 78 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 79 | + u8 fid = cdw10[0]; |
|---|
| 80 | + u8 sel = cdw10[1] & 0x7; |
|---|
| 81 | + u32 cdw11 = get_unaligned_le32(cdw10 + 4); |
|---|
| 61 | 82 | |
|---|
| 83 | + trace_seq_printf(p, "fid=0x%x sel=0x%x cdw11=0x%x", fid, sel, cdw11); |
|---|
| 84 | + trace_seq_putc(p, 0); |
|---|
| 85 | + |
|---|
| 86 | + return ret; |
|---|
| 87 | +} |
|---|
| 88 | + |
|---|
| 89 | +static const char *nvme_trace_get_lba_status(struct trace_seq *p, |
|---|
| 90 | + u8 *cdw10) |
|---|
| 91 | +{ |
|---|
| 92 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 93 | + u64 slba = get_unaligned_le64(cdw10); |
|---|
| 94 | + u32 mndw = get_unaligned_le32(cdw10 + 8); |
|---|
| 95 | + u16 rl = get_unaligned_le16(cdw10 + 12); |
|---|
| 96 | + u8 atype = cdw10[15]; |
|---|
| 97 | + |
|---|
| 98 | + trace_seq_printf(p, "slba=0x%llx, mndw=0x%x, rl=0x%x, atype=%u", |
|---|
| 99 | + slba, mndw, rl, atype); |
|---|
| 100 | + trace_seq_putc(p, 0); |
|---|
| 101 | + |
|---|
| 102 | + return ret; |
|---|
| 103 | +} |
|---|
| 62 | 104 | |
|---|
| 63 | 105 | static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10) |
|---|
| 64 | 106 | { |
|---|
| .. | .. |
|---|
| 103 | 145 | u8 opcode, u8 *cdw10) |
|---|
| 104 | 146 | { |
|---|
| 105 | 147 | switch (opcode) { |
|---|
| 148 | + case nvme_admin_delete_sq: |
|---|
| 149 | + return nvme_trace_delete_sq(p, cdw10); |
|---|
| 106 | 150 | case nvme_admin_create_sq: |
|---|
| 107 | 151 | return nvme_trace_create_sq(p, cdw10); |
|---|
| 152 | + case nvme_admin_delete_cq: |
|---|
| 153 | + return nvme_trace_delete_cq(p, cdw10); |
|---|
| 108 | 154 | case nvme_admin_create_cq: |
|---|
| 109 | 155 | return nvme_trace_create_cq(p, cdw10); |
|---|
| 110 | 156 | case nvme_admin_identify: |
|---|
| 111 | 157 | return nvme_trace_admin_identify(p, cdw10); |
|---|
| 158 | + case nvme_admin_get_features: |
|---|
| 159 | + return nvme_trace_admin_get_features(p, cdw10); |
|---|
| 160 | + case nvme_admin_get_lba_status: |
|---|
| 161 | + return nvme_trace_get_lba_status(p, cdw10); |
|---|
| 112 | 162 | default: |
|---|
| 113 | 163 | return nvme_trace_common(p, cdw10); |
|---|
| 114 | 164 | } |
|---|
| .. | .. |
|---|
| 129 | 179 | } |
|---|
| 130 | 180 | } |
|---|
| 131 | 181 | |
|---|
| 182 | +static const char *nvme_trace_fabrics_property_set(struct trace_seq *p, u8 *spc) |
|---|
| 183 | +{ |
|---|
| 184 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 185 | + u8 attrib = spc[0]; |
|---|
| 186 | + u32 ofst = get_unaligned_le32(spc + 4); |
|---|
| 187 | + u64 value = get_unaligned_le64(spc + 8); |
|---|
| 188 | + |
|---|
| 189 | + trace_seq_printf(p, "attrib=%u, ofst=0x%x, value=0x%llx", |
|---|
| 190 | + attrib, ofst, value); |
|---|
| 191 | + trace_seq_putc(p, 0); |
|---|
| 192 | + return ret; |
|---|
| 193 | +} |
|---|
| 194 | + |
|---|
| 195 | +static const char *nvme_trace_fabrics_connect(struct trace_seq *p, u8 *spc) |
|---|
| 196 | +{ |
|---|
| 197 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 198 | + u16 recfmt = get_unaligned_le16(spc); |
|---|
| 199 | + u16 qid = get_unaligned_le16(spc + 2); |
|---|
| 200 | + u16 sqsize = get_unaligned_le16(spc + 4); |
|---|
| 201 | + u8 cattr = spc[6]; |
|---|
| 202 | + u32 kato = get_unaligned_le32(spc + 8); |
|---|
| 203 | + |
|---|
| 204 | + trace_seq_printf(p, "recfmt=%u, qid=%u, sqsize=%u, cattr=%u, kato=%u", |
|---|
| 205 | + recfmt, qid, sqsize, cattr, kato); |
|---|
| 206 | + trace_seq_putc(p, 0); |
|---|
| 207 | + return ret; |
|---|
| 208 | +} |
|---|
| 209 | + |
|---|
| 210 | +static const char *nvme_trace_fabrics_property_get(struct trace_seq *p, u8 *spc) |
|---|
| 211 | +{ |
|---|
| 212 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 213 | + u8 attrib = spc[0]; |
|---|
| 214 | + u32 ofst = get_unaligned_le32(spc + 4); |
|---|
| 215 | + |
|---|
| 216 | + trace_seq_printf(p, "attrib=%u, ofst=0x%x", attrib, ofst); |
|---|
| 217 | + trace_seq_putc(p, 0); |
|---|
| 218 | + return ret; |
|---|
| 219 | +} |
|---|
| 220 | + |
|---|
| 221 | +static const char *nvme_trace_fabrics_common(struct trace_seq *p, u8 *spc) |
|---|
| 222 | +{ |
|---|
| 223 | + const char *ret = trace_seq_buffer_ptr(p); |
|---|
| 224 | + |
|---|
| 225 | + trace_seq_printf(p, "specific=%*ph", 24, spc); |
|---|
| 226 | + trace_seq_putc(p, 0); |
|---|
| 227 | + return ret; |
|---|
| 228 | +} |
|---|
| 229 | + |
|---|
| 230 | +const char *nvme_trace_parse_fabrics_cmd(struct trace_seq *p, |
|---|
| 231 | + u8 fctype, u8 *spc) |
|---|
| 232 | +{ |
|---|
| 233 | + switch (fctype) { |
|---|
| 234 | + case nvme_fabrics_type_property_set: |
|---|
| 235 | + return nvme_trace_fabrics_property_set(p, spc); |
|---|
| 236 | + case nvme_fabrics_type_connect: |
|---|
| 237 | + return nvme_trace_fabrics_connect(p, spc); |
|---|
| 238 | + case nvme_fabrics_type_property_get: |
|---|
| 239 | + return nvme_trace_fabrics_property_get(p, spc); |
|---|
| 240 | + default: |
|---|
| 241 | + return nvme_trace_fabrics_common(p, spc); |
|---|
| 242 | + } |
|---|
| 243 | +} |
|---|
| 244 | + |
|---|
| 132 | 245 | const char *nvme_trace_disk_name(struct trace_seq *p, char *name) |
|---|
| 133 | 246 | { |
|---|
| 134 | 247 | const char *ret = trace_seq_buffer_ptr(p); |
|---|
| .. | .. |
|---|
| 139 | 252 | |
|---|
| 140 | 253 | return ret; |
|---|
| 141 | 254 | } |
|---|
| 255 | + |
|---|
| 256 | +EXPORT_TRACEPOINT_SYMBOL_GPL(nvme_sq); |
|---|