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