Home | History | Annotate | Line # | Download | only in ic
nvmereg.h revision 1.3.2.2
      1  1.3.2.2  pgoyette /*	$NetBSD: nvmereg.h,v 1.3.2.2 2017/03/20 06:57:28 pgoyette 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.1    nonaka #define NVME_CAP	0x0000	/* Controller Capabilities */
     24      1.1    nonaka #define  NVME_CAP_MPSMAX(_r)	(12 + (((_r) >> 52) & 0xf)) /* shift */
     25      1.1    nonaka #define  NVME_CAP_MPSMIN(_r)	(12 + (((_r) >> 48) & 0xf)) /* shift */
     26      1.1    nonaka #define  NVME_CAP_CSS(_r)	(((_r) >> 37) & 0x7f)
     27      1.1    nonaka #define  NVME_CAP_CSS_NVM	__BIT(0)
     28      1.1    nonaka #define  NVME_CAP_NSSRS(_r)	ISSET((_r), __BIT(36))
     29      1.1    nonaka #define  NVME_CAP_DSTRD(_r)	__BIT(2 + (((_r) >> 32) & 0xf)) /* bytes */
     30      1.1    nonaka #define  NVME_CAP_TO(_r)	(500 * (((_r) >> 24) & 0xff)) /* ms */
     31      1.1    nonaka #define  NVME_CAP_AMS(_r)	(((_r) >> 17) & 0x3)
     32      1.1    nonaka #define  NVME_CAP_AMS_WRR	__BIT(0)
     33      1.1    nonaka #define  NVME_CAP_AMS_VENDOR	__BIT(1)
     34      1.1    nonaka #define  NVME_CAP_CQR(_r)	ISSET((_r), __BIT(16))
     35      1.1    nonaka #define  NVME_CAP_MQES(_r)	(((_r) & 0xffff) + 1)
     36      1.1    nonaka #define NVME_CAP_LO	0x0000
     37      1.1    nonaka #define NVME_CAP_HI	0x0004
     38      1.1    nonaka #define NVME_VS		0x0008	/* Version */
     39      1.1    nonaka #define  NVME_VS_MJR(_r)	(((_r) >> 16) & 0xffff)
     40      1.1    nonaka #define  NVME_VS_MNR(_r)	((_r) & 0xffff)
     41      1.1    nonaka #define  NVME_VS_1_0		0x00010000
     42      1.1    nonaka #define  NVME_VS_1_1		0x00010100
     43      1.1    nonaka #define  NVME_VS_1_2		0x00010200
     44  1.3.2.2  pgoyette #define  NVME_VS_1_2_1		0x00010201
     45      1.1    nonaka #define NVME_INTMS	0x000c	/* Interrupt Mask Set */
     46      1.1    nonaka #define NVME_INTMC	0x0010	/* Interrupt Mask Clear */
     47      1.1    nonaka #define NVME_CC		0x0014	/* Controller Configuration */
     48      1.1    nonaka #define  NVME_CC_IOCQES(_v)	(((_v) & 0xf) << 20)
     49      1.1    nonaka #define  NVME_CC_IOCQES_MASK	NVME_CC_IOCQES(0xf)
     50      1.1    nonaka #define  NVME_CC_IOCQES_R(_v)	(((_v) >> 20) & 0xf)
     51      1.1    nonaka #define  NVME_CC_IOSQES(_v)	(((_v) & 0xf) << 16)
     52      1.1    nonaka #define  NVME_CC_IOSQES_MASK	NVME_CC_IOSQES(0xf)
     53      1.1    nonaka #define  NVME_CC_IOSQES_R(_v)	(((_v) >> 16) & 0xf)
     54      1.1    nonaka #define  NVME_CC_SHN(_v)	(((_v) & 0x3) << 14)
     55      1.1    nonaka #define  NVME_CC_SHN_MASK	NVME_CC_SHN(0x3)
     56      1.1    nonaka #define  NVME_CC_SHN_R(_v)	(((_v) >> 15) & 0x3)
     57      1.1    nonaka #define  NVME_CC_SHN_NONE	0
     58      1.1    nonaka #define  NVME_CC_SHN_NORMAL	1
     59      1.1    nonaka #define  NVME_CC_SHN_ABRUPT	2
     60      1.1    nonaka #define  NVME_CC_AMS(_v)	(((_v) & 0x7) << 11)
     61      1.1    nonaka #define  NVME_CC_AMS_MASK	NVME_CC_AMS(0x7)
     62      1.1    nonaka #define  NVME_CC_AMS_R(_v)	(((_v) >> 11) & 0xf)
     63      1.1    nonaka #define  NVME_CC_AMS_RR		0 /* round-robin */
     64      1.1    nonaka #define  NVME_CC_AMS_WRR_U	1 /* weighted round-robin w/ urgent */
     65      1.1    nonaka #define  NVME_CC_AMS_VENDOR	7 /* vendor */
     66      1.1    nonaka #define  NVME_CC_MPS(_v)	((((_v) - 12) & 0xf) << 7)
     67      1.1    nonaka #define  NVME_CC_MPS_MASK	(0xf << 7)
     68      1.1    nonaka #define  NVME_CC_MPS_R(_v)	(12 + (((_v) >> 7) & 0xf))
     69      1.1    nonaka #define  NVME_CC_CSS(_v)	(((_v) & 0x7) << 4)
     70      1.1    nonaka #define  NVME_CC_CSS_MASK	NVME_CC_CSS(0x7)
     71      1.1    nonaka #define  NVME_CC_CSS_R(_v)	(((_v) >> 4) & 0x7)
     72      1.1    nonaka #define  NVME_CC_CSS_NVM	0
     73      1.1    nonaka #define  NVME_CC_EN		__BIT(0)
     74      1.1    nonaka #define NVME_CSTS	0x001c	/* Controller Status */
     75      1.1    nonaka #define  NVME_CSTS_SHST_MASK	(0x3 << 2)
     76      1.1    nonaka #define  NVME_CSTS_SHST_NONE	(0x0 << 2) /* normal operation */
     77      1.1    nonaka #define  NVME_CSTS_SHST_WAIT	(0x1 << 2) /* shutdown processing occurring */
     78      1.1    nonaka #define  NVME_CSTS_SHST_DONE	(0x2 << 2) /* shutdown processing complete */
     79      1.1    nonaka #define  NVME_CSTS_CFS		(1 << 1)
     80      1.1    nonaka #define  NVME_CSTS_RDY		(1 << 0)
     81      1.1    nonaka #define NVME_NSSR	0x0020	/* NVM Subsystem Reset (Optional) */
     82      1.1    nonaka #define NVME_AQA	0x0024	/* Admin Queue Attributes */
     83      1.1    nonaka 				/* Admin Completion Queue Size */
     84      1.1    nonaka #define  NVME_AQA_ACQS(_v)	(((_v) - 1) << 16)
     85  1.3.2.1  pgoyette #define  NVME_AQA_ACQS_R(_v)	((_v >> 16) & ((1 << 12) - 1))
     86      1.1    nonaka 				/* Admin Submission Queue Size */
     87      1.1    nonaka #define  NVME_AQA_ASQS(_v)	(((_v) - 1) << 0)
     88  1.3.2.1  pgoyette #define  NVME_AQA_ASQS_R(_v)	(_v & ((1 << 12) - 1))
     89      1.1    nonaka #define NVME_ASQ	0x0028	/* Admin Submission Queue Base Address */
     90      1.1    nonaka #define NVME_ACQ	0x0030	/* Admin Completion Queue Base Address */
     91      1.1    nonaka 
     92      1.1    nonaka #define NVME_ADMIN_Q		0
     93      1.1    nonaka /* Submission Queue Tail Doorbell */
     94      1.1    nonaka #define NVME_SQTDBL(_q, _s)	(0x1000 + (2 * (_q) + 0) * (_s))
     95      1.1    nonaka /* Completion Queue Head Doorbell */
     96      1.1    nonaka #define NVME_CQHDBL(_q, _s)	(0x1000 + (2 * (_q) + 1) * (_s))
     97      1.1    nonaka 
     98      1.1    nonaka struct nvme_sge {
     99      1.1    nonaka 	uint8_t		id;
    100      1.1    nonaka 	uint8_t		_reserved[15];
    101      1.1    nonaka } __packed __aligned(8);
    102      1.1    nonaka 
    103      1.1    nonaka struct nvme_sge_data {
    104      1.1    nonaka 	uint8_t		id;
    105      1.1    nonaka 	uint8_t		_reserved[3];
    106      1.1    nonaka 
    107      1.1    nonaka 	uint32_t	length;
    108      1.1    nonaka 
    109      1.1    nonaka 	uint64_t	address;
    110      1.1    nonaka } __packed __aligned(8);
    111      1.1    nonaka 
    112      1.1    nonaka struct nvme_sge_bit_bucket {
    113      1.1    nonaka 	uint8_t		id;
    114      1.1    nonaka 	uint8_t		_reserved[3];
    115      1.1    nonaka 
    116      1.1    nonaka 	uint32_t	length;
    117      1.1    nonaka 
    118      1.1    nonaka 	uint64_t	address;
    119      1.1    nonaka } __packed __aligned(8);
    120      1.1    nonaka 
    121      1.1    nonaka struct nvme_sqe {
    122      1.1    nonaka 	uint8_t		opcode;
    123      1.1    nonaka 	uint8_t		flags;
    124      1.1    nonaka 	uint16_t	cid;
    125      1.1    nonaka 
    126      1.1    nonaka 	uint32_t	nsid;
    127      1.1    nonaka 
    128      1.1    nonaka 	uint8_t		_reserved[8];
    129      1.1    nonaka 
    130      1.1    nonaka 	uint64_t	mptr;
    131      1.1    nonaka 
    132      1.1    nonaka 	union {
    133      1.1    nonaka 		uint64_t	prp[2];
    134      1.1    nonaka 		struct nvme_sge	sge;
    135      1.1    nonaka 	} __packed	entry;
    136      1.1    nonaka 
    137      1.1    nonaka 	uint32_t	cdw10;
    138      1.1    nonaka 	uint32_t	cdw11;
    139      1.1    nonaka 	uint32_t	cdw12;
    140      1.1    nonaka 	uint32_t	cdw13;
    141      1.1    nonaka 	uint32_t	cdw14;
    142      1.1    nonaka 	uint32_t	cdw15;
    143      1.1    nonaka } __packed __aligned(8);
    144      1.1    nonaka 
    145      1.1    nonaka struct nvme_sqe_q {
    146      1.1    nonaka 	uint8_t		opcode;
    147      1.1    nonaka 	uint8_t		flags;
    148      1.1    nonaka 	uint16_t	cid;
    149      1.1    nonaka 
    150      1.1    nonaka 	uint8_t		_reserved1[20];
    151      1.1    nonaka 
    152      1.1    nonaka 	uint64_t	prp1;
    153      1.1    nonaka 
    154      1.1    nonaka 	uint8_t		_reserved2[8];
    155      1.1    nonaka 
    156      1.1    nonaka 	uint16_t	qid;
    157      1.1    nonaka 	uint16_t	qsize;
    158      1.1    nonaka 
    159      1.1    nonaka 	uint8_t		qflags;
    160      1.1    nonaka #define NVM_SQE_SQ_QPRIO_URG	(0x0 << 1)
    161      1.1    nonaka #define NVM_SQE_SQ_QPRIO_HI	(0x1 << 1)
    162      1.1    nonaka #define NVM_SQE_SQ_QPRIO_MED	(0x2 << 1)
    163      1.1    nonaka #define NVM_SQE_SQ_QPRIO_LOW	(0x3 << 1)
    164      1.1    nonaka #define NVM_SQE_CQ_IEN		(1 << 1)
    165      1.1    nonaka #define NVM_SQE_Q_PC		(1 << 0)
    166      1.1    nonaka 	uint8_t		_reserved3;
    167      1.1    nonaka 	uint16_t	cqid; /* XXX interrupt vector for cq */
    168      1.1    nonaka 
    169      1.1    nonaka 	uint8_t		_reserved4[16];
    170      1.1    nonaka } __packed __aligned(8);
    171      1.1    nonaka 
    172      1.1    nonaka struct nvme_sqe_io {
    173      1.1    nonaka 	uint8_t		opcode;
    174      1.1    nonaka 	uint8_t		flags;
    175      1.1    nonaka 	uint16_t	cid;
    176      1.1    nonaka 
    177      1.1    nonaka 	uint32_t	nsid;
    178      1.1    nonaka 
    179      1.1    nonaka 	uint8_t		_reserved[8];
    180      1.1    nonaka 
    181      1.1    nonaka 	uint64_t	mptr;
    182      1.1    nonaka 
    183      1.1    nonaka 	union {
    184      1.1    nonaka 		uint64_t	prp[2];
    185      1.1    nonaka 		struct nvme_sge	sge;
    186      1.1    nonaka 	} __packed	entry;
    187      1.1    nonaka 
    188      1.1    nonaka 	uint64_t	slba;	/* Starting LBA */
    189      1.1    nonaka 
    190      1.1    nonaka 	uint16_t	nlb;	/* Number of Logical Blocks */
    191      1.1    nonaka 	uint16_t	ioflags;
    192  1.3.2.1  pgoyette #define NVM_SQE_IO_LR	__BIT(15)	/* Limited Retry */
    193  1.3.2.1  pgoyette #define NVM_SQE_IO_FUA	__BIT(14)	/* Force Unit Access (bypass cache) */
    194      1.1    nonaka 
    195      1.1    nonaka 	uint8_t		dsm;	/* Dataset Management */
    196  1.3.2.1  pgoyette #define NVM_SQE_IO_INCOMP	__BIT(7)	/* Incompressible */
    197  1.3.2.1  pgoyette #define NVM_SQE_IO_SEQ		__BIT(6)	/* Sequential request */
    198  1.3.2.1  pgoyette #define NVM_SQE_IO_LAT_MASK	__BITS(4, 5)	/* Access Latency */
    199  1.3.2.1  pgoyette #define  NVM_SQE_IO_LAT_NONE	0		/* Latency: none */
    200  1.3.2.1  pgoyette #define  NVM_SQE_IO_LAT_IDLE	__BIT(4)	/* Latency: idle */
    201  1.3.2.1  pgoyette #define  NVM_SQE_IO_LAT_NORMAL	__BIT(5)	/* Latency: normal */
    202  1.3.2.1  pgoyette #define  NVM_SQE_IO_LAT_LOW	__BITS(4, 5)	/* Latency: low */
    203  1.3.2.1  pgoyette #define NVM_SQE_IO_FREQ_MASK	__BITS(0, 3)	/* Access Frequency */
    204  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_TYPICAL	0x1	/* Typical */
    205  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_INFR_INFW	0x2	/* Infrequent read and writes */
    206  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_FRR_INFW	0x3	/* Frequent read, inf. writes */
    207  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_INFR_FRW	0x4	/* Inf. read, freq. writes */
    208  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_FRR_FRW	0x5	/* Freq. read and writes */
    209  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_ONCE		0x6	/* One time i/o operation */
    210  1.3.2.1  pgoyette /* Extra Access Frequency bits for read operations */
    211  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_SPEC		0x7	/* Speculative read - prefech */
    212  1.3.2.1  pgoyette #define  NVM_SQE_IO_FREQ_OVERWRITE	0x8	/* Will be overwritten soon */
    213      1.1    nonaka 	uint8_t		_reserved2[3];
    214      1.1    nonaka 
    215      1.1    nonaka 	uint32_t	eilbrt;	/* Expected Initial Logical Block
    216      1.1    nonaka 				   Reference Tag */
    217      1.1    nonaka 
    218      1.1    nonaka 	uint16_t	elbat;	/* Expected Logical Block
    219      1.1    nonaka 				   Application Tag */
    220      1.1    nonaka 	uint16_t	elbatm;	/* Expected Logical Block
    221      1.1    nonaka 				   Application Tag Mask */
    222      1.1    nonaka } __packed __aligned(8);
    223      1.1    nonaka 
    224      1.1    nonaka struct nvme_cqe {
    225      1.1    nonaka 	uint32_t	cdw0;
    226  1.3.2.2  pgoyette #define NVME_CQE_CDW0_VWC_WCE	__BIT(1)	/* Volatile Write Cache Enable */
    227      1.1    nonaka 
    228      1.1    nonaka 	uint32_t	_reserved;
    229      1.1    nonaka 
    230      1.1    nonaka 	uint16_t	sqhd; /* SQ Head Pointer */
    231      1.1    nonaka 	uint16_t	sqid; /* SQ Identifier */
    232      1.1    nonaka 
    233      1.1    nonaka 	uint16_t	cid; /* Command Identifier */
    234      1.1    nonaka 	uint16_t	flags;
    235      1.1    nonaka #define NVME_CQE_DNR		__BIT(15)
    236      1.1    nonaka #define NVME_CQE_M		__BIT(14)
    237      1.3    nonaka #define NVME_CQE_SCT_MASK	__BITS(8, 10)
    238      1.1    nonaka #define NVME_CQE_SCT(_f)	((_f) & (0x07 << 8))
    239      1.1    nonaka #define  NVME_CQE_SCT_GENERIC		(0x00 << 8)
    240      1.1    nonaka #define  NVME_CQE_SCT_COMMAND		(0x01 << 8)
    241      1.1    nonaka #define  NVME_CQE_SCT_MEDIAERR		(0x02 << 8)
    242      1.1    nonaka #define  NVME_CQE_SCT_VENDOR		(0x07 << 8)
    243      1.3    nonaka #define NVME_CQE_SC_MASK	__BITS(1, 7)
    244      1.1    nonaka #define NVME_CQE_SC(_f)		((_f) & (0x7f << 1))
    245      1.3    nonaka /* generic command status codes */
    246      1.1    nonaka #define  NVME_CQE_SC_SUCCESS		(0x00 << 1)
    247      1.1    nonaka #define  NVME_CQE_SC_INVALID_OPCODE	(0x01 << 1)
    248      1.1    nonaka #define  NVME_CQE_SC_INVALID_FIELD	(0x02 << 1)
    249      1.1    nonaka #define  NVME_CQE_SC_CID_CONFLICT	(0x03 << 1)
    250      1.1    nonaka #define  NVME_CQE_SC_DATA_XFER_ERR	(0x04 << 1)
    251      1.1    nonaka #define  NVME_CQE_SC_ABRT_BY_NO_PWR	(0x05 << 1)
    252      1.1    nonaka #define  NVME_CQE_SC_INTERNAL_DEV_ERR	(0x06 << 1)
    253      1.1    nonaka #define  NVME_CQE_SC_CMD_ABRT_REQD	(0x07 << 1)
    254      1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_SQ_DEL	(0x08 << 1)
    255      1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_ERR	(0x09 << 1)
    256      1.1    nonaka #define  NVME_CQE_SC_CMD_ABDR_FUSE_MISS	(0x0a << 1)
    257      1.1    nonaka #define  NVME_CQE_SC_INVALID_NS		(0x0b << 1)
    258      1.1    nonaka #define  NVME_CQE_SC_CMD_SEQ_ERR	(0x0c << 1)
    259      1.1    nonaka #define  NVME_CQE_SC_INVALID_LAST_SGL	(0x0d << 1)
    260      1.1    nonaka #define  NVME_CQE_SC_INVALID_NUM_SGL	(0x0e << 1)
    261      1.1    nonaka #define  NVME_CQE_SC_DATA_SGL_LEN	(0x0f << 1)
    262      1.1    nonaka #define  NVME_CQE_SC_MDATA_SGL_LEN	(0x10 << 1)
    263      1.1    nonaka #define  NVME_CQE_SC_SGL_TYPE_INVALID	(0x11 << 1)
    264      1.1    nonaka #define  NVME_CQE_SC_LBA_RANGE		(0x80 << 1)
    265      1.1    nonaka #define  NVME_CQE_SC_CAP_EXCEEDED	(0x81 << 1)
    266      1.3    nonaka #define  NVME_CQE_SC_NS_NOT_RDY		(0x82 << 1)
    267      1.3    nonaka #define  NVME_CQE_SC_RSV_CONFLICT	(0x83 << 1)
    268      1.3    nonaka /* command specific status codes */
    269      1.3    nonaka #define  NVME_CQE_SC_CQE_INVALID	(0x00 << 1)
    270      1.3    nonaka #define  NVME_CQE_SC_INVALID_QID	(0x01 << 1)
    271      1.3    nonaka #define  NVME_CQE_SC_MAX_Q_SIZE		(0x02 << 1)
    272      1.3    nonaka #define  NVME_CQE_SC_ABORT_LIMIT	(0x03 << 1)
    273      1.3    nonaka #define  NVME_CQE_SC_ASYNC_EV_REQ_LIMIT	(0x05 << 1)
    274      1.3    nonaka #define  NVME_CQE_SC_INVALID_FW_SLOT	(0x06 << 1)
    275      1.3    nonaka #define  NVME_CQE_SC_INVALID_FW_IMAGE	(0x07 << 1)
    276      1.3    nonaka #define  NVME_CQE_SC_INVALID_INT_VEC	(0x08 << 1)
    277      1.3    nonaka #define  NVME_CQE_SC_INVALID_LOG_PAGE	(0x09 << 1)
    278      1.3    nonaka #define  NVME_CQE_SC_INVALID_FORMAT	(0x0a << 1)
    279      1.3    nonaka #define  NVME_CQE_SC_FW_REQ_CNV_RESET	(0x0b << 1)
    280      1.3    nonaka #define  NVME_CQE_SC_FW_REQ_NVM_RESET	(0x10 << 1)
    281      1.3    nonaka #define  NVME_CQE_SC_FW_REQ_RESET	(0x11 << 1)
    282      1.3    nonaka #define  NVME_CQE_SC_FW_MAX_TIME_VIO	(0x12 << 1)
    283      1.3    nonaka #define  NVME_CQE_SC_FW_PROHIBIT	(0x13 << 1)
    284      1.3    nonaka #define  NVME_CQE_SC_OVERLAP_RANGE	(0x14 << 1)
    285      1.3    nonaka #define  NVME_CQE_SC_CONFLICT_ATTRS	(0x80 << 1)
    286      1.3    nonaka #define  NVME_CQE_SC_INVALID_PROT_INFO	(0x81 << 1)
    287      1.3    nonaka #define  NVME_CQE_SC_ATT_WR_TO_RO_PAGE	(0x82 << 1)
    288      1.3    nonaka /* media error status codes */
    289      1.3    nonaka #define  NVME_CQE_SC_WRITE_FAULTS	(0x80 << 1)
    290      1.3    nonaka #define  NVME_CQE_SC_UNRECV_READ_ERR	(0x81 << 1)
    291      1.3    nonaka #define  NVME_CQE_SC_GUARD_CHECK_ERR	(0x82 << 1)
    292      1.3    nonaka #define  NVME_CQE_SC_APPL_TAG_CHECK_ERR	(0x83 << 1)
    293      1.3    nonaka #define  NVME_CQE_SC_REF_TAG_CHECK_ERR	(0x84 << 1)
    294      1.3    nonaka #define  NVME_CQE_SC_CMP_FAIL		(0x85 << 1)
    295      1.3    nonaka #define  NVME_CQE_SC_ACCESS_DENIED	(0x86 << 1)
    296      1.1    nonaka #define NVME_CQE_PHASE		__BIT(0)
    297      1.1    nonaka } __packed __aligned(8);
    298      1.1    nonaka 
    299      1.1    nonaka #define NVM_ADMIN_DEL_IOSQ	0x00 /* Delete I/O Submission Queue */
    300      1.1    nonaka #define NVM_ADMIN_ADD_IOSQ	0x01 /* Create I/O Submission Queue */
    301      1.1    nonaka #define NVM_ADMIN_GET_LOG_PG	0x02 /* Get Log Page */
    302      1.1    nonaka #define NVM_ADMIN_DEL_IOCQ	0x04 /* Delete I/O Completion Queue */
    303      1.1    nonaka #define NVM_ADMIN_ADD_IOCQ	0x05 /* Create I/O Completion Queue */
    304      1.1    nonaka #define NVM_ADMIN_IDENTIFY	0x06 /* Identify */
    305      1.1    nonaka #define NVM_ADMIN_ABORT		0x08 /* Abort */
    306      1.1    nonaka #define NVM_ADMIN_SET_FEATURES	0x09 /* Set Features */
    307      1.1    nonaka #define NVM_ADMIN_GET_FEATURES	0x0a /* Get Features */
    308      1.1    nonaka #define NVM_ADMIN_ASYNC_EV_REQ	0x0c /* Asynchronous Event Request */
    309      1.3    nonaka #define NVM_ADMIN_FW_COMMIT	0x10 /* Firmware Commit */
    310      1.1    nonaka #define NVM_ADMIN_FW_DOWNLOAD	0x11 /* Firmware Image Download */
    311      1.1    nonaka 
    312      1.1    nonaka #define NVM_CMD_FLUSH		0x00 /* Flush */
    313      1.1    nonaka #define NVM_CMD_WRITE		0x01 /* Write */
    314      1.1    nonaka #define NVM_CMD_READ		0x02 /* Read */
    315      1.1    nonaka #define NVM_CMD_WR_UNCOR	0x04 /* Write Uncorrectable */
    316      1.1    nonaka #define NVM_CMD_COMPARE		0x05 /* Compare */
    317      1.1    nonaka #define NVM_CMD_DSM		0x09 /* Dataset Management */
    318      1.1    nonaka 
    319  1.3.2.2  pgoyette /* Features for GET/SET FEATURES */
    320  1.3.2.2  pgoyette #define NVM_FEATURE_VOLATILE_WRITE_CACHE	0x06	/* optional */
    321  1.3.2.2  pgoyette #define NVM_FEATURE_NUMBER_OF_QUEUES		0x07	/* mandatory */
    322  1.3.2.2  pgoyette 
    323      1.1    nonaka /* Power State Descriptor Data */
    324      1.1    nonaka struct nvm_identify_psd {
    325      1.1    nonaka 	uint16_t	mp;		/* Max Power */
    326      1.3    nonaka 	uint8_t		_reserved1;
    327      1.3    nonaka 	uint8_t		flags;
    328      1.3    nonaka #define	NVME_PSD_NOPS		__BIT(1)
    329      1.3    nonaka #define	NVME_PSD_MPS		__BIT(0)
    330      1.1    nonaka 
    331      1.1    nonaka 	uint32_t	enlat;		/* Entry Latency */
    332      1.1    nonaka 
    333      1.1    nonaka 	uint32_t	exlat;		/* Exit Latency */
    334      1.1    nonaka 
    335      1.1    nonaka 	uint8_t		rrt;		/* Relative Read Throughput */
    336      1.3    nonaka #define	NVME_PSD_RRT_MASK	__BITS(0, 4)
    337      1.1    nonaka 	uint8_t		rrl;		/* Relative Read Latency */
    338      1.3    nonaka #define	NVME_PSD_RRL_MASK	__BITS(0, 4)
    339      1.1    nonaka 	uint8_t		rwt;		/* Relative Write Throughput */
    340      1.3    nonaka #define	NVME_PSD_RWT_MASK	__BITS(0, 4)
    341      1.1    nonaka 	uint8_t		rwl;		/* Relative Write Latency */
    342      1.3    nonaka #define	NVME_PSD_RWL_MASK	__BITS(0, 4)
    343      1.1    nonaka 
    344      1.3    nonaka 	uint16_t	idlp;		/* Idle Power */
    345      1.3    nonaka 	uint8_t		ips;		/* Idle Power Scale */
    346      1.3    nonaka #define	NVME_PSD_IPS_MASK	__BITS(0, 1)
    347      1.3    nonaka 	uint8_t		_reserved2;
    348      1.3    nonaka 	uint16_t	actp;		/* Active Power */
    349      1.3    nonaka 	uint16_t	ap;		/* Active Power Workload/Scale */
    350      1.3    nonaka #define	NVME_PSD_APW_MASK	__BITS(0, 2)
    351      1.3    nonaka #define	NVME_PSD_APS_MASK	__BITS(6, 7)
    352      1.3    nonaka 
    353      1.3    nonaka 	uint8_t		_reserved[8];
    354      1.1    nonaka } __packed __aligned(8);
    355      1.1    nonaka 
    356      1.1    nonaka struct nvm_identify_controller {
    357      1.1    nonaka 	/* Controller Capabilities and Features */
    358      1.1    nonaka 
    359      1.1    nonaka 	uint16_t	vid;		/* PCI Vendor ID */
    360      1.1    nonaka 	uint16_t	ssvid;		/* PCI Subsystem Vendor ID */
    361      1.1    nonaka 
    362      1.1    nonaka 	uint8_t		sn[20];		/* Serial Number */
    363      1.1    nonaka 	uint8_t		mn[40];		/* Model Number */
    364      1.1    nonaka 	uint8_t		fr[8];		/* Firmware Revision */
    365      1.1    nonaka 
    366      1.1    nonaka 	uint8_t		rab;		/* Recommended Arbitration Burst */
    367      1.1    nonaka 	uint8_t		ieee[3];	/* IEEE OUI Identifier */
    368      1.1    nonaka 
    369      1.1    nonaka 	uint8_t		cmic;		/* Controller Multi-Path I/O and
    370      1.1    nonaka 					   Namespace Sharing Capabilities */
    371      1.1    nonaka 	uint8_t		mdts;		/* Maximum Data Transfer Size */
    372      1.1    nonaka 	uint16_t	cntlid;		/* Controller ID */
    373      1.1    nonaka 
    374      1.1    nonaka 	uint8_t		_reserved1[176];
    375      1.1    nonaka 
    376      1.1    nonaka 	/* Admin Command Set Attributes & Optional Controller Capabilities */
    377      1.1    nonaka 
    378      1.1    nonaka 	uint16_t	oacs;		/* Optional Admin Command Support */
    379      1.3    nonaka #define	NVME_ID_CTRLR_OACS_NS		__BIT(3)
    380      1.3    nonaka #define	NVME_ID_CTRLR_OACS_FW		__BIT(2)
    381      1.3    nonaka #define	NVME_ID_CTRLR_OACS_FORMAT	__BIT(1)
    382      1.3    nonaka #define	NVME_ID_CTRLR_OACS_SECURITY	__BIT(0)
    383      1.1    nonaka 	uint8_t		acl;		/* Abort Command Limit */
    384      1.1    nonaka 	uint8_t		aerl;		/* Asynchronous Event Request Limit */
    385      1.1    nonaka 
    386      1.1    nonaka 	uint8_t		frmw;		/* Firmware Updates */
    387      1.3    nonaka #define	NVME_ID_CTRLR_FRMW_NOREQ_RESET	__BIT(4)
    388      1.3    nonaka #define	NVME_ID_CTRLR_FRMW_NSLOT	__BITS(1, 3)
    389      1.3    nonaka #define	NVME_ID_CTRLR_FRMW_SLOT1_RO	__BIT(0)
    390      1.1    nonaka 	uint8_t		lpa;		/* Log Page Attributes */
    391      1.3    nonaka #define	NVME_ID_CTRLR_LPA_CMD_EFFECT	__BIT(1)
    392      1.3    nonaka #define	NVME_ID_CTRLR_LPA_NS_SMART	__BIT(0)
    393      1.1    nonaka 	uint8_t		elpe;		/* Error Log Page Entries */
    394      1.1    nonaka 	uint8_t		npss;		/* Number of Power States Support */
    395      1.1    nonaka 
    396      1.1    nonaka 	uint8_t		avscc;		/* Admin Vendor Specific Command
    397      1.1    nonaka 					   Configuration */
    398      1.1    nonaka 	uint8_t		apsta;		/* Autonomous Power State Transition
    399      1.1    nonaka 					   Attributes */
    400      1.1    nonaka 
    401      1.1    nonaka 	uint8_t		_reserved2[246];
    402      1.1    nonaka 
    403      1.1    nonaka 	/* NVM Command Set Attributes */
    404      1.1    nonaka 
    405      1.1    nonaka 	uint8_t		sqes;		/* Submission Queue Entry Size */
    406      1.3    nonaka #define	NVME_ID_CTRLR_SQES_MAX		__BITS(4, 7)
    407      1.3    nonaka #define	NVME_ID_CTRLR_SQES_MIN		__BITS(0, 3)
    408      1.1    nonaka 	uint8_t		cqes;		/* Completion Queue Entry Size */
    409      1.3    nonaka #define	NVME_ID_CTRLR_CQES_MAX		__BITS(4, 7)
    410      1.3    nonaka #define	NVME_ID_CTRLR_CQES_MIN		__BITS(0, 3)
    411      1.1    nonaka 	uint8_t		_reserved3[2];
    412      1.1    nonaka 
    413      1.1    nonaka 	uint32_t	nn;		/* Number of Namespaces */
    414      1.1    nonaka 
    415      1.1    nonaka 	uint16_t	oncs;		/* Optional NVM Command Support */
    416      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_RESERVATION	__BIT(5)
    417      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_SET_FEATURES	__BIT(4)
    418      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_WRITE_ZERO	__BIT(3)
    419      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_DSM		__BIT(2)
    420      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_WRITE_UNC	__BIT(1)
    421      1.3    nonaka #define	NVME_ID_CTRLR_ONCS_COMPARE	__BIT(0)
    422      1.1    nonaka 	uint16_t	fuses;		/* Fused Operation Support */
    423      1.1    nonaka 
    424      1.1    nonaka 	uint8_t		fna;		/* Format NVM Attributes */
    425      1.1    nonaka 	uint8_t		vwc;		/* Volatile Write Cache */
    426      1.3    nonaka #define	NVME_ID_CTRLR_VWC_PRESENT	__BIT(0)
    427      1.1    nonaka 	uint16_t	awun;		/* Atomic Write Unit Normal */
    428      1.1    nonaka 
    429      1.1    nonaka 	uint16_t	awupf;		/* Atomic Write Unit Power Fail */
    430      1.1    nonaka 	uint8_t		nvscc;		/* NVM Vendor Specific Command */
    431      1.1    nonaka 	uint8_t		_reserved4[1];
    432      1.1    nonaka 
    433      1.1    nonaka 	uint16_t	acwu;		/* Atomic Compare & Write Unit */
    434      1.1    nonaka 	uint8_t		_reserved5[2];
    435      1.1    nonaka 
    436      1.1    nonaka 	uint32_t	sgls;		/* SGL Support */
    437      1.1    nonaka 
    438      1.1    nonaka 	uint8_t		_reserved6[164];
    439      1.1    nonaka 
    440      1.1    nonaka 	/* I/O Command Set Attributes */
    441      1.1    nonaka 
    442      1.1    nonaka 	uint8_t		_reserved7[1344];
    443      1.1    nonaka 
    444      1.1    nonaka 	/* Power State Descriptors */
    445      1.1    nonaka 
    446      1.1    nonaka 	struct nvm_identify_psd psd[32]; /* Power State Descriptors */
    447      1.1    nonaka 
    448      1.1    nonaka 	/* Vendor Specific */
    449      1.1    nonaka 
    450      1.1    nonaka 	uint8_t		_reserved8[1024];
    451      1.1    nonaka } __packed __aligned(8);
    452      1.1    nonaka 
    453      1.1    nonaka struct nvm_namespace_format {
    454      1.1    nonaka 	uint16_t	ms;		/* Metadata Size */
    455      1.1    nonaka 	uint8_t		lbads;		/* LBA Data Size */
    456      1.1    nonaka 	uint8_t		rp;		/* Relative Performance */
    457      1.1    nonaka } __packed __aligned(4);
    458      1.1    nonaka 
    459      1.1    nonaka struct nvm_identify_namespace {
    460      1.1    nonaka 	uint64_t	nsze;		/* Namespace Size */
    461      1.1    nonaka 
    462      1.1    nonaka 	uint64_t	ncap;		/* Namespace Capacity */
    463      1.1    nonaka 
    464      1.1    nonaka 	uint64_t	nuse;		/* Namespace Utilization */
    465      1.1    nonaka 
    466      1.1    nonaka 	uint8_t		nsfeat;		/* Namespace Features */
    467      1.3    nonaka #define	NVME_ID_NS_NSFEAT_LOGICAL_BLK_ERR	__BIT(2)
    468      1.3    nonaka #define	NVME_ID_NS_NSFEAT_NS			__BIT(1)
    469      1.3    nonaka #define	NVME_ID_NS_NSFEAT_THIN_PROV		__BIT(0)
    470      1.1    nonaka 	uint8_t		nlbaf;		/* Number of LBA Formats */
    471      1.1    nonaka 	uint8_t		flbas;		/* Formatted LBA Size */
    472      1.1    nonaka #define NVME_ID_NS_FLBAS(_f)			((_f) & 0x0f)
    473      1.1    nonaka #define NVME_ID_NS_FLBAS_MD			0x10
    474      1.1    nonaka 	uint8_t		mc;		/* Metadata Capabilities */
    475      1.1    nonaka 	uint8_t		dpc;		/* End-to-end Data Protection
    476      1.1    nonaka 					   Capabilities */
    477      1.1    nonaka 	uint8_t		dps;		/* End-to-end Data Protection Type Settings */
    478      1.1    nonaka 
    479      1.1    nonaka 	uint8_t		_reserved1[98];
    480      1.1    nonaka 
    481      1.1    nonaka 	struct nvm_namespace_format
    482      1.1    nonaka 			lbaf[16];	/* LBA Format Support */
    483      1.1    nonaka 
    484      1.1    nonaka 	uint8_t		_reserved2[192];
    485      1.1    nonaka 
    486      1.1    nonaka 	uint8_t		vs[3712];
    487      1.1    nonaka } __packed __aligned(8);
    488      1.2    nonaka 
    489      1.2    nonaka #endif	/* __NVMEREG_H__ */
    490