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  * Perform a GET FEATURES commands that should work on all devices since NVMe
18  * 1.0 (though may fail on some emulated cases). We use the temperature
19  * threshold feature because its output value is generally expected to be
20  * non-zero and the default is 0xFFFF (as of NVMe 1.2). If we find devices that
21  * actually return a default of zero, we should probably put them in an ignore
22  * list in here.
23  */
24 
25 #include <err.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <unistd.h>
29 
30 #include "nvme_ioctl_util.h"
31 
32 int
33 main(void)
34 {
35 	int fd = nvme_ioctl_test_get_fd(0);
36 	nvme_ioctl_get_feature_t get;
37 
38 	(void) memset(&get, 0, sizeof (get));
39 	get.nigf_fid = NVME_FEAT_TEMPERATURE;
40 
41 	if (ioctl(fd, NVME_IOC_GET_FEATURE, &get) != 0) {
42 		err(EXIT_FAILURE, "TEST FAILED: failed to issue NVMe get "
43 		    "features ioctl");
44 	} else if (get.nigf_common.nioc_drv_err != NVME_IOCTL_E_OK) {
45 		errx(EXIT_FAILURE, "TEST FAILED: failed to get temperature "
46 		    "threshold feature: found error 0x%x, but expected success",
47 		    get.nigf_common.nioc_drv_err);
48 	}
49 
50 	if (get.nigf_cdw0 == 0) {
51 		errx(EXIT_FAILURE, "TEST FAILED: found zeroed cdw0 value for "
52 		    "composite temperature threshold");
53 	} else {
54 		(void) printf("TEST PASSED: successfully read composite "
55 		    "temperature threshold\n");
56 	}
57 
58 	VERIFY0(close(fd));
59 	return (0);
60 }
61