xref: /netbsd-src/sys/dev/ic/nvmereg.h (revision a35682c843a187d8b1429c3c235bdc7b16455293)
1*a35682c8Sandvar /*	$NetBSD: nvmereg.h,v 1.19 2022/10/12 20:50:43 andvar Exp $	*/
28b5163f0Snonaka /*	$OpenBSD: nvmereg.h,v 1.10 2016/04/14 11:18:32 dlg Exp $ */
38b5163f0Snonaka 
48b5163f0Snonaka /*
58b5163f0Snonaka  * Copyright (c) 2014 David Gwynne <dlg@openbsd.org>
68b5163f0Snonaka  *
78b5163f0Snonaka  * Permission to use, copy, modify, and distribute this software for any
88b5163f0Snonaka  * purpose with or without fee is hereby granted, provided that the above
98b5163f0Snonaka  * copyright notice and this permission notice appear in all copies.
108b5163f0Snonaka  *
118b5163f0Snonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
128b5163f0Snonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
138b5163f0Snonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
148b5163f0Snonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
158b5163f0Snonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
168b5163f0Snonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
178b5163f0Snonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
188b5163f0Snonaka  */
198b5163f0Snonaka 
20e7c0cc5dSnonaka #ifndef	__NVMEREG_H__
21e7c0cc5dSnonaka #define	__NVMEREG_H__
22e7c0cc5dSnonaka 
231f5086ecSnonaka #ifndef	NVME_CTASSERT
241f5086ecSnonaka #define	NVME_CTASSERT(x, s)	__CTASSERT(x)
251f5086ecSnonaka #endif
261f5086ecSnonaka 
278b5163f0Snonaka #define NVME_CAP	0x0000	/* Controller Capabilities */
288b5163f0Snonaka #define  NVME_CAP_MPSMAX(_r)	(12 + (((_r) >> 52) & 0xf)) /* shift */
298b5163f0Snonaka #define  NVME_CAP_MPSMIN(_r)	(12 + (((_r) >> 48) & 0xf)) /* shift */
308b5163f0Snonaka #define  NVME_CAP_CSS(_r)	(((_r) >> 37) & 0x7f)
318b5163f0Snonaka #define  NVME_CAP_CSS_NVM	__BIT(0)
328b5163f0Snonaka #define  NVME_CAP_NSSRS(_r)	ISSET((_r), __BIT(36))
338b5163f0Snonaka #define  NVME_CAP_DSTRD(_r)	__BIT(2 + (((_r) >> 32) & 0xf)) /* bytes */
348b5163f0Snonaka #define  NVME_CAP_TO(_r)	(500 * (((_r) >> 24) & 0xff)) /* ms */
358b5163f0Snonaka #define  NVME_CAP_AMS(_r)	(((_r) >> 17) & 0x3)
368b5163f0Snonaka #define  NVME_CAP_AMS_WRR	__BIT(0)
378b5163f0Snonaka #define  NVME_CAP_AMS_VENDOR	__BIT(1)
388b5163f0Snonaka #define  NVME_CAP_CQR(_r)	ISSET((_r), __BIT(16))
398b5163f0Snonaka #define  NVME_CAP_MQES(_r)	(((_r) & 0xffff) + 1)
408b5163f0Snonaka #define NVME_CAP_LO	0x0000
418b5163f0Snonaka #define NVME_CAP_HI	0x0004
428b5163f0Snonaka #define NVME_VS		0x0008	/* Version */
438b5163f0Snonaka #define  NVME_VS_MJR(_r)	(((_r) >> 16) & 0xffff)
4474b49282Snonaka #define  NVME_VS_MNR(_r)	(((_r) >> 8) & 0xff)
4574b49282Snonaka #define  NVME_VS_TER(_r)	((_r) & 0xff)
468b5163f0Snonaka #define NVME_INTMS	0x000c	/* Interrupt Mask Set */
478b5163f0Snonaka #define NVME_INTMC	0x0010	/* Interrupt Mask Clear */
488b5163f0Snonaka #define NVME_CC		0x0014	/* Controller Configuration */
498b5163f0Snonaka #define  NVME_CC_IOCQES(_v)	(((_v) & 0xf) << 20)
508b5163f0Snonaka #define  NVME_CC_IOCQES_MASK	NVME_CC_IOCQES(0xf)
518b5163f0Snonaka #define  NVME_CC_IOCQES_R(_v)	(((_v) >> 20) & 0xf)
528b5163f0Snonaka #define  NVME_CC_IOSQES(_v)	(((_v) & 0xf) << 16)
538b5163f0Snonaka #define  NVME_CC_IOSQES_MASK	NVME_CC_IOSQES(0xf)
548b5163f0Snonaka #define  NVME_CC_IOSQES_R(_v)	(((_v) >> 16) & 0xf)
558b5163f0Snonaka #define  NVME_CC_SHN(_v)	(((_v) & 0x3) << 14)
568b5163f0Snonaka #define  NVME_CC_SHN_MASK	NVME_CC_SHN(0x3)
578b5163f0Snonaka #define  NVME_CC_SHN_R(_v)	(((_v) >> 15) & 0x3)
588b5163f0Snonaka #define  NVME_CC_SHN_NONE	0
598b5163f0Snonaka #define  NVME_CC_SHN_NORMAL	1
608b5163f0Snonaka #define  NVME_CC_SHN_ABRUPT	2
618b5163f0Snonaka #define  NVME_CC_AMS(_v)	(((_v) & 0x7) << 11)
628b5163f0Snonaka #define  NVME_CC_AMS_MASK	NVME_CC_AMS(0x7)
638b5163f0Snonaka #define  NVME_CC_AMS_R(_v)	(((_v) >> 11) & 0xf)
648b5163f0Snonaka #define  NVME_CC_AMS_RR		0 /* round-robin */
658b5163f0Snonaka #define  NVME_CC_AMS_WRR_U	1 /* weighted round-robin w/ urgent */
668b5163f0Snonaka #define  NVME_CC_AMS_VENDOR	7 /* vendor */
678b5163f0Snonaka #define  NVME_CC_MPS(_v)	((((_v) - 12) & 0xf) << 7)
688b5163f0Snonaka #define  NVME_CC_MPS_MASK	(0xf << 7)
698b5163f0Snonaka #define  NVME_CC_MPS_R(_v)	(12 + (((_v) >> 7) & 0xf))
708b5163f0Snonaka #define  NVME_CC_CSS(_v)	(((_v) & 0x7) << 4)
718b5163f0Snonaka #define  NVME_CC_CSS_MASK	NVME_CC_CSS(0x7)
728b5163f0Snonaka #define  NVME_CC_CSS_R(_v)	(((_v) >> 4) & 0x7)
738b5163f0Snonaka #define  NVME_CC_CSS_NVM	0
748b5163f0Snonaka #define  NVME_CC_EN		__BIT(0)
758b5163f0Snonaka #define NVME_CSTS	0x001c	/* Controller Status */
768b5163f0Snonaka #define  NVME_CSTS_SHST_MASK	(0x3 << 2)
778b5163f0Snonaka #define  NVME_CSTS_SHST_NONE	(0x0 << 2) /* normal operation */
788b5163f0Snonaka #define  NVME_CSTS_SHST_WAIT	(0x1 << 2) /* shutdown processing occurring */
798b5163f0Snonaka #define  NVME_CSTS_SHST_DONE	(0x2 << 2) /* shutdown processing complete */
805ecb5207Sskrll #define  NVME_CSTS_CFS		__BIT(1)
815ecb5207Sskrll #define  NVME_CSTS_RDY		__BIT(0)
828b5163f0Snonaka #define NVME_NSSR	0x0020	/* NVM Subsystem Reset (Optional) */
838b5163f0Snonaka #define NVME_AQA	0x0024	/* Admin Queue Attributes */
848b5163f0Snonaka 				/* Admin Completion Queue Size */
858b5163f0Snonaka #define  NVME_AQA_ACQS(_v)	(((_v) - 1) << 16)
865ecb5207Sskrll #define  NVME_AQA_ACQS_R(_v)	((_v >> 16) & (__BIT(12) - 1))
878b5163f0Snonaka 				/* Admin Submission Queue Size */
888b5163f0Snonaka #define  NVME_AQA_ASQS(_v)	(((_v) - 1) << 0)
895ecb5207Sskrll #define  NVME_AQA_ASQS_R(_v)	(_v & (__BIT(12) - 1))
908b5163f0Snonaka #define NVME_ASQ	0x0028	/* Admin Submission Queue Base Address */
918b5163f0Snonaka #define NVME_ACQ	0x0030	/* Admin Completion Queue Base Address */
928b5163f0Snonaka 
938b5163f0Snonaka #define NVME_ADMIN_Q		0
948b5163f0Snonaka /* Submission Queue Tail Doorbell */
958b5163f0Snonaka #define NVME_SQTDBL(_q, _s)	(0x1000 + (2 * (_q) + 0) * (_s))
968b5163f0Snonaka /* Completion Queue Head Doorbell */
978b5163f0Snonaka #define NVME_CQHDBL(_q, _s)	(0x1000 + (2 * (_q) + 1) * (_s))
988b5163f0Snonaka 
998b5163f0Snonaka struct nvme_sge {
1008b5163f0Snonaka 	uint8_t		id;
1018b5163f0Snonaka 	uint8_t		_reserved[15];
1028b5163f0Snonaka } __packed __aligned(8);
1031f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sge) == 16, "bad size for nvme_sge");
1048b5163f0Snonaka 
1058b5163f0Snonaka struct nvme_sge_data {
1068b5163f0Snonaka 	uint8_t		id;
1078b5163f0Snonaka 	uint8_t		_reserved[3];
1088b5163f0Snonaka 
1098b5163f0Snonaka 	uint32_t	length;
1108b5163f0Snonaka 
1118b5163f0Snonaka 	uint64_t	address;
1128b5163f0Snonaka } __packed __aligned(8);
1131f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sge_data) == 16, "bad size for nvme_sge_data");
1148b5163f0Snonaka 
1158b5163f0Snonaka struct nvme_sge_bit_bucket {
1168b5163f0Snonaka 	uint8_t		id;
1178b5163f0Snonaka 	uint8_t		_reserved[3];
1188b5163f0Snonaka 
1198b5163f0Snonaka 	uint32_t	length;
1208b5163f0Snonaka 
1218b5163f0Snonaka 	uint64_t	address;
1228b5163f0Snonaka } __packed __aligned(8);
1231f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sge_bit_bucket) == 16, "bad size for nvme_sge_bit_bucket");
1248b5163f0Snonaka 
1258b5163f0Snonaka struct nvme_sqe {
1268b5163f0Snonaka 	uint8_t		opcode;
1278b5163f0Snonaka 	uint8_t		flags;
1288b5163f0Snonaka 	uint16_t	cid;
1298b5163f0Snonaka 
1308b5163f0Snonaka 	uint32_t	nsid;
1318b5163f0Snonaka 
1328b5163f0Snonaka 	uint8_t		_reserved[8];
1338b5163f0Snonaka 
1348b5163f0Snonaka 	uint64_t	mptr;
1358b5163f0Snonaka 
1368b5163f0Snonaka 	union {
1378b5163f0Snonaka 		uint64_t	prp[2];
1388b5163f0Snonaka 		struct nvme_sge	sge;
13949e18393Smrg 	} entry;
1408b5163f0Snonaka 
1418b5163f0Snonaka 	uint32_t	cdw10;
1428b5163f0Snonaka 	uint32_t	cdw11;
1438b5163f0Snonaka 	uint32_t	cdw12;
1448b5163f0Snonaka 	uint32_t	cdw13;
1458b5163f0Snonaka 	uint32_t	cdw14;
1468b5163f0Snonaka 	uint32_t	cdw15;
1478b5163f0Snonaka } __packed __aligned(8);
1481f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sqe) == 64, "bad size for nvme_sqe");
1498b5163f0Snonaka 
1508b5163f0Snonaka struct nvme_sqe_q {
1518b5163f0Snonaka 	uint8_t		opcode;
1528b5163f0Snonaka 	uint8_t		flags;
1538b5163f0Snonaka 	uint16_t	cid;
1548b5163f0Snonaka 
1558b5163f0Snonaka 	uint8_t		_reserved1[20];
1568b5163f0Snonaka 
1578b5163f0Snonaka 	uint64_t	prp1;
1588b5163f0Snonaka 
1598b5163f0Snonaka 	uint8_t		_reserved2[8];
1608b5163f0Snonaka 
1618b5163f0Snonaka 	uint16_t	qid;
1628b5163f0Snonaka 	uint16_t	qsize;
1638b5163f0Snonaka 
1648b5163f0Snonaka 	uint8_t		qflags;
1658b5163f0Snonaka #define NVM_SQE_SQ_QPRIO_URG	(0x0 << 1)
1668b5163f0Snonaka #define NVM_SQE_SQ_QPRIO_HI	(0x1 << 1)
1678b5163f0Snonaka #define NVM_SQE_SQ_QPRIO_MED	(0x2 << 1)
1688b5163f0Snonaka #define NVM_SQE_SQ_QPRIO_LOW	(0x3 << 1)
1695ecb5207Sskrll #define NVM_SQE_CQ_IEN		__BIT(1)
1705ecb5207Sskrll #define NVM_SQE_Q_PC		__BIT(0)
1718b5163f0Snonaka 	uint8_t		_reserved3;
1728b5163f0Snonaka 	uint16_t	cqid; /* XXX interrupt vector for cq */
1738b5163f0Snonaka 
1748b5163f0Snonaka 	uint8_t		_reserved4[16];
1758b5163f0Snonaka } __packed __aligned(8);
1761f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sqe_q) == 64, "bad size for nvme_sqe_q");
1778b5163f0Snonaka 
1788b5163f0Snonaka struct nvme_sqe_io {
1798b5163f0Snonaka 	uint8_t		opcode;
1808b5163f0Snonaka 	uint8_t		flags;
1818b5163f0Snonaka 	uint16_t	cid;
1828b5163f0Snonaka 
1838b5163f0Snonaka 	uint32_t	nsid;
1848b5163f0Snonaka 
1858b5163f0Snonaka 	uint8_t		_reserved[8];
1868b5163f0Snonaka 
1878b5163f0Snonaka 	uint64_t	mptr;
1888b5163f0Snonaka 
1898b5163f0Snonaka 	union {
1908b5163f0Snonaka 		uint64_t	prp[2];
1918b5163f0Snonaka 		struct nvme_sge	sge;
19249e18393Smrg 	} entry;
1938b5163f0Snonaka 
1948b5163f0Snonaka 	uint64_t	slba;	/* Starting LBA */
1958b5163f0Snonaka 
1968b5163f0Snonaka 	uint16_t	nlb;	/* Number of Logical Blocks */
1978b5163f0Snonaka 	uint16_t	ioflags;
19887d3a42cSjdolecek #define NVM_SQE_IO_LR	__BIT(15)	/* Limited Retry */
1990d0b547dSjdolecek #define NVM_SQE_IO_FUA	__BIT(14)	/* Force Unit Access (bypass cache) */
2008b5163f0Snonaka 
2018b5163f0Snonaka 	uint8_t		dsm;	/* Dataset Management */
2020d0b547dSjdolecek #define NVM_SQE_IO_INCOMP	__BIT(7)	/* Incompressible */
2030d0b547dSjdolecek #define NVM_SQE_IO_SEQ		__BIT(6)	/* Sequential request */
2040d0b547dSjdolecek #define NVM_SQE_IO_LAT_MASK	__BITS(4, 5)	/* Access Latency */
2050d0b547dSjdolecek #define  NVM_SQE_IO_LAT_NONE	0		/* Latency: none */
2060d0b547dSjdolecek #define  NVM_SQE_IO_LAT_IDLE	__BIT(4)	/* Latency: idle */
2070d0b547dSjdolecek #define  NVM_SQE_IO_LAT_NORMAL	__BIT(5)	/* Latency: normal */
2080d0b547dSjdolecek #define  NVM_SQE_IO_LAT_LOW	__BITS(4, 5)	/* Latency: low */
2090d0b547dSjdolecek #define NVM_SQE_IO_FREQ_MASK	__BITS(0, 3)	/* Access Frequency */
2100d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_TYPICAL	0x1	/* Typical */
2110d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_INFR_INFW	0x2	/* Infrequent read and writes */
2120d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_FRR_INFW	0x3	/* Frequent read, inf. writes */
2130d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_INFR_FRW	0x4	/* Inf. read, freq. writes */
2140d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_FRR_FRW	0x5	/* Freq. read and writes */
2150d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_ONCE		0x6	/* One time i/o operation */
2160d0b547dSjdolecek /* Extra Access Frequency bits for read operations */
217*a35682c8Sandvar #define  NVM_SQE_IO_FREQ_SPEC		0x7	/* Speculative read - prefetch */
2180d0b547dSjdolecek #define  NVM_SQE_IO_FREQ_OVERWRITE	0x8	/* Will be overwritten soon */
2198b5163f0Snonaka 	uint8_t		_reserved2[3];
2208b5163f0Snonaka 
2218b5163f0Snonaka 	uint32_t	eilbrt;	/* Expected Initial Logical Block
2228b5163f0Snonaka 				   Reference Tag */
2238b5163f0Snonaka 
2248b5163f0Snonaka 	uint16_t	elbat;	/* Expected Logical Block
2258b5163f0Snonaka 				   Application Tag */
2268b5163f0Snonaka 	uint16_t	elbatm;	/* Expected Logical Block
2278b5163f0Snonaka 				   Application Tag Mask */
2288b5163f0Snonaka } __packed __aligned(8);
2291f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_sqe_io) == 64, "bad size for nvme_sqe_io");
2308b5163f0Snonaka 
2318b5163f0Snonaka struct nvme_cqe {
2328b5163f0Snonaka 	uint32_t	cdw0;
2338b5163f0Snonaka 
2348b5163f0Snonaka 	uint32_t	_reserved;
2358b5163f0Snonaka 
2368b5163f0Snonaka 	uint16_t	sqhd; /* SQ Head Pointer */
2378b5163f0Snonaka 	uint16_t	sqid; /* SQ Identifier */
2388b5163f0Snonaka 
2398b5163f0Snonaka 	uint16_t	cid; /* Command Identifier */
2408b5163f0Snonaka 	uint16_t	flags;
2418b5163f0Snonaka #define NVME_CQE_DNR		__BIT(15)
2428b5163f0Snonaka #define NVME_CQE_M		__BIT(14)
2432ef514d7Smlelstv #define NVME_CQE_SCT_MASK	__BITS(9, 11)
2442ef514d7Smlelstv #define NVME_CQE_SCT(_f)	((_f) & NVME_CQE_SCT_MASK)
2451d93c630Smlelstv #define  NVME_CQE_SCT_GENERIC		(0x00 << 9)
2461d93c630Smlelstv #define  NVME_CQE_SCT_COMMAND		(0x01 << 9)
2471d93c630Smlelstv #define  NVME_CQE_SCT_MEDIAERR		(0x02 << 9)
2481d93c630Smlelstv #define  NVME_CQE_SCT_VENDOR		(0x07 << 9)
2492ef514d7Smlelstv #define NVME_CQE_SC_MASK	__BITS(1, 8)
2502ef514d7Smlelstv #define NVME_CQE_SC(_f)		((_f) & NVME_CQE_SC_MASK)
251cae3c2f4Snonaka /* generic command status codes */
2528b5163f0Snonaka #define  NVME_CQE_SC_SUCCESS		(0x00 << 1)
2538b5163f0Snonaka #define  NVME_CQE_SC_INVALID_OPCODE	(0x01 << 1)
2548b5163f0Snonaka #define  NVME_CQE_SC_INVALID_FIELD	(0x02 << 1)
2558b5163f0Snonaka #define  NVME_CQE_SC_CID_CONFLICT	(0x03 << 1)
2568b5163f0Snonaka #define  NVME_CQE_SC_DATA_XFER_ERR	(0x04 << 1)
2578b5163f0Snonaka #define  NVME_CQE_SC_ABRT_BY_NO_PWR	(0x05 << 1)
2588b5163f0Snonaka #define  NVME_CQE_SC_INTERNAL_DEV_ERR	(0x06 << 1)
2598b5163f0Snonaka #define  NVME_CQE_SC_CMD_ABRT_REQD	(0x07 << 1)
2608b5163f0Snonaka #define  NVME_CQE_SC_CMD_ABDR_SQ_DEL	(0x08 << 1)
2618b5163f0Snonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_ERR	(0x09 << 1)
2628b5163f0Snonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_MISS	(0x0a << 1)
2638b5163f0Snonaka #define  NVME_CQE_SC_INVALID_NS		(0x0b << 1)
2648b5163f0Snonaka #define  NVME_CQE_SC_CMD_SEQ_ERR	(0x0c << 1)
2658b5163f0Snonaka #define  NVME_CQE_SC_INVALID_LAST_SGL	(0x0d << 1)
2668b5163f0Snonaka #define  NVME_CQE_SC_INVALID_NUM_SGL	(0x0e << 1)
2678b5163f0Snonaka #define  NVME_CQE_SC_DATA_SGL_LEN	(0x0f << 1)
2688b5163f0Snonaka #define  NVME_CQE_SC_MDATA_SGL_LEN	(0x10 << 1)
2698b5163f0Snonaka #define  NVME_CQE_SC_SGL_TYPE_INVALID	(0x11 << 1)
2708b5163f0Snonaka #define  NVME_CQE_SC_LBA_RANGE		(0x80 << 1)
2718b5163f0Snonaka #define  NVME_CQE_SC_CAP_EXCEEDED	(0x81 << 1)
272cae3c2f4Snonaka #define  NVME_CQE_SC_NS_NOT_RDY		(0x82 << 1)
273cae3c2f4Snonaka #define  NVME_CQE_SC_RSV_CONFLICT	(0x83 << 1)
274cae3c2f4Snonaka /* command specific status codes */
275cae3c2f4Snonaka #define  NVME_CQE_SC_CQE_INVALID	(0x00 << 1)
276cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_QID	(0x01 << 1)
277cae3c2f4Snonaka #define  NVME_CQE_SC_MAX_Q_SIZE		(0x02 << 1)
278cae3c2f4Snonaka #define  NVME_CQE_SC_ABORT_LIMIT	(0x03 << 1)
279cae3c2f4Snonaka #define  NVME_CQE_SC_ASYNC_EV_REQ_LIMIT	(0x05 << 1)
280cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_FW_SLOT	(0x06 << 1)
281cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_FW_IMAGE	(0x07 << 1)
282cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_INT_VEC	(0x08 << 1)
283cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_LOG_PAGE	(0x09 << 1)
284cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_FORMAT	(0x0a << 1)
285cae3c2f4Snonaka #define  NVME_CQE_SC_FW_REQ_CNV_RESET	(0x0b << 1)
286cae3c2f4Snonaka #define  NVME_CQE_SC_FW_REQ_NVM_RESET	(0x10 << 1)
287cae3c2f4Snonaka #define  NVME_CQE_SC_FW_REQ_RESET	(0x11 << 1)
288cae3c2f4Snonaka #define  NVME_CQE_SC_FW_MAX_TIME_VIO	(0x12 << 1)
289cae3c2f4Snonaka #define  NVME_CQE_SC_FW_PROHIBIT	(0x13 << 1)
290cae3c2f4Snonaka #define  NVME_CQE_SC_OVERLAP_RANGE	(0x14 << 1)
291cae3c2f4Snonaka #define  NVME_CQE_SC_CONFLICT_ATTRS	(0x80 << 1)
292cae3c2f4Snonaka #define  NVME_CQE_SC_INVALID_PROT_INFO	(0x81 << 1)
293cae3c2f4Snonaka #define  NVME_CQE_SC_ATT_WR_TO_RO_PAGE	(0x82 << 1)
294cae3c2f4Snonaka /* media error status codes */
295cae3c2f4Snonaka #define  NVME_CQE_SC_WRITE_FAULTS	(0x80 << 1)
296cae3c2f4Snonaka #define  NVME_CQE_SC_UNRECV_READ_ERR	(0x81 << 1)
297cae3c2f4Snonaka #define  NVME_CQE_SC_GUARD_CHECK_ERR	(0x82 << 1)
298cae3c2f4Snonaka #define  NVME_CQE_SC_APPL_TAG_CHECK_ERR	(0x83 << 1)
299cae3c2f4Snonaka #define  NVME_CQE_SC_REF_TAG_CHECK_ERR	(0x84 << 1)
300cae3c2f4Snonaka #define  NVME_CQE_SC_CMP_FAIL		(0x85 << 1)
301cae3c2f4Snonaka #define  NVME_CQE_SC_ACCESS_DENIED	(0x86 << 1)
3028b5163f0Snonaka #define NVME_CQE_PHASE		__BIT(0)
3038b5163f0Snonaka } __packed __aligned(8);
3041f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvme_cqe) == 16, "bad size for nvme_cqe");
3058b5163f0Snonaka 
3068b5163f0Snonaka #define NVM_ADMIN_DEL_IOSQ	0x00 /* Delete I/O Submission Queue */
3078b5163f0Snonaka #define NVM_ADMIN_ADD_IOSQ	0x01 /* Create I/O Submission Queue */
3088b5163f0Snonaka #define NVM_ADMIN_GET_LOG_PG	0x02 /* Get Log Page */
3098b5163f0Snonaka #define NVM_ADMIN_DEL_IOCQ	0x04 /* Delete I/O Completion Queue */
3108b5163f0Snonaka #define NVM_ADMIN_ADD_IOCQ	0x05 /* Create I/O Completion Queue */
3118b5163f0Snonaka #define NVM_ADMIN_IDENTIFY	0x06 /* Identify */
3128b5163f0Snonaka #define NVM_ADMIN_ABORT		0x08 /* Abort */
3138b5163f0Snonaka #define NVM_ADMIN_SET_FEATURES	0x09 /* Set Features */
3148b5163f0Snonaka #define NVM_ADMIN_GET_FEATURES	0x0a /* Get Features */
3158b5163f0Snonaka #define NVM_ADMIN_ASYNC_EV_REQ	0x0c /* Asynchronous Event Request */
3161f5086ecSnonaka #define NVM_ADMIN_NS_MANAGEMENT	0x0d /* Namespace Management */
3171f5086ecSnonaka /* 0x0e-0x0f - reserved */
318cae3c2f4Snonaka #define NVM_ADMIN_FW_COMMIT	0x10 /* Firmware Commit */
3198b5163f0Snonaka #define NVM_ADMIN_FW_DOWNLOAD	0x11 /* Firmware Image Download */
3201b34f87dSnonaka #define NVM_ADMIN_DEV_SELFTEST	0x14 /* Device Self Test */
3211f5086ecSnonaka #define NVM_ADMIN_NS_ATTACHMENT	0x15 /* Namespace Attachment */
3221b34f87dSnonaka #define NVM_ADMIN_KEEP_ALIVE	0x18 /* Keep Alive */
323*a35682c8Sandvar #define NVM_ADMIN_DIRECTIVE_SND	0x19 /* Directive Send */
324*a35682c8Sandvar #define NVM_ADMIN_DIRECTIVE_RCV	0x1a /* Directive Receive */
3251b34f87dSnonaka #define NVM_ADMIN_VIRT_MGMT	0x1c /* Virtualization Management */
3261b34f87dSnonaka #define NVM_ADMIN_NVME_MI_SEND	0x1d /* NVMe-MI Send */
3271b34f87dSnonaka #define NVM_ADMIN_NVME_MI_RECV	0x1e /* NVMe-MI Receive */
3281b34f87dSnonaka #define NVM_ADMIN_DOORBELL_BC	0x7c /* Doorbell Buffer Config */
3291b34f87dSnonaka #define NVM_ADMIN_FORMAT_NVM	0x80 /* Format NVM */
3301b34f87dSnonaka #define NVM_ADMIN_SECURITY_SND	0x81 /* Security Send */
3311b34f87dSnonaka #define NVM_ADMIN_SECURITY_RCV	0x82 /* Security Receive */
3321b34f87dSnonaka #define NVM_ADMIN_SANITIZE	0x84 /* Sanitize */
3338b5163f0Snonaka 
3348b5163f0Snonaka #define NVM_CMD_FLUSH		0x00 /* Flush */
3358b5163f0Snonaka #define NVM_CMD_WRITE		0x01 /* Write */
3368b5163f0Snonaka #define NVM_CMD_READ		0x02 /* Read */
3378b5163f0Snonaka #define NVM_CMD_WR_UNCOR	0x04 /* Write Uncorrectable */
3388b5163f0Snonaka #define NVM_CMD_COMPARE		0x05 /* Compare */
3391b34f87dSnonaka /* 0x06-0x07 - reserved */
3401b34f87dSnonaka #define NVM_CMD_WRITE_ZEROES	0x08 /* Write Zeroes */
3418b5163f0Snonaka #define NVM_CMD_DSM		0x09 /* Dataset Management */
3428b5163f0Snonaka 
3435df68754Sjdolecek /* Features for GET/SET FEATURES */
3441f5086ecSnonaka /* 0x00 - reserved */
3451f5086ecSnonaka #define NVM_FEAT_ARBITRATION			0x01
3461f5086ecSnonaka #define NVM_FEAT_POWER_MANAGEMENT		0x02
3471f5086ecSnonaka #define NVM_FEAT_LBA_RANGE_TYPE			0x03
3481f5086ecSnonaka #define NVM_FEAT_TEMPERATURE_THRESHOLD		0x04
3491f5086ecSnonaka #define NVM_FEAT_ERROR_RECOVERY			0x05
3505df68754Sjdolecek #define NVM_FEATURE_VOLATILE_WRITE_CACHE	0x06	/* optional */
3515df68754Sjdolecek #define NVM_FEATURE_NUMBER_OF_QUEUES		0x07	/* mandatory */
3521f5086ecSnonaka #define NVM_FEAT_INTERRUPT_COALESCING		0x08
3531f5086ecSnonaka #define NVM_FEAT_INTERRUPT_VECTOR_CONFIGURATION 0x09
3541f5086ecSnonaka #define NVM_FEAT_WRITE_ATOMICITY		0x0a
3551f5086ecSnonaka #define NVM_FEAT_ASYNC_EVENT_CONFIGURATION	0x0b
3561f5086ecSnonaka #define NVM_FEAT_AUTONOMOUS_POWER_STATE_TRANSITION 0x0c
3571f5086ecSnonaka #define NVM_FEAT_HOST_MEMORY_BUFFER		0x0d
3581f5086ecSnonaka #define NVM_FEAT_TIMESTAMP			0x0e
3591f5086ecSnonaka #define NVM_FEAT_KEEP_ALIVE_TIMER		0x0f
3601f5086ecSnonaka #define NVM_FEAT_HOST_CONTROLLED_THERMAL_MGMT	0x10
3611f5086ecSnonaka #define NVM_FEAT_NON_OP_POWER_STATE_CONFIG	0x11
3621f5086ecSnonaka /* 0x12-0x77 - reserved */
3631f5086ecSnonaka /* 0x78-0x7f - NVMe Management Interface */
3641f5086ecSnonaka #define NVM_FEAT_SOFTWARE_PROGRESS_MARKER	0x80
3651b34f87dSnonaka #define NVM_FEAT_HOST_IDENTIFIER		0x81
3661b34f87dSnonaka #define NVM_FEAT_RESERVATION_NOTIFICATION_MASK	0x82
3671b34f87dSnonaka #define NVM_FEAT_RESERVATION_PERSISTANCE	0x83
3681b34f87dSnonaka /* 0x84-0xBF - command set specific (reserved) */
3691f5086ecSnonaka /* 0xC0-0xFF - vendor specific */
3705df68754Sjdolecek 
371b7a0ea19Sjdolecek #define NVM_SET_FEATURES_SV		__BIT(31)	/* Persist */
372b7a0ea19Sjdolecek 
373b7a0ea19Sjdolecek #define NVM_VOLATILE_WRITE_CACHE_WCE	__BIT(0) 	/* Write Cache Enable */
374b7a0ea19Sjdolecek 
3758b5163f0Snonaka /* Power State Descriptor Data */
3768b5163f0Snonaka struct nvm_identify_psd {
3778b5163f0Snonaka 	uint16_t	mp;		/* Max Power */
378cae3c2f4Snonaka 	uint8_t		_reserved1;
379cae3c2f4Snonaka 	uint8_t		flags;
380cae3c2f4Snonaka #define	NVME_PSD_NOPS		__BIT(1)
381cae3c2f4Snonaka #define	NVME_PSD_MPS		__BIT(0)
3828b5163f0Snonaka 
3838b5163f0Snonaka 	uint32_t	enlat;		/* Entry Latency */
3848b5163f0Snonaka 
3858b5163f0Snonaka 	uint32_t	exlat;		/* Exit Latency */
3868b5163f0Snonaka 
3878b5163f0Snonaka 	uint8_t		rrt;		/* Relative Read Throughput */
388cae3c2f4Snonaka #define	NVME_PSD_RRT_MASK	__BITS(0, 4)
3898b5163f0Snonaka 	uint8_t		rrl;		/* Relative Read Latency */
390cae3c2f4Snonaka #define	NVME_PSD_RRL_MASK	__BITS(0, 4)
3918b5163f0Snonaka 	uint8_t		rwt;		/* Relative Write Throughput */
392cae3c2f4Snonaka #define	NVME_PSD_RWT_MASK	__BITS(0, 4)
3938b5163f0Snonaka 	uint8_t		rwl;		/* Relative Write Latency */
394cae3c2f4Snonaka #define	NVME_PSD_RWL_MASK	__BITS(0, 4)
3958b5163f0Snonaka 
396cae3c2f4Snonaka 	uint16_t	idlp;		/* Idle Power */
397cae3c2f4Snonaka 	uint8_t		ips;		/* Idle Power Scale */
398cae3c2f4Snonaka #define	NVME_PSD_IPS_MASK	__BITS(0, 1)
399cae3c2f4Snonaka 	uint8_t		_reserved2;
400cae3c2f4Snonaka 	uint16_t	actp;		/* Active Power */
401cae3c2f4Snonaka 	uint16_t	ap;		/* Active Power Workload/Scale */
402cae3c2f4Snonaka #define	NVME_PSD_APW_MASK	__BITS(0, 2)
403cae3c2f4Snonaka #define	NVME_PSD_APS_MASK	__BITS(6, 7)
404cae3c2f4Snonaka 
405cae3c2f4Snonaka 	uint8_t		_reserved[8];
4068b5163f0Snonaka } __packed __aligned(8);
4071f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvm_identify_psd) == 32, "bad size for nvm_identify_psd");
4088b5163f0Snonaka 
4098b5163f0Snonaka struct nvm_identify_controller {
4108b5163f0Snonaka 	/* Controller Capabilities and Features */
4118b5163f0Snonaka 
4128b5163f0Snonaka 	uint16_t	vid;		/* PCI Vendor ID */
4138b5163f0Snonaka 	uint16_t	ssvid;		/* PCI Subsystem Vendor ID */
4148b5163f0Snonaka 
4158b5163f0Snonaka 	uint8_t		sn[20];		/* Serial Number */
4168b5163f0Snonaka 	uint8_t		mn[40];		/* Model Number */
4178b5163f0Snonaka 	uint8_t		fr[8];		/* Firmware Revision */
4188b5163f0Snonaka 
4198b5163f0Snonaka 	uint8_t		rab;		/* Recommended Arbitration Burst */
4208b5163f0Snonaka 	uint8_t		ieee[3];	/* IEEE OUI Identifier */
4218b5163f0Snonaka 
4228b5163f0Snonaka 	uint8_t		cmic;		/* Controller Multi-Path I/O and
4238b5163f0Snonaka 					   Namespace Sharing Capabilities */
4248b5163f0Snonaka 	uint8_t		mdts;		/* Maximum Data Transfer Size */
4258b5163f0Snonaka 
4261f5086ecSnonaka 	uint16_t	cntlid;		/* Controller ID */
4271f5086ecSnonaka 	uint32_t	ver;		/* Version */
4281f5086ecSnonaka 
4291f5086ecSnonaka 	uint32_t	rtd3r;		/* RTD3 Resume Latency */
4301f5086ecSnonaka 	uint32_t	rtd3e;		/* RTD3 Enter Latency */
4311f5086ecSnonaka 
4321f5086ecSnonaka 	uint32_t	oaes;		/* Optional Asynchronous Events Supported */
4331f5086ecSnonaka 	uint32_t	ctrattr;	/* Controller Attributes */
4341f5086ecSnonaka 
4351f5086ecSnonaka 	uint8_t		_reserved1[12];
4361f5086ecSnonaka 
4371f5086ecSnonaka 	uint8_t		fguid[16];	/* FRU Globally Unique Identifier */
4381f5086ecSnonaka 
4391f5086ecSnonaka 	uint8_t		_reserved2[128];
4408b5163f0Snonaka 
4418b5163f0Snonaka 	/* Admin Command Set Attributes & Optional Controller Capabilities */
4428b5163f0Snonaka 
4438b5163f0Snonaka 	uint16_t	oacs;		/* Optional Admin Command Support */
4441b34f87dSnonaka #define	NVME_ID_CTRLR_OACS_DOORBELL_BC	__BIT(8)
4451b34f87dSnonaka #define	NVME_ID_CTRLR_OACS_VIRT_MGMT	__BIT(7)
4461b34f87dSnonaka #define	NVME_ID_CTRLR_OACS_NVME_MI	__BIT(6)
4471b34f87dSnonaka #define	NVME_ID_CTRLR_OACS_DIRECTIVES	__BIT(5)
4481b34f87dSnonaka #define	NVME_ID_CTRLR_OACS_DEV_SELFTEST	__BIT(4)
449cae3c2f4Snonaka #define	NVME_ID_CTRLR_OACS_NS		__BIT(3)
450cae3c2f4Snonaka #define	NVME_ID_CTRLR_OACS_FW		__BIT(2)
451cae3c2f4Snonaka #define	NVME_ID_CTRLR_OACS_FORMAT	__BIT(1)
452cae3c2f4Snonaka #define	NVME_ID_CTRLR_OACS_SECURITY	__BIT(0)
4538b5163f0Snonaka 	uint8_t		acl;		/* Abort Command Limit */
4548b5163f0Snonaka 	uint8_t		aerl;		/* Asynchronous Event Request Limit */
4558b5163f0Snonaka 
4568b5163f0Snonaka 	uint8_t		frmw;		/* Firmware Updates */
457cae3c2f4Snonaka #define	NVME_ID_CTRLR_FRMW_NOREQ_RESET	__BIT(4)
458cae3c2f4Snonaka #define	NVME_ID_CTRLR_FRMW_NSLOT	__BITS(1, 3)
459cae3c2f4Snonaka #define	NVME_ID_CTRLR_FRMW_SLOT1_RO	__BIT(0)
4608b5163f0Snonaka 	uint8_t		lpa;		/* Log Page Attributes */
461cae3c2f4Snonaka #define	NVME_ID_CTRLR_LPA_CMD_EFFECT	__BIT(1)
462cae3c2f4Snonaka #define	NVME_ID_CTRLR_LPA_NS_SMART	__BIT(0)
4638b5163f0Snonaka 	uint8_t		elpe;		/* Error Log Page Entries */
4648b5163f0Snonaka 	uint8_t		npss;		/* Number of Power States Support */
4658b5163f0Snonaka 
4668b5163f0Snonaka 	uint8_t		avscc;		/* Admin Vendor Specific Command
4678b5163f0Snonaka 					   Configuration */
4688b5163f0Snonaka 	uint8_t		apsta;		/* Autonomous Power State Transition
4698b5163f0Snonaka 					   Attributes */
470390f9331Sjdolecek #define	NVME_ID_CTRLR_APSTA_PRESENT	__BIT(0)
4718b5163f0Snonaka 
4721f5086ecSnonaka 	uint16_t	wctemp;		/* Warning Composite Temperature
4731f5086ecSnonaka 					   Threshold */
4741f5086ecSnonaka 	uint16_t	cctemp;		/* Critical Composite Temperature
4751f5086ecSnonaka 					   Threshold */
4761f5086ecSnonaka 
4771f5086ecSnonaka 	uint16_t	mtfa;		/* Maximum Time for Firmware Activation */
4781f5086ecSnonaka 
4791f5086ecSnonaka 	uint32_t	hmpre;		/* Host Memory Buffer Preferred Size */
4801f5086ecSnonaka 	uint32_t	hmmin;		/* Host Memory Buffer Minimum Size */
4811f5086ecSnonaka 
4821f5086ecSnonaka 	struct {
4831f5086ecSnonaka 		uint64_t	tnvmcap[2];
4841f5086ecSnonaka 		uint64_t	unvmcap[2];
4851f5086ecSnonaka 	} __packed untncap;		/* Name space capabilities:
4861f5086ecSnonaka 					   if NVME_ID_CTRLR_OACS_NS,
4871f5086ecSnonaka 					   report tnvmcap and unvmcap */
4881f5086ecSnonaka 
4891f5086ecSnonaka 	uint32_t	rpmbs;		/* Replay Protected Memory Block Support */
4901f5086ecSnonaka 
4911f5086ecSnonaka 	uint16_t	edstt;		/* Extended Device Self-test Time */
4921f5086ecSnonaka 	uint8_t		dsto;		/* Device Self-test Options */
4931f5086ecSnonaka 
4941f5086ecSnonaka 	uint8_t		fwug;		/* Firmware Update Granularity */
4951f5086ecSnonaka 
4961f5086ecSnonaka 	uint16_t	kas;		/* Keep Alive Support */
4971f5086ecSnonaka 
4981f5086ecSnonaka 	uint16_t	hctma;		/* Host Controlled Thermal Management
4991f5086ecSnonaka 					   Attributes */
5001f5086ecSnonaka 	uint16_t	mntmt;		/* Minimum Thermal Management Temperature */
5011f5086ecSnonaka 	uint16_t	mxtmt;		/* Maximum Thermal Management Temperature */
5021f5086ecSnonaka 
5031f5086ecSnonaka 	uint32_t	sanicap;	/* Sanitize Capabilities */
5041f5086ecSnonaka 
5051f5086ecSnonaka 	uint8_t		_reserved3[180];
5068b5163f0Snonaka 
5078b5163f0Snonaka 	/* NVM Command Set Attributes */
5088b5163f0Snonaka 
5098b5163f0Snonaka 	uint8_t		sqes;		/* Submission Queue Entry Size */
510cae3c2f4Snonaka #define	NVME_ID_CTRLR_SQES_MAX		__BITS(4, 7)
511cae3c2f4Snonaka #define	NVME_ID_CTRLR_SQES_MIN		__BITS(0, 3)
5128b5163f0Snonaka 	uint8_t		cqes;		/* Completion Queue Entry Size */
513cae3c2f4Snonaka #define	NVME_ID_CTRLR_CQES_MAX		__BITS(4, 7)
514cae3c2f4Snonaka #define	NVME_ID_CTRLR_CQES_MIN		__BITS(0, 3)
5151f5086ecSnonaka 
5161f5086ecSnonaka 	uint16_t	maxcmd;		/* Maximum Outstanding Commands */
5178b5163f0Snonaka 
5188b5163f0Snonaka 	uint32_t	nn;		/* Number of Namespaces */
5198b5163f0Snonaka 
5208b5163f0Snonaka 	uint16_t	oncs;		/* Optional NVM Command Support */
521b7a0ea19Sjdolecek #define	NVME_ID_CTRLR_ONCS_TIMESTAMP	__BIT(6)
522cae3c2f4Snonaka #define	NVME_ID_CTRLR_ONCS_RESERVATION	__BIT(5)
5230929c770Sjdolecek #define	NVME_ID_CTRLR_ONCS_SET_FEATURES	__BIT(4)
524cae3c2f4Snonaka #define	NVME_ID_CTRLR_ONCS_WRITE_ZERO	__BIT(3)
525cae3c2f4Snonaka #define	NVME_ID_CTRLR_ONCS_DSM		__BIT(2)
526cae3c2f4Snonaka #define	NVME_ID_CTRLR_ONCS_WRITE_UNC	__BIT(1)
527cae3c2f4Snonaka #define	NVME_ID_CTRLR_ONCS_COMPARE	__BIT(0)
5288b5163f0Snonaka 	uint16_t	fuses;		/* Fused Operation Support */
5298b5163f0Snonaka 
5308b5163f0Snonaka 	uint8_t		fna;		/* Format NVM Attributes */
5311b34f87dSnonaka #define	NVME_ID_CTRLR_FNA_CRYPTO_ERASE	__BIT(2)
5321b34f87dSnonaka #define	NVME_ID_CTRLR_FNA_ERASE_ALL	__BIT(1)
5331b34f87dSnonaka #define	NVME_ID_CTRLR_FNA_FORMAT_ALL	__BIT(0)
5348b5163f0Snonaka 	uint8_t		vwc;		/* Volatile Write Cache */
535cae3c2f4Snonaka #define	NVME_ID_CTRLR_VWC_PRESENT	__BIT(0)
5368b5163f0Snonaka 	uint16_t	awun;		/* Atomic Write Unit Normal */
5378b5163f0Snonaka 	uint16_t	awupf;		/* Atomic Write Unit Power Fail */
5381b34f87dSnonaka 
5398b5163f0Snonaka 	uint8_t		nvscc;		/* NVM Vendor Specific Command */
5408b5163f0Snonaka 	uint8_t		_reserved4[1];
5418b5163f0Snonaka 
5428b5163f0Snonaka 	uint16_t	acwu;		/* Atomic Compare & Write Unit */
5438b5163f0Snonaka 	uint8_t		_reserved5[2];
5448b5163f0Snonaka 
5458b5163f0Snonaka 	uint32_t	sgls;		/* SGL Support */
5468b5163f0Snonaka 
5471b34f87dSnonaka 	uint8_t		_reserved6[228];
5488b5163f0Snonaka 
5491b34f87dSnonaka 	uint8_t		subnqn[256];	/* NVM Subsystem NVMe Qualified Name */
5508b5163f0Snonaka 
5511b34f87dSnonaka 	uint8_t		_reserved7[768];
5528b5163f0Snonaka 
5531b34f87dSnonaka 	uint8_t		_reserved8[256]; /* NVMe over Fabrics specification */
5548b5163f0Snonaka 
5558b5163f0Snonaka 	struct nvm_identify_psd psd[32]; /* Power State Descriptors */
5568b5163f0Snonaka 
5571b34f87dSnonaka 	uint8_t		vs[1024];	/* Vendor Specific */
5588b5163f0Snonaka } __packed __aligned(8);
5591f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvm_identify_controller) == 4096, "bad size for nvm_identify_controller");
5608b5163f0Snonaka 
5618b5163f0Snonaka struct nvm_namespace_format {
5628b5163f0Snonaka 	uint16_t	ms;		/* Metadata Size */
5638b5163f0Snonaka 	uint8_t		lbads;		/* LBA Data Size */
5648b5163f0Snonaka 	uint8_t		rp;		/* Relative Performance */
5658b5163f0Snonaka } __packed __aligned(4);
5661f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvm_namespace_format) == 4, "bad size for nvm_namespace_format");
5678b5163f0Snonaka 
5688b5163f0Snonaka struct nvm_identify_namespace {
5698b5163f0Snonaka 	uint64_t	nsze;		/* Namespace Size */
5708b5163f0Snonaka 
5718b5163f0Snonaka 	uint64_t	ncap;		/* Namespace Capacity */
5728b5163f0Snonaka 
5738b5163f0Snonaka 	uint64_t	nuse;		/* Namespace Utilization */
5748b5163f0Snonaka 
5758b5163f0Snonaka 	uint8_t		nsfeat;		/* Namespace Features */
576cae3c2f4Snonaka #define	NVME_ID_NS_NSFEAT_LOGICAL_BLK_ERR	__BIT(2)
577cae3c2f4Snonaka #define	NVME_ID_NS_NSFEAT_NS			__BIT(1)
578cae3c2f4Snonaka #define	NVME_ID_NS_NSFEAT_THIN_PROV		__BIT(0)
5798b5163f0Snonaka 	uint8_t		nlbaf;		/* Number of LBA Formats */
5808b5163f0Snonaka 	uint8_t		flbas;		/* Formatted LBA Size */
5818b5163f0Snonaka #define NVME_ID_NS_FLBAS(_f)			((_f) & 0x0f)
5828b5163f0Snonaka #define NVME_ID_NS_FLBAS_MD			0x10
5838b5163f0Snonaka 	uint8_t		mc;		/* Metadata Capabilities */
5848b5163f0Snonaka 	uint8_t		dpc;		/* End-to-end Data Protection
5858b5163f0Snonaka 					   Capabilities */
5861b34f87dSnonaka 	uint8_t		dps;		/* End-to-end Data Protection Type
5871b34f87dSnonaka 					   Settings */
5881b34f87dSnonaka #define	NVME_ID_NS_DPS_MD_START			__BIT(3)
5891b34f87dSnonaka #define	NVME_ID_NS_DPS_PIT(_f)			((_f) & 0x7)
5908b5163f0Snonaka 
5911b34f87dSnonaka 	uint8_t		nmic;		/* Namespace Multi-path I/O and Namespace
5921b34f87dSnonaka 					   Sharing Capabilities */
5931b34f87dSnonaka 
5941b34f87dSnonaka 	uint8_t		rescap;		/* Reservation Capabilities */
5951b34f87dSnonaka 
5961b34f87dSnonaka 	uint8_t		fpi;		/* Format Progress Indicator */
5971b34f87dSnonaka 
5981b34f87dSnonaka 	uint8_t		dlfeat;		/* Deallocate Logical Block Features */
5991b34f87dSnonaka 
6001b34f87dSnonaka 	uint16_t	nawun;		/* Namespace Atomic Write Unit Normal  */
6011b34f87dSnonaka 	uint16_t	nawupf;		/* Namespace Atomic Write Unit Power Fail */
6021b34f87dSnonaka 	uint16_t	nacwu;		/* Namespace Atomic Compare & Write Unit */
6031b34f87dSnonaka 	uint16_t	nabsn;		/* Namespace Atomic Boundary Size Normal */
6041b34f87dSnonaka 	uint16_t	nabo;		/* Namespace Atomic Boundary Offset */
6051b34f87dSnonaka 	uint16_t	nabspf;		/* Namespace Atomic Boundary Size Power
6061b34f87dSnonaka 					   Fail */
6071b34f87dSnonaka 	uint16_t	noiob;		/* Namespace Optimal IO Boundary */
6081b34f87dSnonaka 
6091b34f87dSnonaka 	uint8_t		nvmcap[16];	/* NVM Capacity */
6101b34f87dSnonaka 
6111b34f87dSnonaka 	uint8_t		_reserved1[40];	/* bytes 64-103: Reserved */
6121b34f87dSnonaka 
6131b34f87dSnonaka 	uint8_t		nguid[16];	/* Namespace Globally Unique Identifier */
6141b34f87dSnonaka 	uint8_t		eui64[8];	/* IEEE Extended Unique Identifier */
6158b5163f0Snonaka 
6168b5163f0Snonaka 	struct nvm_namespace_format
6178b5163f0Snonaka 			lbaf[16];	/* LBA Format Support */
6188b5163f0Snonaka 
6198b5163f0Snonaka 	uint8_t		_reserved2[192];
6208b5163f0Snonaka 
6218b5163f0Snonaka 	uint8_t		vs[3712];
6228b5163f0Snonaka } __packed __aligned(8);
6231f5086ecSnonaka NVME_CTASSERT(sizeof(struct nvm_identify_namespace) == 4096, "bad size for nvm_identify_namespace");
624e7c0cc5dSnonaka 
625e7c0cc5dSnonaka #endif	/* __NVMEREG_H__ */
626