xref: /illumos-gate/usr/src/test/nvme-tests/tests/libnvme/sctostr.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  * Test a few different bits of the status code string generation and see that
18*533affcbSRobert Mustacchi  * we get something expected. Note, we try to avoid using the existing constants
19*533affcbSRobert Mustacchi  * that we have for the sct / sc when testing the corresponding entries so
20*533affcbSRobert Mustacchi  * someone can more so copy and paste entries from the spec and be less tempted
21*533affcbSRobert Mustacchi  * to copy data from the implementation.
22*533affcbSRobert Mustacchi  */
23*533affcbSRobert Mustacchi 
24*533affcbSRobert Mustacchi #include <stdbool.h>
25*533affcbSRobert Mustacchi #include <stdlib.h>
26*533affcbSRobert Mustacchi #include <err.h>
27*533affcbSRobert Mustacchi #include <stdio.h>
28*533affcbSRobert Mustacchi #include <strings.h>
29*533affcbSRobert Mustacchi #include <sys/sysmacros.h>
30*533affcbSRobert Mustacchi #include <libnvme.h>
31*533affcbSRobert Mustacchi 
32*533affcbSRobert Mustacchi typedef struct {
33*533affcbSRobert Mustacchi 	uint32_t st_code;
34*533affcbSRobert Mustacchi 	const char *st_str;
35*533affcbSRobert Mustacchi } sct_test_t;
36*533affcbSRobert Mustacchi 
37*533affcbSRobert Mustacchi static const sct_test_t sct_tests[] = { {
38*533affcbSRobert Mustacchi 	.st_code = 0,
39*533affcbSRobert Mustacchi 	.st_str = "generic command status",
40*533affcbSRobert Mustacchi }, {
41*533affcbSRobert Mustacchi 	.st_code = 7,
42*533affcbSRobert Mustacchi 	.st_str = "vendor specific"
43*533affcbSRobert Mustacchi }, {
44*533affcbSRobert Mustacchi 	.st_code = 0x23,
45*533affcbSRobert Mustacchi 	.st_str = "unknown status type"
46*533affcbSRobert Mustacchi }, {
47*533affcbSRobert Mustacchi 	.st_code = 0x169,
48*533affcbSRobert Mustacchi 	.st_str = "unknown status type"
49*533affcbSRobert Mustacchi } };
50*533affcbSRobert Mustacchi 
51*533affcbSRobert Mustacchi typedef struct {
52*533affcbSRobert Mustacchi 	nvme_csi_t sc_csi;
53*533affcbSRobert Mustacchi 	uint32_t sc_sct;
54*533affcbSRobert Mustacchi 	uint32_t sc_sc;
55*533affcbSRobert Mustacchi 	const char *sc_str;
56*533affcbSRobert Mustacchi } sc_test_t;
57*533affcbSRobert Mustacchi 
58*533affcbSRobert Mustacchi static const sc_test_t sc_tests[] = { {
59*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
60*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
61*533affcbSRobert Mustacchi 	.sc_sc = 0x0,
62*533affcbSRobert Mustacchi 	.sc_str = "successful completion"
63*533affcbSRobert Mustacchi }, {
64*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
65*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
66*533affcbSRobert Mustacchi 	.sc_sc = 0x2,
67*533affcbSRobert Mustacchi 	.sc_str = "invalid field in command"
68*533affcbSRobert Mustacchi }, {
69*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
70*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
71*533affcbSRobert Mustacchi 	.sc_sc = 0xb,
72*533affcbSRobert Mustacchi 	.sc_str = "invalid namespace or format"
73*533affcbSRobert Mustacchi }, {
74*533affcbSRobert Mustacchi 	/*
75*533affcbSRobert Mustacchi 	 * This is a purposefully bad CSI, but the CSI shouldn't matter for this
76*533affcbSRobert Mustacchi 	 * code.
77*533affcbSRobert Mustacchi 	 */
78*533affcbSRobert Mustacchi 	.sc_csi = 0xff,
79*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
80*533affcbSRobert Mustacchi 	.sc_sc = 0xb,
81*533affcbSRobert Mustacchi 	.sc_str = "invalid namespace or format"
82*533affcbSRobert Mustacchi }, {
83*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
84*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
85*533affcbSRobert Mustacchi 	.sc_sc = 0x7f,
86*533affcbSRobert Mustacchi 	.sc_str = "unknown status code",
87*533affcbSRobert Mustacchi }, {
88*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
89*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
90*533affcbSRobert Mustacchi 	.sc_sc = 0x80,
91*533affcbSRobert Mustacchi 	.sc_str = "lba out of range"
92*533affcbSRobert Mustacchi }, {
93*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
94*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
95*533affcbSRobert Mustacchi 	.sc_sc = 0x82,
96*533affcbSRobert Mustacchi 	.sc_str = "namespace not ready"
97*533affcbSRobert Mustacchi }, {
98*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
99*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
100*533affcbSRobert Mustacchi 	.sc_sc = 0xbf,
101*533affcbSRobert Mustacchi 	.sc_str = "unknown command set specific general status code"
102*533affcbSRobert Mustacchi 
103*533affcbSRobert Mustacchi }, {
104*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
105*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_GENERIC,
106*533affcbSRobert Mustacchi 	.sc_sc = 0xff,
107*533affcbSRobert Mustacchi 	.sc_str = "generic vendor specific status code"
108*533affcbSRobert Mustacchi }, {
109*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
110*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
111*533affcbSRobert Mustacchi 	.sc_sc = 0x6,
112*533affcbSRobert Mustacchi 	.sc_str = "invalid firmware slot"
113*533affcbSRobert Mustacchi }, {
114*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
115*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
116*533affcbSRobert Mustacchi 	.sc_sc = 0x9,
117*533affcbSRobert Mustacchi 	.sc_str = "invalid log page"
118*533affcbSRobert Mustacchi }, {
119*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
120*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
121*533affcbSRobert Mustacchi 	.sc_sc = 0x6f,
122*533affcbSRobert Mustacchi 	.sc_str = "unknown generic command status code"
123*533affcbSRobert Mustacchi }, {
124*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
125*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
126*533affcbSRobert Mustacchi 	.sc_sc = 0x80,
127*533affcbSRobert Mustacchi 	.sc_str = "conflicting attributes"
128*533affcbSRobert Mustacchi }, {
129*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
130*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
131*533affcbSRobert Mustacchi 	.sc_sc = 0xbf,
132*533affcbSRobert Mustacchi 	.sc_str = "unknown command specific, I/O command set specific status "
133*533affcbSRobert Mustacchi 	    "code",
134*533affcbSRobert Mustacchi }, {
135*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
136*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_SPECIFIC,
137*533affcbSRobert Mustacchi 	.sc_sc = 0xff,
138*533affcbSRobert Mustacchi 	.sc_str = "command specific vendor specific status code"
139*533affcbSRobert Mustacchi }, {
140*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
141*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_INTEGRITY,
142*533affcbSRobert Mustacchi 	.sc_sc = 0x80,
143*533affcbSRobert Mustacchi 	.sc_str = "write fault"
144*533affcbSRobert Mustacchi }, {
145*533affcbSRobert Mustacchi 	.sc_csi = 0x23,
146*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_INTEGRITY,
147*533affcbSRobert Mustacchi 	.sc_sc = 0x80,
148*533affcbSRobert Mustacchi 	.sc_str = "write fault"
149*533affcbSRobert Mustacchi }, {
150*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
151*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_INTEGRITY,
152*533affcbSRobert Mustacchi 	.sc_sc = 0x0,
153*533affcbSRobert Mustacchi 	.sc_str = "unknown media and data integrity status code"
154*533affcbSRobert Mustacchi }, {
155*533affcbSRobert Mustacchi 	.sc_csi = NVME_CSI_NVM,
156*533affcbSRobert Mustacchi 	.sc_sct = NVME_CQE_SCT_INTEGRITY,
157*533affcbSRobert Mustacchi 	.sc_sc = 0xff,
158*533affcbSRobert Mustacchi 	.sc_str = "vendor specific media and data integrity status code"
159*533affcbSRobert Mustacchi } };
160*533affcbSRobert Mustacchi 
161*533affcbSRobert Mustacchi static bool
sct_test_one(const sct_test_t * test)162*533affcbSRobert Mustacchi sct_test_one(const sct_test_t *test)
163*533affcbSRobert Mustacchi {
164*533affcbSRobert Mustacchi 	const char *str = nvme_scttostr(NULL, test->st_code);
165*533affcbSRobert Mustacchi 	if (strcmp(str, test->st_str) != 0) {
166*533affcbSRobert Mustacchi 		warnx("TEST FAILED: sct 0x%x was translated to string %s, "
167*533affcbSRobert Mustacchi 		    "not %s", test->st_code, str, test->st_str);
168*533affcbSRobert Mustacchi 		return (false);
169*533affcbSRobert Mustacchi 	}
170*533affcbSRobert Mustacchi 
171*533affcbSRobert Mustacchi 	(void) printf("TEST PASSED: sct 0x%x successfully translated\n",
172*533affcbSRobert Mustacchi 	    test->st_code);
173*533affcbSRobert Mustacchi 	return (true);
174*533affcbSRobert Mustacchi }
175*533affcbSRobert Mustacchi 
176*533affcbSRobert Mustacchi static bool
sc_test_one(const sc_test_t * test)177*533affcbSRobert Mustacchi sc_test_one(const sc_test_t *test)
178*533affcbSRobert Mustacchi {
179*533affcbSRobert Mustacchi 	const char *str = nvme_sctostr(NULL, test->sc_csi, test->sc_sct,
180*533affcbSRobert Mustacchi 	    test->sc_sc);
181*533affcbSRobert Mustacchi 	if (strcmp(str, test->sc_str) != 0) {
182*533affcbSRobert Mustacchi 		warnx("TEST FAILED: csi/sct/sc 0x%x/0x%x/0x%x was translated "
183*533affcbSRobert Mustacchi 		    "to string %s, not %s", test->sc_csi, test->sc_sct,
184*533affcbSRobert Mustacchi 		    test->sc_sc, str, test->sc_str);
185*533affcbSRobert Mustacchi 		return (false);
186*533affcbSRobert Mustacchi 	}
187*533affcbSRobert Mustacchi 
188*533affcbSRobert Mustacchi 	(void) printf("TEST PASSED: csi/sct/sc 0x%x/0x%x/0x%x successfully "
189*533affcbSRobert Mustacchi 	    "translated\n", test->sc_csi, test->sc_sct, test->sc_sc);
190*533affcbSRobert Mustacchi 
191*533affcbSRobert Mustacchi 	return (true);
192*533affcbSRobert Mustacchi }
193*533affcbSRobert Mustacchi 
194*533affcbSRobert Mustacchi int
main(void)195*533affcbSRobert Mustacchi main(void)
196*533affcbSRobert Mustacchi {
197*533affcbSRobert Mustacchi 	int ret = EXIT_SUCCESS;
198*533affcbSRobert Mustacchi 
199*533affcbSRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(sct_tests); i++) {
200*533affcbSRobert Mustacchi 		if (!sct_test_one(&sct_tests[i])) {
201*533affcbSRobert Mustacchi 			ret = EXIT_FAILURE;
202*533affcbSRobert Mustacchi 		}
203*533affcbSRobert Mustacchi 	}
204*533affcbSRobert Mustacchi 
205*533affcbSRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(sc_tests); i++) {
206*533affcbSRobert Mustacchi 		if (!sc_test_one(&sc_tests[i])) {
207*533affcbSRobert Mustacchi 			ret = EXIT_FAILURE;
208*533affcbSRobert Mustacchi 		}
209*533affcbSRobert Mustacchi 	}
210*533affcbSRobert Mustacchi 
211*533affcbSRobert Mustacchi 	return (ret);
212*533affcbSRobert Mustacchi }
213