Home | History | Annotate | Line # | Download | only in ic
      1  1.19    andvar /*	$NetBSD: nvmereg.h,v 1.19 2022/10/12 20:50:43 andvar Exp $	*/
      2   1.1    nonaka /*	$OpenBSD: nvmereg.h,v 1.10 2016/04/14 11:18:32 dlg Exp $ */
      3   1.1    nonaka 
      4   1.1    nonaka /*
      5   1.1    nonaka  * Copyright (c) 2014 David Gwynne <dlg (at) openbsd.org>
      6   1.1    nonaka  *
      7   1.1    nonaka  * Permission to use, copy, modify, and distribute this software for any
      8   1.1    nonaka  * purpose with or without fee is hereby granted, provided that the above
      9   1.1    nonaka  * copyright notice and this permission notice appear in all copies.
     10   1.1    nonaka  *
     11   1.1    nonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12   1.1    nonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13   1.1    nonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14   1.1    nonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15   1.1    nonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16   1.1    nonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17   1.1    nonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18   1.1    nonaka  */
     19   1.1    nonaka 
     20   1.2    nonaka #ifndef	__NVMEREG_H__
     21   1.2    nonaka #define	__NVMEREG_H__
     22   1.2    nonaka 
     23  1.10    nonaka #ifndef	NVME_CTASSERT
     24  1.10    nonaka #define	NVME_CTASSERT(x, s)	__CTASSERT(x)
     25  1.10    nonaka #endif
     26  1.10    nonaka 
     27   1.1    nonaka #define NVME_CAP	0x0000	/* Controller Capabilities */
     28   1.1    nonaka #define  NVME_CAP_MPSMAX(_r)	(12 + (((_r) >> 52) & 0xf)) /* shift */
     29   1.1    nonaka #define  NVME_CAP_MPSMIN(_r)	(12 + (((_r) >> 48) & 0xf)) /* shift */
     30   1.1    nonaka #define  NVME_CAP_CSS(_r)	(((_r) >> 37) & 0x7f)
     31   1.1    nonaka #define  NVME_CAP_CSS_NVM	__BIT(0)
     32   1.1    nonaka #define  NVME_CAP_NSSRS(_r)	ISSET((_r), __BIT(36))
     33   1.1    nonaka #define  NVME_CAP_DSTRD(_r)	__BIT(2 + (((_r) >> 32) & 0xf)) /* bytes */
     34   1.1    nonaka #define  NVME_CAP_TO(_r)	(500 * (((_r) >> 24) & 0xff)) /* ms */
     35   1.1    nonaka #define  NVME_CAP_AMS(_r)	(((_r) >> 17) & 0x3)
     36   1.1    nonaka #define  NVME_CAP_AMS_WRR	__BIT(0)
     37   1.1    nonaka #define  NVME_CAP_AMS_VENDOR	__BIT(1)
     38   1.1    nonaka #define  NVME_CAP_CQR(_r)	ISSET((_r), __BIT(16))
     39   1.1    nonaka #define  NVME_CAP_MQES(_r)	(((_r) & 0xffff) + 1)
     40   1.1    nonaka #define NVME_CAP_LO	0x0000
     41   1.1    nonaka #define NVME_CAP_HI	0x0004
     42   1.1    nonaka #define NVME_VS		0x0008	/* Version */
     43   1.1    nonaka #define  NVME_VS_MJR(_r)	(((_r) >> 16) & 0xffff)
     44   1.9    nonaka #define  NVME_VS_MNR(_r)	(((_r) >> 8) & 0xff)
     45   1.9    nonaka #define  NVME_VS_TER(_r)	((_r) & 0xff)
     46   1.1    nonaka #define NVME_INTMS	0x000c	/* Interrupt Mask Set */
     47   1.1    nonaka #define NVME_INTMC	0x0010	/* Interrupt Mask Clear */
     48   1.1    nonaka #define NVME_CC		0x0014	/* Controller Configuration */
     49   1.1    nonaka #define  NVME_CC_IOCQES(_v)	(((_v) & 0xf) << 20)
     50   1.1    nonaka #define  NVME_CC_IOCQES_MASK	NVME_CC_IOCQES(0xf)
     51   1.1    nonaka #define  NVME_CC_IOCQES_R(_v)	(((_v) >> 20) & 0xf)
     52   1.1    nonaka #define  NVME_CC_IOSQES(_v)	(((_v) & 0xf) << 16)
     53   1.1    nonaka #define  NVME_CC_IOSQES_MASK	NVME_CC_IOSQES(0xf)
     54   1.1    nonaka #define  NVME_CC_IOSQES_R(_v)	(((_v) >> 16) & 0xf)
     55   1.1    nonaka #define  NVME_CC_SHN(_v)	(((_v) & 0x3) << 14)
     56   1.1    nonaka #define  NVME_CC_SHN_MASK	NVME_CC_SHN(0x3)
     57   1.1    nonaka #define  NVME_CC_SHN_R(_v)	(((_v) >> 15) & 0x3)
     58   1.1    nonaka #define  NVME_CC_SHN_NONE	0
     59   1.1    nonaka #define  NVME_CC_SHN_NORMAL	1
     60   1.1    nonaka #define  NVME_CC_SHN_ABRUPT	2
     61   1.1    nonaka #define  NVME_CC_AMS(_v)	(((_v) & 0x7) << 11)
     62   1.1    nonaka #define  NVME_CC_AMS_MASK	NVME_CC_AMS(0x7)
     63   1.1    nonaka #define  NVME_CC_AMS_R(_v)	(((_v) >> 11) & 0xf)
     64   1.1    nonaka #define  NVME_CC_AMS_RR		0 /* round-robin */
     65   1.1    nonaka #define  NVME_CC_AMS_WRR_U	1 /* weighted round-robin w/ urgent */
     66   1.1    nonaka #define  NVME_CC_AMS_VENDOR	7 /* vendor */
     67   1.1    nonaka #define  NVME_CC_MPS(_v)	((((_v) - 12) & 0xf) << 7)
     68   1.1    nonaka #define  NVME_CC_MPS_MASK	(0xf << 7)
     69   1.1    nonaka #define  NVME_CC_MPS_R(_v)	(12 + (((_v) >> 7) & 0xf))
     70   1.1    nonaka #define  NVME_CC_CSS(_v)	(((_v) & 0x7) << 4)
     71   1.1    nonaka #define  NVME_CC_CSS_MASK	NVME_CC_CSS(0x7)
     72   1.1    nonaka #define  NVME_CC_CSS_R(_v)	(((_v) >> 4) & 0x7)
     73   1.1    nonaka #define  NVME_CC_CSS_NVM	0
     74   1.1    nonaka #define  NVME_CC_EN		__BIT(0)
     75   1.1    nonaka #define NVME_CSTS	0x001c	/* Controller Status */
     76   1.1    nonaka #define  NVME_CSTS_SHST_MASK	(0x3 << 2)
     77   1.1    nonaka #define  NVME_CSTS_SHST_NONE	(0x0 << 2) /* normal operation */
     78   1.1    nonaka #define  NVME_CSTS_SHST_WAIT	(0x1 << 2) /* shutdown processing occurring */
     79   1.1    nonaka #define  NVME_CSTS_SHST_DONE	(0x2 << 2) /* shutdown processing complete */
     80  1.16     skrll #define  NVME_CSTS_CFS		__BIT(1)
     81  1.16     skrll #define  NVME_CSTS_RDY		__BIT(0)
     82   1.1    nonaka #define NVME_NSSR	0x0020	/* NVM Subsystem Reset (Optional) */
     83   1.1    nonaka #define NVME_AQA	0x0024	/* Admin Queue Attributes */
     84   1.1    nonaka 				/* Admin Completion Queue Size */
     85   1.1    nonaka #define  NVME_AQA_ACQS(_v)	(((_v) - 1) << 16)
     86  1.16     skrll #define  NVME_AQA_ACQS_R(_v)	((_v >> 16) & (__BIT(12) - 1))
     87   1.1    nonaka 				/* Admin Submission Queue Size */
     88   1.1    nonaka #define  NVME_AQA_ASQS(_v)	(((_v) - 1) << 0)
     89  1.16     skrll #define  NVME_AQA_ASQS_R(_v)	(_v & (__BIT(12) - 1))
     90   1.1    nonaka #define NVME_ASQ	0x0028	/* Admin Submission Queue Base Address */
     91   1.1    nonaka #define NVME_ACQ	0x0030	/* Admin Completion Queue Base Address */
     92   1.1    nonaka 
     93   1.1    nonaka #define NVME_ADMIN_Q		0
     94   1.1    nonaka /* Submission Queue Tail Doorbell */
     95   1.1    nonaka #define NVME_SQTDBL(_q, _s)	(0x1000 + (2 * (_q) + 0) * (_s))
     96   1.1    nonaka /* Completion Queue Head Doorbell */
     97   1.1    nonaka #define NVME_CQHDBL(_q, _s)	(0x1000 + (2 * (_q) + 1) * (_s))
     98   1.1    nonaka 
     99   1.1    nonaka struct nvme_sge {
    100   1.1    nonaka 	uint8_t		id;
    101   1.1    nonaka 	uint8_t		_reserved[15];
    102   1.1    nonaka } __packed __aligned(8);
    103  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sge) == 16, "bad size for nvme_sge");
    104   1.1    nonaka 
    105   1.1    nonaka struct nvme_sge_data {
    106   1.1    nonaka 	uint8_t		id;
    107   1.1    nonaka 	uint8_t		_reserved[3];
    108   1.1    nonaka 
    109   1.1    nonaka 	uint32_t	length;
    110   1.1    nonaka 
    111   1.1    nonaka 	uint64_t	address;
    112   1.1    nonaka } __packed __aligned(8);
    113  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sge_data) == 16, "bad size for nvme_sge_data");
    114   1.1    nonaka 
    115   1.1    nonaka struct nvme_sge_bit_bucket {
    116   1.1    nonaka 	uint8_t		id;
    117   1.1    nonaka 	uint8_t		_reserved[3];
    118   1.1    nonaka 
    119   1.1    nonaka 	uint32_t	length;
    120   1.1    nonaka 
    121   1.1    nonaka 	uint64_t	address;
    122   1.1    nonaka } __packed __aligned(8);
    123  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sge_bit_bucket) == 16, "bad size for nvme_sge_bit_bucket");
    124   1.1    nonaka 
    125   1.1    nonaka struct nvme_sqe {
    126   1.1    nonaka 	uint8_t		opcode;
    127   1.1    nonaka 	uint8_t		flags;
    128   1.1    nonaka 	uint16_t	cid;
    129   1.1    nonaka 
    130   1.1    nonaka 	uint32_t	nsid;
    131   1.1    nonaka 
    132   1.1    nonaka 	uint8_t		_reserved[8];
    133   1.1    nonaka 
    134   1.1    nonaka 	uint64_t	mptr;
    135   1.1    nonaka 
    136   1.1    nonaka 	union {
    137   1.1    nonaka 		uint64_t	prp[2];
    138   1.1    nonaka 		struct nvme_sge	sge;
    139  1.14       mrg 	} entry;
    140   1.1    nonaka 
    141   1.1    nonaka 	uint32_t	cdw10;
    142   1.1    nonaka 	uint32_t	cdw11;
    143   1.1    nonaka 	uint32_t	cdw12;
    144   1.1    nonaka 	uint32_t	cdw13;
    145   1.1    nonaka 	uint32_t	cdw14;
    146   1.1    nonaka 	uint32_t	cdw15;
    147   1.1    nonaka } __packed __aligned(8);
    148  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sqe) == 64, "bad size for nvme_sqe");
    149   1.1    nonaka 
    150   1.1    nonaka struct nvme_sqe_q {
    151   1.1    nonaka 	uint8_t		opcode;
    152   1.1    nonaka 	uint8_t		flags;
    153   1.1    nonaka 	uint16_t	cid;
    154   1.1    nonaka 
    155   1.1    nonaka 	uint8_t		_reserved1[20];
    156   1.1    nonaka 
    157   1.1    nonaka 	uint64_t	prp1;
    158   1.1    nonaka 
    159   1.1    nonaka 	uint8_t		_reserved2[8];
    160   1.1    nonaka 
    161   1.1    nonaka 	uint16_t	qid;
    162   1.1    nonaka 	uint16_t	qsize;
    163   1.1    nonaka 
    164   1.1    nonaka 	uint8_t		qflags;
    165   1.1    nonaka #define NVM_SQE_SQ_QPRIO_URG	(0x0 << 1)
    166   1.1    nonaka #define NVM_SQE_SQ_QPRIO_HI	(0x1 << 1)
    167   1.1    nonaka #define NVM_SQE_SQ_QPRIO_MED	(0x2 << 1)
    168   1.1    nonaka #define NVM_SQE_SQ_QPRIO_LOW	(0x3 << 1)
    169  1.16     skrll #define NVM_SQE_CQ_IEN		__BIT(1)
    170  1.16     skrll #define NVM_SQE_Q_PC		__BIT(0)
    171   1.1    nonaka 	uint8_t		_reserved3;
    172   1.1    nonaka 	uint16_t	cqid; /* XXX interrupt vector for cq */
    173   1.1    nonaka 
    174   1.1    nonaka 	uint8_t		_reserved4[16];
    175   1.1    nonaka } __packed __aligned(8);
    176  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sqe_q) == 64, "bad size for nvme_sqe_q");
    177   1.1    nonaka 
    178   1.1    nonaka struct nvme_sqe_io {
    179   1.1    nonaka 	uint8_t		opcode;
    180   1.1    nonaka 	uint8_t		flags;
    181   1.1    nonaka 	uint16_t	cid;
    182   1.1    nonaka 
    183   1.1    nonaka 	uint32_t	nsid;
    184   1.1    nonaka 
    185   1.1    nonaka 	uint8_t		_reserved[8];
    186   1.1    nonaka 
    187   1.1    nonaka 	uint64_t	mptr;
    188   1.1    nonaka 
    189   1.1    nonaka 	union {
    190   1.1    nonaka 		uint64_t	prp[2];
    191   1.1    nonaka 		struct nvme_sge	sge;
    192  1.14       mrg 	} entry;
    193   1.1    nonaka 
    194   1.1    nonaka 	uint64_t	slba;	/* Starting LBA */
    195   1.1    nonaka 
    196   1.1    nonaka 	uint16_t	nlb;	/* Number of Logical Blocks */
    197   1.1    nonaka 	uint16_t	ioflags;
    198   1.6  jdolecek #define NVM_SQE_IO_LR	__BIT(15)	/* Limited Retry */
    199   1.4  jdolecek #define NVM_SQE_IO_FUA	__BIT(14)	/* Force Unit Access (bypass cache) */
    200   1.1    nonaka 
    201   1.1    nonaka 	uint8_t		dsm;	/* Dataset Management */
    202   1.6  jdolecek #define NVM_SQE_IO_INCOMP	__BIT(7)	/* Incompressible */
    203   1.6  jdolecek #define NVM_SQE_IO_SEQ		__BIT(6)	/* Sequential request */
    204   1.6  jdolecek #define NVM_SQE_IO_LAT_MASK	__BITS(4, 5)	/* Access Latency */
    205   1.6  jdolecek #define  NVM_SQE_IO_LAT_NONE	0		/* Latency: none */
    206   1.6  jdolecek #define  NVM_SQE_IO_LAT_IDLE	__BIT(4)	/* Latency: idle */
    207   1.6  jdolecek #define  NVM_SQE_IO_LAT_NORMAL	__BIT(5)	/* Latency: normal */
    208   1.6  jdolecek #define  NVM_SQE_IO_LAT_LOW	__BITS(4, 5)	/* Latency: low */
    209   1.6  jdolecek #define NVM_SQE_IO_FREQ_MASK	__BITS(0, 3)	/* Access Frequency */
    210   1.6  jdolecek #define  NVM_SQE_IO_FREQ_TYPICAL	0x1	/* Typical */
    211   1.6  jdolecek #define  NVM_SQE_IO_FREQ_INFR_INFW	0x2	/* Infrequent read and writes */
    212   1.6  jdolecek #define  NVM_SQE_IO_FREQ_FRR_INFW	0x3	/* Frequent read, inf. writes */
    213   1.6  jdolecek #define  NVM_SQE_IO_FREQ_INFR_FRW	0x4	/* Inf. read, freq. writes */
    214   1.6  jdolecek #define  NVM_SQE_IO_FREQ_FRR_FRW	0x5	/* Freq. read and writes */
    215   1.6  jdolecek #define  NVM_SQE_IO_FREQ_ONCE		0x6	/* One time i/o operation */
    216   1.6  jdolecek /* Extra Access Frequency bits for read operations */
    217  1.19    andvar #define  NVM_SQE_IO_FREQ_SPEC		0x7	/* Speculative read - prefetch */
    218   1.6  jdolecek #define  NVM_SQE_IO_FREQ_OVERWRITE	0x8	/* Will be overwritten soon */
    219   1.1    nonaka 	uint8_t		_reserved2[3];
    220   1.1    nonaka 
    221   1.1    nonaka 	uint32_t	eilbrt;	/* Expected Initial Logical Block
    222   1.1    nonaka 				   Reference Tag */
    223   1.1    nonaka 
    224   1.1    nonaka 	uint16_t	elbat;	/* Expected Logical Block
    225   1.1    nonaka 				   Application Tag */
    226   1.1    nonaka 	uint16_t	elbatm;	/* Expected Logical Block
    227   1.1    nonaka 				   Application Tag Mask */
    228   1.1    nonaka } __packed __aligned(8);
    229  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_sqe_io) == 64, "bad size for nvme_sqe_io");
    230   1.1    nonaka 
    231   1.1    nonaka struct nvme_cqe {
    232   1.1    nonaka 	uint32_t	cdw0;
    233   1.1    nonaka 
    234   1.1    nonaka 	uint32_t	_reserved;
    235   1.1    nonaka 
    236   1.1    nonaka 	uint16_t	sqhd; /* SQ Head Pointer */
    237   1.1    nonaka 	uint16_t	sqid; /* SQ Identifier */
    238   1.1    nonaka 
    239   1.1    nonaka 	uint16_t	cid; /* Command Identifier */
    240   1.1    nonaka 	uint16_t	flags;
    241   1.1    nonaka #define NVME_CQE_DNR		__BIT(15)
    242   1.1    nonaka #define NVME_CQE_M		__BIT(14)
    243  1.17   mlelstv #define NVME_CQE_SCT_MASK	__BITS(9, 11)
    244  1.17   mlelstv #define NVME_CQE_SCT(_f)	((_f) & NVME_CQE_SCT_MASK)
    245  1.18   mlelstv #define  NVME_CQE_SCT_GENERIC		(0x00 << 9)
    246  1.18   mlelstv #define  NVME_CQE_SCT_COMMAND		(0x01 << 9)
    247  1.18   mlelstv #define  NVME_CQE_SCT_MEDIAERR		(0x02 << 9)
    248  1.18   mlelstv #define  NVME_CQE_SCT_VENDOR		(0x07 << 9)
    249  1.17   mlelstv #define NVME_CQE_SC_MASK	__BITS(1, 8)
    250  1.17   mlelstv #define NVME_CQE_SC(_f)		((_f) & NVME_CQE_SC_MASK)
    251   1.3    nonaka /* generic command status codes */
    252   1.1    nonaka #define  NVME_CQE_SC_SUCCESS		(0x00 << 1)
    253   1.1    nonaka #define  NVME_CQE_SC_INVALID_OPCODE	(0x01 << 1)
    254   1.1    nonaka #define  NVME_CQE_SC_INVALID_FIELD	(0x02 << 1)
    255   1.1    nonaka #define  NVME_CQE_SC_CID_CONFLICT	(0x03 << 1)
    256   1.1    nonaka #define  NVME_CQE_SC_DATA_XFER_ERR	(0x04 << 1)
    257   1.1    nonaka #define  NVME_CQE_SC_ABRT_BY_NO_PWR	(0x05 << 1)
    258   1.1    nonaka #define  NVME_CQE_SC_INTERNAL_DEV_ERR	(0x06 << 1)
    259   1.1    nonaka #define  NVME_CQE_SC_CMD_ABRT_REQD	(0x07 << 1)
    260   1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_SQ_DEL	(0x08 << 1)
    261   1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_ERR	(0x09 << 1)
    262   1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_MISS	(0x0a << 1)
    263   1.1    nonaka #define  NVME_CQE_SC_INVALID_NS		(0x0b << 1)
    264   1.1    nonaka #define  NVME_CQE_SC_CMD_SEQ_ERR	(0x0c << 1)
    265   1.1    nonaka #define  NVME_CQE_SC_INVALID_LAST_SGL	(0x0d << 1)
    266   1.1    nonaka #define  NVME_CQE_SC_INVALID_NUM_SGL	(0x0e << 1)
    267   1.1    nonaka #define  NVME_CQE_SC_DATA_SGL_LEN	(0x0f << 1)
    268   1.1    nonaka #define  NVME_CQE_SC_MDATA_SGL_LEN	(0x10 << 1)
    269   1.1    nonaka #define  NVME_CQE_SC_SGL_TYPE_INVALID	(0x11 << 1)
    270   1.1    nonaka #define  NVME_CQE_SC_LBA_RANGE		(0x80 << 1)
    271   1.1    nonaka #define  NVME_CQE_SC_CAP_EXCEEDED	(0x81 << 1)
    272   1.3    nonaka #define  NVME_CQE_SC_NS_NOT_RDY		(0x82 << 1)
    273   1.3    nonaka #define  NVME_CQE_SC_RSV_CONFLICT	(0x83 << 1)
    274   1.3    nonaka /* command specific status codes */
    275   1.3    nonaka #define  NVME_CQE_SC_CQE_INVALID	(0x00 << 1)
    276   1.3    nonaka #define  NVME_CQE_SC_INVALID_QID	(0x01 << 1)
    277   1.3    nonaka #define  NVME_CQE_SC_MAX_Q_SIZE		(0x02 << 1)
    278   1.3    nonaka #define  NVME_CQE_SC_ABORT_LIMIT	(0x03 << 1)
    279   1.3    nonaka #define  NVME_CQE_SC_ASYNC_EV_REQ_LIMIT	(0x05 << 1)
    280   1.3    nonaka #define  NVME_CQE_SC_INVALID_FW_SLOT	(0x06 << 1)
    281   1.3    nonaka #define  NVME_CQE_SC_INVALID_FW_IMAGE	(0x07 << 1)
    282   1.3    nonaka #define  NVME_CQE_SC_INVALID_INT_VEC	(0x08 << 1)
    283   1.3    nonaka #define  NVME_CQE_SC_INVALID_LOG_PAGE	(0x09 << 1)
    284   1.3    nonaka #define  NVME_CQE_SC_INVALID_FORMAT	(0x0a << 1)
    285   1.3    nonaka #define  NVME_CQE_SC_FW_REQ_CNV_RESET	(0x0b << 1)
    286   1.3    nonaka #define  NVME_CQE_SC_FW_REQ_NVM_RESET	(0x10 << 1)
    287   1.3    nonaka #define  NVME_CQE_SC_FW_REQ_RESET	(0x11 << 1)
    288   1.3    nonaka #define  NVME_CQE_SC_FW_MAX_TIME_VIO	(0x12 << 1)
    289   1.3    nonaka #define  NVME_CQE_SC_FW_PROHIBIT	(0x13 << 1)
    290   1.3    nonaka #define  NVME_CQE_SC_OVERLAP_RANGE	(0x14 << 1)
    291   1.3    nonaka #define  NVME_CQE_SC_CONFLICT_ATTRS	(0x80 << 1)
    292   1.3    nonaka #define  NVME_CQE_SC_INVALID_PROT_INFO	(0x81 << 1)
    293   1.3    nonaka #define  NVME_CQE_SC_ATT_WR_TO_RO_PAGE	(0x82 << 1)
    294   1.3    nonaka /* media error status codes */
    295   1.3    nonaka #define  NVME_CQE_SC_WRITE_FAULTS	(0x80 << 1)
    296   1.3    nonaka #define  NVME_CQE_SC_UNRECV_READ_ERR	(0x81 << 1)
    297   1.3    nonaka #define  NVME_CQE_SC_GUARD_CHECK_ERR	(0x82 << 1)
    298   1.3    nonaka #define  NVME_CQE_SC_APPL_TAG_CHECK_ERR	(0x83 << 1)
    299   1.3    nonaka #define  NVME_CQE_SC_REF_TAG_CHECK_ERR	(0x84 << 1)
    300   1.3    nonaka #define  NVME_CQE_SC_CMP_FAIL		(0x85 << 1)
    301   1.3    nonaka #define  NVME_CQE_SC_ACCESS_DENIED	(0x86 << 1)
    302   1.1    nonaka #define NVME_CQE_PHASE		__BIT(0)
    303   1.1    nonaka } __packed __aligned(8);
    304  1.10    nonaka NVME_CTASSERT(sizeof(struct nvme_cqe) == 16, "bad size for nvme_cqe");
    305   1.1    nonaka 
    306   1.1    nonaka #define NVM_ADMIN_DEL_IOSQ	0x00 /* Delete I/O Submission Queue */
    307   1.1    nonaka #define NVM_ADMIN_ADD_IOSQ	0x01 /* Create I/O Submission Queue */
    308   1.1    nonaka #define NVM_ADMIN_GET_LOG_PG	0x02 /* Get Log Page */
    309   1.1    nonaka #define NVM_ADMIN_DEL_IOCQ	0x04 /* Delete I/O Completion Queue */
    310   1.1    nonaka #define NVM_ADMIN_ADD_IOCQ	0x05 /* Create I/O Completion Queue */
    311   1.1    nonaka #define NVM_ADMIN_IDENTIFY	0x06 /* Identify */
    312   1.1    nonaka #define NVM_ADMIN_ABORT		0x08 /* Abort */
    313   1.1    nonaka #define NVM_ADMIN_SET_FEATURES	0x09 /* Set Features */
    314   1.1    nonaka #define NVM_ADMIN_GET_FEATURES	0x0a /* Get Features */
    315   1.1    nonaka #define NVM_ADMIN_ASYNC_EV_REQ	0x0c /* Asynchronous Event Request */
    316  1.10    nonaka #define NVM_ADMIN_NS_MANAGEMENT	0x0d /* Namespace Management */
    317  1.10    nonaka /* 0x0e-0x0f - reserved */
    318   1.3    nonaka #define NVM_ADMIN_FW_COMMIT	0x10 /* Firmware Commit */
    319   1.1    nonaka #define NVM_ADMIN_FW_DOWNLOAD	0x11 /* Firmware Image Download */
    320  1.11    nonaka #define NVM_ADMIN_DEV_SELFTEST	0x14 /* Device Self Test */
    321  1.10    nonaka #define NVM_ADMIN_NS_ATTACHMENT	0x15 /* Namespace Attachment */
    322  1.11    nonaka #define NVM_ADMIN_KEEP_ALIVE	0x18 /* Keep Alive */
    323  1.19    andvar #define NVM_ADMIN_DIRECTIVE_SND	0x19 /* Directive Send */
    324  1.19    andvar #define NVM_ADMIN_DIRECTIVE_RCV	0x1a /* Directive Receive */
    325  1.11    nonaka #define NVM_ADMIN_VIRT_MGMT	0x1c /* Virtualization Management */
    326  1.11    nonaka #define NVM_ADMIN_NVME_MI_SEND	0x1d /* NVMe-MI Send */
    327  1.11    nonaka #define NVM_ADMIN_NVME_MI_RECV	0x1e /* NVMe-MI Receive */
    328  1.11    nonaka #define NVM_ADMIN_DOORBELL_BC	0x7c /* Doorbell Buffer Config */
    329  1.11    nonaka #define NVM_ADMIN_FORMAT_NVM	0x80 /* Format NVM */
    330  1.11    nonaka #define NVM_ADMIN_SECURITY_SND	0x81 /* Security Send */
    331  1.11    nonaka #define NVM_ADMIN_SECURITY_RCV	0x82 /* Security Receive */
    332  1.11    nonaka #define NVM_ADMIN_SANITIZE	0x84 /* Sanitize */
    333   1.1    nonaka 
    334   1.1    nonaka #define NVM_CMD_FLUSH		0x00 /* Flush */
    335   1.1    nonaka #define NVM_CMD_WRITE		0x01 /* Write */
    336   1.1    nonaka #define NVM_CMD_READ		0x02 /* Read */
    337   1.1    nonaka #define NVM_CMD_WR_UNCOR	0x04 /* Write Uncorrectable */
    338   1.1    nonaka #define NVM_CMD_COMPARE		0x05 /* Compare */
    339  1.11    nonaka /* 0x06-0x07 - reserved */
    340  1.11    nonaka #define NVM_CMD_WRITE_ZEROES	0x08 /* Write Zeroes */
    341   1.1    nonaka #define NVM_CMD_DSM		0x09 /* Dataset Management */
    342   1.1    nonaka 
    343   1.8  jdolecek /* Features for GET/SET FEATURES */
    344  1.10    nonaka /* 0x00 - reserved */
    345  1.10    nonaka #define NVM_FEAT_ARBITRATION			0x01
    346  1.10    nonaka #define NVM_FEAT_POWER_MANAGEMENT		0x02
    347  1.10    nonaka #define NVM_FEAT_LBA_RANGE_TYPE			0x03
    348  1.10    nonaka #define NVM_FEAT_TEMPERATURE_THRESHOLD		0x04
    349  1.10    nonaka #define NVM_FEAT_ERROR_RECOVERY			0x05
    350   1.8  jdolecek #define NVM_FEATURE_VOLATILE_WRITE_CACHE	0x06	/* optional */
    351   1.8  jdolecek #define NVM_FEATURE_NUMBER_OF_QUEUES		0x07	/* mandatory */
    352  1.10    nonaka #define NVM_FEAT_INTERRUPT_COALESCING		0x08
    353  1.10    nonaka #define NVM_FEAT_INTERRUPT_VECTOR_CONFIGURATION 0x09
    354  1.10    nonaka #define NVM_FEAT_WRITE_ATOMICITY		0x0a
    355  1.10    nonaka #define NVM_FEAT_ASYNC_EVENT_CONFIGURATION	0x0b
    356  1.10    nonaka #define NVM_FEAT_AUTONOMOUS_POWER_STATE_TRANSITION 0x0c
    357  1.10    nonaka #define NVM_FEAT_HOST_MEMORY_BUFFER		0x0d
    358  1.10    nonaka #define NVM_FEAT_TIMESTAMP			0x0e
    359  1.10    nonaka #define NVM_FEAT_KEEP_ALIVE_TIMER		0x0f
    360  1.10    nonaka #define NVM_FEAT_HOST_CONTROLLED_THERMAL_MGMT	0x10
    361  1.10    nonaka #define NVM_FEAT_NON_OP_POWER_STATE_CONFIG	0x11
    362  1.10    nonaka /* 0x12-0x77 - reserved */
    363  1.10    nonaka /* 0x78-0x7f - NVMe Management Interface */
    364  1.10    nonaka #define NVM_FEAT_SOFTWARE_PROGRESS_MARKER	0x80
    365  1.11    nonaka #define NVM_FEAT_HOST_IDENTIFIER		0x81
    366  1.11    nonaka #define NVM_FEAT_RESERVATION_NOTIFICATION_MASK	0x82
    367  1.11    nonaka #define NVM_FEAT_RESERVATION_PERSISTANCE	0x83
    368  1.11    nonaka /* 0x84-0xBF - command set specific (reserved) */
    369  1.10    nonaka /* 0xC0-0xFF - vendor specific */
    370   1.8  jdolecek 
    371  1.12  jdolecek #define NVM_SET_FEATURES_SV		__BIT(31)	/* Persist */
    372  1.12  jdolecek 
    373  1.12  jdolecek #define NVM_VOLATILE_WRITE_CACHE_WCE	__BIT(0) 	/* Write Cache Enable */
    374  1.12  jdolecek 
    375   1.1    nonaka /* Power State Descriptor Data */
    376   1.1    nonaka struct nvm_identify_psd {
    377   1.1    nonaka 	uint16_t	mp;		/* Max Power */
    378   1.3    nonaka 	uint8_t		_reserved1;
    379   1.3    nonaka 	uint8_t		flags;
    380   1.3    nonaka #define	NVME_PSD_NOPS		__BIT(1)
    381   1.3    nonaka #define	NVME_PSD_MPS		__BIT(0)
    382   1.1    nonaka 
    383   1.1    nonaka 	uint32_t	enlat;		/* Entry Latency */
    384   1.1    nonaka 
    385   1.1    nonaka 	uint32_t	exlat;		/* Exit Latency */
    386   1.1    nonaka 
    387   1.1    nonaka 	uint8_t		rrt;		/* Relative Read Throughput */
    388   1.3    nonaka #define	NVME_PSD_RRT_MASK	__BITS(0, 4)
    389   1.1    nonaka 	uint8_t		rrl;		/* Relative Read Latency */
    390   1.3    nonaka #define	NVME_PSD_RRL_MASK	__BITS(0, 4)
    391   1.1    nonaka 	uint8_t		rwt;		/* Relative Write Throughput */
    392   1.3    nonaka #define	NVME_PSD_RWT_MASK	__BITS(0, 4)
    393   1.1    nonaka 	uint8_t		rwl;		/* Relative Write Latency */
    394   1.3    nonaka #define	NVME_PSD_RWL_MASK	__BITS(0, 4)
    395   1.1    nonaka 
    396   1.3    nonaka 	uint16_t	idlp;		/* Idle Power */
    397   1.3    nonaka 	uint8_t		ips;		/* Idle Power Scale */
    398   1.3    nonaka #define	NVME_PSD_IPS_MASK	__BITS(0, 1)
    399   1.3    nonaka 	uint8_t		_reserved2;
    400   1.3    nonaka 	uint16_t	actp;		/* Active Power */
    401   1.3    nonaka 	uint16_t	ap;		/* Active Power Workload/Scale */
    402   1.3    nonaka #define	NVME_PSD_APW_MASK	__BITS(0, 2)
    403   1.3    nonaka #define	NVME_PSD_APS_MASK	__BITS(6, 7)
    404   1.3    nonaka 
    405   1.3    nonaka 	uint8_t		_reserved[8];
    406   1.1    nonaka } __packed __aligned(8);
    407  1.10    nonaka NVME_CTASSERT(sizeof(struct nvm_identify_psd) == 32, "bad size for nvm_identify_psd");
    408   1.1    nonaka 
    409   1.1    nonaka struct nvm_identify_controller {
    410   1.1    nonaka 	/* Controller Capabilities and Features */
    411   1.1    nonaka 
    412   1.1    nonaka 	uint16_t	vid;		/* PCI Vendor ID */
    413   1.1    nonaka 	uint16_t	ssvid;		/* PCI Subsystem Vendor ID */
    414   1.1    nonaka 
    415   1.1    nonaka 	uint8_t		sn[20];		/* Serial Number */
    416   1.1    nonaka 	uint8_t		mn[40];		/* Model Number */
    417   1.1    nonaka 	uint8_t		fr[8];		/* Firmware Revision */
    418   1.1    nonaka 
    419   1.1    nonaka 	uint8_t		rab;		/* Recommended Arbitration Burst */
    420   1.1    nonaka 	uint8_t		ieee[3];	/* IEEE OUI Identifier */
    421   1.1    nonaka 
    422   1.1    nonaka 	uint8_t		cmic;		/* Controller Multi-Path I/O and
    423   1.1    nonaka 					   Namespace Sharing Capabilities */
    424   1.1    nonaka 	uint8_t		mdts;		/* Maximum Data Transfer Size */
    425  1.10    nonaka 
    426   1.1    nonaka 	uint16_t	cntlid;		/* Controller ID */
    427  1.10    nonaka 	uint32_t	ver;		/* Version */
    428  1.10    nonaka 
    429  1.10    nonaka 	uint32_t	rtd3r;		/* RTD3 Resume Latency */
    430  1.10    nonaka 	uint32_t	rtd3e;		/* RTD3 Enter Latency */
    431  1.10    nonaka 
    432  1.10    nonaka 	uint32_t	oaes;		/* Optional Asynchronous Events Supported */
    433  1.10    nonaka 	uint32_t	ctrattr;	/* Controller Attributes */
    434  1.10    nonaka 
    435  1.10    nonaka 	uint8_t		_reserved1[12];
    436   1.1    nonaka 
    437  1.10    nonaka 	uint8_t		fguid[16];	/* FRU Globally Unique Identifier */
    438  1.10    nonaka 
    439  1.10    nonaka 	uint8_t		_reserved2[128];
    440   1.1    nonaka 
    441   1.1    nonaka 	/* Admin Command Set Attributes & Optional Controller Capabilities */
    442   1.1    nonaka 
    443   1.1    nonaka 	uint16_t	oacs;		/* Optional Admin Command Support */
    444  1.11    nonaka #define	NVME_ID_CTRLR_OACS_DOORBELL_BC	__BIT(8)
    445  1.11    nonaka #define	NVME_ID_CTRLR_OACS_VIRT_MGMT	__BIT(7)
    446  1.11    nonaka #define	NVME_ID_CTRLR_OACS_NVME_MI	__BIT(6)
    447  1.11    nonaka #define	NVME_ID_CTRLR_OACS_DIRECTIVES	__BIT(5)
    448  1.11    nonaka #define	NVME_ID_CTRLR_OACS_DEV_SELFTEST	__BIT(4)
    449   1.3    nonaka #define	NVME_ID_CTRLR_OACS_NS		__BIT(3)
    450   1.3    nonaka #define	NVME_ID_CTRLR_OACS_FW		__BIT(2)
    451   1.3    nonaka #define	NVME_ID_CTRLR_OACS_FORMAT	__BIT(1)
    452   1.3    nonaka #define	NVME_ID_CTRLR_OACS_SECURITY	__BIT(0)
    453   1.1    nonaka 	uint8_t		acl;		/* Abort Command Limit */
    454   1.1    nonaka 	uint8_t		aerl;		/* Asynchronous Event Request Limit */
    455   1.1    nonaka 
    456   1.1    nonaka 	uint8_t		frmw;		/* Firmware Updates */
    457   1.3    nonaka #define	NVME_ID_CTRLR_FRMW_NOREQ_RESET	__BIT(4)
    458   1.3    nonaka #define	NVME_ID_CTRLR_FRMW_NSLOT	__BITS(1, 3)
    459   1.3    nonaka #define	NVME_ID_CTRLR_FRMW_SLOT1_RO	__BIT(0)
    460   1.1    nonaka 	uint8_t		lpa;		/* Log Page Attributes */
    461   1.3    nonaka #define	NVME_ID_CTRLR_LPA_CMD_EFFECT	__BIT(1)
    462   1.3    nonaka #define	NVME_ID_CTRLR_LPA_NS_SMART	__BIT(0)
    463   1.1    nonaka 	uint8_t		elpe;		/* Error Log Page Entries */
    464   1.1    nonaka 	uint8_t		npss;		/* Number of Power States Support */
    465   1.1    nonaka 
    466   1.1    nonaka 	uint8_t		avscc;		/* Admin Vendor Specific Command
    467   1.1    nonaka 					   Configuration */
    468   1.1    nonaka 	uint8_t		apsta;		/* Autonomous Power State Transition
    469   1.1    nonaka 					   Attributes */
    470  1.15  jdolecek #define	NVME_ID_CTRLR_APSTA_PRESENT	__BIT(0)
    471   1.1    nonaka 
    472  1.10    nonaka 	uint16_t	wctemp;		/* Warning Composite Temperature
    473  1.10    nonaka 					   Threshold */
    474  1.10    nonaka 	uint16_t	cctemp;		/* Critical Composite Temperature
    475  1.10    nonaka 					   Threshold */
    476  1.10    nonaka 
    477  1.10    nonaka 	uint16_t	mtfa;		/* Maximum Time for Firmware Activation */
    478  1.10    nonaka 
    479  1.10    nonaka 	uint32_t	hmpre;		/* Host Memory Buffer Preferred Size */
    480  1.10    nonaka 	uint32_t	hmmin;		/* Host Memory Buffer Minimum Size */
    481  1.10    nonaka 
    482  1.10    nonaka 	struct {
    483  1.10    nonaka 		uint64_t	tnvmcap[2];
    484  1.10    nonaka 		uint64_t	unvmcap[2];
    485  1.10    nonaka 	} __packed untncap;		/* Name space capabilities:
    486  1.10    nonaka 					   if NVME_ID_CTRLR_OACS_NS,
    487  1.10    nonaka 					   report tnvmcap and unvmcap */
    488  1.10    nonaka 
    489  1.10    nonaka 	uint32_t	rpmbs;		/* Replay Protected Memory Block Support */
    490  1.10    nonaka 
    491  1.10    nonaka 	uint16_t	edstt;		/* Extended Device Self-test Time */
    492  1.10    nonaka 	uint8_t		dsto;		/* Device Self-test Options */
    493  1.10    nonaka 
    494  1.10    nonaka 	uint8_t		fwug;		/* Firmware Update Granularity */
    495  1.10    nonaka 
    496  1.10    nonaka 	uint16_t	kas;		/* Keep Alive Support */
    497  1.10    nonaka 
    498  1.10    nonaka 	uint16_t	hctma;		/* Host Controlled Thermal Management
    499  1.10    nonaka 					   Attributes */
    500  1.10    nonaka 	uint16_t	mntmt;		/* Minimum Thermal Management Temperature */
    501  1.10    nonaka 	uint16_t	mxtmt;		/* Maximum Thermal Management Temperature */
    502  1.10    nonaka 
    503  1.10    nonaka 	uint32_t	sanicap;	/* Sanitize Capabilities */
    504  1.10    nonaka 
    505  1.10    nonaka 	uint8_t		_reserved3[180];
    506   1.1    nonaka 
    507   1.1    nonaka 	/* NVM Command Set Attributes */
    508   1.1    nonaka 
    509   1.1    nonaka 	uint8_t		sqes;		/* Submission Queue Entry Size */
    510   1.3    nonaka #define	NVME_ID_CTRLR_SQES_MAX		__BITS(4, 7)
    511   1.3    nonaka #define	NVME_ID_CTRLR_SQES_MIN		__BITS(0, 3)
    512   1.1    nonaka 	uint8_t		cqes;		/* Completion Queue Entry Size */
    513   1.3    nonaka #define	NVME_ID_CTRLR_CQES_MAX		__BITS(4, 7)
    514   1.3    nonaka #define	NVME_ID_CTRLR_CQES_MIN		__BITS(0, 3)
    515  1.10    nonaka 
    516  1.10    nonaka 	uint16_t	maxcmd;		/* Maximum Outstanding Commands */
    517   1.1    nonaka 
    518   1.1    nonaka 	uint32_t	nn;		/* Number of Namespaces */
    519   1.1    nonaka 
    520   1.1    nonaka 	uint16_t	oncs;		/* Optional NVM Command Support */
    521  1.12  jdolecek #define	NVME_ID_CTRLR_ONCS_TIMESTAMP	__BIT(6)
    522   1.3    nonaka #define	NVME_ID_CTRLR_ONCS_RESERVATION	__BIT(5)
    523  1.13  jdolecek #define	NVME_ID_CTRLR_ONCS_SET_FEATURES	__BIT(4)
    524   1.3    nonaka #define	NVME_ID_CTRLR_ONCS_WRITE_ZERO	__BIT(3)
    525   1.3    nonaka #define	NVME_ID_CTRLR_ONCS_DSM		__BIT(2)
    526   1.3    nonaka #define	NVME_ID_CTRLR_ONCS_WRITE_UNC	__BIT(1)
    527   1.3    nonaka #define	NVME_ID_CTRLR_ONCS_COMPARE	__BIT(0)
    528   1.1    nonaka 	uint16_t	fuses;		/* Fused Operation Support */
    529   1.1    nonaka 
    530   1.1    nonaka 	uint8_t		fna;		/* Format NVM Attributes */
    531  1.11    nonaka #define	NVME_ID_CTRLR_FNA_CRYPTO_ERASE	__BIT(2)
    532  1.11    nonaka #define	NVME_ID_CTRLR_FNA_ERASE_ALL	__BIT(1)
    533  1.11    nonaka #define	NVME_ID_CTRLR_FNA_FORMAT_ALL	__BIT(0)
    534   1.1    nonaka 	uint8_t		vwc;		/* Volatile Write Cache */
    535   1.3    nonaka #define	NVME_ID_CTRLR_VWC_PRESENT	__BIT(0)
    536   1.1    nonaka 	uint16_t	awun;		/* Atomic Write Unit Normal */
    537  1.11    nonaka 	uint16_t	awupf;		/* Atomic Write Unit Power Fail */
    538   1.1    nonaka 
    539   1.1    nonaka 	uint8_t		nvscc;		/* NVM Vendor Specific Command */
    540   1.1    nonaka 	uint8_t		_reserved4[1];
    541   1.1    nonaka 
    542   1.1    nonaka 	uint16_t	acwu;		/* Atomic Compare & Write Unit */
    543   1.1    nonaka 	uint8_t		_reserved5[2];
    544   1.1    nonaka 
    545   1.1    nonaka 	uint32_t	sgls;		/* SGL Support */
    546   1.1    nonaka 
    547  1.11    nonaka 	uint8_t		_reserved6[228];
    548   1.1    nonaka 
    549  1.11    nonaka 	uint8_t		subnqn[256];	/* NVM Subsystem NVMe Qualified Name */
    550   1.1    nonaka 
    551  1.11    nonaka 	uint8_t		_reserved7[768];
    552   1.1    nonaka 
    553  1.11    nonaka 	uint8_t		_reserved8[256]; /* NVMe over Fabrics specification */
    554   1.1    nonaka 
    555   1.1    nonaka 	struct nvm_identify_psd psd[32]; /* Power State Descriptors */
    556   1.1    nonaka 
    557  1.11    nonaka 	uint8_t		vs[1024];	/* Vendor Specific */
    558   1.1    nonaka } __packed __aligned(8);
    559  1.10    nonaka NVME_CTASSERT(sizeof(struct nvm_identify_controller) == 4096, "bad size for nvm_identify_controller");
    560   1.1    nonaka 
    561   1.1    nonaka struct nvm_namespace_format {
    562   1.1    nonaka 	uint16_t	ms;		/* Metadata Size */
    563   1.1    nonaka 	uint8_t		lbads;		/* LBA Data Size */
    564   1.1    nonaka 	uint8_t		rp;		/* Relative Performance */
    565   1.1    nonaka } __packed __aligned(4);
    566  1.10    nonaka NVME_CTASSERT(sizeof(struct nvm_namespace_format) == 4, "bad size for nvm_namespace_format");
    567   1.1    nonaka 
    568   1.1    nonaka struct nvm_identify_namespace {
    569   1.1    nonaka 	uint64_t	nsze;		/* Namespace Size */
    570   1.1    nonaka 
    571   1.1    nonaka 	uint64_t	ncap;		/* Namespace Capacity */
    572   1.1    nonaka 
    573   1.1    nonaka 	uint64_t	nuse;		/* Namespace Utilization */
    574   1.1    nonaka 
    575   1.1    nonaka 	uint8_t		nsfeat;		/* Namespace Features */
    576   1.3    nonaka #define	NVME_ID_NS_NSFEAT_LOGICAL_BLK_ERR	__BIT(2)
    577   1.3    nonaka #define	NVME_ID_NS_NSFEAT_NS			__BIT(1)
    578   1.3    nonaka #define	NVME_ID_NS_NSFEAT_THIN_PROV		__BIT(0)
    579   1.1    nonaka 	uint8_t		nlbaf;		/* Number of LBA Formats */
    580   1.1    nonaka 	uint8_t		flbas;		/* Formatted LBA Size */
    581   1.1    nonaka #define NVME_ID_NS_FLBAS(_f)			((_f) & 0x0f)
    582   1.1    nonaka #define NVME_ID_NS_FLBAS_MD			0x10
    583   1.1    nonaka 	uint8_t		mc;		/* Metadata Capabilities */
    584   1.1    nonaka 	uint8_t		dpc;		/* End-to-end Data Protection
    585   1.1    nonaka 					   Capabilities */
    586  1.11    nonaka 	uint8_t		dps;		/* End-to-end Data Protection Type
    587  1.11    nonaka 					   Settings */
    588  1.11    nonaka #define	NVME_ID_NS_DPS_MD_START			__BIT(3)
    589  1.11    nonaka #define	NVME_ID_NS_DPS_PIT(_f)			((_f) & 0x7)
    590  1.11    nonaka 
    591  1.11    nonaka 	uint8_t		nmic;		/* Namespace Multi-path I/O and Namespace
    592  1.11    nonaka 					   Sharing Capabilities */
    593  1.11    nonaka 
    594  1.11    nonaka 	uint8_t		rescap;		/* Reservation Capabilities */
    595  1.11    nonaka 
    596  1.11    nonaka 	uint8_t		fpi;		/* Format Progress Indicator */
    597  1.11    nonaka 
    598  1.11    nonaka 	uint8_t		dlfeat;		/* Deallocate Logical Block Features */
    599  1.11    nonaka 
    600  1.11    nonaka 	uint16_t	nawun;		/* Namespace Atomic Write Unit Normal  */
    601  1.11    nonaka 	uint16_t	nawupf;		/* Namespace Atomic Write Unit Power Fail */
    602  1.11    nonaka 	uint16_t	nacwu;		/* Namespace Atomic Compare & Write Unit */
    603  1.11    nonaka 	uint16_t	nabsn;		/* Namespace Atomic Boundary Size Normal */
    604  1.11    nonaka 	uint16_t	nabo;		/* Namespace Atomic Boundary Offset */
    605  1.11    nonaka 	uint16_t	nabspf;		/* Namespace Atomic Boundary Size Power
    606  1.11    nonaka 					   Fail */
    607  1.11    nonaka 	uint16_t	noiob;		/* Namespace Optimal IO Boundary */
    608  1.11    nonaka 
    609  1.11    nonaka 	uint8_t		nvmcap[16];	/* NVM Capacity */
    610  1.11    nonaka 
    611  1.11    nonaka 	uint8_t		_reserved1[40];	/* bytes 64-103: Reserved */
    612   1.1    nonaka 
    613  1.11    nonaka 	uint8_t		nguid[16];	/* Namespace Globally Unique Identifier */
    614  1.11    nonaka 	uint8_t		eui64[8];	/* IEEE Extended Unique Identifier */
    615   1.1    nonaka 
    616   1.1    nonaka 	struct nvm_namespace_format
    617   1.1    nonaka 			lbaf[16];	/* LBA Format Support */
    618   1.1    nonaka 
    619   1.1    nonaka 	uint8_t		_reserved2[192];
    620   1.1    nonaka 
    621   1.1    nonaka 	uint8_t		vs[3712];
    622   1.1    nonaka } __packed __aligned(8);
    623  1.10    nonaka NVME_CTASSERT(sizeof(struct nvm_identify_namespace) == 4096, "bad size for nvm_identify_namespace");
    624   1.2    nonaka 
    625   1.2    nonaka #endif	/* __NVMEREG_H__ */
    626