1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2016 Nexenta Systems, Inc. 14 * Copyright 2020 Joyent, Inc. 15 * Copyright 2019 Western Digital Corporation 16 * Copyright 2025 Oxide Computer Company 17 * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. 18 */ 19 20 #ifndef _SYS_NVME_H 21 #define _SYS_NVME_H 22 23 #include <sys/types.h> 24 #include <sys/debug.h> 25 #include <sys/stddef.h> 26 27 #ifdef _KERNEL 28 #include <sys/types32.h> 29 #else 30 #include <sys/uuid.h> 31 #include <stdint.h> 32 #endif 33 34 /* 35 * Declarations used for communication between nvme(4D) and libnvme. 36 */ 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 /* 43 * NVMe ioctl definitions 44 */ 45 46 #define NVME_IOC (('N' << 24) | ('V' << 16) | ('M' << 8)) 47 #define NVME_IOC_CTRL_INFO (NVME_IOC | 0) 48 #define NVME_IOC_IDENTIFY (NVME_IOC | 1) 49 #define NVME_IOC_GET_LOGPAGE (NVME_IOC | 2) 50 #define NVME_IOC_GET_FEATURE (NVME_IOC | 3) 51 #define NVME_IOC_FORMAT (NVME_IOC | 4) 52 #define NVME_IOC_BD_DETACH (NVME_IOC | 5) 53 #define NVME_IOC_BD_ATTACH (NVME_IOC | 6) 54 #define NVME_IOC_FIRMWARE_DOWNLOAD (NVME_IOC | 7) 55 #define NVME_IOC_FIRMWARE_COMMIT (NVME_IOC | 8) 56 #define NVME_IOC_PASSTHRU (NVME_IOC | 9) 57 #define NVME_IOC_NS_INFO (NVME_IOC | 10) 58 #define NVME_IOC_LOCK (NVME_IOC | 11) 59 #define NVME_IOC_UNLOCK (NVME_IOC | 12) 60 #define NVME_IOC_CTRL_ATTACH (NVME_IOC | 13) 61 #define NVME_IOC_CTRL_DETACH (NVME_IOC | 14) 62 #define NVME_IOC_NS_CREATE (NVME_IOC | 15) 63 #define NVME_IOC_NS_DELETE (NVME_IOC | 16) 64 #define NVME_IOC_MAX NVME_IOC_NS_DELETE 65 66 #define IS_NVME_IOC(x) ((x) > NVME_IOC && (x) <= NVME_IOC_MAX) 67 #define NVME_IOC_CMD(x) ((x) & 0xff) 68 69 /* 70 * This represents the set of all possible errors that can be returned from an 71 * ioctl. Our general rule of thumb is that we only will use an errno value to 72 * indicate that certain processing failed: a lack of privileges, bad minor, or 73 * failure to copy in and out the initial ioctl structure. However, if we get 74 * far enough that there is any other failure (including a failure to copy in 75 * and out nested data such as the identify command payload) then we will issue 76 * an error here. Put differently, our basic promise is that there should be a 77 * single straightforward meaning for any errno returned and instead all the 78 * nuance is here. Our goal is that no one should guess what of two dozen things 79 * an EINVAL might have referred to. 80 * 81 * When we are dealing with field parameters, there are three general classes of 82 * errors that we define that are common across all request structures: 83 * 84 * <REQ>_<FIELD>_RANGE RANGE class errors indicate that the value 85 * passed in is outside the range that the device 86 * supports. The range may vary based on the 87 * specification. This is used both for issues like 88 * bad alignment in a value (e.g. not 4-byte 89 * aligned) or a value that is larger than the 90 * maximum possible size. Because the namespace ID 91 * is shared in every request in the controller and 92 * is part of our standard ioctl handling, we use a 93 * single set of errors for that. 94 * 95 * <REQ>_<FIELD>_UNSUP This indicates that the controller cannot 96 * support any value in the given field. This is 97 * either because the field was introduced in an 98 * NVMe specification later than the controller 99 * supports or because there is an explicit feature 100 * bit that indicates whether or not this field is 101 * valid. Entries here may or may not have a 102 * namespace unsupported entry due to the fact that 103 * this is command specific. 104 * 105 * <REQ>_<FIELD>_UNUSE This class is perhaps the weirdest. This 106 * represents a case where a given field cannot be 107 * set because it is not used based on the 108 * specifics of the request. For example, if you're 109 * getting the health log page, you may not set the 110 * LSP or LSI for that log page, even if you have 111 * an NVMe 1.4 controller that supports both fields 112 * because they have no meaning. A similar example 113 * would be setting a controller ID when it has no 114 * meaning in a particular identify request. 115 * 116 * While every field will have a RANGE class error, some fields will not have an 117 * UNSUP or UNUSE class error depending on the specifics. A field that has 118 * always been present since NVMe 1.0 and is always valid, such as say the log 119 * page ID field for a get log page request or the length of a firmware download 120 * request, currently are always valid. It is possible that future revisions to 121 * the specification or our logic may change this. 122 */ 123 typedef enum { 124 /* 125 * Indicates that the command actually completed successfully. 126 */ 127 NVME_IOCTL_E_OK = 0, 128 /* 129 * Indicates that the controller failed the command and the controller 130 * specific (SC/SCT) are available. For all other errors, those fields 131 * are reserved. 132 */ 133 NVME_IOCTL_E_CTRL_ERROR, 134 /* 135 * Indicates that the controller is considered "dead" by the system and 136 * therefore is unusable. Separately, the controller may have been 137 * removed from the system due to hotplug or related. In that case, the 138 * gone variant is used to distinguish this. 139 */ 140 NVME_IOCTL_E_CTRL_DEAD, 141 NVME_IOCTL_E_CTRL_GONE, 142 /* 143 * Indicates that a bad namespace was requested. This would generally 144 * happen when referring to a namespace that is outside of controller's 145 * range. 146 */ 147 NVME_IOCTL_E_NS_RANGE, 148 /* 149 * Indicates that a namespace is not usable in this context. 150 */ 151 NVME_IOCTL_E_NS_UNUSE, 152 /* 153 * Indicates that the requested namespace could not be used because we 154 * are operating on a namespace minor and asked to operate on a 155 * different namespace. 156 */ 157 NVME_IOCTL_E_MINOR_WRONG_NS, 158 /* 159 * Indicates that the requested ioctl can only operate on the controller 160 * minor and we were on a namespace minor. This is not used for when a 161 * namespace is incorrectly requested otherwise. 162 */ 163 NVME_IOCTL_E_NOT_CTRL, 164 /* 165 * Indicates that we were asked to operate on the broadcast namespace 166 * either because it was specified or that was how the request was 167 * transformed and the broadcast namespace is not supported for this 168 * operation. 169 */ 170 NVME_IOCTL_E_NO_BCAST_NS, 171 /* 172 * Indicates that the operation failed because the operation requires a 173 * controller or namespace write lock and the caller did not have it. 174 */ 175 NVME_IOCTL_E_NEED_CTRL_WRLOCK, 176 NVME_IOCTL_E_NEED_NS_WRLOCK, 177 /* 178 * Indicates that the operation could not proceed because someone else 179 * has exclusive access currently to the controller or namespace and 180 * therefore this request (which does not require exclusive access) 181 * could not proceed. 182 */ 183 NVME_IOCTL_E_CTRL_LOCKED, 184 NVME_IOCTL_E_NS_LOCKED, 185 /* 186 * Indicates that a standard log page was requested that the kernel 187 * doesn't know about. 188 */ 189 NVME_IOCTL_E_UNKNOWN_LOG_PAGE, 190 /* 191 * Indicates that the controller does not support the requested log 192 * page; however, the kernel knows about it. 193 */ 194 NVME_IOCTL_E_UNSUP_LOG_PAGE, 195 /* 196 * Indicates that the log page's scope requires operating on something 197 * that isn't what was requested. For example, trying to request the 198 * firmware information page on a namespace. 199 */ 200 NVME_IOCTL_E_BAD_LOG_SCOPE, 201 /* 202 * Log page fields with bad values. 203 */ 204 NVME_IOCTL_E_LOG_CSI_RANGE, 205 NVME_IOCTL_E_LOG_LID_RANGE, 206 NVME_IOCTL_E_LOG_LSP_RANGE, 207 NVME_IOCTL_E_LOG_LSI_RANGE, 208 NVME_IOCTL_E_LOG_RAE_RANGE, 209 NVME_IOCTL_E_LOG_SIZE_RANGE, 210 NVME_IOCTL_E_LOG_OFFSET_RANGE, 211 /* 212 * Log page fields that may not be supported. 213 */ 214 NVME_IOCTL_E_LOG_CSI_UNSUP, 215 NVME_IOCTL_E_LOG_LSP_UNSUP, 216 NVME_IOCTL_E_LOG_LSI_UNSUP, 217 NVME_IOCTL_E_LOG_RAE_UNSUP, 218 NVME_IOCTL_E_LOG_OFFSET_UNSUP, 219 /* 220 * Log page fields that may not be usable, depending on context. 221 */ 222 NVME_IOCTL_E_LOG_LSP_UNUSE, 223 NVME_IOCTL_E_LOG_LSI_UNUSE, 224 NVME_IOCTL_E_LOG_RAE_UNUSE, 225 /* 226 * Indicates that no DMA memory was available for a request. 227 */ 228 NVME_IOCTL_E_NO_DMA_MEM, 229 /* 230 * Indicates that there was no kernel memory avilable for the request. 231 */ 232 NVME_IOCTL_E_NO_KERN_MEM, 233 /* 234 * Indicates that an error occurred while trying to fill out the DMA PRP 235 */ 236 NVME_IOCTL_E_BAD_PRP, 237 /* 238 * Indicates that a pointer to user data to read from or write to was 239 * not valid and generated a fault. Specifically this is for items that 240 * an ioctl structure points to. 241 */ 242 NVME_IOCTL_E_BAD_USER_DATA, 243 /* 244 * Indicates that the kernel does not know about the requested identify 245 * command. 246 */ 247 NVME_IOCTL_E_UNKNOWN_IDENTIFY, 248 /* 249 * Indicates that the controller does not support the requested identify 250 * command. 251 */ 252 NVME_IOCTL_E_UNSUP_IDENTIFY, 253 /* 254 * The following errors indicate either a bad value for a given identify 255 * argument. This would happen because the value is outside the 256 * supported range. There is no CNS or below as those are the 257 * higher-level errors right above this. 258 */ 259 NVME_IOCTL_E_IDENTIFY_CTRLID_RANGE, 260 /* 261 * Next, we have the unsupported and unusable pieces. The nsid was 262 * supported starting in NVMe 1.0, therefore it is never unsupported. 263 * However, the controller ID both requires controller support and is 264 * not usable in several requests. 265 */ 266 NVME_IOCTL_E_IDENTIFY_CTRLID_UNSUP, 267 NVME_IOCTL_E_IDENTIFY_CTRLID_UNUSE, 268 /* 269 * Indicates that the controller does not support the NVMe spec's 270 * general vendor unique command format. 271 */ 272 NVME_IOCTL_E_CTRL_VUC_UNSUP, 273 /* 274 * The following indicate bad values for given NVMe vendor unique 275 * command fields. All of the cdw1[2-5] fields are not part of this 276 * because there is nothing that we can validate. 277 */ 278 NVME_IOCTL_E_VUC_TIMEOUT_RANGE, 279 NVME_IOCTL_E_VUC_OPCODE_RANGE, 280 NVME_IOCTL_E_VUC_FLAGS_RANGE, 281 NVME_IOCTL_E_VUC_IMPACT_RANGE, 282 NVME_IOCTL_E_VUC_NDT_RANGE, 283 /* 284 * These indicate that the VUC data and that the corresponding pair of 285 * fields do not agree with each other. 286 */ 287 NVME_IOCTL_E_INCONSIST_VUC_FLAGS_NDT, 288 NVME_IOCTL_E_INCONSIST_VUC_BUF_NDT, 289 /* 290 * Indicates that the operation in question did not succeed because 291 * blkdev failed to detach. Most often this happens because the device 292 * node is busy. Reasons the device node could be busy include that the 293 * device is in a zpool, a file system is mounted, a process has the 294 * block device open, etc. 295 */ 296 NVME_IOCTL_E_BLKDEV_DETACH, 297 /* 298 * Indicates that the operation in question failed because we were 299 * unable to create and online a new blkdev child. 300 */ 301 NVME_IOCTL_E_BLKDEV_ATTACH, 302 /* 303 * Indicates that the namespace requested for an attach is not supported 304 * by the system. This would happen due to properties of the namespace 305 * itself (e.g. utilizing metadata sectors). 306 */ 307 NVME_IOCTL_E_UNSUP_ATTACH_NS, 308 /* 309 * Indicates that the format operation is not supported by the 310 * controller at all. 311 */ 312 NVME_IOCTL_E_CTRL_FORMAT_UNSUP, 313 /* 314 * Indicates that the controller does not support the ability to perform 315 * a cryptographic secure erase. 316 */ 317 NVME_IOCTL_E_CTRL_CRYPTO_SE_UNSUP, 318 /* 319 * Indicates that a format operation is targeting a namespace, but 320 * cannot be performed because it does not support formatting an 321 * individual namespace or performing a secure-erase of an individual 322 * namespace respectively. 323 */ 324 NVME_IOCTL_E_CTRL_NS_FORMAT_UNSUP, 325 NVME_IOCTL_E_CTRL_NS_SE_UNSUP, 326 /* 327 * The following indicate bad values for a format NVM request. 328 */ 329 NVME_IOCTL_E_FORMAT_LBAF_RANGE, 330 NVME_IOCTL_E_FORMAT_SES_RANGE, 331 /* 332 * Indicates that the requested LBA format is not supported due to its 333 * use of metadata. 334 */ 335 NVME_IOCTL_E_UNSUP_LBAF_META, 336 /* 337 * Indicates that the firmware commands are not supported by the 338 * controller at all. 339 */ 340 NVME_IOCTL_E_CTRL_FW_UNSUP, 341 /* 342 * Indicates that the controller has reported a firmware update 343 * granularity that exceeds the calculated / driver supported maximum 344 * DMA transfer size. As such we cannot perform this operation. 345 */ 346 NVME_IOCTL_E_FW_LOAD_IMPOS_GRAN, 347 /* 348 * The following indicate bad values for a firmware load's length and 349 * offset. 350 */ 351 NVME_IOCTL_E_FW_LOAD_LEN_RANGE, 352 NVME_IOCTL_E_FW_LOAD_OFFSET_RANGE, 353 /* 354 * The following indicate bad values for a firmware commit's slot and 355 * action. 356 */ 357 NVME_IOCTL_E_FW_COMMIT_SLOT_RANGE, 358 NVME_IOCTL_E_FW_COMMIT_ACTION_RANGE, 359 /* 360 * Indicates that an explicit attempt was made to download an image into 361 * a read-only slot. Note, some instances of this cannot be caught prior 362 * to issuing a command to the controller (commit action 0b11 as it can 363 * be used whether there is or isn't a staged image) and will result in 364 * a controller error. 365 */ 366 NVME_IOCTL_E_RO_FW_SLOT, 367 /* 368 * Indicates that the kernel doesn't know about the NVMe feature in 369 * question and therefore cannot proceed. 370 */ 371 NVME_IOCTL_E_UNKNOWN_FEATURE, 372 /* 373 * Indicates that while the system knows about the feature in question, 374 * it is not supported by the controller. 375 */ 376 NVME_IOCTL_E_UNSUP_FEATURE, 377 /* 378 * The following errors indicate a bad value for a given get feature 379 * field. This would happen because the value is outside the supported 380 * range. 381 */ 382 NVME_IOCTL_E_GET_FEAT_SEL_RANGE, 383 NVME_IOCTL_E_GET_FEAT_CDW11_RANGE, 384 NVME_IOCTL_E_GET_FEAT_DATA_RANGE, 385 /* 386 * This set of errors indicate that the field is not supported. This can 387 * happen because a given get feature command doesn't support setting 388 * this value, the field isn't supported in this revision of the 389 * controller, or similar issues. 390 */ 391 NVME_IOCTL_E_GET_FEAT_SEL_UNSUP, 392 /* 393 * Fields that may be circumstantially unusable. 394 */ 395 NVME_IOCTL_E_GET_FEAT_CDW11_UNUSE, 396 NVME_IOCTL_E_GET_FEAT_DATA_UNUSE, 397 /* 398 * The following errors indicate a bad lock type. 399 */ 400 NVME_IOCTL_E_BAD_LOCK_ENTITY, 401 NVME_IOCTL_E_BAD_LOCK_LEVEL, 402 NVME_IOCTL_E_BAD_LOCK_FLAGS, 403 /* 404 * Indicates that a namespace open cannot lock or unlock a controller. 405 */ 406 NVME_IOCTL_E_NS_CANNOT_LOCK_CTRL, 407 NVME_IOCTL_E_NS_CANNOT_UNLOCK_CTRL, 408 /* 409 * Indicates that this lock is already held by the caller. 410 */ 411 NVME_IOCTL_E_LOCK_ALREADY_HELD, 412 /* 413 * Indicates that we cannot take the controller lock, because the 414 * caller already has an active namespace lock. 415 */ 416 NVME_IOCTL_E_LOCK_NO_CTRL_WITH_NS, 417 /* 418 * Indicates that we cannot take a namespace lock because a controller 419 * write lock already exists. 420 */ 421 NVME_IOCTL_LOCK_NO_NS_WITH_CTRL_WRLOCK, 422 /* 423 * Indicates that we cannot take a namespace lock because we already 424 * have one. 425 */ 426 NVME_IOCTL_E_LOCK_NO_2ND_NS, 427 /* 428 * Indicate that a blocking wait for a lock was interrupted due to a 429 * signal. 430 */ 431 NVME_IOCTL_E_LOCK_WAIT_SIGNAL, 432 /* 433 * Indicates that the lock could not be acquired because it was already 434 * held and we were asked not to block on the lock. 435 */ 436 NVME_IOCTL_E_LOCK_WOULD_BLOCK, 437 /* 438 * Indicates that the lock operation could not proceed because the minor 439 * is already blocking on another lock operation. 440 */ 441 NVME_IOCTL_E_LOCK_PENDING, 442 /* 443 * Indicates that the requested lock could not be unlocked because it is 444 * not held. The minor may not hold the lock or it may be blocking for 445 * acquisition. 446 */ 447 NVME_IOCTL_E_LOCK_NOT_HELD, 448 /* 449 * Indicates that the requested lock could not be unlocked because the 450 * namespace requested is not the namespace that is currently locked. 451 */ 452 NVME_IOCTL_E_LOCK_WRONG_NS, 453 /* 454 * Indicates that the request could not proceed because a namespace is 455 * attached to blkdev. This would block a format operation, a vendor 456 * unique command that indicated that it would impact all namespaces, 457 * etc. 458 */ 459 NVME_IOCTL_E_NS_BLKDEV_ATTACH, 460 /* 461 * Indicates that the blkdev address somehow would have overflowed our 462 * internal buffer. 463 */ 464 NVME_IOCTL_E_BD_ADDR_OVER, 465 /* 466 * Indicates that Namespace Management commands are not supported by the 467 * controller at all. 468 */ 469 NVME_IOCTL_E_CTRL_NS_MGMT_UNSUP, 470 /* 471 * Indicates that the request could not proceed because the namespace is 472 * currently attached to a controller. 473 */ 474 NVME_IOCTL_E_NS_CTRL_ATTACHED, 475 NVME_IOCTL_E_NS_CTRL_NOT_ATTACHED, 476 /* 477 * This indicates that the namespace ID is valid; however, there is no 478 * namespace actually allocated for this ID. For example, when trying to 479 * attach or detach a controller to an unallocated namespace. 480 * 481 * When a namespace ID is invalid, the kernel will generally instead 482 * return NVME_IOCTL_E_NS_RANGE. 483 */ 484 NVME_IOCTL_E_NS_NO_NS, 485 /* 486 * Namespace Create fields with bad values 487 */ 488 NVME_IOCTL_E_NS_CREATE_NSZE_RANGE, 489 NVME_IOCTL_E_NS_CREATE_NCAP_RANGE, 490 NVME_IOCTL_E_NS_CREATE_CSI_RANGE, 491 NVME_IOCTL_E_NS_CREATE_FLBAS_RANGE, 492 NVME_IOCTL_E_NS_CREATE_NMIC_RANGE, 493 /* 494 * Namespace Create fields with unsupported versions. Currently this can 495 * only apply to the CSI. Note, there aren't unusable errors yet; 496 * however, that'll change when we support other CSI types. 497 */ 498 NVME_IOCTL_E_NS_CREATE_CSI_UNSUP, 499 /* 500 * We may have a valid CSI, but not support it at our end. This error 501 * indicates that. Similarly, the device may not support thin 502 * provisioning. 503 */ 504 NVME_IOCTL_E_DRV_CSI_UNSUP, 505 NVME_IOCTL_E_CTRL_THIN_PROV_UNSUP 506 } nvme_ioctl_errno_t; 507 508 /* 509 * This structure is embedded as the first item of every ioctl. It is also used 510 * directly for the following ioctls: 511 * 512 * - blkdev attach (NVME_IOC_ATTACH) 513 * - blkdev detach (NVME_IOC_DETACH) 514 * - controller attach (NVME_IOC_CTRL_ATTACH) 515 * - controller detach (NVME_IOC_CTRL_DETACH) 516 * - namespace delete (NVME_IOC_NS_DELETE) 517 */ 518 typedef struct { 519 /* 520 * This allows one to specify the namespace ID that the ioctl may 521 * target, if it supports it. This field may be left to zero to indicate 522 * that the current open device (whether the controller or a namespace) 523 * should be targeted. If a namespace is open, a value other than 0 or 524 * the current namespace's ID is invalid. 525 */ 526 uint32_t nioc_nsid; 527 /* 528 * These next three values represent a possible error that may have 529 * occurred. On every ioctl nioc_drv_err is set to a value from the 530 * nvme_ioctl_errno_t enumeration. Anything other than NVME_IOCTL_E_OK 531 * indicates a failure of some kind. Some error values will put 532 * supplemental information in sct and sc. For example, 533 * NVME_IOCTL_E_CTRL_ERROR uses that as a way to return the raw error 534 * values from the controller for someone to inspect. Others may use 535 * this for their own well-defined supplemental information. 536 */ 537 uint32_t nioc_drv_err; 538 uint32_t nioc_ctrl_sct; 539 uint32_t nioc_ctrl_sc; 540 } nvme_ioctl_common_t; 541 542 /* 543 * NVMe Identify Command (NVME_IOC_IDENTIFY). 544 */ 545 typedef struct { 546 nvme_ioctl_common_t nid_common; 547 uint32_t nid_cns; 548 uint32_t nid_ctrlid; 549 uintptr_t nid_data; 550 } nvme_ioctl_identify_t; 551 552 /* 553 * The following constants describe the maximum values that may be used in 554 * various identify requests. 555 */ 556 #define NVME_IDENTIFY_MAX_CTRLID 0xffff 557 #define NVME_IDENTIFY_MAX_NSID 0xffffffff 558 #define NVME_IDENTIFY_MAX_CNS_1v2 0xff 559 #define NVME_IDENTIFY_MAX_CNS_1v1 0x3 560 #define NVME_IDENTIFY_MAX_CNS 0x1 561 562 /* 563 * Get a specific feature (NVME_IOC_GET_FEATURE). 564 */ 565 typedef struct { 566 nvme_ioctl_common_t nigf_common; 567 uint32_t nigf_fid; 568 uint32_t nigf_sel; 569 uint32_t nigf_cdw11; 570 uintptr_t nigf_data; 571 uint64_t nigf_len; 572 uint32_t nigf_cdw0; 573 } nvme_ioctl_get_feature_t; 574 575 /* 576 * Feature maximums. 577 */ 578 #define NVME_FEAT_MAX_FID 0xff 579 #define NVME_FEAT_MAX_SEL 0x3 580 581 /* 582 * Get a specific log page (NVME_IOC_GET_LOGPAGE). By default, unused fields 583 * should be left at zero. the input data length is specified by nigl_len, in 584 * bytes. The NVMe specification does not provide a way for a controller to 585 * write less bytes than requested for a log page. It is undefined behavior if a 586 * log page read requests more data than is supported. If this is successful, 587 * nigl_len bytes will be copied out. 588 */ 589 typedef struct { 590 nvme_ioctl_common_t nigl_common; 591 uint32_t nigl_csi; 592 uint32_t nigl_lid; 593 uint32_t nigl_lsp; 594 uint32_t nigl_lsi; 595 uint32_t nigl_rae; 596 uint64_t nigl_len; 597 uint64_t nigl_offset; 598 uintptr_t nigl_data; 599 } nvme_ioctl_get_logpage_t; 600 601 /* 602 * The following constants describe the maximum values for fields that used in 603 * the log page request. Note, some of these change with the version. These 604 * values are inclusive. The default max is the lowest common value. Larger 605 * values are included here. While these values are what the command set 606 * maximums are, the device driver may support smaller minimums (e.g. for size). 607 */ 608 #define NVME_LOG_MAX_LID 0xff 609 #define NVME_LOG_MAX_LSP 0x0f 610 #define NVME_LOG_MAX_LSP_2v0 0x7f 611 #define NVME_LOG_MAX_LSI 0xffff 612 #define NVME_LOG_MAX_UUID 0x7f 613 #define NVME_LOG_MAX_CSI 0xff 614 #define NVME_LOG_MAX_RAE 0x1 615 #define NVME_LOG_MAX_OFFSET UINT64_MAX 616 617 /* 618 * These maximum size values are inclusive like the others. The fields are 12 619 * and 32-bits wide respectively, but are zero based. That is accounted for by 620 * the shifts below. 621 */ 622 #define NVME_LOG_MAX_SIZE ((1ULL << 12ULL) * 4ULL) 623 #define NVME_LOG_MAX_SIZE_1v2 ((1ULL << 32ULL) * 4ULL) 624 625 /* 626 * Inject a vendor-specific admin command (NVME_IOC_PASSTHRU). 627 */ 628 typedef struct { 629 nvme_ioctl_common_t npc_common; /* NSID and status */ 630 uint32_t npc_opcode; /* Command opcode. */ 631 uint32_t npc_timeout; /* Command timeout, in seconds. */ 632 uint32_t npc_flags; /* Flags for the command. */ 633 uint32_t npc_impact; /* Impact information */ 634 uint32_t npc_cdw0; /* Command-specific result DWord 0 */ 635 uint32_t npc_cdw12; /* Command-specific DWord 12 */ 636 uint32_t npc_cdw13; /* Command-specific DWord 13 */ 637 uint32_t npc_cdw14; /* Command-specific DWord 14 */ 638 uint32_t npc_cdw15; /* Command-specific DWord 15 */ 639 uint64_t npc_buflen; /* Size of npc_buf. */ 640 uintptr_t npc_buf; /* I/O source or destination */ 641 } nvme_ioctl_passthru_t; 642 643 /* 644 * Constants for the passthru admin commands. Because the timeout is a kernel 645 * property, we don't include that here. 646 */ 647 #define NVME_PASSTHRU_MIN_ADMIN_OPC 0xc0 648 #define NVME_PASSTHRU_MAX_ADMIN_OPC 0xff 649 650 /* Flags for NVMe passthru commands. */ 651 #define NVME_PASSTHRU_READ 0x1 /* Read from device */ 652 #define NVME_PASSTHRU_WRITE 0x2 /* Write to device */ 653 654 /* 655 * Impact information for NVMe passthru commands. The current impact flags are 656 * defined as follows: 657 * 658 * NVME_IMPACT_NS This implies that one or all of the namespaces may be 659 * changed. This command will rescan all namespace after 660 * this occurs and update our state as a result. However, 661 * this requires that all such namespaces not be attached 662 * to blkdev to continue. 663 */ 664 #define NVME_IMPACT_NS 0x01 665 666 667 /* 668 * Firmware download (NVME_IOC_FIRMWARE_DOWNLOAD). 669 */ 670 typedef struct { 671 nvme_ioctl_common_t fwl_common; 672 uintptr_t fwl_buf; 673 uint64_t fwl_len; 674 uint64_t fwl_off; 675 } nvme_ioctl_fw_load_t; 676 677 /* 678 * Firmware commit (NVME_IOC_FIRMWARE_COMMIT). This was previously called 679 * firmware activate in earlier specification revisions. 680 */ 681 typedef struct { 682 nvme_ioctl_common_t fwc_common; 683 uint32_t fwc_slot; 684 uint32_t fwc_action; 685 } nvme_ioctl_fw_commit_t; 686 687 /* 688 * Format NVM command (NVME_IOC_FORMAT) 689 */ 690 typedef struct { 691 nvme_ioctl_common_t nif_common; 692 uint32_t nif_lbaf; 693 uint32_t nif_ses; 694 } nvme_ioctl_format_t; 695 696 typedef enum { 697 NVME_LOCK_E_CTRL = 1, 698 NVME_LOCK_E_NS 699 } nvme_lock_ent_t; 700 701 typedef enum { 702 NVME_LOCK_L_READ = 1, 703 NVME_LOCK_L_WRITE 704 } nvme_lock_level_t; 705 706 typedef enum { 707 NVME_LOCK_F_DONT_BLOCK = 1 << 0 708 } nvme_lock_flags_t; 709 710 /* 711 * Lock structure (NVME_IOC_LOCK). 712 */ 713 typedef struct { 714 nvme_ioctl_common_t nil_common; 715 nvme_lock_ent_t nil_ent; 716 nvme_lock_level_t nil_level; 717 nvme_lock_flags_t nil_flags; 718 } nvme_ioctl_lock_t; 719 720 /* 721 * Unlock structure (NVME_IOC_UNLOCK). 722 */ 723 typedef struct { 724 nvme_ioctl_common_t niu_common; 725 nvme_lock_ent_t niu_ent; 726 } nvme_ioctl_unlock_t; 727 728 /* 729 * Namespace Management related structures and constants. Note, namespace 730 * controller attach, controller detach, and namespace delete all use the common 731 * ioctl structure at this time. 732 */ 733 #define NVME_NS_ATTACH_CTRL_ATTACH 0 734 #define NVME_NS_ATTACH_CTRL_DETACH 1 735 736 /* 737 * Constants related to fields here. These represent the specifications maximum 738 * size, even though there are additional constraints placed on it by the driver 739 * (e.g. we only allow creating a namespace with the NVM CSI). 740 */ 741 #define NVME_NS_MGMT_MAX_CSI 0xff 742 #define NVME_NS_MGMT_MAX_FLBAS 0xf 743 #define NVME_NS_MGMT_NMIC_MASK 0x1 744 745 /* 746 * Logical values for namespace multipath I/O and sharing capabilities (NMIC). 747 */ 748 typedef enum { 749 /* 750 * Indicates that no NVMe namespace sharing is permitted between 751 * controllers. 752 */ 753 NVME_NS_NMIC_T_NONE = 0, 754 /* 755 * Indicates that namespace sharing is allowed between controllers. This 756 * is equivalent to the SHRNS bit being set. 757 */ 758 NVME_NS_NMIC_T_SHARED, 759 /* 760 * Indicates that this is a dispersed namespace. A dispersed namespace 761 * implies a shared namespace and indicates that DISNS and SHRNS are 762 * both set. 763 */ 764 NVME_NS_NMIC_T_DISPERSED 765 } nvme_ns_nmic_t; 766 767 /* 768 * Namespace create structure (NVME_IOC_NS_CREATE). 769 */ 770 typedef struct { 771 nvme_ioctl_common_t nnc_common; 772 uint64_t nnc_nsze; 773 uint64_t nnc_ncap; 774 uint32_t nnc_csi; 775 uint32_t nnc_flbas; 776 uint32_t nnc_nmic; 777 uint32_t nnc_nsid; 778 } nvme_ioctl_ns_create_t; 779 780 /* 781 * 32-bit ioctl structures. These must be packed to be 4 bytes to get the proper 782 * ILP32 sizing. 783 */ 784 #if defined(_KERNEL) && defined(_SYSCALL32) 785 #pragma pack(4) 786 typedef struct { 787 nvme_ioctl_common_t nid_common; 788 uint32_t nid_cns; 789 uint32_t nid_ctrlid; 790 uintptr32_t nid_data; 791 } nvme_ioctl_identify32_t; 792 793 typedef struct { 794 nvme_ioctl_common_t nigf_common; 795 uint32_t nigf_fid; 796 uint32_t nigf_sel; 797 uint32_t nigf_cdw11; 798 uintptr32_t nigf_data; 799 uint64_t nigf_len; 800 uint32_t nigf_cdw0; 801 } nvme_ioctl_get_feature32_t; 802 803 typedef struct { 804 nvme_ioctl_common_t nigl_common; 805 uint32_t nigl_csi; 806 uint32_t nigl_lid; 807 uint32_t nigl_lsp; 808 uint32_t nigl_lsi; 809 uint32_t nigl_rae; 810 uint64_t nigl_len; 811 uint64_t nigl_offset; 812 uintptr32_t nigl_data; 813 } nvme_ioctl_get_logpage32_t; 814 815 typedef struct { 816 nvme_ioctl_common_t npc_common; /* NSID and status */ 817 uint32_t npc_opcode; /* Command opcode. */ 818 uint32_t npc_timeout; /* Command timeout, in seconds. */ 819 uint32_t npc_flags; /* Flags for the command. */ 820 uint32_t npc_impact; /* Impact information */ 821 uint32_t npc_cdw0; /* Command-specific result DWord 0 */ 822 uint32_t npc_cdw12; /* Command-specific DWord 12 */ 823 uint32_t npc_cdw13; /* Command-specific DWord 13 */ 824 uint32_t npc_cdw14; /* Command-specific DWord 14 */ 825 uint32_t npc_cdw15; /* Command-specific DWord 15 */ 826 uint64_t npc_buflen; /* Size of npc_buf. */ 827 uintptr32_t npc_buf; /* I/O source or destination */ 828 } nvme_ioctl_passthru32_t; 829 830 typedef struct { 831 nvme_ioctl_common_t fwl_common; 832 uintptr32_t fwl_buf; 833 uint64_t fwl_len; 834 uint64_t fwl_off; 835 } nvme_ioctl_fw_load32_t; 836 #pragma pack() /* pack(4) */ 837 #endif /* _KERNEL && _SYSCALL32 */ 838 839 /* 840 * NVMe capabilities. This is a set of fields that come from the controller's 841 * PCIe register space. 842 */ 843 typedef struct { 844 uint32_t cap_mpsmax; /* Memory Page Size Maximum */ 845 uint32_t cap_mpsmin; /* Memory Page Size Minimum */ 846 } nvme_capabilities_t; 847 848 /* 849 * NVMe version 850 */ 851 typedef struct { 852 uint16_t v_minor; 853 uint16_t v_major; 854 } nvme_version_t; 855 856 #define NVME_VERSION_ATLEAST(v, maj, min) \ 857 (((v)->v_major) > (maj) || \ 858 ((v)->v_major == (maj) && (v)->v_minor >= (min))) 859 860 #define NVME_VERSION_HIGHER(v, maj, min) \ 861 (((v)->v_major) > (maj) || \ 862 ((v)->v_major == (maj) && (v)->v_minor > (min))) 863 864 /* 865 * NVMe Namespace related constants. The maximum NSID is determined by the 866 * identify controller data structure. 867 */ 868 #define NVME_NSID_MIN 1 869 #define NVME_NSID_BCAST 0xffffffff 870 871 #pragma pack(1) 872 873 typedef struct { 874 uint64_t lo; 875 uint64_t hi; 876 } nvme_uint128_t; 877 878 /* 879 * NVMe Identify data structures 880 */ 881 882 #define NVME_IDENTIFY_BUFSIZE 4096 /* buffer size for Identify */ 883 884 /* NVMe Identify parameters (cdw10) */ 885 #define NVME_IDENTIFY_NSID 0x0 /* Identify Namespace */ 886 #define NVME_IDENTIFY_CTRL 0x1 /* Identify Controller */ 887 #define NVME_IDENTIFY_NSID_LIST 0x2 /* List Active Namespaces */ 888 #define NVME_IDENTIFY_NSID_DESC 0x3 /* Namespace ID Descriptors */ 889 890 #define NVME_IDENTIFY_NSID_ALLOC_LIST 0x10 /* List Allocated NSID */ 891 #define NVME_IDENTIFY_NSID_ALLOC 0x11 /* Identify Allocated NSID */ 892 #define NVME_IDENTIFY_NSID_CTRL_LIST 0x12 /* List Controllers on NSID */ 893 #define NVME_IDENTIFY_CTRL_LIST 0x13 /* Controller List */ 894 #define NVME_IDENTIFY_PRIMARY_CAPS 0x14 /* Primary Controller Caps */ 895 896 897 /* NVMe Queue Entry Size bitfield */ 898 typedef struct { 899 uint8_t qes_min:4; /* minimum entry size */ 900 uint8_t qes_max:4; /* maximum entry size */ 901 } nvme_idctl_qes_t; 902 903 /* NVMe Power State Descriptor */ 904 typedef struct { 905 uint16_t psd_mp; /* Maximum Power */ 906 uint8_t psd_rsvd1; 907 uint8_t psd_mps:1; /* Max Power Scale (1.1) */ 908 uint8_t psd_nops:1; /* Non-Operational State (1.1) */ 909 uint8_t psd_rsvd2:6; 910 uint32_t psd_enlat; /* Entry Latency */ 911 uint32_t psd_exlat; /* Exit Latency */ 912 uint8_t psd_rrt:5; /* Relative Read Throughput */ 913 uint8_t psd_rsvd3:3; 914 uint8_t psd_rrl:5; /* Relative Read Latency */ 915 uint8_t psd_rsvd4:3; 916 uint8_t psd_rwt:5; /* Relative Write Throughput */ 917 uint8_t psd_rsvd5:3; 918 uint8_t psd_rwl:5; /* Relative Write Latency */ 919 uint8_t psd_rsvd6:3; 920 uint16_t psd_idlp; /* Idle Power (1.2) */ 921 uint8_t psd_rsvd7:6; 922 uint8_t psd_ips:2; /* Idle Power Scale (1.2) */ 923 uint8_t psd_rsvd8; 924 uint16_t psd_actp; /* Active Power (1.2) */ 925 uint8_t psd_apw:3; /* Active Power Workload (1.2) */ 926 uint8_t psd_rsvd9:3; 927 uint8_t psd_aps:2; /* Active Power Scale */ 928 uint8_t psd_rsvd10[9]; 929 } nvme_idctl_psd_t; 930 931 #define NVME_SERIAL_SZ 20 932 #define NVME_MODEL_SZ 40 933 #define NVME_FWVER_SZ 8 934 935 /* NVMe Identify Controller Data Structure */ 936 typedef struct { 937 /* Controller Capabilities & Features */ 938 uint16_t id_vid; /* PCI vendor ID */ 939 uint16_t id_ssvid; /* PCI subsystem vendor ID */ 940 char id_serial[NVME_SERIAL_SZ]; /* Serial Number */ 941 char id_model[NVME_MODEL_SZ]; /* Model Number */ 942 char id_fwrev[NVME_FWVER_SZ]; /* Firmware Revision */ 943 uint8_t id_rab; /* Recommended Arbitration Burst */ 944 uint8_t id_oui[3]; /* vendor IEEE OUI */ 945 struct { /* Multi-Interface Capabilities */ 946 uint8_t m_multi_pci:1; /* HW has multiple PCIe interfaces */ 947 uint8_t m_multi_ctrl:1; /* HW has multiple controllers (1.1) */ 948 uint8_t m_sr_iov:1; /* Controller is SR-IOV virt fn (1.1) */ 949 uint8_t m_anar_sup:1; /* ANA Reporting Supported (1.4) */ 950 uint8_t m_rsvd:4; 951 } id_mic; 952 uint8_t id_mdts; /* Maximum Data Transfer Size */ 953 uint16_t id_cntlid; /* Unique Controller Identifier (1.1) */ 954 /* Added in NVMe 1.2 */ 955 uint32_t id_ver; /* Version (1.2) */ 956 uint32_t id_rtd3r; /* RTD3 Resume Latency (1.2) */ 957 uint32_t id_rtd3e; /* RTD3 Entry Latency (1.2) */ 958 struct { 959 uint32_t oaes_rsvd0:8; 960 uint32_t oaes_nsan:1; /* Namespace Attribute Notices (1.2) */ 961 uint32_t oaes_fwact:1; /* Firmware Activation Notices (1.2) */ 962 uint32_t oaes_rsvd1:1; 963 uint32_t oaes_ansacn:1; /* Asymmetric NS Access Change (1.4) */ 964 uint32_t oaes_plat:1; /* Predictable Lat Event Agg. (1.4) */ 965 uint32_t oaes_lbasi:1; /* LBA Status Information (1.4) */ 966 uint32_t oaes_egeal:1; /* Endurance Group Event Agg. (1.4) */ 967 uint32_t oaes_rsvd2:17; 968 } id_oaes; 969 struct { 970 uint32_t ctrat_hid:1; /* 128-bit Host Identifier (1.2) */ 971 uint32_t ctrat_nops:1; /* Non-Operational Power State (1.3) */ 972 uint32_t ctrat_nvmset:1; /* NVMe Sets (1.4) */ 973 uint32_t ctrat_rrl:1; /* Read Recovery Levels (1.4) */ 974 uint32_t ctrat_engrp:1; /* Endurance Groups (1.4) */ 975 uint32_t ctrat_plm:1; /* Predictable Latency Mode (1.4) */ 976 uint32_t ctrat_tbkas:1; /* Traffic Based Keep Alive (1.4) */ 977 uint32_t ctrat_nsg:1; /* Namespace Granularity (1.4) */ 978 uint32_t ctrat_sqass:1; /* SQ Associations (1.4) */ 979 uint32_t ctrat_uuid:1; /* UUID List (1.4) */ 980 uint32_t ctrat_rsvd:22; 981 } id_ctratt; 982 uint16_t id_rrls; /* Read Recovery Levels (1.4) */ 983 uint8_t id_rsvd_cc[111-102]; 984 uint8_t id_cntrltype; /* Controller Type (1.4) */ 985 uint8_t id_frguid[16]; /* FRU GUID (1.3) */ 986 uint16_t id_crdt1; /* Command Retry Delay Time 1 (1.4) */ 987 uint16_t id_crdt2; /* Command Retry Delay Time 2 (1.4) */ 988 uint16_t id_crdt3; /* Command Retry Delay Time 3 (1.4) */ 989 uint8_t id_rsvd2_cc[240 - 134]; 990 uint8_t id_rsvd_nvmemi[253 - 240]; 991 /* NVMe-MI region */ 992 struct { /* NVMe Subsystem Report */ 993 uint8_t nvmsr_nvmesd:1; /* NVMe Storage Device */ 994 uint8_t nvmsr_nvmee:1; /* NVMe Enclosure */ 995 uint8_t nvmsr_rsvd:6; 996 } id_nvmsr; 997 struct { /* VPD Write Cycle Information */ 998 uint8_t vwci_crem:7; /* Write Cycles Remaining */ 999 uint8_t vwci_valid:1; /* Write Cycles Remaining Valid */ 1000 } id_vpdwc; 1001 struct { /* Management Endpoint Capabilities */ 1002 uint8_t mec_smbusme:1; /* SMBus Port Management Endpoint */ 1003 uint8_t mec_pcieme:1; /* PCIe Port Management Endpoint */ 1004 uint8_t mec_rsvd:6; 1005 } id_mec; 1006 1007 /* Admin Command Set Attributes */ 1008 struct { /* Optional Admin Command Support */ 1009 uint16_t oa_security:1; /* Security Send & Receive */ 1010 uint16_t oa_format:1; /* Format NVM */ 1011 uint16_t oa_firmware:1; /* Firmware Activate & Download */ 1012 uint16_t oa_nsmgmt:1; /* Namespace Management (1.2) */ 1013 uint16_t oa_selftest:1; /* Self Test (1.3) */ 1014 uint16_t oa_direct:1; /* Directives (1.3) */ 1015 uint16_t oa_nvmemi:1; /* MI-Send/Recv (1.3) */ 1016 uint16_t oa_virtmgmt:1; /* Virtualization Management (1.3) */ 1017 uint16_t oa_doorbell:1; /* Doorbell Buffer Config (1.3) */ 1018 uint16_t oa_lbastat:1; /* LBA Status (1.4) */ 1019 uint16_t oa_rsvd:6; 1020 } id_oacs; 1021 uint8_t id_acl; /* Abort Command Limit */ 1022 uint8_t id_aerl; /* Asynchronous Event Request Limit */ 1023 struct { /* Firmware Updates */ 1024 uint8_t fw_readonly:1; /* Slot 1 is Read-Only */ 1025 uint8_t fw_nslot:3; /* number of firmware slots */ 1026 uint8_t fw_norst:1; /* Activate w/o reset (1.2) */ 1027 uint8_t fw_rsvd:3; 1028 } id_frmw; 1029 struct { /* Log Page Attributes */ 1030 uint8_t lp_smart:1; /* SMART/Health information per NS */ 1031 uint8_t lp_cmdeff:1; /* Command Effects (1.2) */ 1032 uint8_t lp_extsup:1; /* Extended Get Log Page (1.2) */ 1033 uint8_t lp_telemetry:1; /* Telemetry Log Pages (1.3) */ 1034 uint8_t lp_persist:1; /* Persistent Log Page (1.4) */ 1035 uint8_t lp_rsvd:3; 1036 } id_lpa; 1037 uint8_t id_elpe; /* Error Log Page Entries */ 1038 uint8_t id_npss; /* Number of Power States */ 1039 struct { /* Admin Vendor Specific Command Conf */ 1040 uint8_t av_spec:1; /* use format from spec */ 1041 uint8_t av_rsvd:7; 1042 } id_avscc; 1043 struct { /* Autonomous Power State Trans (1.1) */ 1044 uint8_t ap_sup:1; /* APST supported (1.1) */ 1045 uint8_t ap_rsvd:7; 1046 } id_apsta; 1047 uint16_t ap_wctemp; /* Warning Composite Temp. (1.2) */ 1048 uint16_t ap_cctemp; /* Critical Composite Temp. (1.2) */ 1049 uint16_t ap_mtfa; /* Maximum Firmware Activation (1.2) */ 1050 uint32_t ap_hmpre; /* Host Memory Buf Pref Size (1.2) */ 1051 uint32_t ap_hmmin; /* Host Memory Buf Min Size (1.2) */ 1052 nvme_uint128_t ap_tnvmcap; /* Total NVM Capacity in Bytes (1.2) */ 1053 nvme_uint128_t ap_unvmcap; /* Unallocated NVM Capacity (1.2) */ 1054 struct { /* Replay Protected Mem. Block (1.2) */ 1055 uint32_t rpmbs_units:3; /* Number of targets */ 1056 uint32_t rpmbs_auth:3; /* Auth method */ 1057 uint32_t rpmbs_rsvd:10; 1058 uint32_t rpmbs_tot:8; /* Total size in 128KB */ 1059 uint32_t rpmbs_acc:8; /* Access size in 512B */ 1060 } ap_rpmbs; 1061 /* Added in NVMe 1.3 */ 1062 uint16_t ap_edstt; /* Ext. Device Self-test time (1.3) */ 1063 struct { /* Device Self-test Options */ 1064 uint8_t dsto_sub:1; /* Subsystem level self-test (1.3) */ 1065 uint8_t dsto_rsvd:7; 1066 } ap_dsto; 1067 uint8_t ap_fwug; /* Firmware Update Granularity (1.3) */ 1068 uint16_t ap_kas; /* Keep Alive Support (1.2) */ 1069 struct { /* Host Thermal Management (1.3) */ 1070 uint16_t hctma_hctm:1; /* Host Controlled (1.3) */ 1071 uint16_t hctma_rsvd:15; 1072 } ap_hctma; 1073 uint16_t ap_mntmt; /* Minimum Thermal Temperature (1.3) */ 1074 uint16_t ap_mxtmt; /* Maximum Thermal Temperature (1.3) */ 1075 struct { /* Sanitize Caps */ 1076 uint32_t san_ces:1; /* Crypto Erase Support (1.3) */ 1077 uint32_t san_bes:1; /* Block Erase Support (1.3) */ 1078 uint32_t san_ows:1; /* Overwite Support (1.3) */ 1079 uint32_t san_rsvd:26; 1080 uint32_t san_ndi:1; /* No-deallocate Inhibited (1.4) */ 1081 uint32_t san_nodmmas:2; /* No-Deallocate Modifies Media (1.4) */ 1082 } ap_sanitize; 1083 uint32_t ap_hmminds; /* Host Mem Buf Min Desc Entry (1.4) */ 1084 uint16_t ap_hmmaxd; /* How Mem Max Desc Entries (1.4) */ 1085 uint16_t ap_nsetidmax; /* Max NVMe set identifier (1.4) */ 1086 uint16_t ap_engidmax; /* Max Endurance Group ID (1.4) */ 1087 uint8_t ap_anatt; /* ANA Transition Time (1.4) */ 1088 struct { /* Asymmetric Namespace Access Caps */ 1089 uint8_t anacap_opt:1; /* Optimized State (1.4) */ 1090 uint8_t anacap_unopt:1; /* Un-optimized State (1.4) */ 1091 uint8_t anacap_inacc:1; /* Inaccessible State (1.4) */ 1092 uint8_t anacap_ploss:1; /* Persistent Loss (1.4) */ 1093 uint8_t anacap_chg:1; /* Change State (1.4 ) */ 1094 uint8_t anacap_rsvd:1; 1095 uint8_t anacap_grpns:1; /* ID Changes with NS Attach (1.4) */ 1096 uint8_t anacap_grpid:1; /* Supports Group ID (1.4) */ 1097 } ap_anacap; 1098 uint32_t ap_anagrpmax; /* ANA Group ID Max (1.4) */ 1099 uint32_t ap_nanagrpid; /* Number of ANA Group IDs (1.4) */ 1100 uint32_t ap_pels; /* Persistent Event Log Size (1.4) */ 1101 uint8_t id_rsvd_ac[512 - 356]; 1102 1103 /* NVM Command Set Attributes */ 1104 nvme_idctl_qes_t id_sqes; /* Submission Queue Entry Size */ 1105 nvme_idctl_qes_t id_cqes; /* Completion Queue Entry Size */ 1106 uint16_t id_maxcmd; /* Max Outstanding Commands (1.3) */ 1107 uint32_t id_nn; /* Number of Namespaces */ 1108 struct { /* Optional NVM Command Support */ 1109 uint16_t on_compare:1; /* Compare */ 1110 uint16_t on_wr_unc:1; /* Write Uncorrectable */ 1111 uint16_t on_dset_mgmt:1; /* Dataset Management */ 1112 uint16_t on_wr_zero:1; /* Write Zeros (1.1) */ 1113 uint16_t on_save:1; /* Save/Select in Get/Set Feat (1.1) */ 1114 uint16_t on_reserve:1; /* Reservations (1.1) */ 1115 uint16_t on_ts:1; /* Timestamp (1.3) */ 1116 uint16_t on_verify:1; /* Verify (1.4) */ 1117 uint16_t on_rsvd:8; 1118 } id_oncs; 1119 struct { /* Fused Operation Support */ 1120 uint16_t f_cmp_wr:1; /* Compare and Write */ 1121 uint16_t f_rsvd:15; 1122 } id_fuses; 1123 struct { /* Format NVM Attributes */ 1124 uint8_t fn_format:1; /* Format applies to all NS */ 1125 uint8_t fn_sec_erase:1; /* Secure Erase applies to all NS */ 1126 uint8_t fn_crypt_erase:1; /* Cryptographic Erase supported */ 1127 uint8_t fn_rsvd:5; 1128 } id_fna; 1129 struct { /* Volatile Write Cache */ 1130 uint8_t vwc_present:1; /* Volatile Write Cache present */ 1131 uint8_t vwc_nsflush:2; /* Flush with NS ffffffff (1.4) */ 1132 uint8_t rsvd:5; 1133 } id_vwc; 1134 uint16_t id_awun; /* Atomic Write Unit Normal */ 1135 uint16_t id_awupf; /* Atomic Write Unit Power Fail */ 1136 struct { /* NVM Vendor Specific Command Conf */ 1137 uint8_t nv_spec:1; /* use format from spec */ 1138 uint8_t nv_rsvd:7; 1139 } id_nvscc; 1140 struct { /* Namespace Write Protection Caps */ 1141 uint8_t nwpc_base:1; /* Base support (1.4) */ 1142 uint8_t nwpc_wpupc:1; /* Write prot until power cycle (1.4) */ 1143 uint8_t nwpc_permwp:1; /* Permanent write prot (1.4) */ 1144 uint8_t nwpc_rsvd:5; 1145 } id_nwpc; 1146 uint16_t id_acwu; /* Atomic Compare & Write Unit (1.1) */ 1147 uint16_t id_rsvd_nc_3; 1148 struct { /* SGL Support (1.1) */ 1149 uint16_t sgl_sup:2; /* SGL Supported in NVM cmds (1.3) */ 1150 uint16_t sgl_keyed:1; /* Keyed SGL Support (1.2) */ 1151 uint16_t sgl_rsvd1:13; 1152 uint16_t sgl_bucket:1; /* SGL Bit Bucket supported (1.1) */ 1153 uint16_t sgl_balign:1; /* SGL Byte Aligned (1.2) */ 1154 uint16_t sgl_sglgtd:1; /* SGL Length Longer than Data (1.2) */ 1155 uint16_t sgl_mptr:1; /* SGL MPTR w/ SGL (1.2) */ 1156 uint16_t sgl_offset:1; /* SGL Address is offset (1.2) */ 1157 uint16_t sgl_tport:1; /* Transport SGL Data Block (1.4) */ 1158 uint16_t sgl_rsvd2:10; 1159 } id_sgls; 1160 uint32_t id_mnan; /* Maximum Number of Allowed NSes */ 1161 uint8_t id_rsvd_nc_4[768 - 544]; 1162 1163 /* I/O Command Set Attributes */ 1164 uint8_t id_subnqn[1024 - 768]; /* Subsystem Qualified Name (1.2.1+) */ 1165 uint8_t id_rsvd_ioc[1792 - 1024]; 1166 uint8_t id_nvmof[2048 - 1792]; /* NVMe over Fabrics */ 1167 1168 /* Power State Descriptors */ 1169 nvme_idctl_psd_t id_psd[32]; 1170 1171 /* Vendor Specific */ 1172 uint8_t id_vs[1024]; 1173 } nvme_identify_ctrl_t; 1174 1175 /* 1176 * NVMe Controller Types 1177 */ 1178 #define NVME_CNTRLTYPE_RSVD 0 1179 #define NVME_CNTRLTYPE_IO 1 1180 #define NVME_CNTRLTYPE_DISC 2 1181 #define NVME_CNTRLTYPE_ADMIN 3 1182 1183 /* 1184 * RPMBS Authentication Types 1185 */ 1186 #define NVME_RPMBS_AUTH_HMAC_SHA256 0 1187 1188 /* 1189 * NODMMAS Values 1190 */ 1191 #define NVME_NODMMAS_UNDEF 0x00 1192 #define NVME_NODMMAS_NOMOD 0x01 1193 #define NVME_NODMMAS_DOMOD 0x02 1194 1195 /* 1196 * VWC NSID flushes 1197 */ 1198 #define NVME_VWCNS_UNKNOWN 0x00 1199 #define NVME_VWCNS_UNSUP 0x02 1200 #define NVME_VWCNS_SUP 0x03 1201 1202 /* 1203 * SGL Support Values 1204 */ 1205 #define NVME_SGL_UNSUP 0x00 1206 #define NVME_SGL_SUP_UNALIGN 0x01 1207 #define NVME_SGL_SUP_ALIGN 0x02 1208 1209 /* NVMe Identify Namespace LBA Format */ 1210 typedef struct { 1211 uint16_t lbaf_ms; /* Metadata Size */ 1212 uint8_t lbaf_lbads; /* LBA Data Size */ 1213 uint8_t lbaf_rp:2; /* Relative Performance */ 1214 uint8_t lbaf_rsvd1:6; 1215 } nvme_idns_lbaf_t; 1216 1217 #define NVME_MAX_LBAF 16 1218 1219 /* NVMe Identify Namespace Data Structure */ 1220 typedef struct { 1221 uint64_t id_nsize; /* Namespace Size */ 1222 uint64_t id_ncap; /* Namespace Capacity */ 1223 uint64_t id_nuse; /* Namespace Utilization */ 1224 struct { /* Namespace Features */ 1225 uint8_t f_thin:1; /* Thin Provisioning */ 1226 uint8_t f_nsabp:1; /* Namespace atomics (1.2) */ 1227 uint8_t f_dae:1; /* Deallocated errors supported (1.2) */ 1228 uint8_t f_uidreuse:1; /* GUID reuse impossible (1.3) */ 1229 uint8_t f_optperf:1; /* Namespace I/O opt (1.4) */ 1230 uint8_t f_rsvd:3; 1231 } id_nsfeat; 1232 uint8_t id_nlbaf; /* Number of LBA formats */ 1233 struct { /* Formatted LBA size */ 1234 uint8_t lba_format:4; /* LBA format */ 1235 uint8_t lba_extlba:1; /* extended LBA (includes metadata) */ 1236 uint8_t lba_rsvd:3; 1237 } id_flbas; 1238 struct { /* Metadata Capabilities */ 1239 uint8_t mc_extlba:1; /* extended LBA transfers */ 1240 uint8_t mc_separate:1; /* separate metadata transfers */ 1241 uint8_t mc_rsvd:6; 1242 } id_mc; 1243 struct { /* Data Protection Capabilities */ 1244 uint8_t dp_type1:1; /* Protection Information Type 1 */ 1245 uint8_t dp_type2:1; /* Protection Information Type 2 */ 1246 uint8_t dp_type3:1; /* Protection Information Type 3 */ 1247 uint8_t dp_first:1; /* first 8 bytes of metadata */ 1248 uint8_t dp_last:1; /* last 8 bytes of metadata */ 1249 uint8_t dp_rsvd:3; 1250 } id_dpc; 1251 struct { /* Data Protection Settings */ 1252 uint8_t dp_pinfo:3; /* Protection Information enabled */ 1253 uint8_t dp_first:1; /* first 8 bytes of metadata */ 1254 uint8_t dp_rsvd:4; 1255 } id_dps; 1256 struct { /* NS Multi-Path/Sharing Cap (1.1) */ 1257 uint8_t nm_shared:1; /* NS is shared (1.1) */ 1258 uint8_t nm_rsvd:7; 1259 } id_nmic; 1260 struct { /* Reservation Capabilities (1.1) */ 1261 uint8_t rc_persist:1; /* Persist Through Power Loss (1.1) */ 1262 uint8_t rc_wr_excl:1; /* Write Exclusive (1.1) */ 1263 uint8_t rc_excl:1; /* Exclusive Access (1.1) */ 1264 uint8_t rc_wr_excl_r:1; /* Wr Excl - Registrants Only (1.1) */ 1265 uint8_t rc_excl_r:1; /* Excl Acc - Registrants Only (1.1) */ 1266 uint8_t rc_wr_excl_a:1; /* Wr Excl - All Registrants (1.1) */ 1267 uint8_t rc_excl_a:1; /* Excl Acc - All Registrants (1.1) */ 1268 uint8_t rc_ign_ekey:1; /* Ignore Existing Key (1.3) */ 1269 } id_rescap; 1270 struct { /* Format Progress Indicator (1.2) */ 1271 uint8_t fpi_remp:7; /* Percent NVM Format Remaining (1.2) */ 1272 uint8_t fpi_sup:1; /* Supported (1.2) */ 1273 } id_fpi; 1274 uint8_t id_dfleat; /* Deallocate Log. Block (1.3) */ 1275 uint16_t id_nawun; /* Atomic Write Unit Normal (1.2) */ 1276 uint16_t id_nawupf; /* Atomic Write Unit Power Fail (1.2) */ 1277 uint16_t id_nacwu; /* Atomic Compare & Write Unit (1.2) */ 1278 uint16_t id_nabsn; /* Atomic Boundary Size Normal (1.2) */ 1279 uint16_t id_nbao; /* Atomic Boundary Offset (1.2) */ 1280 uint16_t id_nabspf; /* Atomic Boundary Size Fail (1.2) */ 1281 uint16_t id_noiob; /* Optimal I/O Bondary (1.3) */ 1282 nvme_uint128_t id_nvmcap; /* NVM Capacity */ 1283 uint16_t id_npwg; /* NS Pref. Write Gran. (1.4) */ 1284 uint16_t id_npwa; /* NS Pref. Write Align. (1.4) */ 1285 uint16_t id_npdg; /* NS Pref. Deallocate Gran. (1.4) */ 1286 uint16_t id_npda; /* NS Pref. Deallocate Align. (1.4) */ 1287 uint16_t id_nows; /* NS. Optimal Write Size (1.4) */ 1288 uint8_t id_rsvd1[92 - 74]; 1289 uint32_t id_anagrpid; /* ANA Group Identifier (1.4) */ 1290 uint8_t id_rsvd2[99 - 96]; 1291 struct { 1292 uint8_t nsa_wprot:1; /* Write Protected (1.4) */ 1293 uint8_t nsa_rsvd:7; 1294 } id_nsattr; 1295 uint16_t id_nvmsetid; /* NVM Set Identifier (1.4) */ 1296 uint16_t id_endgid; /* Endurance Group Identifier (1.4) */ 1297 uint8_t id_nguid[16]; /* Namespace GUID (1.2) */ 1298 uint8_t id_eui64[8]; /* IEEE Extended Unique Id (1.1) */ 1299 nvme_idns_lbaf_t id_lbaf[NVME_MAX_LBAF]; /* LBA Formats */ 1300 1301 uint8_t id_rsvd3[384 - 192]; 1302 1303 uint8_t id_vs[4096 - 384]; /* Vendor Specific */ 1304 } nvme_identify_nsid_t; 1305 1306 /* NVMe Identify Namespace ID List */ 1307 typedef struct { 1308 /* Ordered list of Namespace IDs */ 1309 uint32_t nl_nsid[NVME_IDENTIFY_BUFSIZE / sizeof (uint32_t)]; 1310 } nvme_identify_nsid_list_t; 1311 1312 /* NVME Identify Controller ID List */ 1313 typedef struct { 1314 uint16_t cl_nid; /* Number of controller entries */ 1315 /* unique controller identifiers */ 1316 uint16_t cl_ctlid[NVME_IDENTIFY_BUFSIZE / sizeof (uint16_t) - 1]; 1317 } nvme_identify_ctrl_list_t; 1318 1319 /* NVMe Identify Namespace Descriptor */ 1320 typedef struct { 1321 uint8_t nd_nidt; /* Namespace Identifier Type */ 1322 uint8_t nd_nidl; /* Namespace Identifier Length */ 1323 uint8_t nd_resv[2]; 1324 uint8_t nd_nid[]; /* Namespace Identifier */ 1325 } nvme_identify_nsid_desc_t; 1326 1327 #define NVME_NSID_DESC_EUI64 1 1328 #define NVME_NSID_DESC_NGUID 2 1329 #define NVME_NSID_DESC_NUUID 3 1330 #define NVME_NSID_DESC_MIN NVME_NSID_DESC_EUI64 1331 #define NVME_NSID_DESC_MAX NVME_NSID_DESC_NUUID 1332 1333 #define NVME_NSID_DESC_LEN_EUI64 8 1334 #define NVME_NSID_DESC_LEN_NGUID 16 1335 #define NVME_NSID_DESC_LEN_NUUID UUID_LEN 1336 1337 /* NVMe Identify Primary Controller Capabilities */ 1338 typedef struct { 1339 uint16_t nipc_cntlid; /* Controller ID */ 1340 uint16_t nipc_portid; /* Port Identifier */ 1341 uint8_t nipc_crt; /* Controller Resource Types */ 1342 uint8_t nipc_rsvd0[32 - 5]; 1343 uint32_t nipc_vqfrt; /* VQ Resources Flexible Total */ 1344 uint32_t nipc_vqrfa; /* VQ Resources Flexible Assigned */ 1345 uint16_t nipc_vqrfap; /* VQ Resources to Primary */ 1346 uint16_t nipc_vqprt; /* VQ Resources Private Total */ 1347 uint16_t nipc_vqfrsm; /* VQ Resources Secondary Max */ 1348 uint16_t nipc_vqgran; /* VQ Flexible Resource Gran */ 1349 uint8_t nipc_rvsd1[64 - 48]; 1350 uint32_t nipc_vifrt; /* VI Flexible total */ 1351 uint32_t nipc_virfa; /* VI Flexible Assigned */ 1352 uint16_t nipc_virfap; /* VI Flexible Allocated to Primary */ 1353 uint16_t nipc_viprt; /* VI Resources Private Total */ 1354 uint16_t nipc_vifrsm; /* VI Resources Secondary Max */ 1355 uint16_t nipc_vigran; /* VI Flexible Granularity */ 1356 uint8_t nipc_rsvd2[4096 - 80]; 1357 } nvme_identify_primary_caps_t; 1358 1359 /* 1360 * NVMe completion queue entry status field 1361 */ 1362 typedef struct { 1363 uint16_t sf_p:1; /* Phase Tag */ 1364 uint16_t sf_sc:8; /* Status Code */ 1365 uint16_t sf_sct:3; /* Status Code Type */ 1366 uint16_t sf_rsvd2:2; 1367 uint16_t sf_m:1; /* More */ 1368 uint16_t sf_dnr:1; /* Do Not Retry */ 1369 } nvme_cqe_sf_t; 1370 1371 1372 /* 1373 * NVMe Get Log Page 1374 */ 1375 #define NVME_LOGPAGE_SUP 0x00 /* Supported Logs (2.0) */ 1376 #define NVME_LOGPAGE_ERROR 0x01 /* Error Information */ 1377 #define NVME_LOGPAGE_HEALTH 0x02 /* SMART/Health Information */ 1378 #define NVME_LOGPAGE_FWSLOT 0x03 /* Firmware Slot Information */ 1379 #define NVME_LOGPAGE_NSCHANGE 0x04 /* Changed namespace (1.2) */ 1380 #define NVME_LOGPAGE_CMDSUP 0x05 /* Cmds. Supported and Effects (1.3) */ 1381 #define NVME_LOGPAGE_SELFTEST 0x06 /* Device self-test (1.3) */ 1382 #define NVME_LOGPAGE_TELMHOST 0x07 /* Telemetry Host-Initiated */ 1383 #define NVME_LOGPAGE_TELMCTRL 0x08 /* Telemetry Controller-Initiated */ 1384 #define NVME_LOGPAGE_ENDGRP 0x09 /* Endurance Group Information (1.4) */ 1385 #define NVME_LOGPAGE_PLATSET 0x0a /* Predictable Lat. per NVM Set (1.4) */ 1386 #define NVME_LOGPAGE_PLATAGG 0x0b /* Predictable Lat. Event Agg (1.4) */ 1387 #define NVME_LOGPAGE_ASYMNS 0x0c /* Asymmetric Namespace Access (1.4) */ 1388 #define NVME_LOGPAGE_PEV 0x0d /* Persistent Event Log (1.4) */ 1389 #define NVME_LOGPAGE_LBASTS 0x0e /* LBA Status Information (1.4) */ 1390 #define NVME_LOGPAGE_ENDAGG 0x0f /* Endurance Group Event Agg. (1.4) */ 1391 1392 #define NVME_LOGPAGE_VEND_MIN 0xc0 1393 #define NVME_LOGPAGE_VEND_MAX 0xff 1394 1395 /* 1396 * Supported Log Pages (2.0). There is one entry of an nvme_logsup_t that then 1397 * exists on a per-log basis. 1398 */ 1399 1400 /* 1401 * The NVMe Log Identifier specific parameter field. Currently there is only one 1402 * defined field for the persistent event log (pel). 1403 */ 1404 typedef union { 1405 uint16_t nsl_lidsp; /* Raw Value */ 1406 struct { /* Persistent Event Log */ 1407 uint16_t nsl_ec512:1; 1408 uint16_t nsl_pel_rsvd0p1:15; 1409 } nsl_pel; 1410 } nvme_suplog_lidsp_t; 1411 1412 typedef struct { 1413 uint16_t ns_lsupp:1; 1414 uint16_t ns_ios:1; 1415 uint16_t ns_rsvd0p2:14; 1416 nvme_suplog_lidsp_t ns_lidsp; 1417 } nvme_suplog_t; 1418 1419 CTASSERT(sizeof (nvme_suplog_lidsp_t) == 2); 1420 CTASSERT(sizeof (nvme_suplog_t) == 4); 1421 1422 typedef struct { 1423 nvme_suplog_t nl_logs[256]; 1424 } nvme_suplog_log_t; 1425 1426 CTASSERT(sizeof (nvme_suplog_log_t) == 1024); 1427 1428 /* 1429 * SMART / Health information 1430 */ 1431 typedef struct { 1432 uint64_t el_count; /* Error Count */ 1433 uint16_t el_sqid; /* Submission Queue ID */ 1434 uint16_t el_cid; /* Command ID */ 1435 nvme_cqe_sf_t el_sf; /* Status Field */ 1436 uint8_t el_byte; /* Parameter Error Location byte */ 1437 uint8_t el_bit:3; /* Parameter Error Location bit */ 1438 uint8_t el_rsvd1:5; 1439 uint64_t el_lba; /* Logical Block Address */ 1440 uint32_t el_nsid; /* Namespace ID */ 1441 uint8_t el_vendor; /* Vendor Specific Information avail */ 1442 uint8_t el_rsvd2[64 - 29]; 1443 } nvme_error_log_entry_t; 1444 1445 typedef struct { 1446 struct { /* Critical Warning */ 1447 uint8_t cw_avail:1; /* available space too low */ 1448 uint8_t cw_temp:1; /* temperature too high */ 1449 uint8_t cw_reliab:1; /* degraded reliability */ 1450 uint8_t cw_readonly:1; /* media is read-only */ 1451 uint8_t cw_volatile:1; /* volatile memory backup failed */ 1452 uint8_t cw_rsvd:3; 1453 } hl_crit_warn; 1454 uint16_t hl_temp; /* Temperature */ 1455 uint8_t hl_avail_spare; /* Available Spare */ 1456 uint8_t hl_avail_spare_thr; /* Available Spare Threshold */ 1457 uint8_t hl_used; /* Percentage Used */ 1458 uint8_t hl_rsvd1[32 - 6]; 1459 nvme_uint128_t hl_data_read; /* Data Units Read */ 1460 nvme_uint128_t hl_data_write; /* Data Units Written */ 1461 nvme_uint128_t hl_host_read; /* Host Read Commands */ 1462 nvme_uint128_t hl_host_write; /* Host Write Commands */ 1463 nvme_uint128_t hl_ctrl_busy; /* Controller Busy Time */ 1464 nvme_uint128_t hl_power_cycles; /* Power Cycles */ 1465 nvme_uint128_t hl_power_on_hours; /* Power On Hours */ 1466 nvme_uint128_t hl_unsafe_shutdn; /* Unsafe Shutdowns */ 1467 nvme_uint128_t hl_media_errors; /* Media Errors */ 1468 nvme_uint128_t hl_errors_logged; /* Number of errors logged */ 1469 /* Added in NVMe 1.2 */ 1470 uint32_t hl_warn_temp_time; /* Warning Composite Temp Time */ 1471 uint32_t hl_crit_temp_time; /* Critical Composite Temp Time */ 1472 uint16_t hl_temp_sensor_1; /* Temperature Sensor 1 */ 1473 uint16_t hl_temp_sensor_2; /* Temperature Sensor 2 */ 1474 uint16_t hl_temp_sensor_3; /* Temperature Sensor 3 */ 1475 uint16_t hl_temp_sensor_4; /* Temperature Sensor 4 */ 1476 uint16_t hl_temp_sensor_5; /* Temperature Sensor 5 */ 1477 uint16_t hl_temp_sensor_6; /* Temperature Sensor 6 */ 1478 uint16_t hl_temp_sensor_7; /* Temperature Sensor 7 */ 1479 uint16_t hl_temp_sensor_8; /* Temperature Sensor 8 */ 1480 /* Added in NVMe 1.3 */ 1481 uint32_t hl_tmtemp_1_tc; /* Thermal Mgmt Temp 1 Transition # */ 1482 uint32_t hl_tmtemp_2_tc; /* Thermal Mgmt Temp 1 Transition # */ 1483 uint32_t hl_tmtemp_1_time; /* Time in Thermal Mgmt Temp 1 */ 1484 uint32_t hl_tmtemp_2_time; /* Time in Thermal Mgmt Temp 2 */ 1485 uint8_t hl_rsvd2[512 - 232]; 1486 } nvme_health_log_t; 1487 1488 /* 1489 * The NVMe spec allows for up to seven firmware slots. 1490 */ 1491 #define NVME_MAX_FWSLOTS 7 1492 1493 typedef struct { 1494 /* Active Firmware Slot */ 1495 uint8_t fw_afi:3; 1496 uint8_t fw_rsvd1:1; 1497 /* Next Active Firmware Slot */ 1498 uint8_t fw_next:3; 1499 uint8_t fw_rsvd2:1; 1500 uint8_t fw_rsvd3[7]; 1501 /* Firmware Revision / Slot */ 1502 char fw_frs[NVME_MAX_FWSLOTS][NVME_FWVER_SZ]; 1503 uint8_t fw_rsvd4[512 - 64]; 1504 } nvme_fwslot_log_t; 1505 1506 /* 1507 * The NVMe spec specifies that the changed namespace list contains up to 1508 * 1024 entries. 1509 */ 1510 #define NVME_NSCHANGE_LIST_SIZE 1024 1511 1512 typedef struct { 1513 uint32_t nscl_ns[NVME_NSCHANGE_LIST_SIZE]; 1514 } nvme_nschange_list_t; 1515 1516 /* 1517 * Commands Supported and Effects log page and information structure. This was 1518 * an optional log page added in NVMe 1.2. 1519 */ 1520 typedef struct { 1521 uint8_t cmd_csupp:1; /* Command supported */ 1522 uint8_t cmd_lbcc:1; /* Logical block content change */ 1523 uint8_t cmd_ncc:1; /* Namespace capability change */ 1524 uint8_t cmd_nic:1; /* Namespace inventory change */ 1525 uint8_t cmd_ccc:1; /* Controller capability change */ 1526 uint8_t cmd_rsvd0p5:3; 1527 uint8_t cmd_rsvd1; 1528 uint16_t cmd_cse:3; /* Command submission and execution */ 1529 uint16_t cmd_uuid:1; /* UUID select supported, 1.4 */ 1530 uint16_t cmd_csp:12; /* Command Scope, 2.0 */ 1531 } nvme_cmdeff_t; 1532 1533 CTASSERT(sizeof (nvme_cmdeff_t) == 4); 1534 1535 typedef enum { 1536 NVME_CMDEFF_CSP_NS = 1 << 0, 1537 NVME_CMDEFF_CSP_CTRL = 1 << 1, 1538 NVME_CMDEFF_CSP_SET = 1 << 2, 1539 NVME_CMDEFF_CSP_ENDURANCE = 1 << 3, 1540 NVME_CMDEFF_CSP_DOMAIN = 1 << 4, 1541 NVME_CMDEFF_CSP_NVM = 1 << 5 1542 } nvme_cmdeff_csp_t; 1543 1544 typedef enum { 1545 NVME_CMDEFF_CSE_NONE = 0, 1546 NVME_CMDEFF_CSE_NS, 1547 NVME_CMDEFF_CSE_CTRL 1548 } nvme_cmdeff_cse_t; 1549 1550 typedef struct { 1551 nvme_cmdeff_t cme_admin[256]; 1552 nvme_cmdeff_t cme_io[256]; 1553 uint8_t cme_rsvd2048[2048]; 1554 } nvme_cmdeff_log_t; 1555 1556 CTASSERT(sizeof (nvme_cmdeff_log_t) == 4096); 1557 CTASSERT(offsetof(nvme_cmdeff_log_t, cme_rsvd2048) == 2048); 1558 1559 /* 1560 * Persistent Event Log Header. This log was added in NVMe 1.4. It begins with a 1561 * 512 byte header which is defined below. It uses the log specific parameter to 1562 * determine how to access it. Internally the drive contains the notion of a 1563 * context that must be released and accessed. 1564 */ 1565 typedef struct { 1566 uint8_t pel_lid; /* Log Identifier */ 1567 uint8_t pel_rsvd1[3]; 1568 uint32_t pel_tnev; /* Total Number of Events */ 1569 uint64_t pel_tll; /* Total Log Length */ 1570 uint8_t pel_lrev; /* Log Revision */ 1571 uint8_t pel_rsvd17[1]; 1572 uint16_t pel_lhl; /* Log Header Length */ 1573 uint64_t pel_tstmp; /* Timestamp */ 1574 nvme_uint128_t pel_poh; /* Power on Hours */ 1575 uint64_t pel_pwrcc; /* Power Cycle Count */ 1576 uint16_t pel_vid; /* PCI Vendor ID */ 1577 uint16_t pel_ssvid; /* PCI Subsystem Vendor ID */ 1578 uint8_t pel_sn[NVME_SERIAL_SZ]; /* Serial Number */ 1579 uint8_t pel_mn[NVME_MODEL_SZ]; /* Model Number */ 1580 uint8_t pel_subnqn[372 - 116]; /* NVM Subsystem Qual. Name */ 1581 uint16_t pel_gnum; /* Generation Number (2.0) */ 1582 struct { /* Reporting Context Info (2.0) */ 1583 uint16_t pel_rcpid; /* Port Identifier */ 1584 uint16_t pel_rcpit:2; /* Port Identifier Type */ 1585 uint16_t pel_rce:1; /* Reporting Context Exists */ 1586 uint16_t pel_rsvd19:13; 1587 } pel_rci; 1588 uint8_t pel_rsvd378[480 - 378]; 1589 uint8_t pel_seb[32]; /* Supported Events Bitmap */ 1590 uint8_t pel_data[]; 1591 } nvme_pev_log_t; 1592 1593 /* 1594 * This enum represents the bit index for various features in the supported 1595 * events bitmap. 1596 */ 1597 typedef enum { 1598 NVME_SEB_SHLSES = 1, /* SMART / Health Log */ 1599 NVME_SEB_FCES = 2, /* Firmware Commit */ 1600 NVME_SEB_TCES = 3, /* Timestamp Change */ 1601 NVME_SEB_PRES = 4, /* Power-on or Reset */ 1602 NVME_SEB_NSHEES = 5, /* NVM Subsystem Hardware Error */ 1603 NVME_SEB_CNES = 6, /* Change Namespace */ 1604 NVME_SEB_FNSES = 7, /* Format NVM Start */ 1605 NVME_SEB_FNCES = 8, /* Format NVM Completion */ 1606 NVME_SEB_SSES = 9, /* Sanitize Start */ 1607 NVME_SEB_SCES = 10, /* Sanitize Completion */ 1608 NVME_SEB_SFES = 11, /* Set Feature */ 1609 NVME_SEB_TLCES = 12, /* Telemetry Log Create */ 1610 NVME_SEB_TEES = 13, /* Thermal Excursion */ 1611 NVME_SEB_SMVES = 14, /* Sanitize Media Verification (2.1) */ 1612 NVME_SEB_VSES = 222, /* Vendor Specific */ 1613 NVME_SEB_TCG = 223 /* TCG */ 1614 } nvme_pev_seb_t; 1615 1616 /* 1617 * Log specific fields for the persistent event log. These are required by the 1618 * log. 1619 */ 1620 typedef enum { 1621 /* 1622 * Read the persistent event log, presumes that a context has already 1623 * been established. 1624 */ 1625 NVME_PEV_LSP_READ = 0, 1626 /* 1627 * Establish a new context and then read a portion of the event log. Any 1628 * prior existing context must already have been released. 1629 */ 1630 NVME_PEV_LSP_EST_CTX_READ, 1631 /* 1632 * Releases the persistent event log context. It is legal for this 1633 * context to already have been released. 1634 */ 1635 NVME_PEV_LSP_REL_CTX, 1636 /* 1637 * This establishes a context and reads the fixed 512 bytes. The 1638 * controller is supposed to ignore any offset and length fields and 1639 * always read 512 bytes regardless. This is present starting in NVMe 1640 * 2.0. 1641 */ 1642 NVME_PEV_LSP_EST_CTX_READ_512 1643 } nvme_pev_log_lsp_t; 1644 1645 #ifndef __CHECKER__ 1646 CTASSERT(sizeof (nvme_pev_log_t) == 512); 1647 CTASSERT(offsetof(nvme_pev_log_t, pel_gnum) == 372); 1648 #endif 1649 1650 /* 1651 * NVMe Format NVM 1652 */ 1653 #define NVME_FRMT_SES_NONE 0 1654 #define NVME_FRMT_SES_USER 1 1655 #define NVME_FRMT_SES_CRYPTO 2 1656 #define NVME_FRMT_MAX_SES 2 1657 1658 #define NVME_FRMT_MAX_LBAF 15 1659 1660 typedef union { 1661 struct { 1662 uint32_t fm_lbaf:4; /* LBA Format */ 1663 uint32_t fm_ms:1; /* Metadata Settings */ 1664 uint32_t fm_pi:3; /* Protection Information */ 1665 uint32_t fm_pil:1; /* Prot. Information Location */ 1666 uint32_t fm_ses:3; /* Secure Erase Settings */ 1667 uint32_t fm_resvd:20; 1668 } b; 1669 uint32_t r; 1670 } nvme_format_nvm_t; 1671 1672 1673 /* 1674 * NVMe Get / Set Features 1675 */ 1676 #define NVME_FEAT_ARBITRATION 0x1 /* Command Arbitration */ 1677 #define NVME_FEAT_POWER_MGMT 0x2 /* Power Management */ 1678 #define NVME_FEAT_LBA_RANGE 0x3 /* LBA Range Type */ 1679 #define NVME_FEAT_TEMPERATURE 0x4 /* Temperature Threshold */ 1680 #define NVME_FEAT_ERROR 0x5 /* Error Recovery */ 1681 #define NVME_FEAT_WRITE_CACHE 0x6 /* Volatile Write Cache */ 1682 #define NVME_FEAT_NQUEUES 0x7 /* Number of Queues */ 1683 #define NVME_FEAT_INTR_COAL 0x8 /* Interrupt Coalescing */ 1684 #define NVME_FEAT_INTR_VECT 0x9 /* Interrupt Vector Configuration */ 1685 #define NVME_FEAT_WRITE_ATOM 0xa /* Write Atomicity */ 1686 #define NVME_FEAT_ASYNC_EVENT 0xb /* Asynchronous Event Configuration */ 1687 #define NVME_FEAT_AUTO_PST 0xc /* Autonomous Power State Transition */ 1688 /* (1.1) */ 1689 1690 #define NVME_FEAT_PROGRESS 0x80 /* Software Progress Marker */ 1691 1692 /* 1693 * This enumeration represents the capabilities in the Get Features select / Set 1694 * Features save options. This was introduced in NVMe 1.1 and the values below 1695 * match the specification. An optional feature in the identify controller data 1696 * structure is set to indicate that this is supported (id_oncs.on_save). 1697 */ 1698 typedef enum { 1699 NVME_FEATURE_SEL_CURRENT = 0, 1700 NVME_FEATURE_SEL_DEFAULT, 1701 NVME_FEATURE_SEL_SAVED, 1702 NVME_FEATURE_SEL_SUPPORTED 1703 } nvme_feature_sel_t; 1704 1705 typedef union { 1706 struct { 1707 uint32_t gt_fid:8; /* Feature ID */ 1708 uint32_t gt_sel:3; /* Select */ 1709 uint32_t gt_rsvd:21; 1710 } b; 1711 uint32_t r; 1712 } nvme_get_features_dw10_t; 1713 1714 /* Arbitration Feature */ 1715 typedef union { 1716 struct { 1717 uint8_t arb_ab:3; /* Arbitration Burst */ 1718 uint8_t arb_rsvd:5; 1719 uint8_t arb_lpw; /* Low Priority Weight */ 1720 uint8_t arb_mpw; /* Medium Priority Weight */ 1721 uint8_t arb_hpw; /* High Priority Weight */ 1722 } b; 1723 uint32_t r; 1724 } nvme_arbitration_t; 1725 1726 /* Power Management Feature */ 1727 typedef union { 1728 struct { 1729 uint32_t pm_ps:5; /* Power State */ 1730 uint32_t pm_rsvd:27; 1731 } b; 1732 uint32_t r; 1733 } nvme_power_mgmt_t; 1734 1735 /* LBA Range Type Feature */ 1736 typedef union { 1737 struct { 1738 uint32_t lr_num:6; /* Number of LBA ranges */ 1739 uint32_t lr_rsvd:26; 1740 } b; 1741 uint32_t r; 1742 } nvme_lba_range_type_t; 1743 1744 typedef struct { 1745 uint8_t lr_type; /* Type */ 1746 struct { /* Attributes */ 1747 uint8_t lr_write:1; /* may be overwritten */ 1748 uint8_t lr_hidden:1; /* hidden from OS/EFI/BIOS */ 1749 uint8_t lr_rsvd1:6; 1750 } lr_attr; 1751 uint8_t lr_rsvd2[14]; 1752 uint64_t lr_slba; /* Starting LBA */ 1753 uint64_t lr_nlb; /* Number of Logical Blocks */ 1754 uint8_t lr_guid[16]; /* Unique Identifier */ 1755 uint8_t lr_rsvd3[16]; 1756 } nvme_lba_range_t; 1757 1758 #define NVME_LBA_RANGE_BUFSIZE 4096 1759 1760 /* Temperature Threshold Feature */ 1761 typedef union { 1762 struct { 1763 uint16_t tt_tmpth; /* Temperature Threshold */ 1764 uint16_t tt_tmpsel:4; /* Temperature Select */ 1765 uint16_t tt_thsel:2; /* Temperature Type */ 1766 uint16_t tt_resv:10; 1767 } b; 1768 uint32_t r; 1769 } nvme_temp_threshold_t; 1770 1771 #define NVME_TEMP_THRESH_MAX_SENSOR 8 1772 #define NVME_TEMP_THRESH_ALL 0xf 1773 #define NVME_TEMP_THRESH_OVER 0x00 1774 #define NVME_TEMP_THRESH_UNDER 0x01 1775 1776 /* Error Recovery Feature */ 1777 typedef union { 1778 struct { 1779 uint16_t er_tler; /* Time-Limited Error Recovery */ 1780 uint16_t er_rsvd; 1781 } b; 1782 uint32_t r; 1783 } nvme_error_recovery_t; 1784 1785 /* Volatile Write Cache Feature */ 1786 typedef union { 1787 struct { 1788 uint32_t wc_wce:1; /* Volatile Write Cache Enable */ 1789 uint32_t wc_rsvd:31; 1790 } b; 1791 uint32_t r; 1792 } nvme_write_cache_t; 1793 1794 /* Number of Queues Feature */ 1795 typedef union { 1796 struct { 1797 uint16_t nq_nsq; /* Number of Submission Queues */ 1798 uint16_t nq_ncq; /* Number of Completion Queues */ 1799 } b; 1800 uint32_t r; 1801 } nvme_nqueues_t; 1802 1803 /* Interrupt Coalescing Feature */ 1804 typedef union { 1805 struct { 1806 uint8_t ic_thr; /* Aggregation Threshold */ 1807 uint8_t ic_time; /* Aggregation Time */ 1808 uint16_t ic_rsvd; 1809 } b; 1810 uint32_t r; 1811 } nvme_intr_coal_t; 1812 1813 /* Interrupt Configuration Features */ 1814 typedef union { 1815 struct { 1816 uint16_t iv_iv; /* Interrupt Vector */ 1817 uint16_t iv_cd:1; /* Coalescing Disable */ 1818 uint16_t iv_rsvd:15; 1819 } b; 1820 uint32_t r; 1821 } nvme_intr_vect_t; 1822 1823 /* Write Atomicity Feature */ 1824 typedef union { 1825 struct { 1826 uint32_t wa_dn:1; /* Disable Normal */ 1827 uint32_t wa_rsvd:31; 1828 } b; 1829 uint32_t r; 1830 } nvme_write_atomicity_t; 1831 1832 /* Asynchronous Event Configuration Feature */ 1833 typedef union { 1834 struct { 1835 uint8_t aec_avail:1; /* Available space too low */ 1836 uint8_t aec_temp:1; /* Temperature too high */ 1837 uint8_t aec_reliab:1; /* Degraded reliability */ 1838 uint8_t aec_readonly:1; /* Media is read-only */ 1839 uint8_t aec_volatile:1; /* Volatile memory backup failed */ 1840 uint8_t aec_rsvd1:3; 1841 uint8_t aec_nsan:1; /* Namespace attribute notices (1.2) */ 1842 uint8_t aec_fwact:1; /* Firmware activation notices (1.2) */ 1843 uint8_t aec_telln:1; /* Telemetry log notices (1.3) */ 1844 uint8_t aec_ansacn:1; /* Asymm. NS access change (1.4) */ 1845 uint8_t aec_plat:1; /* Predictable latency ev. agg. (1.4) */ 1846 uint8_t aec_lbasi:1; /* LBA status information (1.4) */ 1847 uint8_t aec_egeal:1; /* Endurance group ev. agg. (1.4) */ 1848 uint8_t aec_rsvd2:1; 1849 uint8_t aec_rsvd3[2]; 1850 } b; 1851 uint32_t r; 1852 } nvme_async_event_conf_t; 1853 1854 /* Autonomous Power State Transition Feature (1.1) */ 1855 typedef union { 1856 struct { 1857 uint32_t apst_apste:1; /* APST enabled */ 1858 uint32_t apst_rsvd:31; 1859 } b; 1860 uint32_t r; 1861 } nvme_auto_power_state_trans_t; 1862 1863 typedef struct { 1864 uint32_t apst_rsvd1:3; 1865 uint32_t apst_itps:5; /* Idle Transition Power State */ 1866 uint32_t apst_itpt:24; /* Idle Time Prior to Transition */ 1867 uint32_t apst_rsvd2; 1868 } nvme_auto_power_state_t; 1869 1870 #define NVME_AUTO_PST_BUFSIZE 256 1871 1872 /* Software Progress Marker Feature */ 1873 typedef union { 1874 struct { 1875 uint8_t spm_pbslc; /* Pre-Boot Software Load Count */ 1876 uint8_t spm_rsvd[3]; 1877 } b; 1878 uint32_t r; 1879 } nvme_software_progress_marker_t; 1880 1881 /* 1882 * Firmware Commit - Command Dword 10 1883 */ 1884 #define NVME_FWC_SAVE 0x0 /* Save image only */ 1885 #define NVME_FWC_SAVE_ACTIVATE 0x1 /* Save and activate at next reset */ 1886 #define NVME_FWC_ACTIVATE 0x2 /* Activate slot at next reset */ 1887 #define NVME_FWC_ACTIVATE_IMMED 0x3 /* Activate slot immediately */ 1888 1889 /* 1890 * Firmware slot number is only 3 bits, and zero is not allowed. 1891 * Valid range is 1 to 7. 1892 */ 1893 #define NVME_FW_SLOT_MIN 1U /* lowest allowable slot number ... */ 1894 #define NVME_FW_SLOT_MAX 7U /* ... and highest */ 1895 1896 /* 1897 * Some constants to make verification of DWORD variables and arguments easier. 1898 * A DWORD is 4 bytes. 1899 */ 1900 #define NVME_DWORD_SHIFT 2 1901 #define NVME_DWORD_SIZE (1 << NVME_DWORD_SHIFT) 1902 #define NVME_DWORD_MASK (NVME_DWORD_SIZE - 1) 1903 1904 /* 1905 * The maximum offset a firmware image segment can be loaded at is the number 1906 * of DWORDS in a 32 bit field. The maximum length of such a segment is the 1907 * same. Expressed in bytes it is: 1908 */ 1909 #define NVME_FW_OFFSETB_MAX ((u_longlong_t)UINT32_MAX << NVME_DWORD_SHIFT) 1910 #define NVME_FW_LENB_MAX NVME_FW_OFFSETB_MAX 1911 1912 typedef union { 1913 struct { 1914 uint32_t fc_slot:3; /* Firmware slot */ 1915 uint32_t fc_action:3; /* Commit action */ 1916 uint32_t fc_rsvd:26; 1917 } b; 1918 uint32_t r; 1919 } nvme_firmware_commit_dw10_t; 1920 1921 #pragma pack() /* pack(1) */ 1922 1923 /* NVMe completion status code type */ 1924 #define NVME_CQE_SCT_GENERIC 0 /* Generic Command Status */ 1925 #define NVME_CQE_SCT_SPECIFIC 1 /* Command Specific Status */ 1926 #define NVME_CQE_SCT_INTEGRITY 2 /* Media and Data Integrity Errors */ 1927 #define NVME_CQE_SCT_PATH 3 /* Path Related Status (1.4) */ 1928 #define NVME_CQE_SCT_VENDOR 7 /* Vendor Specific */ 1929 1930 /* 1931 * Status code ranges 1932 */ 1933 #define NVME_CQE_SC_GEN_MIN 0x00 1934 #define NVME_CQE_SC_GEN_MAX 0x7f 1935 #define NVME_CQE_SC_CSI_MIN 0x80 1936 #define NVME_CQE_SC_CSI_MAX 0xbf 1937 #define NVME_CQE_SC_VEND_MIN 0xc0 1938 #define NVME_CQE_SC_VEND_MAX 0xff 1939 1940 /* NVMe completion status code (generic) */ 1941 #define NVME_CQE_SC_GEN_SUCCESS 0x0 /* Successful Completion */ 1942 #define NVME_CQE_SC_GEN_INV_OPC 0x1 /* Invalid Command Opcode */ 1943 #define NVME_CQE_SC_GEN_INV_FLD 0x2 /* Invalid Field in Command */ 1944 #define NVME_CQE_SC_GEN_ID_CNFL 0x3 /* Command ID Conflict */ 1945 #define NVME_CQE_SC_GEN_DATA_XFR_ERR 0x4 /* Data Transfer Error */ 1946 #define NVME_CQE_SC_GEN_ABORT_PWRLOSS 0x5 /* Cmds Aborted / Pwr Loss */ 1947 #define NVME_CQE_SC_GEN_INTERNAL_ERR 0x6 /* Internal Error */ 1948 #define NVME_CQE_SC_GEN_ABORT_REQUEST 0x7 /* Command Abort Requested */ 1949 #define NVME_CQE_SC_GEN_ABORT_SQ_DEL 0x8 /* Cmd Aborted / SQ deletion */ 1950 #define NVME_CQE_SC_GEN_ABORT_FUSE_FAIL 0x9 /* Cmd Aborted / Failed Fused */ 1951 #define NVME_CQE_SC_GEN_ABORT_FUSE_MISS 0xa /* Cmd Aborted / Missing Fusd */ 1952 #define NVME_CQE_SC_GEN_INV_NS 0xb /* Inval Namespace or Format */ 1953 #define NVME_CQE_SC_GEN_CMD_SEQ_ERR 0xc /* Command Sequence Error */ 1954 #define NVME_CQE_SC_GEN_INV_SGL_LAST 0xd /* Inval SGL Last Seg Desc */ 1955 #define NVME_CQE_SC_GEN_INV_SGL_NUM 0xe /* Inval Number of SGL Desc */ 1956 #define NVME_CQE_SC_GEN_INV_DSGL_LEN 0xf /* Data SGL Length Invalid */ 1957 #define NVME_CQE_SC_GEN_INV_MSGL_LEN 0x10 /* Metadata SGL Length Inval */ 1958 #define NVME_CQE_SC_GEN_INV_SGL_DESC 0x11 /* SGL Descriptor Type Inval */ 1959 /* Added in NVMe 1.2 */ 1960 #define NVME_CQE_SC_GEN_INV_USE_CMB 0x12 /* Inval use of Ctrl Mem Buf */ 1961 #define NVME_CQE_SC_GEN_INV_PRP_OFF 0x13 /* PRP Offset Invalid */ 1962 #define NVME_CQE_SC_GEN_AWU_EXCEEDED 0x14 /* Atomic Write Unit Exceeded */ 1963 #define NVME_CQE_SC_GEN_OP_DENIED 0x15 /* Operation Denied */ 1964 #define NVME_CQE_SC_GEN_INV_SGL_OFF 0x16 /* SGL Offset Invalid */ 1965 #define NVME_CQE_SC_GEN_INV_SGL_ST 0x17 /* SGL Sub type Invalid */ 1966 #define NVME_CQE_SC_GEN_INCON_HOSTID 0x18 /* Host ID Inconsistent fmt */ 1967 #define NVME_CQE_SC_GEN_KA_EXP 0x19 /* Keep Alive Timer Expired */ 1968 #define NVME_CQE_SC_GEN_INV_KA_TO 0x1a /* Keep Alive Timeout Invalid */ 1969 /* Added in NVMe 1.3 */ 1970 #define NVME_CQE_SC_GEN_ABORT_PREEMPT 0x1b /* Cmd aborted due to preempt */ 1971 #define NVME_CQE_SC_GEN_SANITIZE_FAIL 0x1c /* Sanitize Failed */ 1972 #define NVME_CQE_SC_GEN_SANITIZING 0x1d /* Sanitize in Progress */ 1973 #define NVME_CQE_SC_GEN_INV_SGL_GRAN 0x1e /* SGL Data Block Gran. Inval */ 1974 #define NVME_CQE_SC_GEN_NO_CMD_Q_CMD 0x1f /* Command not sup for CMB Q */ 1975 /* Added in NVMe 1.4 */ 1976 #define NVME_CQE_SC_GEN_NS_RDONLY 0x20 /* Namespace is write prot. */ 1977 #define NVME_CQE_SC_GEN_CMD_INTR 0x21 /* Command Interrupted */ 1978 #define NVME_CQE_SC_GEN_TRANSIENT 0x22 /* Transient Transport Error */ 1979 /* Added in NVMe 2.0 */ 1980 #define NVME_CQE_SC_GEN_CMD_LOCK 0x23 /* Command/Feature Lockdown */ 1981 #define NVME_CQE_SC_ADM_MEDIA_NR 0x24 /* Admin Cmd Media Not Ready */ 1982 1983 /* NVMe completion status code (generic NVM commands) */ 1984 #define NVME_CQE_SC_GEN_NVM_LBA_RANGE 0x80 /* LBA Out Of Range */ 1985 #define NVME_CQE_SC_GEN_NVM_CAP_EXC 0x81 /* Capacity Exceeded */ 1986 #define NVME_CQE_SC_GEN_NVM_NS_NOTRDY 0x82 /* Namespace Not Ready */ 1987 #define NVME_CQE_SC_GEN_NVM_RSV_CNFLCT 0x83 /* Reservation Conflict */ 1988 #define NVME_CQE_SC_GEN_NVM_FORMATTING 0x84 /* Format in progress (1.2) */ 1989 /* Added in NVMe 2.0 */ 1990 #define NVME_CQE_SC_GEN_KEY_INV_VAL 0x85 /* Invalid value size */ 1991 #define NVME_CQE_SC_GEN_KEY_INV_KEY 0x86 /* Invalid key size */ 1992 #define NVME_CQE_SC_GEN_KEY_ENOENT 0x87 /* KV Key Does Not Exist */ 1993 #define NVME_CQE_SC_GEN_KEY_UNRECOV 0x88 /* Unrecovered Error */ 1994 #define NVME_CQE_SC_GEN_KEY_EXISTS 0x89 /* Key already exists */ 1995 1996 /* NVMe completion status code (command specific) */ 1997 #define NVME_CQE_SC_SPC_INV_CQ 0x0 /* Completion Queue Invalid */ 1998 #define NVME_CQE_SC_SPC_INV_QID 0x1 /* Invalid Queue Identifier */ 1999 #define NVME_CQE_SC_SPC_MAX_QSZ_EXC 0x2 /* Max Queue Size Exceeded */ 2000 #define NVME_CQE_SC_SPC_ABRT_CMD_EXC 0x3 /* Abort Cmd Limit Exceeded */ 2001 #define NVME_CQE_SC_SPC_ASYNC_EVREQ_EXC 0x5 /* Async Event Request Limit */ 2002 #define NVME_CQE_SC_SPC_INV_FW_SLOT 0x6 /* Invalid Firmware Slot */ 2003 #define NVME_CQE_SC_SPC_INV_FW_IMG 0x7 /* Invalid Firmware Image */ 2004 #define NVME_CQE_SC_SPC_INV_INT_VECT 0x8 /* Invalid Interrupt Vector */ 2005 #define NVME_CQE_SC_SPC_INV_LOG_PAGE 0x9 /* Invalid Log Page */ 2006 #define NVME_CQE_SC_SPC_INV_FORMAT 0xa /* Invalid Format */ 2007 #define NVME_CQE_SC_SPC_FW_RESET 0xb /* FW Application Reset Reqd */ 2008 #define NVME_CQE_SC_SPC_INV_Q_DEL 0xc /* Invalid Queue Deletion */ 2009 #define NVME_CQE_SC_SPC_FEAT_SAVE 0xd /* Feature Id Not Saveable */ 2010 #define NVME_CQE_SC_SPC_FEAT_CHG 0xe /* Feature Not Changeable */ 2011 #define NVME_CQE_SC_SPC_FEAT_NS_SPEC 0xf /* Feature Not Namespace Spec */ 2012 /* Added in NVMe 1.2 */ 2013 #define NVME_CQE_SC_SPC_FW_NSSR 0x10 /* FW Application NSSR Reqd */ 2014 #define NVME_CQE_SC_SPC_FW_NEXT_RESET 0x11 /* FW Application Next Reqd */ 2015 #define NVME_CQE_SC_SPC_FW_MTFA 0x12 /* FW Application Exceed MTFA */ 2016 #define NVME_CQE_SC_SPC_FW_PROHIBITED 0x13 /* FW Application Prohibited */ 2017 #define NVME_CQE_SC_SPC_FW_OVERLAP 0x14 /* Overlapping FW ranges */ 2018 #define NVME_CQE_SC_SPC_NS_INSUF_CAP 0x15 /* NS Insufficient Capacity */ 2019 #define NVME_CQE_SC_SPC_NS_NO_ID 0x16 /* NS ID Unavailable */ 2020 /* 0x17 is reserved */ 2021 #define NVME_CQE_SC_SPC_NS_ATTACHED 0x18 /* NS Already Attached */ 2022 #define NVME_CQE_SC_SPC_NS_PRIV 0x19 /* NS is private */ 2023 #define NVME_CQE_SC_SPC_NS_NOT_ATTACH 0x1a /* NS Not Attached */ 2024 #define NVME_CQE_SC_SPC_THIN_ENOTSUP 0x1b /* Thin Provisioning ENOTSUP */ 2025 #define NVME_CQE_SC_SPC_INV_CTRL_LIST 0x1c /* Controller list invalid */ 2026 /* Added in NVMe 1.3 */ 2027 #define NVME_CQE_SC_SPC_SELF_TESTING 0x1d /* Self-test in progress */ 2028 #define NVME_CQE_SC_SPC_NO_BP_WRITE 0x1e /* No Boot Partition Write */ 2029 #define NVME_CQE_SC_SPC_INV_CTRL_ID 0x1f /* Invalid Controller Id */ 2030 #define NVME_CQE_SC_SPC_INV_SEC_CTRL 0x20 /* Invalid Sec. Ctrl state */ 2031 #define NVME_CQE_SC_SPC_INV_CTRL_NRSRC 0x21 /* Inv. # Ctrl Resources */ 2032 #define NVME_CQE_SC_SPC_INV_RSRC_ID 0x22 /* Inv. Resource ID */ 2033 /* Added in NVMe 1.4 */ 2034 #define NVME_CQE_SC_SPC_NO_SAN_PMR 0x23 /* Sanitize prohib. w/ pmem */ 2035 #define NVME_CQE_SC_SPC_INV_ANA_GID 0x24 /* Invalid ANA group ID */ 2036 #define NVME_CQE_SC_SPC_ANA_ATTACH 0x25 /* ANA Attach Failed */ 2037 /* Added in NVMe 2.0 */ 2038 #define NVME_CQE_SC_SPC_INSUF_CAP 0x26 /* Insufficient Capacity */ 2039 #define NVME_CQE_SC_SPC_NS_ATTACH_LIM 0x27 /* NS Attach Limit Exceeded */ 2040 #define NVME_CQE_SC_SPC_LOCKDOWN_UNSUP 0x28 /* Prohib Cmd Exec Not Sup */ 2041 #define NVME_CQE_SC_SPC_UNSUP_IO_CMD 0x29 /* I/O Command set not sup */ 2042 #define NVME_CQE_SC_SPC_DIS_IO_CMD 0x2a /* I/O Command set not enab */ 2043 #define NVME_CQE_SC_SPC_INV_CMD_COMBO 0x2b /* I/O command set combo rej */ 2044 #define NVME_CQE_SC_SPC_INV_IO_CMD 0x2c /* Invalid I/O command set */ 2045 #define NVME_CQE_SC_SPC_UNAVAIL_ID 0x2d /* Unavailable ID */ 2046 2047 2048 /* NVMe completion status code (I/O command specific) */ 2049 #define NVME_CQE_SC_SPC_NVM_CNFL_ATTR 0x80 /* Conflicting Attributes */ 2050 #define NVME_CQE_SC_SPC_NVM_INV_PROT 0x81 /* Invalid Protection */ 2051 #define NVME_CQE_SC_SPC_NVM_READONLY 0x82 /* Write to Read Only Range */ 2052 /* Added in 2.0 */ 2053 #define NVME_CQE_SC_SPC_IO_LIMIT 0x83 /* Cmd Size Limit Exceeded */ 2054 /* 0x84 to 0xb7 are reserved */ 2055 #define NVME_CQE_SC_SPC_ZONE_BDRY_ERR 0xb8 /* Zoned Boundary Error */ 2056 #define NVME_CQE_SC_SPC_ZONE_FULL 0xb9 /* Zone is Full */ 2057 #define NVME_CQE_SC_SPC_ZONE_RDONLY 0xba /* Zone is Read Only */ 2058 #define NVME_CQE_SC_SPC_ZONE_OFFLINE 0xbb /* Zone is Offline */ 2059 #define NVME_CQE_SC_SPC_ZONE_INV_WRITE 0xbc /* Zone Invalid Write */ 2060 #define NVME_CQE_SC_SPC_ZONE_ACT 0xbd /* Too May Active Zones */ 2061 #define NVME_CQE_SC_SPC_ZONE_OPEN 0xbe /* Too May Open Zones */ 2062 #define NVME_CQE_SC_SPC_INV_ZONE_TRANS 0xbf /* Invalid Zone State Trans */ 2063 2064 /* NVMe completion status code (data / metadata integrity) */ 2065 #define NVME_CQE_SC_INT_NVM_WRITE 0x80 /* Write Fault */ 2066 #define NVME_CQE_SC_INT_NVM_READ 0x81 /* Unrecovered Read Error */ 2067 #define NVME_CQE_SC_INT_NVM_GUARD 0x82 /* Guard Check Error */ 2068 #define NVME_CQE_SC_INT_NVM_APPL_TAG 0x83 /* Application Tag Check Err */ 2069 #define NVME_CQE_SC_INT_NVM_REF_TAG 0x84 /* Reference Tag Check Err */ 2070 #define NVME_CQE_SC_INT_NVM_COMPARE 0x85 /* Compare Failure */ 2071 #define NVME_CQE_SC_INT_NVM_ACCESS 0x86 /* Access Denied */ 2072 /* Added in 1.2 */ 2073 #define NVME_CQE_SC_INT_NVM_DEALLOC 0x87 /* Dealloc Log Block */ 2074 /* Added in 2.0 */ 2075 #define NVME_CQE_SC_INT_NVM_TAG 0x88 /* End-to-End Storage Tag Err */ 2076 2077 /* NVMe completion status code (path related) */ 2078 /* Added in NVMe 1.4 */ 2079 #define NVME_CQE_SC_PATH_INT_ERR 0x00 /* Internal Path Error */ 2080 #define NVME_CQE_SC_PATH_AA_PLOSS 0x01 /* Asym Access Pers Loss */ 2081 #define NVME_CQE_SC_PATH_AA_INACC 0x02 /* Asym Access Inaccessible */ 2082 #define NVME_CQE_SC_PATH_AA_TRANS 0x03 /* Asym Access Transition */ 2083 #define NVME_CQE_SC_PATH_CTRL_ERR 0x60 /* Controller Path Error */ 2084 #define NVME_CQE_SC_PATH_HOST_ERR 0x70 /* Host Path Error */ 2085 #define NVME_CQE_SC_PATH_HOST_ABRT 0x71 /* Cmd aborted by host */ 2086 2087 /* 2088 * Controller information (NVME_IOC_CTRL_INFO). This is a consolidation of misc. 2089 * information that we want to know about a controller. 2090 */ 2091 typedef struct { 2092 nvme_ioctl_common_t nci_common; 2093 nvme_identify_ctrl_t nci_ctrl_id; 2094 nvme_identify_nsid_t nci_common_ns; 2095 nvme_version_t nci_vers; 2096 nvme_capabilities_t nci_caps; 2097 uint32_t nci_nintrs; 2098 } nvme_ioctl_ctrl_info_t; 2099 2100 /* 2101 * NVME namespace states. 2102 * 2103 * The values are defined entirely by the driver. Some states correspond to 2104 * namespace states described by the NVMe specification r1.3 section 6.1, others 2105 * are specific to the implementation of this driver. These are present in the 2106 * nvme_ns_kinfo_t that is used with the NVME_IOC_NS_INFO ioctl. Devices that 2107 * support Namespace Management have the ability to transition through these 2108 * states directly. Devices without it may be able to have namespaces in these 2109 * states depending on the version. 2110 * 2111 * The states are as follows: 2112 * - UNALLOCATED: The namespace ID exists, but has no corresponding NVM 2113 * allocation as per the NVMe spec. It leaves this state with an NVMe 2114 * Namespace Management NS create command: NVME_IOC_NS_CREATE. 2115 * 2116 * - ALLOCATED: The namespace exists in the controller as per the NVMe spec. It 2117 * becomes ACTIVE (or IGNORED) by performing a controller attach comand: 2118 * NVME_IOC_CTRL_ATTACH. It becomes unallocated by performing an NVMe 2119 * Namespace Management NS delete command: NVME_IOC_NS_DELETE. 2120 * 2121 * - ACTIVE: The namespace exists and is attached to this controller as per the 2122 * NVMe spec. From the hardware's perspective the namespace is usable. 2123 * 2124 * Not all namespaces are supported by the kernel. For example, a namespace 2125 * may use features that the NVMe device driver does not support such as 2126 * end-to-end data protection features or a different command set. 2127 * 2128 * When a namespace enters the active state, we will immediately evaluate 2129 * whether or not we can support a block device (via blkdev(4D)) on this 2130 * namespace. If we can, then we will immediately advance to the NOT_IGNORED 2131 * state. Otherwise, to transition to the NOT_IGNORED state, the namespace 2132 * must be formatted with the FORMAT NVM command with supported settings. The 2133 * namespace can transition back to the ALLOCATED state by performing a 2134 * NVME_IOC_CTRL_DETACH ioctl. 2135 * 2136 * - NOT_IGNORED: The namespace is active from the controller perspective and is 2137 * formatted with settings that would support blkdev(4D) being attached; 2138 * however, there is no blkdev(4D) instance currently attached. A device 2139 * transitions from the NOT_IGNORED to the ATTACHED state by actively 2140 * attaching a blkdev(4D) instance to the namespace through the 2141 * NVME_IOC_BD_ATTACH ioctl. A namespace can transition back to the ACTIVE 2142 * state by issuing a FORMAT NVM command with unsupported settings. It can 2143 * also go to the ALLOCATED state by performing the NVME_IOC_CTRL_DETACH 2144 * ioctl. 2145 * 2146 * - ATTACHED: the driver has attached a blkdev(4D) instance to this namespace 2147 * and it is usable as a block device. Certain operations such as a FORMAT NVM 2148 * or similar are rejected during this state. The device can go back to ACTIVE 2149 * with the NVME_IOC_BD_DETACH ioctl. 2150 */ 2151 typedef enum { 2152 NVME_NS_STATE_UNALLOCATED = 0, 2153 NVME_NS_STATE_ALLOCATED, 2154 NVME_NS_STATE_ACTIVE, 2155 NVME_NS_STATE_NOT_IGNORED, 2156 NVME_NS_STATE_ATTACHED 2157 } nvme_ns_state_t; 2158 2159 #define NVME_NS_NSTATES 5 2160 2161 /* 2162 * This is the maximum length of the NVMe namespace's blkdev address. This is 2163 * only valid in the structure with the NVME_NS_STATE_ATTACHED flag is set. 2164 * Otherwise the entry will be all zeros. This is useful when you need to 2165 * determine what the corresponding blkdev instance in libdevinfo for the 2166 * device. 2167 */ 2168 #define NVME_BLKDEV_NAMELEN 128 2169 2170 /* 2171 * Namespace Information (NVME_IOC_NS_INFO). 2172 */ 2173 typedef struct { 2174 nvme_ioctl_common_t nni_common; 2175 nvme_ns_state_t nni_state; 2176 char nni_addr[NVME_BLKDEV_NAMELEN]; 2177 nvme_identify_nsid_t nni_id; 2178 } nvme_ioctl_ns_info_t; 2179 2180 /* 2181 * NVMe Command Set Identifiers. This was added in NVMe 2.0, but in all the 2182 * places it was required to be specified, the default value of 0 indicates the 2183 * traditional NVM command set. 2184 */ 2185 typedef enum { 2186 NVME_CSI_NVM = 0, 2187 NVME_CSI_KV, 2188 NVME_CSI_ZNS 2189 } nvme_csi_t; 2190 2191 #ifdef __cplusplus 2192 } 2193 #endif 2194 2195 #endif /* _SYS_NVME_H */ 2196