The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/nvme/nvme.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (C) 2012-2013 Intel Corporation
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   26  * SUCH DAMAGE.
   27  *
   28  * $FreeBSD$
   29  */
   30 
   31 #ifndef __NVME_H__
   32 #define __NVME_H__
   33 
   34 #ifdef _KERNEL
   35 #include <sys/types.h>
   36 #endif
   37 
   38 #include <sys/param.h>
   39 #include <sys/endian.h>
   40 
   41 #define NVME_PASSTHROUGH_CMD            _IOWR('n', 0, struct nvme_pt_command)
   42 #define NVME_RESET_CONTROLLER           _IO('n', 1)
   43 #define NVME_GET_NSID                   _IOR('n', 2, struct nvme_get_nsid)
   44 #define NVME_GET_MAX_XFER_SIZE          _IOR('n', 3, uint64_t)
   45 
   46 #define NVME_IO_TEST                    _IOWR('n', 100, struct nvme_io_test)
   47 #define NVME_BIO_TEST                   _IOWR('n', 101, struct nvme_io_test)
   48 
   49 /*
   50  * Macros to deal with NVME revisions, as defined VS register
   51  */
   52 #define NVME_REV(x, y)                  (((x) << 16) | ((y) << 8))
   53 #define NVME_MAJOR(r)                   (((r) >> 16) & 0xffff)
   54 #define NVME_MINOR(r)                   (((r) >> 8) & 0xff)
   55 
   56 /*
   57  * Use to mark a command to apply to all namespaces, or to retrieve global
   58  *  log pages.
   59  */
   60 #define NVME_GLOBAL_NAMESPACE_TAG       ((uint32_t)0xFFFFFFFF)
   61 
   62 /* Host memory buffer sizes are always in 4096 byte chunks */
   63 #define NVME_HMB_UNITS                  4096
   64 
   65 /* Many items are expressed in terms of power of two times MPS */
   66 #define NVME_MPS_SHIFT                  12
   67 
   68 /* Register field definitions */
   69 #define NVME_CAP_LO_REG_MQES_SHIFT                      (0)
   70 #define NVME_CAP_LO_REG_MQES_MASK                       (0xFFFF)
   71 #define NVME_CAP_LO_REG_CQR_SHIFT                       (16)
   72 #define NVME_CAP_LO_REG_CQR_MASK                        (0x1)
   73 #define NVME_CAP_LO_REG_AMS_SHIFT                       (17)
   74 #define NVME_CAP_LO_REG_AMS_MASK                        (0x3)
   75 #define NVME_CAP_LO_REG_TO_SHIFT                        (24)
   76 #define NVME_CAP_LO_REG_TO_MASK                         (0xFF)
   77 #define NVME_CAP_LO_MQES(x) \
   78         (((x) >> NVME_CAP_LO_REG_MQES_SHIFT) & NVME_CAP_LO_REG_MQES_MASK)
   79 #define NVME_CAP_LO_CQR(x) \
   80         (((x) >> NVME_CAP_LO_REG_CQR_SHIFT) & NVME_CAP_LO_REG_CQR_MASK)
   81 #define NVME_CAP_LO_AMS(x) \
   82         (((x) >> NVME_CAP_LO_REG_AMS_SHIFT) & NVME_CAP_LO_REG_AMS_MASK)
   83 #define NVME_CAP_LO_TO(x) \
   84         (((x) >> NVME_CAP_LO_REG_TO_SHIFT) & NVME_CAP_LO_REG_TO_MASK)
   85 
   86 #define NVME_CAP_HI_REG_DSTRD_SHIFT                     (0)
   87 #define NVME_CAP_HI_REG_DSTRD_MASK                      (0xF)
   88 #define NVME_CAP_HI_REG_NSSRS_SHIFT                     (4)
   89 #define NVME_CAP_HI_REG_NSSRS_MASK                      (0x1)
   90 #define NVME_CAP_HI_REG_CSS_SHIFT                       (5)
   91 #define NVME_CAP_HI_REG_CSS_MASK                        (0xff)
   92 #define NVME_CAP_HI_REG_CSS_NVM_SHIFT                   (5)
   93 #define NVME_CAP_HI_REG_CSS_NVM_MASK                    (0x1)
   94 #define NVME_CAP_HI_REG_BPS_SHIFT                       (13)
   95 #define NVME_CAP_HI_REG_BPS_MASK                        (0x1)
   96 #define NVME_CAP_HI_REG_MPSMIN_SHIFT                    (16)
   97 #define NVME_CAP_HI_REG_MPSMIN_MASK                     (0xF)
   98 #define NVME_CAP_HI_REG_MPSMAX_SHIFT                    (20)
   99 #define NVME_CAP_HI_REG_MPSMAX_MASK                     (0xF)
  100 #define NVME_CAP_HI_REG_PMRS_SHIFT                      (24)
  101 #define NVME_CAP_HI_REG_PMRS_MASK                       (0x1)
  102 #define NVME_CAP_HI_REG_CMBS_SHIFT                      (25)
  103 #define NVME_CAP_HI_REG_CMBS_MASK                       (0x1)
  104 #define NVME_CAP_HI_DSTRD(x) \
  105         (((x) >> NVME_CAP_HI_REG_DSTRD_SHIFT) & NVME_CAP_HI_REG_DSTRD_MASK)
  106 #define NVME_CAP_HI_NSSRS(x) \
  107         (((x) >> NVME_CAP_HI_REG_NSSRS_SHIFT) & NVME_CAP_HI_REG_NSSRS_MASK)
  108 #define NVME_CAP_HI_CSS(x) \
  109         (((x) >> NVME_CAP_HI_REG_CSS_SHIFT) & NVME_CAP_HI_REG_CSS_MASK)
  110 #define NVME_CAP_HI_CSS_NVM(x) \
  111         (((x) >> NVME_CAP_HI_REG_CSS_NVM_SHIFT) & NVME_CAP_HI_REG_CSS_NVM_MASK)
  112 #define NVME_CAP_HI_BPS(x) \
  113         (((x) >> NVME_CAP_HI_REG_BPS_SHIFT) & NVME_CAP_HI_REG_BPS_MASK)
  114 #define NVME_CAP_HI_MPSMIN(x) \
  115         (((x) >> NVME_CAP_HI_REG_MPSMIN_SHIFT) & NVME_CAP_HI_REG_MPSMIN_MASK)
  116 #define NVME_CAP_HI_MPSMAX(x) \
  117         (((x) >> NVME_CAP_HI_REG_MPSMAX_SHIFT) & NVME_CAP_HI_REG_MPSMAX_MASK)
  118 #define NVME_CAP_HI_PMRS(x) \
  119         (((x) >> NVME_CAP_HI_REG_PMRS_SHIFT) & NVME_CAP_HI_REG_PMRS_MASK)
  120 #define NVME_CAP_HI_CMBS(x) \
  121         (((x) >> NVME_CAP_HI_REG_CMBS_SHIFT) & NVME_CAP_HI_REG_CMBS_MASK)
  122 
  123 #define NVME_CC_REG_EN_SHIFT                            (0)
  124 #define NVME_CC_REG_EN_MASK                             (0x1)
  125 #define NVME_CC_REG_CSS_SHIFT                           (4)
  126 #define NVME_CC_REG_CSS_MASK                            (0x7)
  127 #define NVME_CC_REG_MPS_SHIFT                           (7)
  128 #define NVME_CC_REG_MPS_MASK                            (0xF)
  129 #define NVME_CC_REG_AMS_SHIFT                           (11)
  130 #define NVME_CC_REG_AMS_MASK                            (0x7)
  131 #define NVME_CC_REG_SHN_SHIFT                           (14)
  132 #define NVME_CC_REG_SHN_MASK                            (0x3)
  133 #define NVME_CC_REG_IOSQES_SHIFT                        (16)
  134 #define NVME_CC_REG_IOSQES_MASK                         (0xF)
  135 #define NVME_CC_REG_IOCQES_SHIFT                        (20)
  136 #define NVME_CC_REG_IOCQES_MASK                         (0xF)
  137 
  138 #define NVME_CSTS_REG_RDY_SHIFT                         (0)
  139 #define NVME_CSTS_REG_RDY_MASK                          (0x1)
  140 #define NVME_CSTS_REG_CFS_SHIFT                         (1)
  141 #define NVME_CSTS_REG_CFS_MASK                          (0x1)
  142 #define NVME_CSTS_REG_SHST_SHIFT                        (2)
  143 #define NVME_CSTS_REG_SHST_MASK                         (0x3)
  144 #define NVME_CSTS_REG_NVSRO_SHIFT                       (4)
  145 #define NVME_CSTS_REG_NVSRO_MASK                        (0x1)
  146 #define NVME_CSTS_REG_PP_SHIFT                          (5)
  147 #define NVME_CSTS_REG_PP_MASK                           (0x1)
  148 
  149 #define NVME_CSTS_GET_SHST(csts)                        (((csts) >> NVME_CSTS_REG_SHST_SHIFT) & NVME_CSTS_REG_SHST_MASK)
  150 
  151 #define NVME_AQA_REG_ASQS_SHIFT                         (0)
  152 #define NVME_AQA_REG_ASQS_MASK                          (0xFFF)
  153 #define NVME_AQA_REG_ACQS_SHIFT                         (16)
  154 #define NVME_AQA_REG_ACQS_MASK                          (0xFFF)
  155 
  156 #define NVME_PMRCAP_REG_RDS_SHIFT                       (3)
  157 #define NVME_PMRCAP_REG_RDS_MASK                        (0x1)
  158 #define NVME_PMRCAP_REG_WDS_SHIFT                       (4)
  159 #define NVME_PMRCAP_REG_WDS_MASK                        (0x1)
  160 #define NVME_PMRCAP_REG_BIR_SHIFT                       (5)
  161 #define NVME_PMRCAP_REG_BIR_MASK                        (0x7)
  162 #define NVME_PMRCAP_REG_PMRTU_SHIFT                     (8)
  163 #define NVME_PMRCAP_REG_PMRTU_MASK                      (0x3)
  164 #define NVME_PMRCAP_REG_PMRWBM_SHIFT                    (10)
  165 #define NVME_PMRCAP_REG_PMRWBM_MASK                     (0xf)
  166 #define NVME_PMRCAP_REG_PMRTO_SHIFT                     (16)
  167 #define NVME_PMRCAP_REG_PMRTO_MASK                      (0xff)
  168 #define NVME_PMRCAP_REG_CMSS_SHIFT                      (24)
  169 #define NVME_PMRCAP_REG_CMSS_MASK                       (0x1)
  170 
  171 #define NVME_PMRCAP_RDS(x) \
  172         (((x) >> NVME_PMRCAP_REG_RDS_SHIFT) & NVME_PMRCAP_REG_RDS_MASK)
  173 #define NVME_PMRCAP_WDS(x) \
  174         (((x) >> NVME_PMRCAP_REG_WDS_SHIFT) & NVME_PMRCAP_REG_WDS_MASK)
  175 #define NVME_PMRCAP_BIR(x) \
  176         (((x) >> NVME_PMRCAP_REG_BIR_SHIFT) & NVME_PMRCAP_REG_BIR_MASK)
  177 #define NVME_PMRCAP_PMRTU(x) \
  178         (((x) >> NVME_PMRCAP_REG_PMRTU_SHIFT) & NVME_PMRCAP_REG_PMRTU_MASK)
  179 #define NVME_PMRCAP_PMRWBM(x) \
  180         (((x) >> NVME_PMRCAP_REG_PMRWBM_SHIFT) & NVME_PMRCAP_REG_PMRWBM_MASK)
  181 #define NVME_PMRCAP_PMRTO(x) \
  182         (((x) >> NVME_PMRCAP_REG_PMRTO_SHIFT) & NVME_PMRCAP_REG_PMRTO_MASK)
  183 #define NVME_PMRCAP_CMSS(x) \
  184         (((x) >> NVME_PMRCAP_REG_CMSS_SHIFT) & NVME_PMRCAP_REG_CMSS_MASK)
  185 
  186 /* Command field definitions */
  187 
  188 #define NVME_CMD_FUSE_SHIFT                             (8)
  189 #define NVME_CMD_FUSE_MASK                              (0x3)
  190 
  191 #define NVME_STATUS_P_SHIFT                             (0)
  192 #define NVME_STATUS_P_MASK                              (0x1)
  193 #define NVME_STATUS_SC_SHIFT                            (1)
  194 #define NVME_STATUS_SC_MASK                             (0xFF)
  195 #define NVME_STATUS_SCT_SHIFT                           (9)
  196 #define NVME_STATUS_SCT_MASK                            (0x7)
  197 #define NVME_STATUS_CRD_SHIFT                           (12)
  198 #define NVME_STATUS_CRD_MASK                            (0x3)
  199 #define NVME_STATUS_M_SHIFT                             (14)
  200 #define NVME_STATUS_M_MASK                              (0x1)
  201 #define NVME_STATUS_DNR_SHIFT                           (15)
  202 #define NVME_STATUS_DNR_MASK                            (0x1)
  203 
  204 #define NVME_STATUS_GET_P(st)                           (((st) >> NVME_STATUS_P_SHIFT) & NVME_STATUS_P_MASK)
  205 #define NVME_STATUS_GET_SC(st)                          (((st) >> NVME_STATUS_SC_SHIFT) & NVME_STATUS_SC_MASK)
  206 #define NVME_STATUS_GET_SCT(st)                         (((st) >> NVME_STATUS_SCT_SHIFT) & NVME_STATUS_SCT_MASK)
  207 #define NVME_STATUS_GET_CRD(st)                         (((st) >> NVME_STATUS_CRD_SHIFT) & NVME_STATUS_CRD_MASK)
  208 #define NVME_STATUS_GET_M(st)                           (((st) >> NVME_STATUS_M_SHIFT) & NVME_STATUS_M_MASK)
  209 #define NVME_STATUS_GET_DNR(st)                         (((st) >> NVME_STATUS_DNR_SHIFT) & NVME_STATUS_DNR_MASK)
  210 
  211 #define NVME_PWR_ST_MPS_SHIFT                           (0)
  212 #define NVME_PWR_ST_MPS_MASK                            (0x1)
  213 #define NVME_PWR_ST_NOPS_SHIFT                          (1)
  214 #define NVME_PWR_ST_NOPS_MASK                           (0x1)
  215 #define NVME_PWR_ST_RRT_SHIFT                           (0)
  216 #define NVME_PWR_ST_RRT_MASK                            (0x1F)
  217 #define NVME_PWR_ST_RRL_SHIFT                           (0)
  218 #define NVME_PWR_ST_RRL_MASK                            (0x1F)
  219 #define NVME_PWR_ST_RWT_SHIFT                           (0)
  220 #define NVME_PWR_ST_RWT_MASK                            (0x1F)
  221 #define NVME_PWR_ST_RWL_SHIFT                           (0)
  222 #define NVME_PWR_ST_RWL_MASK                            (0x1F)
  223 #define NVME_PWR_ST_IPS_SHIFT                           (6)
  224 #define NVME_PWR_ST_IPS_MASK                            (0x3)
  225 #define NVME_PWR_ST_APW_SHIFT                           (0)
  226 #define NVME_PWR_ST_APW_MASK                            (0x7)
  227 #define NVME_PWR_ST_APS_SHIFT                           (6)
  228 #define NVME_PWR_ST_APS_MASK                            (0x3)
  229 
  230 /** Controller Multi-path I/O and Namespace Sharing Capabilities */
  231 /* More then one port */
  232 #define NVME_CTRLR_DATA_MIC_MPORTS_SHIFT                (0)
  233 #define NVME_CTRLR_DATA_MIC_MPORTS_MASK                 (0x1)
  234 /* More then one controller */
  235 #define NVME_CTRLR_DATA_MIC_MCTRLRS_SHIFT               (1)
  236 #define NVME_CTRLR_DATA_MIC_MCTRLRS_MASK                (0x1)
  237 /* SR-IOV Virtual Function */
  238 #define NVME_CTRLR_DATA_MIC_SRIOVVF_SHIFT               (2)
  239 #define NVME_CTRLR_DATA_MIC_SRIOVVF_MASK                (0x1)
  240 /* Asymmetric Namespace Access Reporting */
  241 #define NVME_CTRLR_DATA_MIC_ANAR_SHIFT                  (3)
  242 #define NVME_CTRLR_DATA_MIC_ANAR_MASK                   (0x1)
  243 
  244 /** OAES - Optional Asynchronous Events Supported */
  245 /* supports Namespace Attribute Notices event */
  246 #define NVME_CTRLR_DATA_OAES_NS_ATTR_SHIFT              (8)
  247 #define NVME_CTRLR_DATA_OAES_NS_ATTR_MASK               (0x1)
  248 /* supports Firmware Activation Notices event */
  249 #define NVME_CTRLR_DATA_OAES_FW_ACTIVATE_SHIFT          (9)
  250 #define NVME_CTRLR_DATA_OAES_FW_ACTIVATE_MASK           (0x1)
  251 /* supports Asymmetric Namespace Access Change Notices event */
  252 #define NVME_CTRLR_DATA_OAES_ASYM_NS_CHANGE_SHIFT       (11)
  253 #define NVME_CTRLR_DATA_OAES_ASYM_NS_CHANGE_MASK        (0x1)
  254 /* supports Predictable Latency Event Aggregate Log Change Notices event */
  255 #define NVME_CTRLR_DATA_OAES_PREDICT_LATENCY_SHIFT      (12)
  256 #define NVME_CTRLR_DATA_OAES_PREDICT_LATENCY_MASK       (0x1)
  257 /* supports LBA Status Information Notices event */
  258 #define NVME_CTRLR_DATA_OAES_LBA_STATUS_SHIFT           (13)
  259 #define NVME_CTRLR_DATA_OAES_LBA_STATUS_MASK            (0x1)
  260 /* supports Endurance Group Event Aggregate Log Page Changes Notices event */
  261 #define NVME_CTRLR_DATA_OAES_ENDURANCE_GROUP_SHIFT      (14)
  262 #define NVME_CTRLR_DATA_OAES_ENDURANCE_GROUP_MASK       (0x1)
  263 /* supports Normal NVM Subsystem Shutdown event */
  264 #define NVME_CTRLR_DATA_OAES_NORMAL_SHUTDOWN_SHIFT      (15)
  265 #define NVME_CTRLR_DATA_OAES_NORMAL_SHUTDOWN_MASK       (0x1)
  266 /* supports Zone Descriptor Changed Notices event */
  267 #define NVME_CTRLR_DATA_OAES_ZONE_DESC_CHANGE_SHIFT     (27)
  268 #define NVME_CTRLR_DATA_OAES_ZONE_DESC_CHANGE_MASK      (0x1)
  269 /* supports Discovery Log Page Change Notification event */
  270 #define NVME_CTRLR_DATA_OAES_LOG_PAGE_CHANGE_SHIFT      (31)
  271 #define NVME_CTRLR_DATA_OAES_LOG_PAGE_CHANGE_MASK       (0x1)
  272 
  273 /** OACS - optional admin command support */
  274 /* supports security send/receive commands */
  275 #define NVME_CTRLR_DATA_OACS_SECURITY_SHIFT             (0)
  276 #define NVME_CTRLR_DATA_OACS_SECURITY_MASK              (0x1)
  277 /* supports format nvm command */
  278 #define NVME_CTRLR_DATA_OACS_FORMAT_SHIFT               (1)
  279 #define NVME_CTRLR_DATA_OACS_FORMAT_MASK                (0x1)
  280 /* supports firmware activate/download commands */
  281 #define NVME_CTRLR_DATA_OACS_FIRMWARE_SHIFT             (2)
  282 #define NVME_CTRLR_DATA_OACS_FIRMWARE_MASK              (0x1)
  283 /* supports namespace management commands */
  284 #define NVME_CTRLR_DATA_OACS_NSMGMT_SHIFT               (3)
  285 #define NVME_CTRLR_DATA_OACS_NSMGMT_MASK                (0x1)
  286 /* supports Device Self-test command */
  287 #define NVME_CTRLR_DATA_OACS_SELFTEST_SHIFT             (4)
  288 #define NVME_CTRLR_DATA_OACS_SELFTEST_MASK              (0x1)
  289 /* supports Directives */
  290 #define NVME_CTRLR_DATA_OACS_DIRECTIVES_SHIFT           (5)
  291 #define NVME_CTRLR_DATA_OACS_DIRECTIVES_MASK            (0x1)
  292 /* supports NVMe-MI Send/Receive */
  293 #define NVME_CTRLR_DATA_OACS_NVMEMI_SHIFT               (6)
  294 #define NVME_CTRLR_DATA_OACS_NVMEMI_MASK                (0x1)
  295 /* supports Virtualization Management */
  296 #define NVME_CTRLR_DATA_OACS_VM_SHIFT                   (7)
  297 #define NVME_CTRLR_DATA_OACS_VM_MASK                    (0x1)
  298 /* supports Doorbell Buffer Config */
  299 #define NVME_CTRLR_DATA_OACS_DBBUFFER_SHIFT             (8)
  300 #define NVME_CTRLR_DATA_OACS_DBBUFFER_MASK              (0x1)
  301 /* supports Get LBA Status */
  302 #define NVME_CTRLR_DATA_OACS_GETLBA_SHIFT               (9)
  303 #define NVME_CTRLR_DATA_OACS_GETLBA_MASK                (0x1)
  304 
  305 /** firmware updates */
  306 /* first slot is read-only */
  307 #define NVME_CTRLR_DATA_FRMW_SLOT1_RO_SHIFT             (0)
  308 #define NVME_CTRLR_DATA_FRMW_SLOT1_RO_MASK              (0x1)
  309 /* number of firmware slots */
  310 #define NVME_CTRLR_DATA_FRMW_NUM_SLOTS_SHIFT            (1)
  311 #define NVME_CTRLR_DATA_FRMW_NUM_SLOTS_MASK             (0x7)
  312 /* firmware activation without reset */
  313 #define NVME_CTRLR_DATA_FRMW_ACT_WO_RESET_SHIFT         (4)
  314 #define NVME_CTRLR_DATA_FRMW_ACT_WO_RESET_MASK          (0x1)
  315 
  316 /** log page attributes */
  317 /* per namespace smart/health log page */
  318 #define NVME_CTRLR_DATA_LPA_NS_SMART_SHIFT              (0)
  319 #define NVME_CTRLR_DATA_LPA_NS_SMART_MASK               (0x1)
  320 
  321 /** AVSCC - admin vendor specific command configuration */
  322 /* admin vendor specific commands use spec format */
  323 #define NVME_CTRLR_DATA_AVSCC_SPEC_FORMAT_SHIFT         (0)
  324 #define NVME_CTRLR_DATA_AVSCC_SPEC_FORMAT_MASK          (0x1)
  325 
  326 /** Autonomous Power State Transition Attributes */
  327 /* Autonomous Power State Transitions supported */
  328 #define NVME_CTRLR_DATA_APSTA_APST_SUPP_SHIFT           (0)
  329 #define NVME_CTRLR_DATA_APSTA_APST_SUPP_MASK            (0x1)
  330 
  331 /** Sanitize Capabilities */
  332 /* Crypto Erase Support  */
  333 #define NVME_CTRLR_DATA_SANICAP_CES_SHIFT               (0)
  334 #define NVME_CTRLR_DATA_SANICAP_CES_MASK                (0x1)
  335 /* Block Erase Support */
  336 #define NVME_CTRLR_DATA_SANICAP_BES_SHIFT               (1)
  337 #define NVME_CTRLR_DATA_SANICAP_BES_MASK                (0x1)
  338 /* Overwrite Support */
  339 #define NVME_CTRLR_DATA_SANICAP_OWS_SHIFT               (2)
  340 #define NVME_CTRLR_DATA_SANICAP_OWS_MASK                (0x1)
  341 /* No-Deallocate Inhibited  */
  342 #define NVME_CTRLR_DATA_SANICAP_NDI_SHIFT               (29)
  343 #define NVME_CTRLR_DATA_SANICAP_NDI_MASK                (0x1)
  344 /* No-Deallocate Modifies Media After Sanitize */
  345 #define NVME_CTRLR_DATA_SANICAP_NODMMAS_SHIFT           (30)
  346 #define NVME_CTRLR_DATA_SANICAP_NODMMAS_MASK            (0x3)
  347 #define NVME_CTRLR_DATA_SANICAP_NODMMAS_UNDEF           (0)
  348 #define NVME_CTRLR_DATA_SANICAP_NODMMAS_NO              (1)
  349 #define NVME_CTRLR_DATA_SANICAP_NODMMAS_YES             (2)
  350 
  351 /** submission queue entry size */
  352 #define NVME_CTRLR_DATA_SQES_MIN_SHIFT                  (0)
  353 #define NVME_CTRLR_DATA_SQES_MIN_MASK                   (0xF)
  354 #define NVME_CTRLR_DATA_SQES_MAX_SHIFT                  (4)
  355 #define NVME_CTRLR_DATA_SQES_MAX_MASK                   (0xF)
  356 
  357 /** completion queue entry size */
  358 #define NVME_CTRLR_DATA_CQES_MIN_SHIFT                  (0)
  359 #define NVME_CTRLR_DATA_CQES_MIN_MASK                   (0xF)
  360 #define NVME_CTRLR_DATA_CQES_MAX_SHIFT                  (4)
  361 #define NVME_CTRLR_DATA_CQES_MAX_MASK                   (0xF)
  362 
  363 /** optional nvm command support */
  364 #define NVME_CTRLR_DATA_ONCS_COMPARE_SHIFT              (0)
  365 #define NVME_CTRLR_DATA_ONCS_COMPARE_MASK               (0x1)
  366 #define NVME_CTRLR_DATA_ONCS_WRITE_UNC_SHIFT            (1)
  367 #define NVME_CTRLR_DATA_ONCS_WRITE_UNC_MASK             (0x1)
  368 #define NVME_CTRLR_DATA_ONCS_DSM_SHIFT                  (2)
  369 #define NVME_CTRLR_DATA_ONCS_DSM_MASK                   (0x1)
  370 #define NVME_CTRLR_DATA_ONCS_WRZERO_SHIFT               (3)
  371 #define NVME_CTRLR_DATA_ONCS_WRZERO_MASK                (0x1)
  372 #define NVME_CTRLR_DATA_ONCS_SAVEFEAT_SHIFT             (4)
  373 #define NVME_CTRLR_DATA_ONCS_SAVEFEAT_MASK              (0x1)
  374 #define NVME_CTRLR_DATA_ONCS_RESERV_SHIFT               (5)
  375 #define NVME_CTRLR_DATA_ONCS_RESERV_MASK                (0x1)
  376 #define NVME_CTRLR_DATA_ONCS_TIMESTAMP_SHIFT            (6)
  377 #define NVME_CTRLR_DATA_ONCS_TIMESTAMP_MASK             (0x1)
  378 #define NVME_CTRLR_DATA_ONCS_VERIFY_SHIFT               (7)
  379 #define NVME_CTRLR_DATA_ONCS_VERIFY_MASK                (0x1)
  380 
  381 /** Fused Operation Support */
  382 #define NVME_CTRLR_DATA_FUSES_CNW_SHIFT         (0)
  383 #define NVME_CTRLR_DATA_FUSES_CNW_MASK          (0x1)
  384 
  385 /** Format NVM Attributes */
  386 #define NVME_CTRLR_DATA_FNA_FORMAT_ALL_SHIFT            (0)
  387 #define NVME_CTRLR_DATA_FNA_FORMAT_ALL_MASK             (0x1)
  388 #define NVME_CTRLR_DATA_FNA_ERASE_ALL_SHIFT             (1)
  389 #define NVME_CTRLR_DATA_FNA_ERASE_ALL_MASK              (0x1)
  390 #define NVME_CTRLR_DATA_FNA_CRYPTO_ERASE_SHIFT          (2)
  391 #define NVME_CTRLR_DATA_FNA_CRYPTO_ERASE_MASK           (0x1)
  392 
  393 /** volatile write cache */
  394 /* volatile write cache present */
  395 #define NVME_CTRLR_DATA_VWC_PRESENT_SHIFT               (0)
  396 #define NVME_CTRLR_DATA_VWC_PRESENT_MASK                (0x1)
  397 /* flush all namespaces supported */
  398 #define NVME_CTRLR_DATA_VWC_ALL_SHIFT                   (1)
  399 #define NVME_CTRLR_DATA_VWC_ALL_MASK                    (0x3)
  400 #define NVME_CTRLR_DATA_VWC_ALL_UNKNOWN                 (0)
  401 #define NVME_CTRLR_DATA_VWC_ALL_NO                      (2)
  402 #define NVME_CTRLR_DATA_VWC_ALL_YES                     (3)
  403 
  404 /** namespace features */
  405 /* thin provisioning */
  406 #define NVME_NS_DATA_NSFEAT_THIN_PROV_SHIFT             (0)
  407 #define NVME_NS_DATA_NSFEAT_THIN_PROV_MASK              (0x1)
  408 /* NAWUN, NAWUPF, and NACWU fields are valid */
  409 #define NVME_NS_DATA_NSFEAT_NA_FIELDS_SHIFT             (1)
  410 #define NVME_NS_DATA_NSFEAT_NA_FIELDS_MASK              (0x1)
  411 /* Deallocated or Unwritten Logical Block errors supported */
  412 #define NVME_NS_DATA_NSFEAT_DEALLOC_SHIFT               (2)
  413 #define NVME_NS_DATA_NSFEAT_DEALLOC_MASK                (0x1)
  414 /* NGUID and EUI64 fields are not reusable */
  415 #define NVME_NS_DATA_NSFEAT_NO_ID_REUSE_SHIFT           (3)
  416 #define NVME_NS_DATA_NSFEAT_NO_ID_REUSE_MASK            (0x1)
  417 /* NPWG, NPWA, NPDG, NPDA, and NOWS are valid */
  418 #define NVME_NS_DATA_NSFEAT_NPVALID_SHIFT               (4)
  419 #define NVME_NS_DATA_NSFEAT_NPVALID_MASK                (0x1)
  420 
  421 /** formatted lba size */
  422 #define NVME_NS_DATA_FLBAS_FORMAT_SHIFT                 (0)
  423 #define NVME_NS_DATA_FLBAS_FORMAT_MASK                  (0xF)
  424 #define NVME_NS_DATA_FLBAS_EXTENDED_SHIFT               (4)
  425 #define NVME_NS_DATA_FLBAS_EXTENDED_MASK                (0x1)
  426 
  427 /** metadata capabilities */
  428 /* metadata can be transferred as part of data prp list */
  429 #define NVME_NS_DATA_MC_EXTENDED_SHIFT                  (0)
  430 #define NVME_NS_DATA_MC_EXTENDED_MASK                   (0x1)
  431 /* metadata can be transferred with separate metadata pointer */
  432 #define NVME_NS_DATA_MC_POINTER_SHIFT                   (1)
  433 #define NVME_NS_DATA_MC_POINTER_MASK                    (0x1)
  434 
  435 /** end-to-end data protection capabilities */
  436 /* protection information type 1 */
  437 #define NVME_NS_DATA_DPC_PIT1_SHIFT                     (0)
  438 #define NVME_NS_DATA_DPC_PIT1_MASK                      (0x1)
  439 /* protection information type 2 */
  440 #define NVME_NS_DATA_DPC_PIT2_SHIFT                     (1)
  441 #define NVME_NS_DATA_DPC_PIT2_MASK                      (0x1)
  442 /* protection information type 3 */
  443 #define NVME_NS_DATA_DPC_PIT3_SHIFT                     (2)
  444 #define NVME_NS_DATA_DPC_PIT3_MASK                      (0x1)
  445 /* first eight bytes of metadata */
  446 #define NVME_NS_DATA_DPC_MD_START_SHIFT                 (3)
  447 #define NVME_NS_DATA_DPC_MD_START_MASK                  (0x1)
  448 /* last eight bytes of metadata */
  449 #define NVME_NS_DATA_DPC_MD_END_SHIFT                   (4)
  450 #define NVME_NS_DATA_DPC_MD_END_MASK                    (0x1)
  451 
  452 /** end-to-end data protection type settings */
  453 /* protection information type */
  454 #define NVME_NS_DATA_DPS_PIT_SHIFT                      (0)
  455 #define NVME_NS_DATA_DPS_PIT_MASK                       (0x7)
  456 /* 1 == protection info transferred at start of metadata */
  457 /* 0 == protection info transferred at end of metadata */
  458 #define NVME_NS_DATA_DPS_MD_START_SHIFT                 (3)
  459 #define NVME_NS_DATA_DPS_MD_START_MASK                  (0x1)
  460 
  461 /** Namespace Multi-path I/O and Namespace Sharing Capabilities */
  462 /* the namespace may be attached to two or more controllers */
  463 #define NVME_NS_DATA_NMIC_MAY_BE_SHARED_SHIFT           (0)
  464 #define NVME_NS_DATA_NMIC_MAY_BE_SHARED_MASK            (0x1)
  465 
  466 /** Reservation Capabilities */
  467 /* Persist Through Power Loss */
  468 #define NVME_NS_DATA_RESCAP_PTPL_SHIFT          (0)
  469 #define NVME_NS_DATA_RESCAP_PTPL_MASK           (0x1)
  470 /* supports the Write Exclusive */
  471 #define NVME_NS_DATA_RESCAP_WR_EX_SHIFT         (1)
  472 #define NVME_NS_DATA_RESCAP_WR_EX_MASK          (0x1)
  473 /* supports the Exclusive Access */
  474 #define NVME_NS_DATA_RESCAP_EX_AC_SHIFT         (2)
  475 #define NVME_NS_DATA_RESCAP_EX_AC_MASK          (0x1)
  476 /* supports the Write Exclusive – Registrants Only */
  477 #define NVME_NS_DATA_RESCAP_WR_EX_RO_SHIFT      (3)
  478 #define NVME_NS_DATA_RESCAP_WR_EX_RO_MASK       (0x1)
  479 /* supports the Exclusive Access - Registrants Only */
  480 #define NVME_NS_DATA_RESCAP_EX_AC_RO_SHIFT      (4)
  481 #define NVME_NS_DATA_RESCAP_EX_AC_RO_MASK       (0x1)
  482 /* supports the Write Exclusive – All Registrants */
  483 #define NVME_NS_DATA_RESCAP_WR_EX_AR_SHIFT      (5)
  484 #define NVME_NS_DATA_RESCAP_WR_EX_AR_MASK       (0x1)
  485 /* supports the Exclusive Access - All Registrants */
  486 #define NVME_NS_DATA_RESCAP_EX_AC_AR_SHIFT      (6)
  487 #define NVME_NS_DATA_RESCAP_EX_AC_AR_MASK       (0x1)
  488 /* Ignore Existing Key is used as defined in revision 1.3 or later */
  489 #define NVME_NS_DATA_RESCAP_IEKEY13_SHIFT       (7)
  490 #define NVME_NS_DATA_RESCAP_IEKEY13_MASK        (0x1)
  491 
  492 /** Format Progress Indicator */
  493 /* percentage of the Format NVM command that remains to be completed */
  494 #define NVME_NS_DATA_FPI_PERC_SHIFT             (0)
  495 #define NVME_NS_DATA_FPI_PERC_MASK              (0x7f)
  496 /* namespace supports the Format Progress Indicator */
  497 #define NVME_NS_DATA_FPI_SUPP_SHIFT             (7)
  498 #define NVME_NS_DATA_FPI_SUPP_MASK              (0x1)
  499 
  500 /** Deallocate Logical Block Features */
  501 /* deallocated logical block read behavior */
  502 #define NVME_NS_DATA_DLFEAT_READ_SHIFT          (0)
  503 #define NVME_NS_DATA_DLFEAT_READ_MASK           (0x07)
  504 #define NVME_NS_DATA_DLFEAT_READ_NR             (0x00)
  505 #define NVME_NS_DATA_DLFEAT_READ_00             (0x01)
  506 #define NVME_NS_DATA_DLFEAT_READ_FF             (0x02)
  507 /* supports the Deallocate bit in the Write Zeroes */
  508 #define NVME_NS_DATA_DLFEAT_DWZ_SHIFT           (3)
  509 #define NVME_NS_DATA_DLFEAT_DWZ_MASK            (0x01)
  510 /* Guard field for deallocated logical blocks is set to the CRC  */
  511 #define NVME_NS_DATA_DLFEAT_GCRC_SHIFT          (4)
  512 #define NVME_NS_DATA_DLFEAT_GCRC_MASK           (0x01)
  513 
  514 /** lba format support */
  515 /* metadata size */
  516 #define NVME_NS_DATA_LBAF_MS_SHIFT                      (0)
  517 #define NVME_NS_DATA_LBAF_MS_MASK                       (0xFFFF)
  518 /* lba data size */
  519 #define NVME_NS_DATA_LBAF_LBADS_SHIFT                   (16)
  520 #define NVME_NS_DATA_LBAF_LBADS_MASK                    (0xFF)
  521 /* relative performance */
  522 #define NVME_NS_DATA_LBAF_RP_SHIFT                      (24)
  523 #define NVME_NS_DATA_LBAF_RP_MASK                       (0x3)
  524 
  525 enum nvme_critical_warning_state {
  526         NVME_CRIT_WARN_ST_AVAILABLE_SPARE               = 0x1,
  527         NVME_CRIT_WARN_ST_TEMPERATURE                   = 0x2,
  528         NVME_CRIT_WARN_ST_DEVICE_RELIABILITY            = 0x4,
  529         NVME_CRIT_WARN_ST_READ_ONLY                     = 0x8,
  530         NVME_CRIT_WARN_ST_VOLATILE_MEMORY_BACKUP        = 0x10,
  531 };
  532 #define NVME_CRIT_WARN_ST_RESERVED_MASK                 (0xE0)
  533 #define NVME_ASYNC_EVENT_NS_ATTRIBUTE                   (0x100)
  534 #define NVME_ASYNC_EVENT_FW_ACTIVATE                    (0x200)
  535 
  536 /* slot for current FW */
  537 #define NVME_FIRMWARE_PAGE_AFI_SLOT_SHIFT               (0)
  538 #define NVME_FIRMWARE_PAGE_AFI_SLOT_MASK                (0x7)
  539 
  540 /* Commands Supported and Effects */
  541 #define NVME_CE_PAGE_CSUP_SHIFT                         (0)
  542 #define NVME_CE_PAGE_CSUP_MASK                          (0x1)
  543 #define NVME_CE_PAGE_LBCC_SHIFT                         (1)
  544 #define NVME_CE_PAGE_LBCC_MASK                          (0x1)
  545 #define NVME_CE_PAGE_NCC_SHIFT                          (2)
  546 #define NVME_CE_PAGE_NCC_MASK                           (0x1)
  547 #define NVME_CE_PAGE_NIC_SHIFT                          (3)
  548 #define NVME_CE_PAGE_NIC_MASK                           (0x1)
  549 #define NVME_CE_PAGE_CCC_SHIFT                          (4)
  550 #define NVME_CE_PAGE_CCC_MASK                           (0x1)
  551 #define NVME_CE_PAGE_CSE_SHIFT                          (16)
  552 #define NVME_CE_PAGE_CSE_MASK                           (0x7)
  553 #define NVME_CE_PAGE_UUID_SHIFT                         (19)
  554 #define NVME_CE_PAGE_UUID_MASK                          (0x1)
  555 
  556 /* Sanitize Status */
  557 #define NVME_SS_PAGE_SSTAT_STATUS_SHIFT                 (0)
  558 #define NVME_SS_PAGE_SSTAT_STATUS_MASK                  (0x7)
  559 #define NVME_SS_PAGE_SSTAT_STATUS_NEVER                 (0)
  560 #define NVME_SS_PAGE_SSTAT_STATUS_COMPLETED             (1)
  561 #define NVME_SS_PAGE_SSTAT_STATUS_INPROG                (2)
  562 #define NVME_SS_PAGE_SSTAT_STATUS_FAILED                (3)
  563 #define NVME_SS_PAGE_SSTAT_STATUS_COMPLETEDWD           (4)
  564 #define NVME_SS_PAGE_SSTAT_PASSES_SHIFT                 (3)
  565 #define NVME_SS_PAGE_SSTAT_PASSES_MASK                  (0x1f)
  566 #define NVME_SS_PAGE_SSTAT_GDE_SHIFT                    (8)
  567 #define NVME_SS_PAGE_SSTAT_GDE_MASK                     (0x1)
  568 
  569 /* Features */
  570 /* Get Features */
  571 #define NVME_FEAT_GET_SEL_SHIFT                         (8)
  572 #define NVME_FEAT_GET_SEL_MASK                          (0x7)
  573 #define NVME_FEAT_GET_FID_SHIFT                         (0)
  574 #define NVME_FEAT_GET_FID_MASK                          (0xff)
  575 
  576 /* Set Features */
  577 #define NVME_FEAT_SET_SV_SHIFT                          (31)
  578 #define NVME_FEAT_SET_SV_MASK                           (0x1)
  579 #define NVME_FEAT_SET_FID_SHIFT                         (0)
  580 #define NVME_FEAT_SET_FID_MASK                          (0xff)
  581 
  582 /* Helper macro to combine *_MASK and *_SHIFT defines */
  583 #define NVMEB(name)     (name##_MASK << name##_SHIFT)
  584 
  585 /* Helper macro to extract value from x */
  586 #define NVMEV(name, x)  (((x) >> name##_SHIFT) & name##_MASK)
  587 
  588 /* CC register SHN field values */
  589 enum shn_value {
  590         NVME_SHN_NORMAL         = 0x1,
  591         NVME_SHN_ABRUPT         = 0x2,
  592 };
  593 
  594 /* CSTS register SHST field values */
  595 enum shst_value {
  596         NVME_SHST_NORMAL        = 0x0,
  597         NVME_SHST_OCCURRING     = 0x1,
  598         NVME_SHST_COMPLETE      = 0x2,
  599 };
  600 
  601 struct nvme_registers {
  602         uint32_t        cap_lo; /* controller capabilities */
  603         uint32_t        cap_hi;
  604         uint32_t        vs;     /* version */
  605         uint32_t        intms;  /* interrupt mask set */
  606         uint32_t        intmc;  /* interrupt mask clear */
  607         uint32_t        cc;     /* controller configuration */
  608         uint32_t        reserved1;
  609         uint32_t        csts;   /* controller status */
  610         uint32_t        nssr;   /* NVM Subsystem Reset */
  611         uint32_t        aqa;    /* admin queue attributes */
  612         uint64_t        asq;    /* admin submission queue base addr */
  613         uint64_t        acq;    /* admin completion queue base addr */
  614         uint32_t        cmbloc; /* Controller Memory Buffer Location */
  615         uint32_t        cmbsz;  /* Controller Memory Buffer Size */
  616         uint32_t        bpinfo; /* Boot Partition Information */
  617         uint32_t        bprsel; /* Boot Partition Read Select */
  618         uint64_t        bpmbl;  /* Boot Partition Memory Buffer Location */
  619         uint64_t        cmbmsc; /* Controller Memory Buffer Memory Space Control */
  620         uint32_t        cmbsts; /* Controller Memory Buffer Status */
  621         uint8_t         reserved3[3492]; /* 5Ch - DFFh */
  622         uint32_t        pmrcap; /* Persistent Memory Capabilities */
  623         uint32_t        pmrctl; /* Persistent Memory Region Control */
  624         uint32_t        pmrsts; /* Persistent Memory Region Status */
  625         uint32_t        pmrebs; /* Persistent Memory Region Elasticity Buffer Size */
  626         uint32_t        pmrswtp; /* Persistent Memory Region Sustained Write Throughput */
  627         uint32_t        pmrmsc_lo; /* Persistent Memory Region Controller Memory Space Control */
  628         uint32_t        pmrmsc_hi;
  629         uint8_t         reserved4[484]; /* E1Ch - FFFh */
  630         struct {
  631             uint32_t    sq_tdbl; /* submission queue tail doorbell */
  632             uint32_t    cq_hdbl; /* completion queue head doorbell */
  633         } doorbell[1];
  634 };
  635 
  636 _Static_assert(sizeof(struct nvme_registers) == 0x1008, "bad size for nvme_registers");
  637 
  638 struct nvme_command {
  639         /* dword 0 */
  640         uint8_t opc;            /* opcode */
  641         uint8_t fuse;           /* fused operation */
  642         uint16_t cid;           /* command identifier */
  643 
  644         /* dword 1 */
  645         uint32_t nsid;          /* namespace identifier */
  646 
  647         /* dword 2-3 */
  648         uint32_t rsvd2;
  649         uint32_t rsvd3;
  650 
  651         /* dword 4-5 */
  652         uint64_t mptr;          /* metadata pointer */
  653 
  654         /* dword 6-7 */
  655         uint64_t prp1;          /* prp entry 1 */
  656 
  657         /* dword 8-9 */
  658         uint64_t prp2;          /* prp entry 2 */
  659 
  660         /* dword 10-15 */
  661         uint32_t cdw10;         /* command-specific */
  662         uint32_t cdw11;         /* command-specific */
  663         uint32_t cdw12;         /* command-specific */
  664         uint32_t cdw13;         /* command-specific */
  665         uint32_t cdw14;         /* command-specific */
  666         uint32_t cdw15;         /* command-specific */
  667 };
  668 
  669 _Static_assert(sizeof(struct nvme_command) == 16 * 4, "bad size for nvme_command");
  670 
  671 struct nvme_completion {
  672         /* dword 0 */
  673         uint32_t                cdw0;   /* command-specific */
  674 
  675         /* dword 1 */
  676         uint32_t                rsvd1;
  677 
  678         /* dword 2 */
  679         uint16_t                sqhd;   /* submission queue head pointer */
  680         uint16_t                sqid;   /* submission queue identifier */
  681 
  682         /* dword 3 */
  683         uint16_t                cid;    /* command identifier */
  684         uint16_t                status;
  685 } __aligned(8); /* riscv: nvme_qpair_process_completions has better code gen */
  686 
  687 _Static_assert(sizeof(struct nvme_completion) == 4 * 4, "bad size for nvme_completion");
  688 
  689 struct nvme_dsm_range {
  690         uint32_t attributes;
  691         uint32_t length;
  692         uint64_t starting_lba;
  693 };
  694 
  695 /* Largest DSM Trim that can be done */
  696 #define NVME_MAX_DSM_TRIM               4096
  697 
  698 _Static_assert(sizeof(struct nvme_dsm_range) == 16, "bad size for nvme_dsm_ranage");
  699 
  700 /* status code types */
  701 enum nvme_status_code_type {
  702         NVME_SCT_GENERIC                = 0x0,
  703         NVME_SCT_COMMAND_SPECIFIC       = 0x1,
  704         NVME_SCT_MEDIA_ERROR            = 0x2,
  705         NVME_SCT_PATH_RELATED           = 0x3,
  706         /* 0x3-0x6 - reserved */
  707         NVME_SCT_VENDOR_SPECIFIC        = 0x7,
  708 };
  709 
  710 /* generic command status codes */
  711 enum nvme_generic_command_status_code {
  712         NVME_SC_SUCCESS                         = 0x00,
  713         NVME_SC_INVALID_OPCODE                  = 0x01,
  714         NVME_SC_INVALID_FIELD                   = 0x02,
  715         NVME_SC_COMMAND_ID_CONFLICT             = 0x03,
  716         NVME_SC_DATA_TRANSFER_ERROR             = 0x04,
  717         NVME_SC_ABORTED_POWER_LOSS              = 0x05,
  718         NVME_SC_INTERNAL_DEVICE_ERROR           = 0x06,
  719         NVME_SC_ABORTED_BY_REQUEST              = 0x07,
  720         NVME_SC_ABORTED_SQ_DELETION             = 0x08,
  721         NVME_SC_ABORTED_FAILED_FUSED            = 0x09,
  722         NVME_SC_ABORTED_MISSING_FUSED           = 0x0a,
  723         NVME_SC_INVALID_NAMESPACE_OR_FORMAT     = 0x0b,
  724         NVME_SC_COMMAND_SEQUENCE_ERROR          = 0x0c,
  725         NVME_SC_INVALID_SGL_SEGMENT_DESCR       = 0x0d,
  726         NVME_SC_INVALID_NUMBER_OF_SGL_DESCR     = 0x0e,
  727         NVME_SC_DATA_SGL_LENGTH_INVALID         = 0x0f,
  728         NVME_SC_METADATA_SGL_LENGTH_INVALID     = 0x10,
  729         NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID     = 0x11,
  730         NVME_SC_INVALID_USE_OF_CMB              = 0x12,
  731         NVME_SC_PRP_OFFET_INVALID               = 0x13,
  732         NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED      = 0x14,
  733         NVME_SC_OPERATION_DENIED                = 0x15,
  734         NVME_SC_SGL_OFFSET_INVALID              = 0x16,
  735         /* 0x17 - reserved */
  736         NVME_SC_HOST_ID_INCONSISTENT_FORMAT     = 0x18,
  737         NVME_SC_KEEP_ALIVE_TIMEOUT_EXPIRED      = 0x19,
  738         NVME_SC_KEEP_ALIVE_TIMEOUT_INVALID      = 0x1a,
  739         NVME_SC_ABORTED_DUE_TO_PREEMPT          = 0x1b,
  740         NVME_SC_SANITIZE_FAILED                 = 0x1c,
  741         NVME_SC_SANITIZE_IN_PROGRESS            = 0x1d,
  742         NVME_SC_SGL_DATA_BLOCK_GRAN_INVALID     = 0x1e,
  743         NVME_SC_NOT_SUPPORTED_IN_CMB            = 0x1f,
  744         NVME_SC_NAMESPACE_IS_WRITE_PROTECTED    = 0x20,
  745         NVME_SC_COMMAND_INTERRUPTED             = 0x21,
  746         NVME_SC_TRANSIENT_TRANSPORT_ERROR       = 0x22,
  747 
  748         NVME_SC_LBA_OUT_OF_RANGE                = 0x80,
  749         NVME_SC_CAPACITY_EXCEEDED               = 0x81,
  750         NVME_SC_NAMESPACE_NOT_READY             = 0x82,
  751         NVME_SC_RESERVATION_CONFLICT            = 0x83,
  752         NVME_SC_FORMAT_IN_PROGRESS              = 0x84,
  753 };
  754 
  755 /* command specific status codes */
  756 enum nvme_command_specific_status_code {
  757         NVME_SC_COMPLETION_QUEUE_INVALID        = 0x00,
  758         NVME_SC_INVALID_QUEUE_IDENTIFIER        = 0x01,
  759         NVME_SC_MAXIMUM_QUEUE_SIZE_EXCEEDED     = 0x02,
  760         NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED    = 0x03,
  761         /* 0x04 - reserved */
  762         NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED = 0x05,
  763         NVME_SC_INVALID_FIRMWARE_SLOT           = 0x06,
  764         NVME_SC_INVALID_FIRMWARE_IMAGE          = 0x07,
  765         NVME_SC_INVALID_INTERRUPT_VECTOR        = 0x08,
  766         NVME_SC_INVALID_LOG_PAGE                = 0x09,
  767         NVME_SC_INVALID_FORMAT                  = 0x0a,
  768         NVME_SC_FIRMWARE_REQUIRES_RESET         = 0x0b,
  769         NVME_SC_INVALID_QUEUE_DELETION          = 0x0c,
  770         NVME_SC_FEATURE_NOT_SAVEABLE            = 0x0d,
  771         NVME_SC_FEATURE_NOT_CHANGEABLE          = 0x0e,
  772         NVME_SC_FEATURE_NOT_NS_SPECIFIC         = 0x0f,
  773         NVME_SC_FW_ACT_REQUIRES_NVMS_RESET      = 0x10,
  774         NVME_SC_FW_ACT_REQUIRES_RESET           = 0x11,
  775         NVME_SC_FW_ACT_REQUIRES_TIME            = 0x12,
  776         NVME_SC_FW_ACT_PROHIBITED               = 0x13,
  777         NVME_SC_OVERLAPPING_RANGE               = 0x14,
  778         NVME_SC_NS_INSUFFICIENT_CAPACITY        = 0x15,
  779         NVME_SC_NS_ID_UNAVAILABLE               = 0x16,
  780         /* 0x17 - reserved */
  781         NVME_SC_NS_ALREADY_ATTACHED             = 0x18,
  782         NVME_SC_NS_IS_PRIVATE                   = 0x19,
  783         NVME_SC_NS_NOT_ATTACHED                 = 0x1a,
  784         NVME_SC_THIN_PROV_NOT_SUPPORTED         = 0x1b,
  785         NVME_SC_CTRLR_LIST_INVALID              = 0x1c,
  786         NVME_SC_SELF_TEST_IN_PROGRESS           = 0x1d,
  787         NVME_SC_BOOT_PART_WRITE_PROHIB          = 0x1e,
  788         NVME_SC_INVALID_CTRLR_ID                = 0x1f,
  789         NVME_SC_INVALID_SEC_CTRLR_STATE         = 0x20,
  790         NVME_SC_INVALID_NUM_OF_CTRLR_RESRC      = 0x21,
  791         NVME_SC_INVALID_RESOURCE_ID             = 0x22,
  792         NVME_SC_SANITIZE_PROHIBITED_WPMRE       = 0x23,
  793         NVME_SC_ANA_GROUP_ID_INVALID            = 0x24,
  794         NVME_SC_ANA_ATTACH_FAILED               = 0x25,
  795 
  796         NVME_SC_CONFLICTING_ATTRIBUTES          = 0x80,
  797         NVME_SC_INVALID_PROTECTION_INFO         = 0x81,
  798         NVME_SC_ATTEMPTED_WRITE_TO_RO_PAGE      = 0x82,
  799 };
  800 
  801 /* media error status codes */
  802 enum nvme_media_error_status_code {
  803         NVME_SC_WRITE_FAULTS                    = 0x80,
  804         NVME_SC_UNRECOVERED_READ_ERROR          = 0x81,
  805         NVME_SC_GUARD_CHECK_ERROR               = 0x82,
  806         NVME_SC_APPLICATION_TAG_CHECK_ERROR     = 0x83,
  807         NVME_SC_REFERENCE_TAG_CHECK_ERROR       = 0x84,
  808         NVME_SC_COMPARE_FAILURE                 = 0x85,
  809         NVME_SC_ACCESS_DENIED                   = 0x86,
  810         NVME_SC_DEALLOCATED_OR_UNWRITTEN        = 0x87,
  811 };
  812 
  813 /* path related status codes */
  814 enum nvme_path_related_status_code {
  815         NVME_SC_INTERNAL_PATH_ERROR             = 0x00,
  816         NVME_SC_ASYMMETRIC_ACCESS_PERSISTENT_LOSS = 0x01,
  817         NVME_SC_ASYMMETRIC_ACCESS_INACCESSIBLE  = 0x02,
  818         NVME_SC_ASYMMETRIC_ACCESS_TRANSITION    = 0x03,
  819         NVME_SC_CONTROLLER_PATHING_ERROR        = 0x60,
  820         NVME_SC_HOST_PATHING_ERROR              = 0x70,
  821         NVME_SC_COMMAND_ABOTHED_BY_HOST         = 0x71,
  822 };
  823 
  824 /* admin opcodes */
  825 enum nvme_admin_opcode {
  826         NVME_OPC_DELETE_IO_SQ                   = 0x00,
  827         NVME_OPC_CREATE_IO_SQ                   = 0x01,
  828         NVME_OPC_GET_LOG_PAGE                   = 0x02,
  829         /* 0x03 - reserved */
  830         NVME_OPC_DELETE_IO_CQ                   = 0x04,
  831         NVME_OPC_CREATE_IO_CQ                   = 0x05,
  832         NVME_OPC_IDENTIFY                       = 0x06,
  833         /* 0x07 - reserved */
  834         NVME_OPC_ABORT                          = 0x08,
  835         NVME_OPC_SET_FEATURES                   = 0x09,
  836         NVME_OPC_GET_FEATURES                   = 0x0a,
  837         /* 0x0b - reserved */
  838         NVME_OPC_ASYNC_EVENT_REQUEST            = 0x0c,
  839         NVME_OPC_NAMESPACE_MANAGEMENT           = 0x0d,
  840         /* 0x0e-0x0f - reserved */
  841         NVME_OPC_FIRMWARE_ACTIVATE              = 0x10,
  842         NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD        = 0x11,
  843         /* 0x12-0x13 - reserved */
  844         NVME_OPC_DEVICE_SELF_TEST               = 0x14,
  845         NVME_OPC_NAMESPACE_ATTACHMENT           = 0x15,
  846         /* 0x16-0x17 - reserved */
  847         NVME_OPC_KEEP_ALIVE                     = 0x18,
  848         NVME_OPC_DIRECTIVE_SEND                 = 0x19,
  849         NVME_OPC_DIRECTIVE_RECEIVE              = 0x1a,
  850         /* 0x1b - reserved */
  851         NVME_OPC_VIRTUALIZATION_MANAGEMENT      = 0x1c,
  852         NVME_OPC_NVME_MI_SEND                   = 0x1d,
  853         NVME_OPC_NVME_MI_RECEIVE                = 0x1e,
  854         /* 0x1f-0x7b - reserved */
  855         NVME_OPC_DOORBELL_BUFFER_CONFIG         = 0x7c,
  856 
  857         NVME_OPC_FORMAT_NVM                     = 0x80,
  858         NVME_OPC_SECURITY_SEND                  = 0x81,
  859         NVME_OPC_SECURITY_RECEIVE               = 0x82,
  860         /* 0x83 - reserved */
  861         NVME_OPC_SANITIZE                       = 0x84,
  862         /* 0x85 - reserved */
  863         NVME_OPC_GET_LBA_STATUS                 = 0x86,
  864 };
  865 
  866 /* nvme nvm opcodes */
  867 enum nvme_nvm_opcode {
  868         NVME_OPC_FLUSH                          = 0x00,
  869         NVME_OPC_WRITE                          = 0x01,
  870         NVME_OPC_READ                           = 0x02,
  871         /* 0x03 - reserved */
  872         NVME_OPC_WRITE_UNCORRECTABLE            = 0x04,
  873         NVME_OPC_COMPARE                        = 0x05,
  874         /* 0x06-0x07 - reserved */
  875         NVME_OPC_WRITE_ZEROES                   = 0x08,
  876         NVME_OPC_DATASET_MANAGEMENT             = 0x09,
  877         /* 0x0a-0x0b - reserved */
  878         NVME_OPC_VERIFY                         = 0x0c,
  879         NVME_OPC_RESERVATION_REGISTER           = 0x0d,
  880         NVME_OPC_RESERVATION_REPORT             = 0x0e,
  881         /* 0x0f-0x10 - reserved */
  882         NVME_OPC_RESERVATION_ACQUIRE            = 0x11,
  883         /* 0x12-0x14 - reserved */
  884         NVME_OPC_RESERVATION_RELEASE            = 0x15,
  885 };
  886 
  887 enum nvme_feature {
  888         /* 0x00 - reserved */
  889         NVME_FEAT_ARBITRATION                   = 0x01,
  890         NVME_FEAT_POWER_MANAGEMENT              = 0x02,
  891         NVME_FEAT_LBA_RANGE_TYPE                = 0x03,
  892         NVME_FEAT_TEMPERATURE_THRESHOLD         = 0x04,
  893         NVME_FEAT_ERROR_RECOVERY                = 0x05,
  894         NVME_FEAT_VOLATILE_WRITE_CACHE          = 0x06,
  895         NVME_FEAT_NUMBER_OF_QUEUES              = 0x07,
  896         NVME_FEAT_INTERRUPT_COALESCING          = 0x08,
  897         NVME_FEAT_INTERRUPT_VECTOR_CONFIGURATION = 0x09,
  898         NVME_FEAT_WRITE_ATOMICITY               = 0x0A,
  899         NVME_FEAT_ASYNC_EVENT_CONFIGURATION     = 0x0B,
  900         NVME_FEAT_AUTONOMOUS_POWER_STATE_TRANSITION = 0x0C,
  901         NVME_FEAT_HOST_MEMORY_BUFFER            = 0x0D,
  902         NVME_FEAT_TIMESTAMP                     = 0x0E,
  903         NVME_FEAT_KEEP_ALIVE_TIMER              = 0x0F,
  904         NVME_FEAT_HOST_CONTROLLED_THERMAL_MGMT  = 0x10,
  905         NVME_FEAT_NON_OP_POWER_STATE_CONFIG     = 0x11,
  906         NVME_FEAT_READ_RECOVERY_LEVEL_CONFIG    = 0x12,
  907         NVME_FEAT_PREDICTABLE_LATENCY_MODE_CONFIG = 0x13,
  908         NVME_FEAT_PREDICTABLE_LATENCY_MODE_WINDOW = 0x14,
  909         NVME_FEAT_LBA_STATUS_INFORMATION_ATTRIBUTES = 0x15,
  910         NVME_FEAT_HOST_BEHAVIOR_SUPPORT         = 0x16,
  911         NVME_FEAT_SANITIZE_CONFIG               = 0x17,
  912         NVME_FEAT_ENDURANCE_GROUP_EVENT_CONFIGURATION = 0x18,
  913         /* 0x19-0x77 - reserved */
  914         /* 0x78-0x7f - NVMe Management Interface */
  915         NVME_FEAT_SOFTWARE_PROGRESS_MARKER      = 0x80,
  916         NVME_FEAT_HOST_IDENTIFIER               = 0x81,
  917         NVME_FEAT_RESERVATION_NOTIFICATION_MASK = 0x82,
  918         NVME_FEAT_RESERVATION_PERSISTENCE       = 0x83,
  919         NVME_FEAT_NAMESPACE_WRITE_PROTECTION_CONFIG = 0x84,
  920         /* 0x85-0xBF - command set specific (reserved) */
  921         /* 0xC0-0xFF - vendor specific */
  922 };
  923 
  924 enum nvme_dsm_attribute {
  925         NVME_DSM_ATTR_INTEGRAL_READ             = 0x1,
  926         NVME_DSM_ATTR_INTEGRAL_WRITE            = 0x2,
  927         NVME_DSM_ATTR_DEALLOCATE                = 0x4,
  928 };
  929 
  930 enum nvme_activate_action {
  931         NVME_AA_REPLACE_NO_ACTIVATE             = 0x0,
  932         NVME_AA_REPLACE_ACTIVATE                = 0x1,
  933         NVME_AA_ACTIVATE                        = 0x2,
  934 };
  935 
  936 struct nvme_power_state {
  937         /** Maximum Power */
  938         uint16_t        mp;                     /* Maximum Power */
  939         uint8_t         ps_rsvd1;
  940         uint8_t         mps_nops;               /* Max Power Scale, Non-Operational State */
  941 
  942         uint32_t        enlat;                  /* Entry Latency */
  943         uint32_t        exlat;                  /* Exit Latency */
  944 
  945         uint8_t         rrt;                    /* Relative Read Throughput */
  946         uint8_t         rrl;                    /* Relative Read Latency */
  947         uint8_t         rwt;                    /* Relative Write Throughput */
  948         uint8_t         rwl;                    /* Relative Write Latency */
  949 
  950         uint16_t        idlp;                   /* Idle Power */
  951         uint8_t         ips;                    /* Idle Power Scale */
  952         uint8_t         ps_rsvd8;
  953 
  954         uint16_t        actp;                   /* Active Power */
  955         uint8_t         apw_aps;                /* Active Power Workload, Active Power Scale */
  956         uint8_t         ps_rsvd10[9];
  957 } __packed;
  958 
  959 _Static_assert(sizeof(struct nvme_power_state) == 32, "bad size for nvme_power_state");
  960 
  961 #define NVME_SERIAL_NUMBER_LENGTH       20
  962 #define NVME_MODEL_NUMBER_LENGTH        40
  963 #define NVME_FIRMWARE_REVISION_LENGTH   8
  964 
  965 struct nvme_controller_data {
  966         /* bytes 0-255: controller capabilities and features */
  967 
  968         /** pci vendor id */
  969         uint16_t                vid;
  970 
  971         /** pci subsystem vendor id */
  972         uint16_t                ssvid;
  973 
  974         /** serial number */
  975         uint8_t                 sn[NVME_SERIAL_NUMBER_LENGTH];
  976 
  977         /** model number */
  978         uint8_t                 mn[NVME_MODEL_NUMBER_LENGTH];
  979 
  980         /** firmware revision */
  981         uint8_t                 fr[NVME_FIRMWARE_REVISION_LENGTH];
  982 
  983         /** recommended arbitration burst */
  984         uint8_t                 rab;
  985 
  986         /** ieee oui identifier */
  987         uint8_t                 ieee[3];
  988 
  989         /** multi-interface capabilities */
  990         uint8_t                 mic;
  991 
  992         /** maximum data transfer size */
  993         uint8_t                 mdts;
  994 
  995         /** Controller ID */
  996         uint16_t                ctrlr_id;
  997 
  998         /** Version */
  999         uint32_t                ver;
 1000 
 1001         /** RTD3 Resume Latency */
 1002         uint32_t                rtd3r;
 1003 
 1004         /** RTD3 Enter Latency */
 1005         uint32_t                rtd3e;
 1006 
 1007         /** Optional Asynchronous Events Supported */
 1008         uint32_t                oaes;   /* bitfield really */
 1009 
 1010         /** Controller Attributes */
 1011         uint32_t                ctratt; /* bitfield really */
 1012 
 1013         /** Read Recovery Levels Supported */
 1014         uint16_t                rrls;
 1015 
 1016         uint8_t                 reserved1[9];
 1017 
 1018         /** Controller Type */
 1019         uint8_t                 cntrltype;
 1020 
 1021         /** FRU Globally Unique Identifier */
 1022         uint8_t                 fguid[16];
 1023 
 1024         /** Command Retry Delay Time 1 */
 1025         uint16_t                crdt1;
 1026 
 1027         /** Command Retry Delay Time 2 */
 1028         uint16_t                crdt2;
 1029 
 1030         /** Command Retry Delay Time 3 */
 1031         uint16_t                crdt3;
 1032 
 1033         uint8_t                 reserved2[122];
 1034 
 1035         /* bytes 256-511: admin command set attributes */
 1036 
 1037         /** optional admin command support */
 1038         uint16_t                oacs;
 1039 
 1040         /** abort command limit */
 1041         uint8_t                 acl;
 1042 
 1043         /** asynchronous event request limit */
 1044         uint8_t                 aerl;
 1045 
 1046         /** firmware updates */
 1047         uint8_t                 frmw;
 1048 
 1049         /** log page attributes */
 1050         uint8_t                 lpa;
 1051 
 1052         /** error log page entries */
 1053         uint8_t                 elpe;
 1054 
 1055         /** number of power states supported */
 1056         uint8_t                 npss;
 1057 
 1058         /** admin vendor specific command configuration */
 1059         uint8_t                 avscc;
 1060 
 1061         /** Autonomous Power State Transition Attributes */
 1062         uint8_t                 apsta;
 1063 
 1064         /** Warning Composite Temperature Threshold */
 1065         uint16_t                wctemp;
 1066 
 1067         /** Critical Composite Temperature Threshold */
 1068         uint16_t                cctemp;
 1069 
 1070         /** Maximum Time for Firmware Activation */
 1071         uint16_t                mtfa;
 1072 
 1073         /** Host Memory Buffer Preferred Size */
 1074         uint32_t                hmpre;
 1075 
 1076         /** Host Memory Buffer Minimum Size */
 1077         uint32_t                hmmin;
 1078 
 1079         /** Name space capabilities  */
 1080         struct {
 1081                 /* if nsmgmt, report tnvmcap and unvmcap */
 1082                 uint8_t    tnvmcap[16];
 1083                 uint8_t    unvmcap[16];
 1084         } __packed untncap;
 1085 
 1086         /** Replay Protected Memory Block Support */
 1087         uint32_t                rpmbs; /* Really a bitfield */
 1088 
 1089         /** Extended Device Self-test Time */
 1090         uint16_t                edstt;
 1091 
 1092         /** Device Self-test Options */
 1093         uint8_t                 dsto; /* Really a bitfield */
 1094 
 1095         /** Firmware Update Granularity */
 1096         uint8_t                 fwug;
 1097 
 1098         /** Keep Alive Support */
 1099         uint16_t                kas;
 1100 
 1101         /** Host Controlled Thermal Management Attributes */
 1102         uint16_t                hctma; /* Really a bitfield */
 1103 
 1104         /** Minimum Thermal Management Temperature */
 1105         uint16_t                mntmt;
 1106 
 1107         /** Maximum Thermal Management Temperature */
 1108         uint16_t                mxtmt;
 1109 
 1110         /** Sanitize Capabilities */
 1111         uint32_t                sanicap; /* Really a bitfield */
 1112 
 1113         /** Host Memory Buffer Minimum Descriptor Entry Size */
 1114         uint32_t                hmminds;
 1115 
 1116         /** Host Memory Maximum Descriptors Entries */
 1117         uint16_t                hmmaxd;
 1118 
 1119         /** NVM Set Identifier Maximum */
 1120         uint16_t                nsetidmax;
 1121 
 1122         /** Endurance Group Identifier Maximum */
 1123         uint16_t                endgidmax;
 1124 
 1125         /** ANA Transition Time */
 1126         uint8_t                 anatt;
 1127 
 1128         /** Asymmetric Namespace Access Capabilities */
 1129         uint8_t                 anacap;
 1130 
 1131         /** ANA Group Identifier Maximum */
 1132         uint32_t                anagrpmax;
 1133 
 1134         /** Number of ANA Group Identifiers */
 1135         uint32_t                nanagrpid;
 1136 
 1137         /** Persistent Event Log Size */
 1138         uint32_t                pels;
 1139 
 1140         uint8_t                 reserved3[156];
 1141         /* bytes 512-703: nvm command set attributes */
 1142 
 1143         /** submission queue entry size */
 1144         uint8_t                 sqes;
 1145 
 1146         /** completion queue entry size */
 1147         uint8_t                 cqes;
 1148 
 1149         /** Maximum Outstanding Commands */
 1150         uint16_t                maxcmd;
 1151 
 1152         /** number of namespaces */
 1153         uint32_t                nn;
 1154 
 1155         /** optional nvm command support */
 1156         uint16_t                oncs;
 1157 
 1158         /** fused operation support */
 1159         uint16_t                fuses;
 1160 
 1161         /** format nvm attributes */
 1162         uint8_t                 fna;
 1163 
 1164         /** volatile write cache */
 1165         uint8_t                 vwc;
 1166 
 1167         /** Atomic Write Unit Normal */
 1168         uint16_t                awun;
 1169 
 1170         /** Atomic Write Unit Power Fail */
 1171         uint16_t                awupf;
 1172 
 1173         /** NVM Vendor Specific Command Configuration */
 1174         uint8_t                 nvscc;
 1175 
 1176         /** Namespace Write Protection Capabilities */
 1177         uint8_t                 nwpc;
 1178 
 1179         /** Atomic Compare & Write Unit */
 1180         uint16_t                acwu;
 1181         uint16_t                reserved6;
 1182 
 1183         /** SGL Support */
 1184         uint32_t                sgls;
 1185 
 1186         /** Maximum Number of Allowed Namespaces */
 1187         uint32_t                mnan;
 1188 
 1189         /* bytes 540-767: Reserved */
 1190         uint8_t                 reserved7[224];
 1191 
 1192         /** NVM Subsystem NVMe Qualified Name */
 1193         uint8_t                 subnqn[256];
 1194 
 1195         /* bytes 1024-1791: Reserved */
 1196         uint8_t                 reserved8[768];
 1197 
 1198         /* bytes 1792-2047: NVMe over Fabrics specification */
 1199         uint8_t                 reserved9[256];
 1200 
 1201         /* bytes 2048-3071: power state descriptors */
 1202         struct nvme_power_state power_state[32];
 1203 
 1204         /* bytes 3072-4095: vendor specific */
 1205         uint8_t                 vs[1024];
 1206 } __packed __aligned(4);
 1207 
 1208 _Static_assert(sizeof(struct nvme_controller_data) == 4096, "bad size for nvme_controller_data");
 1209 
 1210 struct nvme_namespace_data {
 1211         /** namespace size */
 1212         uint64_t                nsze;
 1213 
 1214         /** namespace capacity */
 1215         uint64_t                ncap;
 1216 
 1217         /** namespace utilization */
 1218         uint64_t                nuse;
 1219 
 1220         /** namespace features */
 1221         uint8_t                 nsfeat;
 1222 
 1223         /** number of lba formats */
 1224         uint8_t                 nlbaf;
 1225 
 1226         /** formatted lba size */
 1227         uint8_t                 flbas;
 1228 
 1229         /** metadata capabilities */
 1230         uint8_t                 mc;
 1231 
 1232         /** end-to-end data protection capabilities */
 1233         uint8_t                 dpc;
 1234 
 1235         /** end-to-end data protection type settings */
 1236         uint8_t                 dps;
 1237 
 1238         /** Namespace Multi-path I/O and Namespace Sharing Capabilities */
 1239         uint8_t                 nmic;
 1240 
 1241         /** Reservation Capabilities */
 1242         uint8_t                 rescap;
 1243 
 1244         /** Format Progress Indicator */
 1245         uint8_t                 fpi;
 1246 
 1247         /** Deallocate Logical Block Features */
 1248         uint8_t                 dlfeat;
 1249 
 1250         /** Namespace Atomic Write Unit Normal  */
 1251         uint16_t                nawun;
 1252 
 1253         /** Namespace Atomic Write Unit Power Fail */
 1254         uint16_t                nawupf;
 1255 
 1256         /** Namespace Atomic Compare & Write Unit */
 1257         uint16_t                nacwu;
 1258 
 1259         /** Namespace Atomic Boundary Size Normal */
 1260         uint16_t                nabsn;
 1261 
 1262         /** Namespace Atomic Boundary Offset */
 1263         uint16_t                nabo;
 1264 
 1265         /** Namespace Atomic Boundary Size Power Fail */
 1266         uint16_t                nabspf;
 1267 
 1268         /** Namespace Optimal IO Boundary */
 1269         uint16_t                noiob;
 1270 
 1271         /** NVM Capacity */
 1272         uint8_t                 nvmcap[16];
 1273 
 1274         /** Namespace Preferred Write Granularity  */
 1275         uint16_t                npwg;
 1276 
 1277         /** Namespace Preferred Write Alignment */
 1278         uint16_t                npwa;
 1279 
 1280         /** Namespace Preferred Deallocate Granularity */
 1281         uint16_t                npdg;
 1282 
 1283         /** Namespace Preferred Deallocate Alignment */
 1284         uint16_t                npda;
 1285 
 1286         /** Namespace Optimal Write Size */
 1287         uint16_t                nows;
 1288 
 1289         /* bytes 74-91: Reserved */
 1290         uint8_t                 reserved5[18];
 1291 
 1292         /** ANA Group Identifier */
 1293         uint32_t                anagrpid;
 1294 
 1295         /* bytes 96-98: Reserved */
 1296         uint8_t                 reserved6[3];
 1297 
 1298         /** Namespace Attributes */
 1299         uint8_t                 nsattr;
 1300 
 1301         /** NVM Set Identifier */
 1302         uint16_t                nvmsetid;
 1303 
 1304         /** Endurance Group Identifier */
 1305         uint16_t                endgid;
 1306 
 1307         /** Namespace Globally Unique Identifier */
 1308         uint8_t                 nguid[16];
 1309 
 1310         /** IEEE Extended Unique Identifier */
 1311         uint8_t                 eui64[8];
 1312 
 1313         /** lba format support */
 1314         uint32_t                lbaf[16];
 1315 
 1316         uint8_t                 reserved7[192];
 1317 
 1318         uint8_t                 vendor_specific[3712];
 1319 } __packed __aligned(4);
 1320 
 1321 _Static_assert(sizeof(struct nvme_namespace_data) == 4096, "bad size for nvme_namepsace_data");
 1322 
 1323 enum nvme_log_page {
 1324         /* 0x00 - reserved */
 1325         NVME_LOG_ERROR                  = 0x01,
 1326         NVME_LOG_HEALTH_INFORMATION     = 0x02,
 1327         NVME_LOG_FIRMWARE_SLOT          = 0x03,
 1328         NVME_LOG_CHANGED_NAMESPACE      = 0x04,
 1329         NVME_LOG_COMMAND_EFFECT         = 0x05,
 1330         NVME_LOG_DEVICE_SELF_TEST       = 0x06,
 1331         NVME_LOG_TELEMETRY_HOST_INITIATED = 0x07,
 1332         NVME_LOG_TELEMETRY_CONTROLLER_INITIATED = 0x08,
 1333         NVME_LOG_ENDURANCE_GROUP_INFORMATION = 0x09,
 1334         NVME_LOG_PREDICTABLE_LATENCY_PER_NVM_SET = 0x0a,
 1335         NVME_LOG_PREDICTABLE_LATENCY_EVENT_AGGREGATE = 0x0b,
 1336         NVME_LOG_ASYMMETRIC_NAMESPACE_ACCESS = 0x0c,
 1337         NVME_LOG_PERSISTENT_EVENT_LOG   = 0x0d,
 1338         NVME_LOG_LBA_STATUS_INFORMATION = 0x0e,
 1339         NVME_LOG_ENDURANCE_GROUP_EVENT_AGGREGATE = 0x0f,
 1340         /* 0x06-0x7F - reserved */
 1341         /* 0x80-0xBF - I/O command set specific */
 1342         NVME_LOG_RES_NOTIFICATION       = 0x80,
 1343         NVME_LOG_SANITIZE_STATUS        = 0x81,
 1344         /* 0x82-0xBF - reserved */
 1345         /* 0xC0-0xFF - vendor specific */
 1346 
 1347         /*
 1348          * The following are Intel Specific log pages, but they seem
 1349          * to be widely implemented.
 1350          */
 1351         INTEL_LOG_READ_LAT_LOG          = 0xc1,
 1352         INTEL_LOG_WRITE_LAT_LOG         = 0xc2,
 1353         INTEL_LOG_TEMP_STATS            = 0xc5,
 1354         INTEL_LOG_ADD_SMART             = 0xca,
 1355         INTEL_LOG_DRIVE_MKT_NAME        = 0xdd,
 1356 
 1357         /*
 1358          * HGST log page, with lots ofs sub pages.
 1359          */
 1360         HGST_INFO_LOG                   = 0xc1,
 1361 };
 1362 
 1363 struct nvme_error_information_entry {
 1364         uint64_t                error_count;
 1365         uint16_t                sqid;
 1366         uint16_t                cid;
 1367         uint16_t                status;
 1368         uint16_t                error_location;
 1369         uint64_t                lba;
 1370         uint32_t                nsid;
 1371         uint8_t                 vendor_specific;
 1372         uint8_t                 trtype;
 1373         uint16_t                reserved30;
 1374         uint64_t                csi;
 1375         uint16_t                ttsi;
 1376         uint8_t                 reserved[22];
 1377 } __packed __aligned(4);
 1378 
 1379 _Static_assert(sizeof(struct nvme_error_information_entry) == 64, "bad size for nvme_error_information_entry");
 1380 
 1381 struct nvme_health_information_page {
 1382         uint8_t                 critical_warning;
 1383         uint16_t                temperature;
 1384         uint8_t                 available_spare;
 1385         uint8_t                 available_spare_threshold;
 1386         uint8_t                 percentage_used;
 1387 
 1388         uint8_t                 reserved[26];
 1389 
 1390         /*
 1391          * Note that the following are 128-bit values, but are
 1392          *  defined as an array of 2 64-bit values.
 1393          */
 1394         /* Data Units Read is always in 512-byte units. */
 1395         uint64_t                data_units_read[2];
 1396         /* Data Units Written is always in 512-byte units. */
 1397         uint64_t                data_units_written[2];
 1398         /* For NVM command set, this includes Compare commands. */
 1399         uint64_t                host_read_commands[2];
 1400         uint64_t                host_write_commands[2];
 1401         /* Controller Busy Time is reported in minutes. */
 1402         uint64_t                controller_busy_time[2];
 1403         uint64_t                power_cycles[2];
 1404         uint64_t                power_on_hours[2];
 1405         uint64_t                unsafe_shutdowns[2];
 1406         uint64_t                media_errors[2];
 1407         uint64_t                num_error_info_log_entries[2];
 1408         uint32_t                warning_temp_time;
 1409         uint32_t                error_temp_time;
 1410         uint16_t                temp_sensor[8];
 1411         /* Thermal Management Temperature 1 Transition Count */
 1412         uint32_t                tmt1tc;
 1413         /* Thermal Management Temperature 2 Transition Count */
 1414         uint32_t                tmt2tc;
 1415         /* Total Time For Thermal Management Temperature 1 */
 1416         uint32_t                ttftmt1;
 1417         /* Total Time For Thermal Management Temperature 2 */
 1418         uint32_t                ttftmt2;
 1419 
 1420         uint8_t                 reserved2[280];
 1421 } __packed __aligned(4);
 1422 
 1423 _Static_assert(sizeof(struct nvme_health_information_page) == 512, "bad size for nvme_health_information_page");
 1424 
 1425 struct nvme_firmware_page {
 1426         uint8_t                 afi;
 1427         uint8_t                 reserved[7];
 1428         uint64_t                revision[7]; /* revisions for 7 slots */
 1429         uint8_t                 reserved2[448];
 1430 } __packed __aligned(4);
 1431 
 1432 _Static_assert(sizeof(struct nvme_firmware_page) == 512, "bad size for nvme_firmware_page");
 1433 
 1434 struct nvme_ns_list {
 1435         uint32_t                ns[1024];
 1436 } __packed __aligned(4);
 1437 
 1438 _Static_assert(sizeof(struct nvme_ns_list) == 4096, "bad size for nvme_ns_list");
 1439 
 1440 struct nvme_command_effects_page {
 1441         uint32_t                acs[256];
 1442         uint32_t                iocs[256];
 1443         uint8_t                 reserved[2048];
 1444 } __packed __aligned(4);
 1445 
 1446 _Static_assert(sizeof(struct nvme_command_effects_page) == 4096,
 1447     "bad size for nvme_command_effects_page");
 1448 
 1449 struct nvme_device_self_test_page {
 1450         uint8_t                 curr_operation;
 1451         uint8_t                 curr_compl;
 1452         uint8_t                 rsvd2[2];
 1453         struct {
 1454                 uint8_t         status;
 1455                 uint8_t         segment_num;
 1456                 uint8_t         valid_diag_info;
 1457                 uint8_t         rsvd3;
 1458                 uint64_t        poh;
 1459                 uint32_t        nsid;
 1460                 /* Define as an array to simplify alignment issues */
 1461                 uint8_t         failing_lba[8];
 1462                 uint8_t         status_code_type;
 1463                 uint8_t         status_code;
 1464                 uint8_t         vendor_specific[2];
 1465         } __packed result[20];
 1466 } __packed __aligned(4);
 1467 
 1468 _Static_assert(sizeof(struct nvme_device_self_test_page) == 564,
 1469     "bad size for nvme_device_self_test_page");
 1470 
 1471 struct nvme_res_notification_page {
 1472         uint64_t                log_page_count;
 1473         uint8_t                 log_page_type;
 1474         uint8_t                 available_log_pages;
 1475         uint8_t                 reserved2;
 1476         uint32_t                nsid;
 1477         uint8_t                 reserved[48];
 1478 } __packed __aligned(4);
 1479 
 1480 _Static_assert(sizeof(struct nvme_res_notification_page) == 64,
 1481     "bad size for nvme_res_notification_page");
 1482 
 1483 struct nvme_sanitize_status_page {
 1484         uint16_t                sprog;
 1485         uint16_t                sstat;
 1486         uint32_t                scdw10;
 1487         uint32_t                etfo;
 1488         uint32_t                etfbe;
 1489         uint32_t                etfce;
 1490         uint32_t                etfownd;
 1491         uint32_t                etfbewnd;
 1492         uint32_t                etfcewnd;
 1493         uint8_t                 reserved[480];
 1494 } __packed __aligned(4);
 1495 
 1496 _Static_assert(sizeof(struct nvme_sanitize_status_page) == 512,
 1497     "bad size for nvme_sanitize_status_page");
 1498 
 1499 struct intel_log_temp_stats {
 1500         uint64_t        current;
 1501         uint64_t        overtemp_flag_last;
 1502         uint64_t        overtemp_flag_life;
 1503         uint64_t        max_temp;
 1504         uint64_t        min_temp;
 1505         uint64_t        _rsvd[5];
 1506         uint64_t        max_oper_temp;
 1507         uint64_t        min_oper_temp;
 1508         uint64_t        est_offset;
 1509 } __packed __aligned(4);
 1510 
 1511 _Static_assert(sizeof(struct intel_log_temp_stats) == 13 * 8, "bad size for intel_log_temp_stats");
 1512 
 1513 struct nvme_resv_reg_ctrlr {
 1514         uint16_t                ctrlr_id;       /* Controller ID */
 1515         uint8_t                 rcsts;          /* Reservation Status */
 1516         uint8_t                 reserved3[5];
 1517         uint64_t                hostid;         /* Host Identifier */
 1518         uint64_t                rkey;           /* Reservation Key */
 1519 } __packed __aligned(4);
 1520 
 1521 _Static_assert(sizeof(struct nvme_resv_reg_ctrlr) == 24, "bad size for nvme_resv_reg_ctrlr");
 1522 
 1523 struct nvme_resv_reg_ctrlr_ext {
 1524         uint16_t                ctrlr_id;       /* Controller ID */
 1525         uint8_t                 rcsts;          /* Reservation Status */
 1526         uint8_t                 reserved3[5];
 1527         uint64_t                rkey;           /* Reservation Key */
 1528         uint64_t                hostid[2];      /* Host Identifier */
 1529         uint8_t                 reserved32[32];
 1530 } __packed __aligned(4);
 1531 
 1532 _Static_assert(sizeof(struct nvme_resv_reg_ctrlr_ext) == 64, "bad size for nvme_resv_reg_ctrlr_ext");
 1533 
 1534 struct nvme_resv_status {
 1535         uint32_t                gen;            /* Generation */
 1536         uint8_t                 rtype;          /* Reservation Type */
 1537         uint8_t                 regctl[2];      /* Number of Registered Controllers */
 1538         uint8_t                 reserved7[2];
 1539         uint8_t                 ptpls;          /* Persist Through Power Loss State */
 1540         uint8_t                 reserved10[14];
 1541         struct nvme_resv_reg_ctrlr      ctrlr[0];
 1542 } __packed __aligned(4);
 1543 
 1544 _Static_assert(sizeof(struct nvme_resv_status) == 24, "bad size for nvme_resv_status");
 1545 
 1546 struct nvme_resv_status_ext {
 1547         uint32_t                gen;            /* Generation */
 1548         uint8_t                 rtype;          /* Reservation Type */
 1549         uint8_t                 regctl[2];      /* Number of Registered Controllers */
 1550         uint8_t                 reserved7[2];
 1551         uint8_t                 ptpls;          /* Persist Through Power Loss State */
 1552         uint8_t                 reserved10[14];
 1553         uint8_t                 reserved24[40];
 1554         struct nvme_resv_reg_ctrlr_ext  ctrlr[0];
 1555 } __packed __aligned(4);
 1556 
 1557 _Static_assert(sizeof(struct nvme_resv_status_ext) == 64, "bad size for nvme_resv_status_ext");
 1558 
 1559 #define NVME_TEST_MAX_THREADS   128
 1560 
 1561 struct nvme_io_test {
 1562         enum nvme_nvm_opcode    opc;
 1563         uint32_t                size;
 1564         uint32_t                time;   /* in seconds */
 1565         uint32_t                num_threads;
 1566         uint32_t                flags;
 1567         uint64_t                io_completed[NVME_TEST_MAX_THREADS];
 1568 };
 1569 
 1570 enum nvme_io_test_flags {
 1571         /*
 1572          * Specifies whether dev_refthread/dev_relthread should be
 1573          *  called during NVME_BIO_TEST.  Ignored for other test
 1574          *  types.
 1575          */
 1576         NVME_TEST_FLAG_REFTHREAD =      0x1,
 1577 };
 1578 
 1579 struct nvme_pt_command {
 1580         /*
 1581          * cmd is used to specify a passthrough command to a controller or
 1582          *  namespace.
 1583          *
 1584          * The following fields from cmd may be specified by the caller:
 1585          *      * opc  (opcode)
 1586          *      * nsid (namespace id) - for admin commands only
 1587          *      * cdw10-cdw15
 1588          *
 1589          * Remaining fields must be set to 0 by the caller.
 1590          */
 1591         struct nvme_command     cmd;
 1592 
 1593         /*
 1594          * cpl returns completion status for the passthrough command
 1595          *  specified by cmd.
 1596          *
 1597          * The following fields will be filled out by the driver, for
 1598          *  consumption by the caller:
 1599          *      * cdw0
 1600          *      * status (except for phase)
 1601          *
 1602          * Remaining fields will be set to 0 by the driver.
 1603          */
 1604         struct nvme_completion  cpl;
 1605 
 1606         /* buf is the data buffer associated with this passthrough command. */
 1607         void *                  buf;
 1608 
 1609         /*
 1610          * len is the length of the data buffer associated with this
 1611          *  passthrough command.
 1612          */
 1613         uint32_t                len;
 1614 
 1615         /*
 1616          * is_read = 1 if the passthrough command will read data into the
 1617          *  supplied buffer from the controller.
 1618          *
 1619          * is_read = 0 if the passthrough command will write data from the
 1620          *  supplied buffer to the controller.
 1621          */
 1622         uint32_t                is_read;
 1623 
 1624         /*
 1625          * driver_lock is used by the driver only.  It must be set to 0
 1626          *  by the caller.
 1627          */
 1628         struct mtx *            driver_lock;
 1629 };
 1630 
 1631 struct nvme_get_nsid {
 1632         char            cdev[SPECNAMELEN + 1];
 1633         uint32_t        nsid;
 1634 };
 1635 
 1636 struct nvme_hmb_desc {
 1637         uint64_t        addr;
 1638         uint32_t        size;
 1639         uint32_t        reserved;
 1640 };
 1641 
 1642 #define nvme_completion_is_error(cpl)                                   \
 1643         (NVME_STATUS_GET_SC((cpl)->status) != 0 || NVME_STATUS_GET_SCT((cpl)->status) != 0)
 1644 
 1645 void    nvme_strvis(uint8_t *dst, const uint8_t *src, int dstlen, int srclen);
 1646 
 1647 #ifdef _KERNEL
 1648 
 1649 struct bio;
 1650 struct thread;
 1651 
 1652 struct nvme_namespace;
 1653 struct nvme_controller;
 1654 struct nvme_consumer;
 1655 
 1656 typedef void (*nvme_cb_fn_t)(void *, const struct nvme_completion *);
 1657 
 1658 typedef void *(*nvme_cons_ns_fn_t)(struct nvme_namespace *, void *);
 1659 typedef void *(*nvme_cons_ctrlr_fn_t)(struct nvme_controller *);
 1660 typedef void (*nvme_cons_async_fn_t)(void *, const struct nvme_completion *,
 1661                                      uint32_t, void *, uint32_t);
 1662 typedef void (*nvme_cons_fail_fn_t)(void *);
 1663 
 1664 enum nvme_namespace_flags {
 1665         NVME_NS_DEALLOCATE_SUPPORTED    = 0x1,
 1666         NVME_NS_FLUSH_SUPPORTED         = 0x2,
 1667 };
 1668 
 1669 int     nvme_ctrlr_passthrough_cmd(struct nvme_controller *ctrlr,
 1670                                    struct nvme_pt_command *pt,
 1671                                    uint32_t nsid, int is_user_buffer,
 1672                                    int is_admin_cmd);
 1673 
 1674 /* Admin functions */
 1675 void    nvme_ctrlr_cmd_set_feature(struct nvme_controller *ctrlr,
 1676                                    uint8_t feature, uint32_t cdw11,
 1677                                    uint32_t cdw12, uint32_t cdw13,
 1678                                    uint32_t cdw14, uint32_t cdw15,
 1679                                    void *payload, uint32_t payload_size,
 1680                                    nvme_cb_fn_t cb_fn, void *cb_arg);
 1681 void    nvme_ctrlr_cmd_get_feature(struct nvme_controller *ctrlr,
 1682                                    uint8_t feature, uint32_t cdw11,
 1683                                    void *payload, uint32_t payload_size,
 1684                                    nvme_cb_fn_t cb_fn, void *cb_arg);
 1685 void    nvme_ctrlr_cmd_get_log_page(struct nvme_controller *ctrlr,
 1686                                     uint8_t log_page, uint32_t nsid,
 1687                                     void *payload, uint32_t payload_size,
 1688                                     nvme_cb_fn_t cb_fn, void *cb_arg);
 1689 
 1690 /* NVM I/O functions */
 1691 int     nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload,
 1692                           uint64_t lba, uint32_t lba_count, nvme_cb_fn_t cb_fn,
 1693                           void *cb_arg);
 1694 int     nvme_ns_cmd_write_bio(struct nvme_namespace *ns, struct bio *bp,
 1695                               nvme_cb_fn_t cb_fn, void *cb_arg);
 1696 int     nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload,
 1697                          uint64_t lba, uint32_t lba_count, nvme_cb_fn_t cb_fn,
 1698                          void *cb_arg);
 1699 int     nvme_ns_cmd_read_bio(struct nvme_namespace *ns, struct bio *bp,
 1700                               nvme_cb_fn_t cb_fn, void *cb_arg);
 1701 int     nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
 1702                                uint8_t num_ranges, nvme_cb_fn_t cb_fn,
 1703                                void *cb_arg);
 1704 int     nvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn,
 1705                           void *cb_arg);
 1706 int     nvme_ns_dump(struct nvme_namespace *ns, void *virt, off_t offset,
 1707                      size_t len);
 1708 
 1709 /* Registration functions */
 1710 struct nvme_consumer *  nvme_register_consumer(nvme_cons_ns_fn_t    ns_fn,
 1711                                                nvme_cons_ctrlr_fn_t ctrlr_fn,
 1712                                                nvme_cons_async_fn_t async_fn,
 1713                                                nvme_cons_fail_fn_t  fail_fn);
 1714 void            nvme_unregister_consumer(struct nvme_consumer *consumer);
 1715 
 1716 /* Controller helper functions */
 1717 device_t        nvme_ctrlr_get_device(struct nvme_controller *ctrlr);
 1718 const struct nvme_controller_data *
 1719                 nvme_ctrlr_get_data(struct nvme_controller *ctrlr);
 1720 static inline bool
 1721 nvme_ctrlr_has_dataset_mgmt(const struct nvme_controller_data *cd)
 1722 {
 1723         /* Assumes cd was byte swapped by nvme_controller_data_swapbytes() */
 1724         return ((cd->oncs >> NVME_CTRLR_DATA_ONCS_DSM_SHIFT) &
 1725                 NVME_CTRLR_DATA_ONCS_DSM_MASK);
 1726 }
 1727 
 1728 /* Namespace helper functions */
 1729 uint32_t        nvme_ns_get_max_io_xfer_size(struct nvme_namespace *ns);
 1730 uint32_t        nvme_ns_get_sector_size(struct nvme_namespace *ns);
 1731 uint64_t        nvme_ns_get_num_sectors(struct nvme_namespace *ns);
 1732 uint64_t        nvme_ns_get_size(struct nvme_namespace *ns);
 1733 uint32_t        nvme_ns_get_flags(struct nvme_namespace *ns);
 1734 const char *    nvme_ns_get_serial_number(struct nvme_namespace *ns);
 1735 const char *    nvme_ns_get_model_number(struct nvme_namespace *ns);
 1736 const struct nvme_namespace_data *
 1737                 nvme_ns_get_data(struct nvme_namespace *ns);
 1738 uint32_t        nvme_ns_get_stripesize(struct nvme_namespace *ns);
 1739 
 1740 int     nvme_ns_bio_process(struct nvme_namespace *ns, struct bio *bp,
 1741                             nvme_cb_fn_t cb_fn);
 1742 int     nvme_ns_ioctl_process(struct nvme_namespace *ns, u_long cmd,
 1743     caddr_t arg, int flag, struct thread *td);
 1744 
 1745 /*
 1746  * Command building helper functions -- shared with CAM
 1747  * These functions assume allocator zeros out cmd structure
 1748  * CAM's xpt_get_ccb and the request allocator for nvme both
 1749  * do zero'd allocations.
 1750  */
 1751 static inline
 1752 void    nvme_ns_flush_cmd(struct nvme_command *cmd, uint32_t nsid)
 1753 {
 1754 
 1755         cmd->opc = NVME_OPC_FLUSH;
 1756         cmd->nsid = htole32(nsid);
 1757 }
 1758 
 1759 static inline
 1760 void    nvme_ns_rw_cmd(struct nvme_command *cmd, uint32_t rwcmd, uint32_t nsid,
 1761     uint64_t lba, uint32_t count)
 1762 {
 1763         cmd->opc = rwcmd;
 1764         cmd->nsid = htole32(nsid);
 1765         cmd->cdw10 = htole32(lba & 0xffffffffu);
 1766         cmd->cdw11 = htole32(lba >> 32);
 1767         cmd->cdw12 = htole32(count-1);
 1768 }
 1769 
 1770 static inline
 1771 void    nvme_ns_write_cmd(struct nvme_command *cmd, uint32_t nsid,
 1772     uint64_t lba, uint32_t count)
 1773 {
 1774         nvme_ns_rw_cmd(cmd, NVME_OPC_WRITE, nsid, lba, count);
 1775 }
 1776 
 1777 static inline
 1778 void    nvme_ns_read_cmd(struct nvme_command *cmd, uint32_t nsid,
 1779     uint64_t lba, uint32_t count)
 1780 {
 1781         nvme_ns_rw_cmd(cmd, NVME_OPC_READ, nsid, lba, count);
 1782 }
 1783 
 1784 static inline
 1785 void    nvme_ns_trim_cmd(struct nvme_command *cmd, uint32_t nsid,
 1786     uint32_t num_ranges)
 1787 {
 1788         cmd->opc = NVME_OPC_DATASET_MANAGEMENT;
 1789         cmd->nsid = htole32(nsid);
 1790         cmd->cdw10 = htole32(num_ranges - 1);
 1791         cmd->cdw11 = htole32(NVME_DSM_ATTR_DEALLOCATE);
 1792 }
 1793 
 1794 extern int nvme_use_nvd;
 1795 
 1796 #endif /* _KERNEL */
 1797 
 1798 /* Endianess conversion functions for NVMe structs */
 1799 static inline
 1800 void    nvme_completion_swapbytes(struct nvme_completion *s __unused)
 1801 {
 1802 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1803 
 1804         s->cdw0 = le32toh(s->cdw0);
 1805         /* omit rsvd1 */
 1806         s->sqhd = le16toh(s->sqhd);
 1807         s->sqid = le16toh(s->sqid);
 1808         /* omit cid */
 1809         s->status = le16toh(s->status);
 1810 #endif
 1811 }
 1812 
 1813 static inline
 1814 void    nvme_power_state_swapbytes(struct nvme_power_state *s __unused)
 1815 {
 1816 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1817 
 1818         s->mp = le16toh(s->mp);
 1819         s->enlat = le32toh(s->enlat);
 1820         s->exlat = le32toh(s->exlat);
 1821         s->idlp = le16toh(s->idlp);
 1822         s->actp = le16toh(s->actp);
 1823 #endif
 1824 }
 1825 
 1826 static inline
 1827 void    nvme_controller_data_swapbytes(struct nvme_controller_data *s __unused)
 1828 {
 1829 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1830         int i;
 1831 
 1832         s->vid = le16toh(s->vid);
 1833         s->ssvid = le16toh(s->ssvid);
 1834         s->ctrlr_id = le16toh(s->ctrlr_id);
 1835         s->ver = le32toh(s->ver);
 1836         s->rtd3r = le32toh(s->rtd3r);
 1837         s->rtd3e = le32toh(s->rtd3e);
 1838         s->oaes = le32toh(s->oaes);
 1839         s->ctratt = le32toh(s->ctratt);
 1840         s->rrls = le16toh(s->rrls);
 1841         s->crdt1 = le16toh(s->crdt1);
 1842         s->crdt2 = le16toh(s->crdt2);
 1843         s->crdt3 = le16toh(s->crdt3);
 1844         s->oacs = le16toh(s->oacs);
 1845         s->wctemp = le16toh(s->wctemp);
 1846         s->cctemp = le16toh(s->cctemp);
 1847         s->mtfa = le16toh(s->mtfa);
 1848         s->hmpre = le32toh(s->hmpre);
 1849         s->hmmin = le32toh(s->hmmin);
 1850         s->rpmbs = le32toh(s->rpmbs);
 1851         s->edstt = le16toh(s->edstt);
 1852         s->kas = le16toh(s->kas);
 1853         s->hctma = le16toh(s->hctma);
 1854         s->mntmt = le16toh(s->mntmt);
 1855         s->mxtmt = le16toh(s->mxtmt);
 1856         s->sanicap = le32toh(s->sanicap);
 1857         s->hmminds = le32toh(s->hmminds);
 1858         s->hmmaxd = le16toh(s->hmmaxd);
 1859         s->nsetidmax = le16toh(s->nsetidmax);
 1860         s->endgidmax = le16toh(s->endgidmax);
 1861         s->anagrpmax = le32toh(s->anagrpmax);
 1862         s->nanagrpid = le32toh(s->nanagrpid);
 1863         s->pels = le32toh(s->pels);
 1864         s->maxcmd = le16toh(s->maxcmd);
 1865         s->nn = le32toh(s->nn);
 1866         s->oncs = le16toh(s->oncs);
 1867         s->fuses = le16toh(s->fuses);
 1868         s->awun = le16toh(s->awun);
 1869         s->awupf = le16toh(s->awupf);
 1870         s->acwu = le16toh(s->acwu);
 1871         s->sgls = le32toh(s->sgls);
 1872         s->mnan = le32toh(s->mnan);
 1873         for (i = 0; i < 32; i++)
 1874                 nvme_power_state_swapbytes(&s->power_state[i]);
 1875 #endif
 1876 }
 1877 
 1878 static inline
 1879 void    nvme_namespace_data_swapbytes(struct nvme_namespace_data *s __unused)
 1880 {
 1881 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1882         int i;
 1883 
 1884         s->nsze = le64toh(s->nsze);
 1885         s->ncap = le64toh(s->ncap);
 1886         s->nuse = le64toh(s->nuse);
 1887         s->nawun = le16toh(s->nawun);
 1888         s->nawupf = le16toh(s->nawupf);
 1889         s->nacwu = le16toh(s->nacwu);
 1890         s->nabsn = le16toh(s->nabsn);
 1891         s->nabo = le16toh(s->nabo);
 1892         s->nabspf = le16toh(s->nabspf);
 1893         s->noiob = le16toh(s->noiob);
 1894         s->npwg = le16toh(s->npwg);
 1895         s->npwa = le16toh(s->npwa);
 1896         s->npdg = le16toh(s->npdg);
 1897         s->npda = le16toh(s->npda);
 1898         s->nows = le16toh(s->nows);
 1899         s->anagrpid = le32toh(s->anagrpid);
 1900         s->nvmsetid = le16toh(s->nvmsetid);
 1901         s->endgid = le16toh(s->endgid);
 1902         for (i = 0; i < 16; i++)
 1903                 s->lbaf[i] = le32toh(s->lbaf[i]);
 1904 #endif
 1905 }
 1906 
 1907 static inline
 1908 void    nvme_error_information_entry_swapbytes(
 1909     struct nvme_error_information_entry *s __unused)
 1910 {
 1911 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1912 
 1913         s->error_count = le64toh(s->error_count);
 1914         s->sqid = le16toh(s->sqid);
 1915         s->cid = le16toh(s->cid);
 1916         s->status = le16toh(s->status);
 1917         s->error_location = le16toh(s->error_location);
 1918         s->lba = le64toh(s->lba);
 1919         s->nsid = le32toh(s->nsid);
 1920         s->csi = le64toh(s->csi);
 1921         s->ttsi = le16toh(s->ttsi);
 1922 #endif
 1923 }
 1924 
 1925 static inline
 1926 void    nvme_le128toh(void *p __unused)
 1927 {
 1928 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1929         /* Swap 16 bytes in place */
 1930         char *tmp = (char*)p;
 1931         char b;
 1932         int i;
 1933         for (i = 0; i < 8; i++) {
 1934                 b = tmp[i];
 1935                 tmp[i] = tmp[15-i];
 1936                 tmp[15-i] = b;
 1937         }
 1938 #endif
 1939 }
 1940 
 1941 static inline
 1942 void    nvme_health_information_page_swapbytes(
 1943     struct nvme_health_information_page *s __unused)
 1944 {
 1945 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1946         int i;
 1947 
 1948         s->temperature = le16toh(s->temperature);
 1949         nvme_le128toh((void *)s->data_units_read);
 1950         nvme_le128toh((void *)s->data_units_written);
 1951         nvme_le128toh((void *)s->host_read_commands);
 1952         nvme_le128toh((void *)s->host_write_commands);
 1953         nvme_le128toh((void *)s->controller_busy_time);
 1954         nvme_le128toh((void *)s->power_cycles);
 1955         nvme_le128toh((void *)s->power_on_hours);
 1956         nvme_le128toh((void *)s->unsafe_shutdowns);
 1957         nvme_le128toh((void *)s->media_errors);
 1958         nvme_le128toh((void *)s->num_error_info_log_entries);
 1959         s->warning_temp_time = le32toh(s->warning_temp_time);
 1960         s->error_temp_time = le32toh(s->error_temp_time);
 1961         for (i = 0; i < 8; i++)
 1962                 s->temp_sensor[i] = le16toh(s->temp_sensor[i]);
 1963         s->tmt1tc = le32toh(s->tmt1tc);
 1964         s->tmt2tc = le32toh(s->tmt2tc);
 1965         s->ttftmt1 = le32toh(s->ttftmt1);
 1966         s->ttftmt2 = le32toh(s->ttftmt2);
 1967 #endif
 1968 }
 1969 
 1970 static inline
 1971 void    nvme_firmware_page_swapbytes(struct nvme_firmware_page *s __unused)
 1972 {
 1973 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1974         int i;
 1975 
 1976         for (i = 0; i < 7; i++)
 1977                 s->revision[i] = le64toh(s->revision[i]);
 1978 #endif
 1979 }
 1980 
 1981 static inline
 1982 void    nvme_ns_list_swapbytes(struct nvme_ns_list *s __unused)
 1983 {
 1984 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1985         int i;
 1986 
 1987         for (i = 0; i < 1024; i++)
 1988                 s->ns[i] = le32toh(s->ns[i]);
 1989 #endif
 1990 }
 1991 
 1992 static inline
 1993 void    nvme_command_effects_page_swapbytes(
 1994     struct nvme_command_effects_page *s __unused)
 1995 {
 1996 #if _BYTE_ORDER != _LITTLE_ENDIAN
 1997         int i;
 1998 
 1999         for (i = 0; i < 256; i++)
 2000                 s->acs[i] = le32toh(s->acs[i]);
 2001         for (i = 0; i < 256; i++)
 2002                 s->iocs[i] = le32toh(s->iocs[i]);
 2003 #endif
 2004 }
 2005 
 2006 static inline
 2007 void    nvme_res_notification_page_swapbytes(
 2008     struct nvme_res_notification_page *s __unused)
 2009 {
 2010 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2011         s->log_page_count = le64toh(s->log_page_count);
 2012         s->nsid = le32toh(s->nsid);
 2013 #endif
 2014 }
 2015 
 2016 static inline
 2017 void    nvme_sanitize_status_page_swapbytes(
 2018     struct nvme_sanitize_status_page *s __unused)
 2019 {
 2020 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2021         s->sprog = le16toh(s->sprog);
 2022         s->sstat = le16toh(s->sstat);
 2023         s->scdw10 = le32toh(s->scdw10);
 2024         s->etfo = le32toh(s->etfo);
 2025         s->etfbe = le32toh(s->etfbe);
 2026         s->etfce = le32toh(s->etfce);
 2027         s->etfownd = le32toh(s->etfownd);
 2028         s->etfbewnd = le32toh(s->etfbewnd);
 2029         s->etfcewnd = le32toh(s->etfcewnd);
 2030 #endif
 2031 }
 2032 
 2033 static inline
 2034 void    intel_log_temp_stats_swapbytes(struct intel_log_temp_stats *s __unused)
 2035 {
 2036 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2037 
 2038         s->current = le64toh(s->current);
 2039         s->overtemp_flag_last = le64toh(s->overtemp_flag_last);
 2040         s->overtemp_flag_life = le64toh(s->overtemp_flag_life);
 2041         s->max_temp = le64toh(s->max_temp);
 2042         s->min_temp = le64toh(s->min_temp);
 2043         /* omit _rsvd[] */
 2044         s->max_oper_temp = le64toh(s->max_oper_temp);
 2045         s->min_oper_temp = le64toh(s->min_oper_temp);
 2046         s->est_offset = le64toh(s->est_offset);
 2047 #endif
 2048 }
 2049 
 2050 static inline
 2051 void    nvme_resv_status_swapbytes(struct nvme_resv_status *s __unused,
 2052     size_t size __unused)
 2053 {
 2054 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2055         size_t i, n;
 2056 
 2057         s->gen = le32toh(s->gen);
 2058         n = (s->regctl[1] << 8) | s->regctl[0];
 2059         n = MIN(n, (size - sizeof(s)) / sizeof(s->ctrlr[0]));
 2060         for (i = 0; i < n; i++) {
 2061                 s->ctrlr[i].ctrlr_id = le16toh(s->ctrlr[i].ctrlr_id);
 2062                 s->ctrlr[i].hostid = le64toh(s->ctrlr[i].hostid);
 2063                 s->ctrlr[i].rkey = le64toh(s->ctrlr[i].rkey);
 2064         }
 2065 #endif
 2066 }
 2067 
 2068 static inline
 2069 void    nvme_resv_status_ext_swapbytes(struct nvme_resv_status_ext *s __unused,
 2070     size_t size __unused)
 2071 {
 2072 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2073         size_t i, n;
 2074 
 2075         s->gen = le32toh(s->gen);
 2076         n = (s->regctl[1] << 8) | s->regctl[0];
 2077         n = MIN(n, (size - sizeof(s)) / sizeof(s->ctrlr[0]));
 2078         for (i = 0; i < n; i++) {
 2079                 s->ctrlr[i].ctrlr_id = le16toh(s->ctrlr[i].ctrlr_id);
 2080                 s->ctrlr[i].rkey = le64toh(s->ctrlr[i].rkey);
 2081                 nvme_le128toh((void *)s->ctrlr[i].hostid);
 2082         }
 2083 #endif
 2084 }
 2085 
 2086 static inline void
 2087 nvme_device_self_test_swapbytes(struct nvme_device_self_test_page *s __unused)
 2088 {
 2089 #if _BYTE_ORDER != _LITTLE_ENDIAN
 2090         uint8_t *tmp;
 2091         uint32_t r, i;
 2092         uint8_t b;
 2093 
 2094         for (r = 0; r < 20; r++) {
 2095                 s->result[r].poh = le64toh(s->result[r].poh);
 2096                 s->result[r].nsid = le32toh(s->result[r].nsid);
 2097                 /* Unaligned 64-bit loads fail on some architectures */
 2098                 tmp = s->result[r].failing_lba;
 2099                 for (i = 0; i < 4; i++) {
 2100                         b = tmp[i];
 2101                         tmp[i] = tmp[7-i];
 2102                         tmp[7-i] = b;
 2103                 }
 2104         }
 2105 #endif
 2106 }
 2107 #endif /* __NVME_H__ */

Cache object: 6c3e890581e1250b2c3e5b1c0c753ad0


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.