1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2024 Oxide Computer Company
14 */
15
16 /*
17 * Validate fields for the various VUC fields. Note, these do not change with
18 * the controller itself. These have been the same since NVMe 1.0.
19 */
20
21 #include <stdlib.h>
22 #include <sys/sysmacros.h>
23 #include <err.h>
24
25 #include "nvme_unit.h"
26
27 static const nvme_unit_field_test_t vuc_field_tests[] = { {
28 .nu_desc = "invalid opcode (1)",
29 .nu_fields = nvme_vuc_fields,
30 .nu_index = NVME_VUC_REQ_FIELD_OPC,
31 .nu_data = &nvme_ctrl_base_1v0,
32 .nu_value = 0xbf,
33 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
34 }, {
35 .nu_desc = "invalid opcode (2)",
36 .nu_fields = nvme_vuc_fields,
37 .nu_index = NVME_VUC_REQ_FIELD_OPC,
38 .nu_data = &nvme_ctrl_base_1v0,
39 .nu_value = 0x100,
40 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
41 }, {
42 .nu_desc = "invalid opcode (3)",
43 .nu_fields = nvme_vuc_fields,
44 .nu_index = NVME_VUC_REQ_FIELD_OPC,
45 .nu_data = &nvme_ctrl_base_1v0,
46 .nu_value = 0x3,
47 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
48 }, {
49 .nu_desc = "valid opcode (1)",
50 .nu_fields = nvme_vuc_fields,
51 .nu_index = NVME_VUC_REQ_FIELD_OPC,
52 .nu_data = &nvme_ctrl_base_1v0,
53 .nu_value = 0xc0,
54 .nu_ret = NVME_FIELD_ERR_OK
55 }, {
56 .nu_desc = "valid opcode (2)",
57 .nu_fields = nvme_vuc_fields,
58 .nu_index = NVME_VUC_REQ_FIELD_OPC,
59 .nu_data = &nvme_ctrl_base_1v0,
60 .nu_value = 0xff,
61 .nu_ret = NVME_FIELD_ERR_OK
62 }, {
63 .nu_desc = "valid opcode (3)",
64 .nu_fields = nvme_vuc_fields,
65 .nu_index = NVME_VUC_REQ_FIELD_OPC,
66 .nu_data = &nvme_ctrl_base_1v0,
67 .nu_value = 0xde,
68 .nu_ret = NVME_FIELD_ERR_OK
69 }, {
70 .nu_desc = "invalid namespace (1)",
71 .nu_fields = nvme_vuc_fields,
72 .nu_index = NVME_VUC_REQ_FIELD_NSID,
73 .nu_data = &nvme_ctrl_base_1v0,
74 .nu_value = 0x33,
75 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
76 }, {
77 .nu_desc = "valid namespace (1)",
78 .nu_fields = nvme_vuc_fields,
79 .nu_index = NVME_VUC_REQ_FIELD_NSID,
80 .nu_data = &nvme_ctrl_base_1v0,
81 .nu_value = 0x0,
82 .nu_ret = NVME_FIELD_ERR_OK
83 }, {
84 .nu_desc = "valid namespace (2)",
85 .nu_fields = nvme_vuc_fields,
86 .nu_index = NVME_VUC_REQ_FIELD_NSID,
87 .nu_data = &nvme_ctrl_base_1v0,
88 .nu_value = NVME_NSID_BCAST,
89 .nu_ret = NVME_FIELD_ERR_OK
90 }, {
91 .nu_desc = "valid namespace (3)",
92 .nu_fields = nvme_vuc_fields,
93 .nu_index = NVME_VUC_REQ_FIELD_NSID,
94 .nu_data = &nvme_ctrl_base_1v0,
95 .nu_value = 0x1,
96 .nu_ret = NVME_FIELD_ERR_OK
97 }, {
98 .nu_desc = "invalid cdw12",
99 .nu_fields = nvme_vuc_fields,
100 .nu_index = NVME_VUC_REQ_FIELD_CDW12,
101 .nu_data = &nvme_ctrl_base_1v0,
102 .nu_value = 0x100000000,
103 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
104 }, {
105 .nu_desc = "valid cdw12",
106 .nu_fields = nvme_vuc_fields,
107 .nu_index = NVME_VUC_REQ_FIELD_CDW12,
108 .nu_data = &nvme_ctrl_base_1v0,
109 .nu_value = 0x7777,
110 .nu_ret = NVME_FIELD_ERR_OK
111 }, {
112 .nu_desc = "invalid cdw13",
113 .nu_fields = nvme_vuc_fields,
114 .nu_index = NVME_VUC_REQ_FIELD_CDW13,
115 .nu_data = &nvme_ctrl_base_1v0,
116 .nu_value = 0x100000000,
117 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
118 }, {
119 .nu_desc = "valid cdw13",
120 .nu_fields = nvme_vuc_fields,
121 .nu_index = NVME_VUC_REQ_FIELD_CDW13,
122 .nu_data = &nvme_ctrl_base_1v0,
123 .nu_value = 0x6666,
124 .nu_ret = NVME_FIELD_ERR_OK
125 }, {
126 .nu_desc = "invalid cdw14",
127 .nu_fields = nvme_vuc_fields,
128 .nu_index = NVME_VUC_REQ_FIELD_CDW14,
129 .nu_data = &nvme_ctrl_base_1v0,
130 .nu_value = 0x100000000,
131 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
132 }, {
133 .nu_desc = "valid cdw14",
134 .nu_fields = nvme_vuc_fields,
135 .nu_index = NVME_VUC_REQ_FIELD_CDW14,
136 .nu_data = &nvme_ctrl_base_1v0,
137 .nu_value = 0x5555,
138 .nu_ret = NVME_FIELD_ERR_OK
139 }, {
140 .nu_desc = "invalid cdw15",
141 .nu_fields = nvme_vuc_fields,
142 .nu_index = NVME_VUC_REQ_FIELD_CDW15,
143 .nu_data = &nvme_ctrl_base_1v0,
144 .nu_value = 0x100000000,
145 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
146 }, {
147 .nu_desc = "valid cdw15",
148 .nu_fields = nvme_vuc_fields,
149 .nu_index = NVME_VUC_REQ_FIELD_CDW15,
150 .nu_data = &nvme_ctrl_base_1v0,
151 .nu_value = 0x4444,
152 .nu_ret = NVME_FIELD_ERR_OK
153 }, {
154 .nu_desc = "invalid ndt (1)",
155 .nu_fields = nvme_vuc_fields,
156 .nu_index = NVME_VUC_REQ_FIELD_NDT,
157 .nu_data = &nvme_ctrl_base_1v0,
158 .nu_value = 0x400000000,
159 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
160 }, {
161 .nu_desc = "invalid ndt (2)",
162 .nu_fields = nvme_vuc_fields,
163 .nu_index = NVME_VUC_REQ_FIELD_NDT,
164 .nu_data = &nvme_ctrl_base_1v0,
165 .nu_value = 0x3,
166 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
167 }, {
168 .nu_desc = "invalid ndt (3)",
169 .nu_fields = nvme_vuc_fields,
170 .nu_index = NVME_VUC_REQ_FIELD_NDT,
171 .nu_data = &nvme_ctrl_base_1v0,
172 .nu_value = 0x17,
173 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
174 }, {
175 .nu_desc = "valid ndt (1)",
176 .nu_fields = nvme_vuc_fields,
177 .nu_index = NVME_VUC_REQ_FIELD_NDT,
178 .nu_data = &nvme_ctrl_base_1v0,
179 .nu_value = 0x3fffffffc,
180 .nu_ret = NVME_FIELD_ERR_OK
181 }, {
182 .nu_desc = "valid ndt (2)",
183 .nu_fields = nvme_vuc_fields,
184 .nu_index = NVME_VUC_REQ_FIELD_NDT,
185 .nu_data = &nvme_ctrl_base_1v0,
186 .nu_value = 0x0,
187 .nu_ret = NVME_FIELD_ERR_OK
188 }, {
189 .nu_desc = "valid ndt (3)",
190 .nu_fields = nvme_vuc_fields,
191 .nu_index = NVME_VUC_REQ_FIELD_NDT,
192 .nu_data = &nvme_ctrl_base_1v0,
193 .nu_value = 0x1234,
194 .nu_ret = NVME_FIELD_ERR_OK
195 }, {
196 .nu_desc = "invalid timeout (1)",
197 .nu_fields = nvme_vuc_fields,
198 .nu_index = NVME_VUC_REQ_FIELD_TO,
199 .nu_data = &nvme_ctrl_base_1v0,
200 .nu_value = 0x0,
201 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
202 }, {
203 .nu_desc = "invalid timeout (2)",
204 .nu_fields = nvme_vuc_fields,
205 .nu_index = NVME_VUC_REQ_FIELD_TO,
206 .nu_data = &nvme_ctrl_base_1v0,
207 .nu_value = 0x100000000,
208 .nu_ret = NVME_FIELD_ERR_BAD_VALUE
209 }, {
210 .nu_desc = "valid timeout (1)",
211 .nu_fields = nvme_vuc_fields,
212 .nu_index = NVME_VUC_REQ_FIELD_TO,
213 .nu_data = &nvme_ctrl_base_1v0,
214 .nu_value = 0x1,
215 .nu_ret = NVME_FIELD_ERR_OK
216 }, {
217 .nu_desc = "valid timeout (2)",
218 .nu_fields = nvme_vuc_fields,
219 .nu_index = NVME_VUC_REQ_FIELD_TO,
220 .nu_data = &nvme_ctrl_base_1v0,
221 .nu_value = 0x101,
222 .nu_ret = NVME_FIELD_ERR_OK
223 } };
224
225 int
main(void)226 main(void)
227 {
228 int ret = EXIT_SUCCESS;
229
230 if (!nvme_unit_field_test(vuc_field_tests,
231 ARRAY_SIZE(vuc_field_tests))) {
232 ret = EXIT_FAILURE;
233 }
234
235 if (ret == EXIT_SUCCESS) {
236 (void) printf("All tests passed successfully!\n");
237 }
238
239 return (ret);
240 }
241