xref: /illumos-gate/usr/src/lib/libnvme/common/libnvme_ocp.c (revision fbd5b8684156f1cae0891d3e690e5bdf7644c840)
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 2025 Oxide Computer Company
14  */
15 
16 /*
17  * libnvme logic that covers the OCP Datacenter NVMe SSD specification.
18  */
19 
20 #include <string.h>
21 #include <sys/sysmacros.h>
22 #include <sys/nvme/ocp.h>
23 
24 #include "libnvme_impl.h"
25 
26 static bool
nvme_ocp_telstr_var_len(uint64_t * outp,const void * data,size_t len)27 nvme_ocp_telstr_var_len(uint64_t *outp, const void *data, size_t len)
28 {
29 	ocp_vul_telstr_t telstr;
30 	size_t need = offsetof(ocp_vul_telstr_t, ots_rsvd40);
31 
32 	if (len < offsetof(ocp_vul_telstr_t, ots_rsvd40)) {
33 		return (false);
34 	}
35 
36 	(void) memcpy(&telstr, data, need);
37 	if (telstr.ots_sls_ndw / sizeof (uint32_t) >= SIZE_MAX) {
38 		return (false);
39 	}
40 	*outp = telstr.ots_sls_ndw * sizeof (uint32_t);
41 	return (true);
42 }
43 
44 const nvme_log_page_info_t ocp_log_smart = {
45 	.nlpi_short = "ocp/smart",
46 	.nlpi_human = "OCP SMART / Health Information",
47 	.nlpi_lid = OCP_LOG_DSSD_SMART,
48 	.nlpi_csi = NVME_CSI_NVM,
49 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
50 	.nlpi_source = NVME_LOG_DISC_S_DB,
51 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
52 	.nlpi_len = sizeof (ocp_vul_smart_t),
53 };
54 
55 const nvme_log_page_info_t ocp_log_errrec = {
56 	.nlpi_short = "ocp/errrec",
57 	.nlpi_human = "OCP Error Recovery",
58 	.nlpi_lid = OCP_LOG_DSSD_ERROR_REC,
59 	.nlpi_csi = NVME_CSI_NVM,
60 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
61 	.nlpi_source = NVME_LOG_DISC_S_DB,
62 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
63 	.nlpi_len = sizeof (ocp_vul_errrec_t),
64 };
65 
66 const nvme_log_page_info_t ocp_log_fwact = {
67 	.nlpi_short = "ocp/fwact",
68 	.nlpi_human = "OCP Firmware Activation",
69 	.nlpi_lid = OCP_LOG_DSSD_FWACT,
70 	.nlpi_csi = NVME_CSI_NVM,
71 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
72 	.nlpi_source = NVME_LOG_DISC_S_DB,
73 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
74 	.nlpi_len = sizeof (ocp_vul_fwact_t),
75 };
76 
77 const nvme_log_page_info_t ocp_log_lat = {
78 	.nlpi_short = "ocp/latency",
79 	.nlpi_human = "OCP Latency Monitor",
80 	.nlpi_lid = OCP_LOG_DSSD_LATENCY,
81 	.nlpi_csi = NVME_CSI_NVM,
82 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
83 	.nlpi_source = NVME_LOG_DISC_S_DB,
84 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
85 	.nlpi_len = sizeof (ocp_vul_lat_t),
86 };
87 
88 const nvme_log_page_info_t ocp_log_devcap = {
89 	.nlpi_short = "ocp/devcap",
90 	.nlpi_human = "OCP Device Capabilities",
91 	.nlpi_lid = OCP_LOG_DSSD_DEV_CAP,
92 	.nlpi_csi = NVME_CSI_NVM,
93 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
94 	.nlpi_source = NVME_LOG_DISC_S_DB,
95 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
96 	.nlpi_len = sizeof (ocp_vul_devcap_t),
97 };
98 
99 const nvme_log_page_info_t ocp_log_unsup = {
100 	.nlpi_short = "ocp/unsup",
101 	.nlpi_human = "OCP Unsupported Requirements",
102 	.nlpi_lid = OCP_LOG_DSSD_UNSUP_REQ,
103 	.nlpi_csi = NVME_CSI_NVM,
104 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
105 	.nlpi_source = NVME_LOG_DISC_S_DB,
106 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
107 	.nlpi_len = sizeof (ocp_vul_unsup_req_t),
108 };
109 
110 const nvme_log_page_info_t ocp_log_telstr = {
111 	.nlpi_short = "ocp/telstr",
112 	.nlpi_human = "OCP Telemetry String",
113 	.nlpi_lid = OCP_LOG_DSSD_TELEMETRY,
114 	.nlpi_csi = NVME_CSI_NVM,
115 	.nlpi_kind = NVME_LOG_ID_VENDOR_SPECIFIC,
116 	.nlpi_source = NVME_LOG_DISC_S_DB,
117 	.nlpi_scope = NVME_LOG_SCOPE_NVM,
118 	.nlpi_len = offsetof(ocp_vul_telstr_t, ots_rsvd40),
119 	.nlpi_var_func = nvme_ocp_telstr_var_len
120 };
121