xref: /illumos-gate/usr/src/test/nvme-tests/tests/unit/logs.c (revision 7001e2dfbde60ab6bfa231a6025776e173dc4657)
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