xref: /illumos-gate/usr/src/test/nvme-tests/tests/unit/identify.c (revision 533affcbc7fc4d0c8132976ea454aaa715fe2307)
1*533affcbSRobert Mustacchi /*
2*533affcbSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*533affcbSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*533affcbSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*533affcbSRobert Mustacchi  * 1.0 of the CDDL.
6*533affcbSRobert Mustacchi  *
7*533affcbSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*533affcbSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*533affcbSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*533affcbSRobert Mustacchi  */
11*533affcbSRobert Mustacchi 
12*533affcbSRobert Mustacchi /*
13*533affcbSRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14*533affcbSRobert Mustacchi  */
15*533affcbSRobert Mustacchi 
16*533affcbSRobert Mustacchi /*
17*533affcbSRobert Mustacchi  * NVMe Identify unit tests. This validates both fields and also whether certain
18*533affcbSRobert Mustacchi  * cases are supported.
19*533affcbSRobert Mustacchi  */
20*533affcbSRobert Mustacchi 
21*533affcbSRobert Mustacchi #include <stdlib.h>
22*533affcbSRobert Mustacchi #include <sys/sysmacros.h>
23*533affcbSRobert Mustacchi #include <err.h>
24*533affcbSRobert Mustacchi 
25*533affcbSRobert Mustacchi #include "nvme_unit.h"
26*533affcbSRobert Mustacchi 
27*533affcbSRobert Mustacchi static const nvme_unit_field_test_t identify_field_tests[] = { {
28*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.0) (1)",
29*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
30*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
31*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
32*533affcbSRobert Mustacchi 	.nu_value = 0x0,
33*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
34*533affcbSRobert Mustacchi }, {
35*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.0) (2)",
36*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
37*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
38*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
39*533affcbSRobert Mustacchi 	.nu_value = 0x1,
40*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
41*533affcbSRobert Mustacchi }, {
42*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.0) (1)",
43*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
44*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
45*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
46*533affcbSRobert Mustacchi 	.nu_value = 0x2,
47*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
48*533affcbSRobert Mustacchi }, {
49*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.0) (2)",
50*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
51*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
52*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
53*533affcbSRobert Mustacchi 	.nu_value = 0x55,
54*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
55*533affcbSRobert Mustacchi }, {
56*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.1) (1)",
57*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
58*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
59*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
60*533affcbSRobert Mustacchi 	.nu_value = 0x0,
61*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
62*533affcbSRobert Mustacchi }, {
63*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.1) (2)",
64*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
65*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
66*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
67*533affcbSRobert Mustacchi 	.nu_value = 0x1,
68*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
69*533affcbSRobert Mustacchi }, {
70*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.1) (3)",
71*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
72*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
73*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
74*533affcbSRobert Mustacchi 	.nu_value = 0x2,
75*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
76*533affcbSRobert Mustacchi },  {
77*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.1) (3)",
78*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
79*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
80*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
81*533affcbSRobert Mustacchi 	.nu_value = 0x3,
82*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
83*533affcbSRobert Mustacchi },  {
84*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.1) (1)",
85*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
86*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
87*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
88*533affcbSRobert Mustacchi 	.nu_value = 0x4,
89*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
90*533affcbSRobert Mustacchi }, {
91*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.1) (2)",
92*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
93*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
94*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
95*533affcbSRobert Mustacchi 	.nu_value = 0x55,
96*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
97*533affcbSRobert Mustacchi }, {
98*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.1) (2)",
99*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
100*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
101*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
102*533affcbSRobert Mustacchi 	.nu_value = 0x121,
103*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
104*533affcbSRobert Mustacchi }, {
105*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.2) (1)",
106*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
107*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
108*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
109*533affcbSRobert Mustacchi 	.nu_value = 0x0,
110*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
111*533affcbSRobert Mustacchi }, {
112*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.2) (2)",
113*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
114*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
115*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
116*533affcbSRobert Mustacchi 	.nu_value = 0xff,
117*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
118*533affcbSRobert Mustacchi }, {
119*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.2) (3)",
120*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
121*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
122*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
123*533affcbSRobert Mustacchi 	.nu_value = 0x74,
124*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
125*533affcbSRobert Mustacchi },  {
126*533affcbSRobert Mustacchi 	.nu_desc = "valid CNS (1.2) (3)",
127*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
128*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
129*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
130*533affcbSRobert Mustacchi 	.nu_value = 0x23,
131*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
132*533affcbSRobert Mustacchi },  {
133*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.2) (1)",
134*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
135*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
136*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
137*533affcbSRobert Mustacchi 	.nu_value = 0x100,
138*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
139*533affcbSRobert Mustacchi }, {
140*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.2) (2)",
141*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
142*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
143*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
144*533affcbSRobert Mustacchi 	.nu_value = 0x3223,
145*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
146*533affcbSRobert Mustacchi }, {
147*533affcbSRobert Mustacchi 	.nu_desc = "invalid CNS (1.2) (2)",
148*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
149*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CNS,
150*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
151*533affcbSRobert Mustacchi 	.nu_value = 0x121,
152*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
153*533affcbSRobert Mustacchi }, {
154*533affcbSRobert Mustacchi 	.nu_desc = "valid nsid (1.0/1) (1)",
155*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
156*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_NSID,
157*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
158*533affcbSRobert Mustacchi 	.nu_value = 0x1,
159*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
160*533affcbSRobert Mustacchi }, {
161*533affcbSRobert Mustacchi 	.nu_desc = "valid nsid (1.0/1) (2)",
162*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
163*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_NSID,
164*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
165*533affcbSRobert Mustacchi 	.nu_value = NVME_NSID_BCAST,
166*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
167*533affcbSRobert Mustacchi }, {
168*533affcbSRobert Mustacchi 	/*
169*533affcbSRobert Mustacchi 	 * The namespace ID for identify commands varies in its allowed values
170*533affcbSRobert Mustacchi 	 * based on the particular CNS. Some commands allow for a namespace ID
171*533affcbSRobert Mustacchi 	 * that has nothing to do with the controller's valid range.
172*533affcbSRobert Mustacchi 	 */
173*533affcbSRobert Mustacchi 	.nu_desc = "invalid nsid (1)",
174*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
175*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_NSID,
176*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
177*533affcbSRobert Mustacchi 	.nu_value = UINT64_MAX,
178*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
179*533affcbSRobert Mustacchi }, {
180*533affcbSRobert Mustacchi 	.nu_desc = "invalid nsid (2)",
181*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
182*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_NSID,
183*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
184*533affcbSRobert Mustacchi 	.nu_value = 0x100000000,
185*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
186*533affcbSRobert Mustacchi }, {
187*533affcbSRobert Mustacchi 	.nu_desc = "unsupported ctrlid (1)",
188*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
189*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
190*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
191*533affcbSRobert Mustacchi 	.nu_value = 0x0,
192*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
193*533affcbSRobert Mustacchi }, {
194*533affcbSRobert Mustacchi 	.nu_desc = "unsupported ctrlid (2)",
195*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
196*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
197*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v1,
198*533affcbSRobert Mustacchi 	.nu_value = 0x0,
199*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_UNSUP_VERSION
200*533affcbSRobert Mustacchi }, {
201*533affcbSRobert Mustacchi 	.nu_desc = "valid ctrlid (1)",
202*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
203*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
204*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
205*533affcbSRobert Mustacchi 	.nu_value = 0x0,
206*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
207*533affcbSRobert Mustacchi }, {
208*533affcbSRobert Mustacchi 	.nu_desc = "valid ctrlid (2)",
209*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
210*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
211*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_ns_1v4,
212*533affcbSRobert Mustacchi 	.nu_value = 0xffff,
213*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
214*533affcbSRobert Mustacchi }, {
215*533affcbSRobert Mustacchi 	.nu_desc = "valid ctrlid (3)",
216*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
217*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
218*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
219*533affcbSRobert Mustacchi 	.nu_value = 0x4334,
220*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
221*533affcbSRobert Mustacchi }, {
222*533affcbSRobert Mustacchi 	.nu_desc = "invalid ctrlid (1)",
223*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
224*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
225*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
226*533affcbSRobert Mustacchi 	.nu_value = 0x10000,
227*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
228*533affcbSRobert Mustacchi }, {
229*533affcbSRobert Mustacchi 	.nu_desc = "invalid ctrlid (2)",
230*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
231*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_CTRLID,
232*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v2,
233*533affcbSRobert Mustacchi 	.nu_value = 0x43210,
234*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
235*533affcbSRobert Mustacchi }, {
236*533affcbSRobert Mustacchi 	.nu_desc = "valid buffer length",
237*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
238*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_BUF,
239*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
240*533affcbSRobert Mustacchi 	.nu_value = 0x1000,
241*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_OK
242*533affcbSRobert Mustacchi }, {
243*533affcbSRobert Mustacchi 	.nu_desc = "invalid buffer length (1)",
244*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
245*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_BUF,
246*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
247*533affcbSRobert Mustacchi 	.nu_value = 0xfff,
248*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
249*533affcbSRobert Mustacchi }, {
250*533affcbSRobert Mustacchi 	.nu_desc = "invalid buffer length (2)",
251*533affcbSRobert Mustacchi 	.nu_fields = nvme_identify_fields,
252*533affcbSRobert Mustacchi 	.nu_index = NVME_ID_REQ_F_BUF,
253*533affcbSRobert Mustacchi 	.nu_data = &nvme_ctrl_base_1v0,
254*533affcbSRobert Mustacchi 	.nu_value = 0x1001,
255*533affcbSRobert Mustacchi 	.nu_ret = NVME_FIELD_ERR_BAD_VALUE
256*533affcbSRobert Mustacchi } };
257*533affcbSRobert Mustacchi 
258*533affcbSRobert Mustacchi typedef struct identify_impl_test {
259*533affcbSRobert Mustacchi 	const char *iit_desc;
260*533affcbSRobert Mustacchi 	uint32_t iit_cns;
261*533affcbSRobert Mustacchi 	const nvme_valid_ctrl_data_t *iit_data;
262*533affcbSRobert Mustacchi 	bool iit_impl;
263*533affcbSRobert Mustacchi } identify_impl_test_t;
264*533affcbSRobert Mustacchi 
265*533affcbSRobert Mustacchi static const identify_impl_test_t identify_impl_tests[] = { {
266*533affcbSRobert Mustacchi 	.iit_desc = "identify namespace supported (1.0)",
267*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID,
268*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
269*533affcbSRobert Mustacchi 	.iit_impl = true
270*533affcbSRobert Mustacchi }, {
271*533affcbSRobert Mustacchi 	.iit_desc = "identify namespace supported (1.4 No NS)",
272*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID,
273*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
274*533affcbSRobert Mustacchi 	.iit_impl = true
275*533affcbSRobert Mustacchi }, {
276*533affcbSRobert Mustacchi 	.iit_desc = "identify namespace supported (2.0)",
277*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID,
278*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_2v0,
279*533affcbSRobert Mustacchi 	.iit_impl = true
280*533affcbSRobert Mustacchi }, {
281*533affcbSRobert Mustacchi 	.iit_desc = "identify controller supported (1.0)",
282*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL,
283*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
284*533affcbSRobert Mustacchi 	.iit_impl = true
285*533affcbSRobert Mustacchi }, {
286*533affcbSRobert Mustacchi 	.iit_desc = "identify controller supported (1.4 No NS)",
287*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL,
288*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
289*533affcbSRobert Mustacchi 	.iit_impl = true
290*533affcbSRobert Mustacchi }, {
291*533affcbSRobert Mustacchi 	.iit_desc = "identify controller supported (2.0)",
292*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL,
293*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_2v0,
294*533affcbSRobert Mustacchi 	.iit_impl = true
295*533affcbSRobert Mustacchi }, {
296*533affcbSRobert Mustacchi 	.iit_desc = "identify controller supported (1.2 No NS)",
297*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL,
298*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v2,
299*533affcbSRobert Mustacchi 	.iit_impl = true
300*533affcbSRobert Mustacchi }, {
301*533affcbSRobert Mustacchi 	.iit_desc = "active namespace list unsupported (1.0)",
302*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_LIST,
303*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
304*533affcbSRobert Mustacchi 	.iit_impl = false
305*533affcbSRobert Mustacchi }, {
306*533affcbSRobert Mustacchi 	.iit_desc = "active namespace list supported (1.1)",
307*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_LIST,
308*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v1,
309*533affcbSRobert Mustacchi 	.iit_impl = true
310*533affcbSRobert Mustacchi }, {
311*533affcbSRobert Mustacchi 	.iit_desc = "active namespace list supported (1.3 No NS)",
312*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_LIST,
313*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v3,
314*533affcbSRobert Mustacchi 	.iit_impl = true
315*533affcbSRobert Mustacchi }, {
316*533affcbSRobert Mustacchi 	.iit_desc = "active namespace list supported (1.4)",
317*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_LIST,
318*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
319*533affcbSRobert Mustacchi 	.iit_impl = true
320*533affcbSRobert Mustacchi }, {
321*533affcbSRobert Mustacchi 	.iit_desc = "namespace id desc unsupported (1.0)",
322*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_DESC,
323*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
324*533affcbSRobert Mustacchi 	.iit_impl = false
325*533affcbSRobert Mustacchi }, {
326*533affcbSRobert Mustacchi 	.iit_desc = "namespace id desc unsupported (1.1)",
327*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_DESC,
328*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v1,
329*533affcbSRobert Mustacchi 	.iit_impl = false
330*533affcbSRobert Mustacchi }, {
331*533affcbSRobert Mustacchi 	.iit_desc = "namespace id desc supported (1.3 No NS)",
332*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_DESC,
333*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v3,
334*533affcbSRobert Mustacchi 	.iit_impl = true
335*533affcbSRobert Mustacchi }, {
336*533affcbSRobert Mustacchi 	.iit_desc = "namespace id desc supported (1.3)",
337*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_DESC,
338*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v3,
339*533affcbSRobert Mustacchi 	.iit_impl = true
340*533affcbSRobert Mustacchi }, {
341*533affcbSRobert Mustacchi 	.iit_desc = "namespace id desc supported (1.4)",
342*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_DESC,
343*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
344*533affcbSRobert Mustacchi 	.iit_impl = true
345*533affcbSRobert Mustacchi }, {
346*533affcbSRobert Mustacchi 	.iit_desc = "allocated namespace list unsupported (1.0)",
347*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC_LIST,
348*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
349*533affcbSRobert Mustacchi 	.iit_impl = false
350*533affcbSRobert Mustacchi }, {
351*533affcbSRobert Mustacchi 	.iit_desc = "allocated namespace list unsupported (1.2 No NS)",
352*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC_LIST,
353*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v2,
354*533affcbSRobert Mustacchi 	.iit_impl = false
355*533affcbSRobert Mustacchi }, {
356*533affcbSRobert Mustacchi 	.iit_desc = "allocated namespace list unsupported (1.4 No NS)",
357*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC_LIST,
358*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
359*533affcbSRobert Mustacchi 	.iit_impl = false
360*533affcbSRobert Mustacchi }, {
361*533affcbSRobert Mustacchi 	.iit_desc = "allocated namespace list supported (1.2)",
362*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC_LIST,
363*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v2,
364*533affcbSRobert Mustacchi 	.iit_impl = true
365*533affcbSRobert Mustacchi }, {
366*533affcbSRobert Mustacchi 	.iit_desc = "allocated namespace list supported (1.4)",
367*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC_LIST,
368*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
369*533affcbSRobert Mustacchi 	.iit_impl = true
370*533affcbSRobert Mustacchi }, {
371*533affcbSRobert Mustacchi 	.iit_desc = "identify allocated namespace unsupported (1.0)",
372*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC,
373*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
374*533affcbSRobert Mustacchi 	.iit_impl = false
375*533affcbSRobert Mustacchi }, {
376*533affcbSRobert Mustacchi 	.iit_desc = "identify allocated namespace unsupported (1.2 No NS)",
377*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC,
378*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v2,
379*533affcbSRobert Mustacchi 	.iit_impl = false
380*533affcbSRobert Mustacchi }, {
381*533affcbSRobert Mustacchi 	.iit_desc = "identify allocated namespace unsupported (1.4 No NS)",
382*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC,
383*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
384*533affcbSRobert Mustacchi 	.iit_impl = false
385*533affcbSRobert Mustacchi }, {
386*533affcbSRobert Mustacchi 	.iit_desc = "identify allocated namespace supported (1.2)",
387*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC,
388*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v2,
389*533affcbSRobert Mustacchi 	.iit_impl = true
390*533affcbSRobert Mustacchi }, {
391*533affcbSRobert Mustacchi 	.iit_desc = "identify allocated namespace supported (1.4)",
392*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_ALLOC,
393*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
394*533affcbSRobert Mustacchi 	.iit_impl = true
395*533affcbSRobert Mustacchi }, {
396*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NS unsupported (1.0)",
397*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_CTRL_LIST,
398*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
399*533affcbSRobert Mustacchi 	.iit_impl = false
400*533affcbSRobert Mustacchi }, {
401*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NS unsupported (1.2 No NS)",
402*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_CTRL_LIST,
403*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v2,
404*533affcbSRobert Mustacchi 	.iit_impl = false
405*533affcbSRobert Mustacchi }, {
406*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NS unsupported (1.4 No NS)",
407*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_CTRL_LIST,
408*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
409*533affcbSRobert Mustacchi 	.iit_impl = false
410*533affcbSRobert Mustacchi }, {
411*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NS supported (1.2)",
412*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_CTRL_LIST,
413*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v2,
414*533affcbSRobert Mustacchi 	.iit_impl = true
415*533affcbSRobert Mustacchi }, {
416*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NS supported (1.4)",
417*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_NSID_CTRL_LIST,
418*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
419*533affcbSRobert Mustacchi 	.iit_impl = true
420*533affcbSRobert Mustacchi }, {
421*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NVM unsupported (1.0)",
422*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL_LIST,
423*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v0,
424*533affcbSRobert Mustacchi 	.iit_impl = false
425*533affcbSRobert Mustacchi }, {
426*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NVM unsupported (1.2 No NS)",
427*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL_LIST,
428*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_base_1v2,
429*533affcbSRobert Mustacchi 	.iit_impl = false
430*533affcbSRobert Mustacchi }, {
431*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NVM unsupported (1.4 No NS)",
432*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL_LIST,
433*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_nons_1v4,
434*533affcbSRobert Mustacchi 	.iit_impl = false
435*533affcbSRobert Mustacchi }, {
436*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NVM supported (1.2)",
437*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL_LIST,
438*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v2,
439*533affcbSRobert Mustacchi 	.iit_impl = true
440*533affcbSRobert Mustacchi }, {
441*533affcbSRobert Mustacchi 	.iit_desc = "controller list by NVM supported (1.4)",
442*533affcbSRobert Mustacchi 	.iit_cns = NVME_IDENTIFY_CTRL_LIST,
443*533affcbSRobert Mustacchi 	.iit_data = &nvme_ctrl_ns_1v4,
444*533affcbSRobert Mustacchi 	.iit_impl = true
445*533affcbSRobert Mustacchi } };
446*533affcbSRobert Mustacchi 
447*533affcbSRobert Mustacchi static bool
identify_impl_test_one(const identify_impl_test_t * test)448*533affcbSRobert Mustacchi identify_impl_test_one(const identify_impl_test_t *test)
449*533affcbSRobert Mustacchi {
450*533affcbSRobert Mustacchi 	const nvme_identify_info_t *info = NULL;
451*533affcbSRobert Mustacchi 	bool impl;
452*533affcbSRobert Mustacchi 
453*533affcbSRobert Mustacchi 	for (size_t i = 0; i < nvme_identify_ncmds; i++) {
454*533affcbSRobert Mustacchi 		if (nvme_identify_cmds[i].nii_csi == NVME_CSI_NVM &&
455*533affcbSRobert Mustacchi 		    nvme_identify_cmds[i].nii_cns == test->iit_cns) {
456*533affcbSRobert Mustacchi 			info = &nvme_identify_cmds[i];
457*533affcbSRobert Mustacchi 			break;
458*533affcbSRobert Mustacchi 		}
459*533affcbSRobert Mustacchi 	}
460*533affcbSRobert Mustacchi 
461*533affcbSRobert Mustacchi 	if (info == NULL) {
462*533affcbSRobert Mustacchi 		errx(EXIT_FAILURE, "malformed test %s: cannot find CNS %u",
463*533affcbSRobert Mustacchi 		    test->iit_desc, test->iit_cns);
464*533affcbSRobert Mustacchi 	}
465*533affcbSRobert Mustacchi 
466*533affcbSRobert Mustacchi 	impl = nvme_identify_info_supported(info, test->iit_data);
467*533affcbSRobert Mustacchi 	if (impl != test->iit_impl) {
468*533affcbSRobert Mustacchi 		warnx("TEST FAILED: %s: expected impl %u, found %u",
469*533affcbSRobert Mustacchi 		    test->iit_desc, test->iit_impl, impl);
470*533affcbSRobert Mustacchi 		return (false);
471*533affcbSRobert Mustacchi 	}
472*533affcbSRobert Mustacchi 
473*533affcbSRobert Mustacchi 	(void) printf("TEST PASSED: %s: got correct impl\n", test->iit_desc);
474*533affcbSRobert Mustacchi 	return (true);
475*533affcbSRobert Mustacchi }
476*533affcbSRobert Mustacchi 
477*533affcbSRobert Mustacchi int
main(void)478*533affcbSRobert Mustacchi main(void)
479*533affcbSRobert Mustacchi {
480*533affcbSRobert Mustacchi 	int ret = EXIT_SUCCESS;
481*533affcbSRobert Mustacchi 
482*533affcbSRobert Mustacchi 	if (!nvme_unit_field_test(identify_field_tests,
483*533affcbSRobert Mustacchi 	    ARRAY_SIZE(identify_field_tests))) {
484*533affcbSRobert Mustacchi 		ret = EXIT_FAILURE;
485*533affcbSRobert Mustacchi 	}
486*533affcbSRobert Mustacchi 
487*533affcbSRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(identify_impl_tests); i++) {
488*533affcbSRobert Mustacchi 		if (!identify_impl_test_one(&identify_impl_tests[i])) {
489*533affcbSRobert Mustacchi 			ret = EXIT_FAILURE;
490*533affcbSRobert Mustacchi 		}
491*533affcbSRobert Mustacchi 	}
492*533affcbSRobert Mustacchi 
493*533affcbSRobert Mustacchi 	if (ret == EXIT_SUCCESS) {
494*533affcbSRobert Mustacchi 		(void) printf("All tests passed successfully!\n");
495*533affcbSRobert Mustacchi 	}
496*533affcbSRobert Mustacchi 
497*533affcbSRobert Mustacchi 	return (ret);
498*533affcbSRobert Mustacchi }
499