.. | .. |
---|
| 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); |
---|