1533affcbSRobert Mustacchi /*
2533affcbSRobert Mustacchi * This file and its contents are supplied under the terms of the
3533affcbSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4533affcbSRobert Mustacchi * You may only use this file in accordance with the terms of version
5533affcbSRobert Mustacchi * 1.0 of the CDDL.
6533affcbSRobert Mustacchi *
7533affcbSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8533affcbSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9533affcbSRobert Mustacchi * http://www.illumos.org/license/CDDL.
10533affcbSRobert Mustacchi */
11533affcbSRobert Mustacchi
12533affcbSRobert Mustacchi /*
13533affcbSRobert Mustacchi * Copyright 2024 Oxide Computer Company
14533affcbSRobert Mustacchi */
15533affcbSRobert Mustacchi
16533affcbSRobert Mustacchi /*
17533affcbSRobert Mustacchi * Various unit tests of the common NVMe log validation code. We focus on field
18533affcbSRobert Mustacchi * validation, scope determination, size, and support determination.
19533affcbSRobert Mustacchi */
20533affcbSRobert Mustacchi
21533affcbSRobert Mustacchi #include <stdlib.h>
22533affcbSRobert Mustacchi #include <sys/sysmacros.h>
23533affcbSRobert Mustacchi #include <stdio.h>
24533affcbSRobert Mustacchi #include <strings.h>
25533affcbSRobert Mustacchi #include <err.h>
26533affcbSRobert Mustacchi
27533affcbSRobert Mustacchi #include "nvme_unit.h"
28533affcbSRobert Mustacchi
29533affcbSRobert Mustacchi static const nvme_unit_field_test_t log_field_tests[] = { {
30533affcbSRobert Mustacchi .nu_desc = "invalid lid value (1)",
31533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
32533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LID,
33533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
34533affcbSRobert Mustacchi .nu_value = 0x123456,
35533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
36533affcbSRobert Mustacchi }, {
37533affcbSRobert Mustacchi .nu_desc = "invalid lid value (2)",
38533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
39533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LID,
40533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
41533affcbSRobert Mustacchi .nu_value = 0x100,
42533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
43533affcbSRobert Mustacchi }, {
44533affcbSRobert Mustacchi .nu_desc = "valid lid (1)",
45533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
46533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LID,
47533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
48533affcbSRobert Mustacchi .nu_value = 0x00,
49533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
50533affcbSRobert Mustacchi }, {
51533affcbSRobert Mustacchi .nu_desc = "valid lid (2)",
52533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
53533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LID,
54533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
55533affcbSRobert Mustacchi .nu_value = 0xff,
56533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
57533affcbSRobert Mustacchi }, {
58533affcbSRobert Mustacchi .nu_desc = "invalid lsp (vers)",
59533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
60533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
61533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
62533affcbSRobert Mustacchi .nu_value = 0x0,
63533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
64533affcbSRobert Mustacchi }, {
65533affcbSRobert Mustacchi .nu_desc = "unsupported lsp",
66533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
67533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
68533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
69533affcbSRobert Mustacchi .nu_value = 0x0,
70533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
71533affcbSRobert Mustacchi }, {
72533affcbSRobert Mustacchi .nu_desc = "invalid lsp (1)",
73533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
74533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
75533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
76533affcbSRobert Mustacchi .nu_value = 0x7777,
77533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
78533affcbSRobert Mustacchi }, {
79533affcbSRobert Mustacchi .nu_desc = "invalid lsp (2)",
80533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
81533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
82533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
83533affcbSRobert Mustacchi .nu_value = 0x7777,
84533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
85533affcbSRobert Mustacchi }, {
86533affcbSRobert Mustacchi .nu_desc = "invalid lsp (1.x)",
87533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
88533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
89533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
90533affcbSRobert Mustacchi .nu_value = 0x10,
91533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
92533affcbSRobert Mustacchi }, {
93533affcbSRobert Mustacchi .nu_desc = "invalid lsp (2.x)",
94533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
95533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
96533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
97533affcbSRobert Mustacchi .nu_value = 0x100,
98533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
99533affcbSRobert Mustacchi }, {
100533affcbSRobert Mustacchi .nu_desc = "invalid lsp (2.x)",
101533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
102533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
103533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
104533affcbSRobert Mustacchi .nu_value = 0x80,
105533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
106533affcbSRobert Mustacchi }, {
107533affcbSRobert Mustacchi .nu_desc = "valid lsp (1.x) (1)",
108533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
109533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
110533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
111533affcbSRobert Mustacchi .nu_value = 0x7,
112533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
113533affcbSRobert Mustacchi }, {
114533affcbSRobert Mustacchi .nu_desc = "valid lsp (1.x) (2)",
115533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
116533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
117533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
118533affcbSRobert Mustacchi .nu_value = 0x2,
119533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
120533affcbSRobert Mustacchi }, {
121533affcbSRobert Mustacchi .nu_desc = "valid lsp (1.x) (3)",
122533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
123533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
124533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
125533affcbSRobert Mustacchi .nu_value = 0x0,
126533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
127533affcbSRobert Mustacchi }, {
128533affcbSRobert Mustacchi .nu_desc = "valid lsp (2.x) (1)",
129533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
130533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
131533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
132533affcbSRobert Mustacchi .nu_value = 0x7,
133533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
134533affcbSRobert Mustacchi }, {
135533affcbSRobert Mustacchi .nu_desc = "valid lsp (2.x) (2)",
136533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
137533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
138533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
139533affcbSRobert Mustacchi .nu_value = 0x2,
140533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
141533affcbSRobert Mustacchi }, {
142533affcbSRobert Mustacchi .nu_desc = "valid lsp (2.x) (3)",
143533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
144533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
145533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
146533affcbSRobert Mustacchi .nu_value = 0x0,
147533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
148533affcbSRobert Mustacchi }, {
149533affcbSRobert Mustacchi .nu_desc = "valid lsp (2.x) (4)",
150533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
151533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
152533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
153533affcbSRobert Mustacchi .nu_value = 0x7f,
154533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
155533affcbSRobert Mustacchi }, {
156533affcbSRobert Mustacchi .nu_desc = "valid lsp (2.x) (4)",
157533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
158533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSP,
159533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
160533affcbSRobert Mustacchi .nu_value = 0x23,
161533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
162533affcbSRobert Mustacchi }, {
163533affcbSRobert Mustacchi .nu_desc = "unsupported lsi",
164533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
165533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
166533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
167533affcbSRobert Mustacchi .nu_value = 0x0,
168533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
169533affcbSRobert Mustacchi }, {
170533affcbSRobert Mustacchi .nu_desc = "invalid lsi (1)",
171533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
172533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
173533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
174533affcbSRobert Mustacchi .nu_value = 0x10000,
175533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
176533affcbSRobert Mustacchi }, {
177533affcbSRobert Mustacchi .nu_desc = "invalid lsi (2)",
178533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
179533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
180533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
181533affcbSRobert Mustacchi .nu_value = 0x123321,
182533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
183533affcbSRobert Mustacchi }, {
184533affcbSRobert Mustacchi .nu_desc = "valid lsi (1)",
185533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
186533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
187533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
188533affcbSRobert Mustacchi .nu_value = 0x0,
189533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
190533affcbSRobert Mustacchi }, {
191533affcbSRobert Mustacchi .nu_desc = "valid lsi (2)",
192533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
193533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
194533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
195533affcbSRobert Mustacchi .nu_value = 0xffff,
196533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
197533affcbSRobert Mustacchi }, {
198533affcbSRobert Mustacchi .nu_desc = "valid lsi (3)",
199533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
200533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_LSI,
201533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
202533affcbSRobert Mustacchi .nu_value = 0x5445,
203533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
204533affcbSRobert Mustacchi }, {
205533affcbSRobert Mustacchi .nu_desc = "invalid size (1.0) (1)",
206533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
207533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
208533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
209533affcbSRobert Mustacchi .nu_value = 0x4004,
210533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
211533affcbSRobert Mustacchi }, {
212533affcbSRobert Mustacchi .nu_desc = "invalid size (1.0) (2)",
213533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
214533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
215533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
216533affcbSRobert Mustacchi .nu_value = 0x76543210,
217533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
218533affcbSRobert Mustacchi }, {
219533affcbSRobert Mustacchi .nu_desc = "invalid size (1.0) (3)",
220533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
221533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
222533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
223533affcbSRobert Mustacchi .nu_value = 0x0,
224533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
225533affcbSRobert Mustacchi }, {
226533affcbSRobert Mustacchi .nu_desc = "bad alignment (1.0) (1)",
227533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
228533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
229533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
230533affcbSRobert Mustacchi .nu_value = 0x3,
231533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
232533affcbSRobert Mustacchi }, {
233533affcbSRobert Mustacchi .nu_desc = "bad alignment (1.0) (2)",
234533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
235533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
236533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
237533affcbSRobert Mustacchi .nu_value = 0xf7,
238533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
239533affcbSRobert Mustacchi }, {
240533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, No LPA) (1)",
241533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
242533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
243533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
244533affcbSRobert Mustacchi .nu_value = 0x4004,
245533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
246533affcbSRobert Mustacchi }, {
247533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, No LPA) (2)",
248533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
249533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
250533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
251533affcbSRobert Mustacchi .nu_value = 0x76543210,
252533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
253533affcbSRobert Mustacchi }, {
254533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, No LPA) (3)",
255533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
256533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
257533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
258533affcbSRobert Mustacchi .nu_value = 0x0,
259533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
260533affcbSRobert Mustacchi }, {
261533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, LPA) (1)",
262533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
263533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
264533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
265533affcbSRobert Mustacchi .nu_value = 0x123456789a0,
266533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
267533affcbSRobert Mustacchi }, {
268533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, LPA) (2)",
269533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
270533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
271533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
272533affcbSRobert Mustacchi .nu_value = 0x400000004,
273533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
274533affcbSRobert Mustacchi }, {
275533affcbSRobert Mustacchi .nu_desc = "invalid size (1.4, LPA) (3)",
276533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
277533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
278533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
279533affcbSRobert Mustacchi .nu_value = 0x0,
280533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
281533affcbSRobert Mustacchi }, {
282533affcbSRobert Mustacchi .nu_desc = "valid size (1.0) (1)",
283533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
284533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
285533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
286533affcbSRobert Mustacchi .nu_value = 0x4000,
287533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
288533affcbSRobert Mustacchi }, {
289533affcbSRobert Mustacchi .nu_desc = "valid size (1.0) (2)",
290533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
291533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
292533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
293533affcbSRobert Mustacchi .nu_value = 0x4,
294533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
295533affcbSRobert Mustacchi }, {
296533affcbSRobert Mustacchi .nu_desc = "valid size (1.0) (3)",
297533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
298533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
299533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
300533affcbSRobert Mustacchi .nu_value = 0x1234,
301533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
302533affcbSRobert Mustacchi }, {
303533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, No LPA) (1)",
304533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
305533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
306533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
307533affcbSRobert Mustacchi .nu_value = 0x4000,
308533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
309533affcbSRobert Mustacchi }, {
310533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, No LPA) (2)",
311533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
312533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
313533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
314533affcbSRobert Mustacchi .nu_value = 0x4,
315533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
316533affcbSRobert Mustacchi }, {
317533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, No LPA) (3)",
318533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
319533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
320533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
321533affcbSRobert Mustacchi .nu_value = 0x1234,
322533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
323533affcbSRobert Mustacchi }, {
324533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, LPA) (1)",
325533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
326533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
327533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
328533affcbSRobert Mustacchi .nu_value = 0x4000,
329533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
330533affcbSRobert Mustacchi }, {
331533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, LPA) (2)",
332533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
333533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
334533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
335533affcbSRobert Mustacchi .nu_value = 0x4,
336533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
337533affcbSRobert Mustacchi }, {
338533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, LPA) (3)",
339533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
340533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
341533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
342533affcbSRobert Mustacchi .nu_value = 0x1234,
343533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
344533affcbSRobert Mustacchi }, {
345533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, LPA) (4)",
346533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
347533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
348533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
349533affcbSRobert Mustacchi .nu_value = 0x400000000,
350533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
351533affcbSRobert Mustacchi }, {
352533affcbSRobert Mustacchi .nu_desc = "valid size (1.4, LPA) (5)",
353533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
354533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_SIZE,
355533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
356533affcbSRobert Mustacchi .nu_value = 0x7777777c,
357533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
358533affcbSRobert Mustacchi }, {
359533affcbSRobert Mustacchi .nu_desc = "unsupported CSI (1.0)",
360533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
361533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
362533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
363533affcbSRobert Mustacchi .nu_value = 0x0,
364533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
365533affcbSRobert Mustacchi }, {
366533affcbSRobert Mustacchi .nu_desc = "unsupported CSI (1.4)",
367533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
368533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
369533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
370533affcbSRobert Mustacchi .nu_value = 0x0,
371533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
372533affcbSRobert Mustacchi }, {
373533affcbSRobert Mustacchi .nu_desc = "invalid CSI (2.0) (1)",
374533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
375533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
376533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
377533affcbSRobert Mustacchi .nu_value = 0x100,
378533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
379533affcbSRobert Mustacchi }, {
380533affcbSRobert Mustacchi .nu_desc = "invalid CSI (2.0) (2)",
381533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
382533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
383533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
384533affcbSRobert Mustacchi .nu_value = UINT64_MAX,
385533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
386533affcbSRobert Mustacchi }, {
387533affcbSRobert Mustacchi .nu_desc = "valid CSI (2.0) (1)",
388533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
389533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
390533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
391533affcbSRobert Mustacchi .nu_value = 0x1,
392533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
393533affcbSRobert Mustacchi }, {
394533affcbSRobert Mustacchi .nu_desc = "valid CSI (2.0) (2)",
395533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
396533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_CSI,
397533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_2v0,
398533affcbSRobert Mustacchi .nu_value = 0xff,
399533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
400533affcbSRobert Mustacchi }, {
401533affcbSRobert Mustacchi .nu_desc = "unsupported rae (1.0)",
402533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
403533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_RAE,
404533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
405533affcbSRobert Mustacchi .nu_value = 0x0,
406533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
407533affcbSRobert Mustacchi }, {
408533affcbSRobert Mustacchi .nu_desc = "invalid rae (1)",
409533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
410533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_RAE,
411533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
412533affcbSRobert Mustacchi .nu_value = 0x2,
413533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
414533affcbSRobert Mustacchi }, {
415533affcbSRobert Mustacchi .nu_desc = "invalid rae (2)",
416533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
417533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_RAE,
418533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
419533affcbSRobert Mustacchi .nu_value = 0x34,
420533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
421533affcbSRobert Mustacchi }, {
422533affcbSRobert Mustacchi .nu_desc = "valid rae (1)",
423533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
424533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_RAE,
425533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
426533affcbSRobert Mustacchi .nu_value = 0x0,
427533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
428533affcbSRobert Mustacchi }, {
429533affcbSRobert Mustacchi .nu_desc = "valid rae (2)",
430533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
431533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_RAE,
432533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
433533affcbSRobert Mustacchi .nu_value = 0x1,
434533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
435533affcbSRobert Mustacchi }, {
436533affcbSRobert Mustacchi .nu_desc = "unsupported offset (1.0)",
437533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
438533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
439533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
440533affcbSRobert Mustacchi .nu_value = 0x3,
441533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
442533affcbSRobert Mustacchi }, {
443533affcbSRobert Mustacchi .nu_desc = "unsupported offset (1.4 No LPA)",
444533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
445533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
446533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_nolpa_1v4,
447533affcbSRobert Mustacchi .nu_value = 0x4,
448533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_UNSUP_FIELD
449533affcbSRobert Mustacchi }, {
450533affcbSRobert Mustacchi .nu_desc = "unaligned offset (1.4) (1)",
451533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
452533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
453533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
454533affcbSRobert Mustacchi .nu_value = 0x3,
455533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
456533affcbSRobert Mustacchi }, {
457533affcbSRobert Mustacchi .nu_desc = "unaligned offset (1.4) (2)",
458533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
459533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
460533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
461533affcbSRobert Mustacchi .nu_value = UINT64_MAX,
462533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
463533affcbSRobert Mustacchi }, {
464533affcbSRobert Mustacchi .nu_desc = "unaligned offset (1.4) (3)",
465533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
466533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
467533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
468533affcbSRobert Mustacchi .nu_value = 0x3,
469533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
470533affcbSRobert Mustacchi }, {
471533affcbSRobert Mustacchi .nu_desc = "valid offset (1.4) (1)",
472533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
473533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
474533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
475533affcbSRobert Mustacchi .nu_value = 0x0,
476533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
477533affcbSRobert Mustacchi }, {
478533affcbSRobert Mustacchi .nu_desc = "valid offset (1.4) (2)",
479533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
480533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
481533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
482533affcbSRobert Mustacchi .nu_value = 0x4444,
483533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
484533affcbSRobert Mustacchi }, {
485533affcbSRobert Mustacchi .nu_desc = "valid offset (1.4) (3)",
486533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
487533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_OFFSET,
488533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
489533affcbSRobert Mustacchi .nu_value = 0xfffffffffffffffc,
490533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
491533affcbSRobert Mustacchi }, {
492533affcbSRobert Mustacchi .nu_desc = "invalid nsid (1.4) (1)",
493533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
494533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
495533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
496533affcbSRobert Mustacchi .nu_value = 0x0,
497533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
498533affcbSRobert Mustacchi }, {
499533affcbSRobert Mustacchi .nu_desc = "invalid nsid (1.4) (2)",
500533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
501533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
502533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
503533affcbSRobert Mustacchi .nu_value = 0x1000,
504533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
505533affcbSRobert Mustacchi }, {
506533affcbSRobert Mustacchi .nu_desc = "invalid nsid (1.4) (3)",
507533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
508533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
509533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
510533affcbSRobert Mustacchi .nu_value = 0x81,
511533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_BAD_VALUE
512533affcbSRobert Mustacchi }, {
513*7001e2dfSRobert Mustacchi .nu_desc = "valid nsid (1.0)",
514*7001e2dfSRobert Mustacchi .nu_fields = nvme_log_fields,
515*7001e2dfSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
516*7001e2dfSRobert Mustacchi .nu_data = &nvme_ctrl_base_1v0,
517*7001e2dfSRobert Mustacchi .nu_value = 0x1,
518*7001e2dfSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
519*7001e2dfSRobert Mustacchi }, {
520533affcbSRobert Mustacchi .nu_desc = "valid nsid (1.4) (1)",
521533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
522533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
523533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
524533affcbSRobert Mustacchi .nu_value = 0x1,
525533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
526533affcbSRobert Mustacchi }, {
527533affcbSRobert Mustacchi .nu_desc = "valid nsid (1.4) (2)",
528533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
529533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
530533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
531533affcbSRobert Mustacchi .nu_value = 0x80,
532533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
533533affcbSRobert Mustacchi }, {
534533affcbSRobert Mustacchi .nu_desc = "valid nsid (1.4) (3)",
535533affcbSRobert Mustacchi .nu_fields = nvme_log_fields,
536533affcbSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
537533affcbSRobert Mustacchi .nu_data = &nvme_ctrl_ns_1v4,
538533affcbSRobert Mustacchi .nu_value = 0x23,
539533affcbSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
540*7001e2dfSRobert Mustacchi }, {
541*7001e2dfSRobert Mustacchi .nu_desc = "valid nsid (2.0 No NS)",
542*7001e2dfSRobert Mustacchi .nu_fields = nvme_log_fields,
543*7001e2dfSRobert Mustacchi .nu_index = NVME_LOG_REQ_FIELD_NSID,
544*7001e2dfSRobert Mustacchi .nu_data = &nvme_ctrl_nons_2v0,
545*7001e2dfSRobert Mustacchi .nu_value = 0x1,
546*7001e2dfSRobert Mustacchi .nu_ret = NVME_FIELD_ERR_OK
547533affcbSRobert Mustacchi } };
548533affcbSRobert Mustacchi
549533affcbSRobert Mustacchi typedef struct log_scope_test {
550533affcbSRobert Mustacchi const char *lst_desc;
551533affcbSRobert Mustacchi const char *lst_short;
552533affcbSRobert Mustacchi const nvme_valid_ctrl_data_t *lst_data;
553533affcbSRobert Mustacchi nvme_log_disc_scope_t lst_exp_scope;
554533affcbSRobert Mustacchi } log_scope_test_t;
555533affcbSRobert Mustacchi
556533affcbSRobert Mustacchi static const log_scope_test_t log_scope_tests[] = { {
557533affcbSRobert Mustacchi .lst_desc = "error log (1.0)",
558533affcbSRobert Mustacchi .lst_short = "error",
559533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_base_1v0,
560533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
561533affcbSRobert Mustacchi }, {
562533affcbSRobert Mustacchi .lst_desc = "error log (2.0)",
563533affcbSRobert Mustacchi .lst_short = "error",
564533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
565533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
566533affcbSRobert Mustacchi }, {
567533affcbSRobert Mustacchi .lst_desc = "health log (1.0)",
568533affcbSRobert Mustacchi .lst_short = "health",
569533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_base_1v0,
570533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
571533affcbSRobert Mustacchi }, {
572533affcbSRobert Mustacchi .lst_desc = "health log (1.4 No LPA)",
573533affcbSRobert Mustacchi .lst_short = "health",
574533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_nolpa_1v4,
575533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
576533affcbSRobert Mustacchi }, {
577533affcbSRobert Mustacchi .lst_desc = "health log (1.0 NS Health)",
578533affcbSRobert Mustacchi .lst_short = "health",
579533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_health_1v0,
580533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL | NVME_LOG_SCOPE_NS
581533affcbSRobert Mustacchi }, {
582533affcbSRobert Mustacchi .lst_desc = "health log (1.4 LPA)",
583533affcbSRobert Mustacchi .lst_short = "health",
584533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_ns_1v4,
585533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL | NVME_LOG_SCOPE_NS
586533affcbSRobert Mustacchi }, {
587533affcbSRobert Mustacchi .lst_desc = "health log (2.0 LPA)",
588533affcbSRobert Mustacchi .lst_short = "health",
589533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
590533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL | NVME_LOG_SCOPE_NS
591533affcbSRobert Mustacchi }, {
592533affcbSRobert Mustacchi .lst_desc = "firmware log (1.0)",
593533affcbSRobert Mustacchi .lst_short = "firmware",
594533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_base_1v0,
595533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_NVM
596533affcbSRobert Mustacchi }, {
597533affcbSRobert Mustacchi .lst_desc = "firmware log (2.0)",
598533affcbSRobert Mustacchi .lst_short = "firmware",
599533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
600533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_NVM
601533affcbSRobert Mustacchi }, {
602046911ebSRobert Mustacchi .lst_desc = "changed namespace log (2.0)",
603533affcbSRobert Mustacchi .lst_short = "changens",
604533affcbSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
605533affcbSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
606046911ebSRobert Mustacchi }, {
607046911ebSRobert Mustacchi .lst_desc = "supported logs log (2.0)",
608046911ebSRobert Mustacchi .lst_short = "suplog",
609046911ebSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
610046911ebSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
611046911ebSRobert Mustacchi }, {
612046911ebSRobert Mustacchi .lst_desc = "commands supported and effects log (1.2)",
613046911ebSRobert Mustacchi .lst_short = "cmdeff",
614046911ebSRobert Mustacchi .lst_data = &nvme_ctrl_ns_1v2,
615046911ebSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
616046911ebSRobert Mustacchi }, {
617046911ebSRobert Mustacchi .lst_desc = "commands supported and effects log (2.0)",
618046911ebSRobert Mustacchi .lst_short = "cmdeff",
619046911ebSRobert Mustacchi .lst_data = &nvme_ctrl_ns_2v0,
620046911ebSRobert Mustacchi .lst_exp_scope = NVME_LOG_SCOPE_CTRL
621533affcbSRobert Mustacchi } };
622533affcbSRobert Mustacchi
623533affcbSRobert Mustacchi typedef struct log_size_test {
624533affcbSRobert Mustacchi const char *lt_desc;
625533affcbSRobert Mustacchi const char *lt_short;
626533affcbSRobert Mustacchi const nvme_valid_ctrl_data_t *lt_data;
627533affcbSRobert Mustacchi uint64_t lt_size;
628533affcbSRobert Mustacchi bool lt_var;
629533affcbSRobert Mustacchi } log_size_test_t;
630533affcbSRobert Mustacchi
631533affcbSRobert Mustacchi static const log_size_test_t log_size_tests[] = { {
632533affcbSRobert Mustacchi .lt_desc = "error log (4 entries)",
633533affcbSRobert Mustacchi .lt_short = "error",
634533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_base_1v0,
635533affcbSRobert Mustacchi .lt_size = 4 * sizeof (nvme_error_log_entry_t),
636533affcbSRobert Mustacchi .lt_var = false
637533affcbSRobert Mustacchi }, {
638533affcbSRobert Mustacchi .lt_desc = "error log (1 entries)",
639533affcbSRobert Mustacchi .lt_short = "error",
640533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v4,
641533affcbSRobert Mustacchi .lt_size = sizeof (nvme_error_log_entry_t),
642533affcbSRobert Mustacchi .lt_var = false
643533affcbSRobert Mustacchi }, {
644533affcbSRobert Mustacchi .lt_desc = "health log (1.0)",
645533affcbSRobert Mustacchi .lt_short = "health",
646533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_base_1v0,
647533affcbSRobert Mustacchi .lt_size = sizeof (nvme_health_log_t),
648533affcbSRobert Mustacchi .lt_var = false
649533affcbSRobert Mustacchi }, {
650533affcbSRobert Mustacchi .lt_desc = "health log (1.4)",
651533affcbSRobert Mustacchi .lt_short = "health",
652533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v4,
653533affcbSRobert Mustacchi .lt_size = sizeof (nvme_health_log_t),
654533affcbSRobert Mustacchi .lt_var = false
655533affcbSRobert Mustacchi }, {
656533affcbSRobert Mustacchi .lt_desc = "firmware log (1.0)",
657533affcbSRobert Mustacchi .lt_short = "firmware",
658533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_base_1v0,
659533affcbSRobert Mustacchi .lt_size = sizeof (nvme_fwslot_log_t),
660533affcbSRobert Mustacchi .lt_var = false
661533affcbSRobert Mustacchi }, {
662533affcbSRobert Mustacchi .lt_desc = "firmware log (1.4)",
663533affcbSRobert Mustacchi .lt_short = "firmware",
664533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v4,
665533affcbSRobert Mustacchi .lt_size = sizeof (nvme_fwslot_log_t),
666533affcbSRobert Mustacchi .lt_var = false
667533affcbSRobert Mustacchi }, {
668533affcbSRobert Mustacchi .lt_desc = "changed namespace log (1.0)",
669533affcbSRobert Mustacchi .lt_short = "changens",
670533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_base_1v0,
671533affcbSRobert Mustacchi .lt_size = sizeof (nvme_nschange_list_t),
672533affcbSRobert Mustacchi .lt_var = false
673533affcbSRobert Mustacchi }, {
674533affcbSRobert Mustacchi .lt_desc = "changed namespace log (1.4)",
675533affcbSRobert Mustacchi .lt_short = "changens",
676533affcbSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v4,
677533affcbSRobert Mustacchi .lt_size = sizeof (nvme_nschange_list_t),
678533affcbSRobert Mustacchi .lt_var = false
679046911ebSRobert Mustacchi }, {
680046911ebSRobert Mustacchi .lt_desc = "commands supported and effects log (1.2)",
681046911ebSRobert Mustacchi .lt_short = "cmdeff",
682046911ebSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v2,
683046911ebSRobert Mustacchi .lt_size = sizeof (nvme_cmdeff_log_t),
684046911ebSRobert Mustacchi .lt_var = false
685046911ebSRobert Mustacchi }, {
686046911ebSRobert Mustacchi .lt_desc = "commands supported and effects log (1.4)",
687046911ebSRobert Mustacchi .lt_short = "cmdeff",
688046911ebSRobert Mustacchi .lt_data = &nvme_ctrl_ns_1v4,
689046911ebSRobert Mustacchi .lt_size = sizeof (nvme_cmdeff_log_t),
690046911ebSRobert Mustacchi .lt_var = false
691046911ebSRobert Mustacchi }, {
692046911ebSRobert Mustacchi .lt_desc = "supported logs log (2.0)",
693046911ebSRobert Mustacchi .lt_short = "suplog",
694046911ebSRobert Mustacchi .lt_data = &nvme_ctrl_ns_2v0,
695046911ebSRobert Mustacchi .lt_size = sizeof (nvme_suplog_log_t),
696046911ebSRobert Mustacchi .lt_var = false
697533affcbSRobert Mustacchi } };
698533affcbSRobert Mustacchi
699533affcbSRobert Mustacchi typedef struct log_impl_test {
700533affcbSRobert Mustacchi const char *lit_desc;
701533affcbSRobert Mustacchi const char *lit_short;
702533affcbSRobert Mustacchi const nvme_valid_ctrl_data_t *lit_data;
703533affcbSRobert Mustacchi bool lit_impl;
704533affcbSRobert Mustacchi } log_impl_test_t;
705533affcbSRobert Mustacchi
706533affcbSRobert Mustacchi static const log_impl_test_t log_impl_tests[] = { {
707046911ebSRobert Mustacchi .lit_desc = "supported logs (1.0)",
708046911ebSRobert Mustacchi .lit_short = "suplog",
709046911ebSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
710046911ebSRobert Mustacchi .lit_impl = false
711046911ebSRobert Mustacchi }, {
712046911ebSRobert Mustacchi .lit_desc = "supported logs (2.0)",
713046911ebSRobert Mustacchi .lit_short = "suplog",
714046911ebSRobert Mustacchi .lit_data = &nvme_ctrl_base_2v0,
715046911ebSRobert Mustacchi .lit_impl = true
716046911ebSRobert Mustacchi }, {
717533affcbSRobert Mustacchi .lit_desc = "error (1.0)",
718533affcbSRobert Mustacchi .lit_short = "error",
719533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
720533affcbSRobert Mustacchi .lit_impl = true
721533affcbSRobert Mustacchi }, {
722533affcbSRobert Mustacchi .lit_desc = "error (1.4)",
723533affcbSRobert Mustacchi .lit_short = "error",
724533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_ns_1v4,
725533affcbSRobert Mustacchi .lit_impl = true
726533affcbSRobert Mustacchi }, {
727533affcbSRobert Mustacchi .lit_desc = "health (1.0)",
728533affcbSRobert Mustacchi .lit_short = "health",
729533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
730533affcbSRobert Mustacchi .lit_impl = true
731533affcbSRobert Mustacchi }, {
732533affcbSRobert Mustacchi .lit_desc = "health (1.4)",
733533affcbSRobert Mustacchi .lit_short = "health",
734533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_ns_1v4,
735533affcbSRobert Mustacchi .lit_impl = true
736533affcbSRobert Mustacchi }, {
737533affcbSRobert Mustacchi .lit_desc = "firmware (1.0)",
738533affcbSRobert Mustacchi .lit_short = "firmware",
739533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
740533affcbSRobert Mustacchi .lit_impl = true
741533affcbSRobert Mustacchi }, {
742533affcbSRobert Mustacchi .lit_desc = "firmware (1.4)",
743533affcbSRobert Mustacchi .lit_short = "firmware",
744533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_ns_1v4,
745533affcbSRobert Mustacchi .lit_impl = true
746533affcbSRobert Mustacchi }, {
747533affcbSRobert Mustacchi .lit_desc = "changed namespace (1.0)",
748533affcbSRobert Mustacchi .lit_short = "changens",
749533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
750533affcbSRobert Mustacchi .lit_impl = false
751533affcbSRobert Mustacchi }, {
752533affcbSRobert Mustacchi .lit_desc = "changed namespace (1.4 No LPA)",
753533affcbSRobert Mustacchi .lit_short = "changens",
754533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_ns_1v4,
755533affcbSRobert Mustacchi .lit_impl = true
756533affcbSRobert Mustacchi }, {
757533affcbSRobert Mustacchi .lit_desc = "changed namespace (1.2 No OAES)",
758533affcbSRobert Mustacchi .lit_short = "changens",
759533affcbSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v2,
760533affcbSRobert Mustacchi .lit_impl = false
761046911ebSRobert Mustacchi }, {
762046911ebSRobert Mustacchi .lit_desc = "commands supported and effects (1.0)",
763046911ebSRobert Mustacchi .lit_short = "cmdeff",
764046911ebSRobert Mustacchi .lit_data = &nvme_ctrl_base_1v0,
765046911ebSRobert Mustacchi .lit_impl = false
766046911ebSRobert Mustacchi }, {
767046911ebSRobert Mustacchi .lit_desc = "commands supported and effects (1.4 LPA)",
768046911ebSRobert Mustacchi .lit_short = "cmdeff",
769046911ebSRobert Mustacchi .lit_data = &nvme_ctrl_ns_1v4,
770046911ebSRobert Mustacchi .lit_impl = true
771046911ebSRobert Mustacchi }, {
772046911ebSRobert Mustacchi .lit_desc = "commands supported and effects (2.0 No LPA)",
773046911ebSRobert Mustacchi .lit_short = "cmdeff",
774046911ebSRobert Mustacchi .lit_data = &nvme_ctrl_base_2v0,
775046911ebSRobert Mustacchi .lit_impl = false
776533affcbSRobert Mustacchi } };
777533affcbSRobert Mustacchi
778533affcbSRobert Mustacchi static const nvme_log_page_info_t *
log_test_find_info(const char * desc,const char * name)779533affcbSRobert Mustacchi log_test_find_info(const char *desc, const char *name)
780533affcbSRobert Mustacchi {
781533affcbSRobert Mustacchi for (size_t i = 0; i < nvme_std_log_npages; i++) {
782533affcbSRobert Mustacchi if (strcmp(nvme_std_log_pages[i].nlpi_short, name) == 0) {
783533affcbSRobert Mustacchi return (&nvme_std_log_pages[i]);
784533affcbSRobert Mustacchi }
785533affcbSRobert Mustacchi }
786533affcbSRobert Mustacchi
787533affcbSRobert Mustacchi errx(EXIT_FAILURE, "malformed test: %s: cannot find log page %s",
788533affcbSRobert Mustacchi desc, name);
789533affcbSRobert Mustacchi }
790533affcbSRobert Mustacchi
791533affcbSRobert Mustacchi static bool
log_scope_test_one(const log_scope_test_t * test)792533affcbSRobert Mustacchi log_scope_test_one(const log_scope_test_t *test)
793533affcbSRobert Mustacchi {
794533affcbSRobert Mustacchi nvme_log_disc_scope_t scope;
795533affcbSRobert Mustacchi const nvme_log_page_info_t *info;
796533affcbSRobert Mustacchi
797533affcbSRobert Mustacchi info = log_test_find_info(test->lst_desc, test->lst_short);
798533affcbSRobert Mustacchi scope = nvme_log_page_info_scope(info, test->lst_data);
799533affcbSRobert Mustacchi if (scope != test->lst_exp_scope) {
800533affcbSRobert Mustacchi warnx("TEST FAILED: %s: found scope 0x%x, expected 0x%x",
801533affcbSRobert Mustacchi test->lst_desc, scope, test->lst_exp_scope);
802533affcbSRobert Mustacchi return (false);
803533affcbSRobert Mustacchi }
804533affcbSRobert Mustacchi
805533affcbSRobert Mustacchi (void) printf("TEST PASSED: %s: correct scope\n", test->lst_desc);
806533affcbSRobert Mustacchi return (true);
807533affcbSRobert Mustacchi }
808533affcbSRobert Mustacchi
809533affcbSRobert Mustacchi static bool
log_size_test_one(const log_size_test_t * test)810533affcbSRobert Mustacchi log_size_test_one(const log_size_test_t *test)
811533affcbSRobert Mustacchi {
812533affcbSRobert Mustacchi const nvme_log_page_info_t *info;
813533affcbSRobert Mustacchi uint64_t len;
814533affcbSRobert Mustacchi bool var, ret = true;
815533affcbSRobert Mustacchi
816533affcbSRobert Mustacchi info = log_test_find_info(test->lt_desc, test->lt_short);
817533affcbSRobert Mustacchi len = nvme_log_page_info_size(info, test->lt_data, &var);
818533affcbSRobert Mustacchi
819533affcbSRobert Mustacchi if (len != test->lt_size) {
820533affcbSRobert Mustacchi warnx("TEST FAILED: %s: expected size %" PRIu64 ", found %"
821533affcbSRobert Mustacchi PRIu64, test->lt_desc, test->lt_size, len);
822533affcbSRobert Mustacchi ret = false;
823533affcbSRobert Mustacchi } else {
824533affcbSRobert Mustacchi (void) printf("TEST PASSED: %s: found correct size\n",
825533affcbSRobert Mustacchi test->lt_desc);
826533affcbSRobert Mustacchi }
827533affcbSRobert Mustacchi
828533affcbSRobert Mustacchi if (var != test->lt_var) {
829533affcbSRobert Mustacchi warnx("TEST FAILED: %s: expected var %u, found %u",
830533affcbSRobert Mustacchi test->lt_desc, test->lt_var, var);
831533affcbSRobert Mustacchi ret = false;
832533affcbSRobert Mustacchi } else {
833533affcbSRobert Mustacchi (void) printf("TEST PASSED: %s: variable length flag correct\n",
834533affcbSRobert Mustacchi test->lt_desc);
835533affcbSRobert Mustacchi }
836533affcbSRobert Mustacchi
837533affcbSRobert Mustacchi return (ret);
838533affcbSRobert Mustacchi }
839533affcbSRobert Mustacchi
840533affcbSRobert Mustacchi static bool
log_impl_test_one(const log_impl_test_t * test)841533affcbSRobert Mustacchi log_impl_test_one(const log_impl_test_t *test)
842533affcbSRobert Mustacchi {
843533affcbSRobert Mustacchi const nvme_log_page_info_t *info;
844533affcbSRobert Mustacchi bool impl;
845533affcbSRobert Mustacchi
846533affcbSRobert Mustacchi info = log_test_find_info(test->lit_desc, test->lit_short);
847533affcbSRobert Mustacchi impl = nvme_log_page_info_supported(info, test->lit_data);
848533affcbSRobert Mustacchi if (impl != test->lit_impl) {
849533affcbSRobert Mustacchi warnx("TEST FAILED: %s: expected impl %u, found %u",
850533affcbSRobert Mustacchi test->lit_desc, test->lit_impl, impl);
851533affcbSRobert Mustacchi return (false);
852533affcbSRobert Mustacchi }
853533affcbSRobert Mustacchi
854533affcbSRobert Mustacchi (void) printf("TEST PASSED: %s: got correct impl\n", test->lit_desc);
855533affcbSRobert Mustacchi return (true);
856533affcbSRobert Mustacchi }
857533affcbSRobert Mustacchi
858533affcbSRobert Mustacchi int
main(void)859533affcbSRobert Mustacchi main(void)
860533affcbSRobert Mustacchi {
861533affcbSRobert Mustacchi int ret = EXIT_SUCCESS;
862533affcbSRobert Mustacchi
863533affcbSRobert Mustacchi if (!nvme_unit_field_test(log_field_tests,
864533affcbSRobert Mustacchi ARRAY_SIZE(log_field_tests))) {
865533affcbSRobert Mustacchi ret = EXIT_FAILURE;
866533affcbSRobert Mustacchi }
867533affcbSRobert Mustacchi
868533affcbSRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(log_scope_tests); i++) {
869533affcbSRobert Mustacchi if (!log_scope_test_one(&log_scope_tests[i])) {
870533affcbSRobert Mustacchi ret = EXIT_FAILURE;
871533affcbSRobert Mustacchi }
872533affcbSRobert Mustacchi }
873533affcbSRobert Mustacchi
874533affcbSRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(log_size_tests); i++) {
875533affcbSRobert Mustacchi if (!log_size_test_one(&log_size_tests[i])) {
876533affcbSRobert Mustacchi ret = EXIT_FAILURE;
877533affcbSRobert Mustacchi }
878533affcbSRobert Mustacchi }
879533affcbSRobert Mustacchi
880533affcbSRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(log_impl_tests); i++) {
881533affcbSRobert Mustacchi if (!log_impl_test_one(&log_impl_tests[i])) {
882533affcbSRobert Mustacchi ret = EXIT_FAILURE;
883533affcbSRobert Mustacchi }
884533affcbSRobert Mustacchi }
885533affcbSRobert Mustacchi
886533affcbSRobert Mustacchi if (ret == EXIT_SUCCESS) {
887533affcbSRobert Mustacchi (void) printf("All tests passed successfully!\n");
888533affcbSRobert Mustacchi }
889533affcbSRobert Mustacchi
890533affcbSRobert Mustacchi return (ret);
891533affcbSRobert Mustacchi }
892