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 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