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 * Implements logic to map a device to a vendor-specific entity. 18 */ 19 20 #include <libdevinfo.h> 21 #include <sys/sysmacros.h> 22 #include <string.h> 23 24 #include "libnvme_impl.h" 25 26 const nvme_vsd_t *const nvme_vsd_devices[] = { 27 &wdc_sn840, 28 &wdc_sn650, 29 &wdc_sn655, 30 µn_7300_pro, 31 µn_7300_max, 32 µn_7400_pro, 33 µn_7400_max, 34 µn_7450_pro, 35 µn_7450_max, 36 µn_6500_ion, 37 µn_7500_pro, 38 µn_7500_max 39 }; 40 41 /* 42 * Our job is to attempt to map a given device to vendor specific information, 43 * if it exists. It may not. 44 */ 45 void 46 nvme_vendor_map_ctrl(nvme_ctrl_t *ctrl) 47 { 48 int *vid, *did; 49 50 if (di_prop_lookup_ints(DDI_DEV_T_ANY, ctrl->nc_devi, "vendor-id", 51 &vid) != 1 || di_prop_lookup_ints(DDI_DEV_T_ANY, ctrl->nc_devi, 52 "device-id", &did) != 1) { 53 return; 54 } 55 56 for (size_t i = 0; i < ARRAY_SIZE(nvme_vsd_devices); i++) { 57 if (nvme_vsd_devices[i]->nvd_vid == vid[0] && 58 nvme_vsd_devices[i]->nvd_did == did[0]) { 59 ctrl->nc_vsd = nvme_vsd_devices[i]; 60 return; 61 } 62 } 63 } 64 65 bool 66 nvme_vendor_vuc_supported(nvme_ctrl_t *ctrl, const char *name) 67 { 68 if (ctrl->nc_vsd != NULL) { 69 for (size_t i = 0; i < ctrl->nc_vsd->nvd_nvuc; i++) { 70 if (strcmp(name, ctrl->nc_vsd->nvd_vuc[i].nvd_short) == 71 0) { 72 return (true); 73 } 74 } 75 } 76 77 return (nvme_ctrl_error(ctrl, NVME_ERR_VU_FUNC_UNSUP_BY_DEV, 0, 78 "device missing support for vendor unique command %s", name)); 79 } 80