Home | History | Annotate | Download | only in linux
      1 /*
      2  * Definitions for the NVM Express interface
      3  * Copyright (c) 2011-2013, Intel Corporation.
      4  *
      5  * This program is free software; you can redistribute it and/or modify it
      6  * under the terms and conditions of the GNU General Public License,
      7  * version 2, as published by the Free Software Foundation.
      8  *
      9  * This program is distributed in the hope it will be useful, but WITHOUT
     10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     12  * more details.
     13  *
     14  * You should have received a copy of the GNU General Public License along with
     15  * this program; if not, write to the Free Software Foundation, Inc.,
     16  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
     17  */
     18 
     19 #ifndef _UAPI_LINUX_NVME_H
     20 #define _UAPI_LINUX_NVME_H
     21 
     22 #include <linux/types.h>
     23 
     24 struct nvme_id_power_state {
     25 	__le16			max_power;	/* centiwatts */
     26 	__u8			rsvd2;
     27 	__u8			flags;
     28 	__le32			entry_lat;	/* microseconds */
     29 	__le32			exit_lat;	/* microseconds */
     30 	__u8			read_tput;
     31 	__u8			read_lat;
     32 	__u8			write_tput;
     33 	__u8			write_lat;
     34 	__u8			rsvd16[16];
     35 };
     36 
     37 enum {
     38 	NVME_PS_FLAGS_MAX_POWER_SCALE	= 1 << 0,
     39 	NVME_PS_FLAGS_NON_OP_STATE	= 1 << 1,
     40 };
     41 
     42 struct nvme_id_ctrl {
     43 	__le16			vid;
     44 	__le16			ssvid;
     45 	char			sn[20];
     46 	char			mn[40];
     47 	char			fr[8];
     48 	__u8			rab;
     49 	__u8			ieee[3];
     50 	__u8			mic;
     51 	__u8			mdts;
     52 	__u8			rsvd78[178];
     53 	__le16			oacs;
     54 	__u8			acl;
     55 	__u8			aerl;
     56 	__u8			frmw;
     57 	__u8			lpa;
     58 	__u8			elpe;
     59 	__u8			npss;
     60 	__u8			rsvd264[248];
     61 	__u8			sqes;
     62 	__u8			cqes;
     63 	__u8			rsvd514[2];
     64 	__le32			nn;
     65 	__le16			oncs;
     66 	__le16			fuses;
     67 	__u8			fna;
     68 	__u8			vwc;
     69 	__le16			awun;
     70 	__le16			awupf;
     71 	__u8			rsvd530[1518];
     72 	struct nvme_id_power_state	psd[32];
     73 	__u8			vs[1024];
     74 };
     75 
     76 enum {
     77 	NVME_CTRL_ONCS_COMPARE			= 1 << 0,
     78 	NVME_CTRL_ONCS_WRITE_UNCORRECTABLE	= 1 << 1,
     79 	NVME_CTRL_ONCS_DSM			= 1 << 2,
     80 };
     81 
     82 struct nvme_lbaf {
     83 	__le16			ms;
     84 	__u8			ds;
     85 	__u8			rp;
     86 };
     87 
     88 struct nvme_id_ns {
     89 	__le64			nsze;
     90 	__le64			ncap;
     91 	__le64			nuse;
     92 	__u8			nsfeat;
     93 	__u8			nlbaf;
     94 	__u8			flbas;
     95 	__u8			mc;
     96 	__u8			dpc;
     97 	__u8			dps;
     98 	__u8			rsvd30[98];
     99 	struct nvme_lbaf	lbaf[16];
    100 	__u8			rsvd192[192];
    101 	__u8			vs[3712];
    102 };
    103 
    104 enum {
    105 	NVME_NS_FEAT_THIN	= 1 << 0,
    106 	NVME_LBAF_RP_BEST	= 0,
    107 	NVME_LBAF_RP_BETTER	= 1,
    108 	NVME_LBAF_RP_GOOD	= 2,
    109 	NVME_LBAF_RP_DEGRADED	= 3,
    110 };
    111 
    112 struct nvme_smart_log {
    113 	__u8			critical_warning;
    114 	__u8			temperature[2];
    115 	__u8			avail_spare;
    116 	__u8			spare_thresh;
    117 	__u8			percent_used;
    118 	__u8			rsvd6[26];
    119 	__u8			data_units_read[16];
    120 	__u8			data_units_written[16];
    121 	__u8			host_reads[16];
    122 	__u8			host_writes[16];
    123 	__u8			ctrl_busy_time[16];
    124 	__u8			power_cycles[16];
    125 	__u8			power_on_hours[16];
    126 	__u8			unsafe_shutdowns[16];
    127 	__u8			media_errors[16];
    128 	__u8			num_err_log_entries[16];
    129 	__u8			rsvd192[320];
    130 };
    131 
    132 enum {
    133 	NVME_SMART_CRIT_SPARE		= 1 << 0,
    134 	NVME_SMART_CRIT_TEMPERATURE	= 1 << 1,
    135 	NVME_SMART_CRIT_RELIABILITY	= 1 << 2,
    136 	NVME_SMART_CRIT_MEDIA		= 1 << 3,
    137 	NVME_SMART_CRIT_VOLATILE_MEMORY	= 1 << 4,
    138 };
    139 
    140 struct nvme_lba_range_type {
    141 	__u8			type;
    142 	__u8			attributes;
    143 	__u8			rsvd2[14];
    144 	__u64			slba;
    145 	__u64			nlb;
    146 	__u8			guid[16];
    147 	__u8			rsvd48[16];
    148 };
    149 
    150 enum {
    151 	NVME_LBART_TYPE_FS	= 0x01,
    152 	NVME_LBART_TYPE_RAID	= 0x02,
    153 	NVME_LBART_TYPE_CACHE	= 0x03,
    154 	NVME_LBART_TYPE_SWAP	= 0x04,
    155 
    156 	NVME_LBART_ATTRIB_TEMP	= 1 << 0,
    157 	NVME_LBART_ATTRIB_HIDE	= 1 << 1,
    158 };
    159 
    160 /* I/O commands */
    161 
    162 enum nvme_opcode {
    163 	nvme_cmd_flush		= 0x00,
    164 	nvme_cmd_write		= 0x01,
    165 	nvme_cmd_read		= 0x02,
    166 	nvme_cmd_write_uncor	= 0x04,
    167 	nvme_cmd_compare	= 0x05,
    168 	nvme_cmd_dsm		= 0x09,
    169 };
    170 
    171 struct nvme_common_command {
    172 	__u8			opcode;
    173 	__u8			flags;
    174 	__u16			command_id;
    175 	__le32			nsid;
    176 	__le32			cdw2[2];
    177 	__le64			metadata;
    178 	__le64			prp1;
    179 	__le64			prp2;
    180 	__le32			cdw10[6];
    181 };
    182 
    183 struct nvme_rw_command {
    184 	__u8			opcode;
    185 	__u8			flags;
    186 	__u16			command_id;
    187 	__le32			nsid;
    188 	__u64			rsvd2;
    189 	__le64			metadata;
    190 	__le64			prp1;
    191 	__le64			prp2;
    192 	__le64			slba;
    193 	__le16			length;
    194 	__le16			control;
    195 	__le32			dsmgmt;
    196 	__le32			reftag;
    197 	__le16			apptag;
    198 	__le16			appmask;
    199 };
    200 
    201 enum {
    202 	NVME_RW_LR			= 1 << 15,
    203 	NVME_RW_FUA			= 1 << 14,
    204 	NVME_RW_DSM_FREQ_UNSPEC		= 0,
    205 	NVME_RW_DSM_FREQ_TYPICAL	= 1,
    206 	NVME_RW_DSM_FREQ_RARE		= 2,
    207 	NVME_RW_DSM_FREQ_READS		= 3,
    208 	NVME_RW_DSM_FREQ_WRITES		= 4,
    209 	NVME_RW_DSM_FREQ_RW		= 5,
    210 	NVME_RW_DSM_FREQ_ONCE		= 6,
    211 	NVME_RW_DSM_FREQ_PREFETCH	= 7,
    212 	NVME_RW_DSM_FREQ_TEMP		= 8,
    213 	NVME_RW_DSM_LATENCY_NONE	= 0 << 4,
    214 	NVME_RW_DSM_LATENCY_IDLE	= 1 << 4,
    215 	NVME_RW_DSM_LATENCY_NORM	= 2 << 4,
    216 	NVME_RW_DSM_LATENCY_LOW		= 3 << 4,
    217 	NVME_RW_DSM_SEQ_REQ		= 1 << 6,
    218 	NVME_RW_DSM_COMPRESSED		= 1 << 7,
    219 };
    220 
    221 struct nvme_dsm_cmd {
    222 	__u8			opcode;
    223 	__u8			flags;
    224 	__u16			command_id;
    225 	__le32			nsid;
    226 	__u64			rsvd2[2];
    227 	__le64			prp1;
    228 	__le64			prp2;
    229 	__le32			nr;
    230 	__le32			attributes;
    231 	__u32			rsvd12[4];
    232 };
    233 
    234 enum {
    235 	NVME_DSMGMT_IDR		= 1 << 0,
    236 	NVME_DSMGMT_IDW		= 1 << 1,
    237 	NVME_DSMGMT_AD		= 1 << 2,
    238 };
    239 
    240 struct nvme_dsm_range {
    241 	__le32			cattr;
    242 	__le32			nlb;
    243 	__le64			slba;
    244 };
    245 
    246 /* Admin commands */
    247 
    248 enum nvme_admin_opcode {
    249 	nvme_admin_delete_sq		= 0x00,
    250 	nvme_admin_create_sq		= 0x01,
    251 	nvme_admin_get_log_page		= 0x02,
    252 	nvme_admin_delete_cq		= 0x04,
    253 	nvme_admin_create_cq		= 0x05,
    254 	nvme_admin_identify		= 0x06,
    255 	nvme_admin_abort_cmd		= 0x08,
    256 	nvme_admin_set_features		= 0x09,
    257 	nvme_admin_get_features		= 0x0a,
    258 	nvme_admin_async_event		= 0x0c,
    259 	nvme_admin_activate_fw		= 0x10,
    260 	nvme_admin_download_fw		= 0x11,
    261 	nvme_admin_format_nvm		= 0x80,
    262 	nvme_admin_security_send	= 0x81,
    263 	nvme_admin_security_recv	= 0x82,
    264 };
    265 
    266 enum {
    267 	NVME_QUEUE_PHYS_CONTIG	= (1 << 0),
    268 	NVME_CQ_IRQ_ENABLED	= (1 << 1),
    269 	NVME_SQ_PRIO_URGENT	= (0 << 1),
    270 	NVME_SQ_PRIO_HIGH	= (1 << 1),
    271 	NVME_SQ_PRIO_MEDIUM	= (2 << 1),
    272 	NVME_SQ_PRIO_LOW	= (3 << 1),
    273 	NVME_FEAT_ARBITRATION	= 0x01,
    274 	NVME_FEAT_POWER_MGMT	= 0x02,
    275 	NVME_FEAT_LBA_RANGE	= 0x03,
    276 	NVME_FEAT_TEMP_THRESH	= 0x04,
    277 	NVME_FEAT_ERR_RECOVERY	= 0x05,
    278 	NVME_FEAT_VOLATILE_WC	= 0x06,
    279 	NVME_FEAT_NUM_QUEUES	= 0x07,
    280 	NVME_FEAT_IRQ_COALESCE	= 0x08,
    281 	NVME_FEAT_IRQ_CONFIG	= 0x09,
    282 	NVME_FEAT_WRITE_ATOMIC	= 0x0a,
    283 	NVME_FEAT_ASYNC_EVENT	= 0x0b,
    284 	NVME_FEAT_SW_PROGRESS	= 0x0c,
    285 	NVME_FWACT_REPL		= (0 << 3),
    286 	NVME_FWACT_REPL_ACTV	= (1 << 3),
    287 	NVME_FWACT_ACTV		= (2 << 3),
    288 };
    289 
    290 struct nvme_identify {
    291 	__u8			opcode;
    292 	__u8			flags;
    293 	__u16			command_id;
    294 	__le32			nsid;
    295 	__u64			rsvd2[2];
    296 	__le64			prp1;
    297 	__le64			prp2;
    298 	__le32			cns;
    299 	__u32			rsvd11[5];
    300 };
    301 
    302 struct nvme_features {
    303 	__u8			opcode;
    304 	__u8			flags;
    305 	__u16			command_id;
    306 	__le32			nsid;
    307 	__u64			rsvd2[2];
    308 	__le64			prp1;
    309 	__le64			prp2;
    310 	__le32			fid;
    311 	__le32			dword11;
    312 	__u32			rsvd12[4];
    313 };
    314 
    315 struct nvme_create_cq {
    316 	__u8			opcode;
    317 	__u8			flags;
    318 	__u16			command_id;
    319 	__u32			rsvd1[5];
    320 	__le64			prp1;
    321 	__u64			rsvd8;
    322 	__le16			cqid;
    323 	__le16			qsize;
    324 	__le16			cq_flags;
    325 	__le16			irq_vector;
    326 	__u32			rsvd12[4];
    327 };
    328 
    329 struct nvme_create_sq {
    330 	__u8			opcode;
    331 	__u8			flags;
    332 	__u16			command_id;
    333 	__u32			rsvd1[5];
    334 	__le64			prp1;
    335 	__u64			rsvd8;
    336 	__le16			sqid;
    337 	__le16			qsize;
    338 	__le16			sq_flags;
    339 	__le16			cqid;
    340 	__u32			rsvd12[4];
    341 };
    342 
    343 struct nvme_delete_queue {
    344 	__u8			opcode;
    345 	__u8			flags;
    346 	__u16			command_id;
    347 	__u32			rsvd1[9];
    348 	__le16			qid;
    349 	__u16			rsvd10;
    350 	__u32			rsvd11[5];
    351 };
    352 
    353 struct nvme_abort_cmd {
    354 	__u8			opcode;
    355 	__u8			flags;
    356 	__u16			command_id;
    357 	__u32			rsvd1[9];
    358 	__le16			sqid;
    359 	__u16			cid;
    360 	__u32			rsvd11[5];
    361 };
    362 
    363 struct nvme_download_firmware {
    364 	__u8			opcode;
    365 	__u8			flags;
    366 	__u16			command_id;
    367 	__u32			rsvd1[5];
    368 	__le64			prp1;
    369 	__le64			prp2;
    370 	__le32			numd;
    371 	__le32			offset;
    372 	__u32			rsvd12[4];
    373 };
    374 
    375 struct nvme_format_cmd {
    376 	__u8			opcode;
    377 	__u8			flags;
    378 	__u16			command_id;
    379 	__le32			nsid;
    380 	__u64			rsvd2[4];
    381 	__le32			cdw10;
    382 	__u32			rsvd11[5];
    383 };
    384 
    385 struct nvme_command {
    386 	union {
    387 		struct nvme_common_command common;
    388 		struct nvme_rw_command rw;
    389 		struct nvme_identify identify;
    390 		struct nvme_features features;
    391 		struct nvme_create_cq create_cq;
    392 		struct nvme_create_sq create_sq;
    393 		struct nvme_delete_queue delete_queue;
    394 		struct nvme_download_firmware dlfw;
    395 		struct nvme_format_cmd format;
    396 		struct nvme_dsm_cmd dsm;
    397 		struct nvme_abort_cmd abort;
    398 	};
    399 };
    400 
    401 enum {
    402 	NVME_SC_SUCCESS			= 0x0,
    403 	NVME_SC_INVALID_OPCODE		= 0x1,
    404 	NVME_SC_INVALID_FIELD		= 0x2,
    405 	NVME_SC_CMDID_CONFLICT		= 0x3,
    406 	NVME_SC_DATA_XFER_ERROR		= 0x4,
    407 	NVME_SC_POWER_LOSS		= 0x5,
    408 	NVME_SC_INTERNAL		= 0x6,
    409 	NVME_SC_ABORT_REQ		= 0x7,
    410 	NVME_SC_ABORT_QUEUE		= 0x8,
    411 	NVME_SC_FUSED_FAIL		= 0x9,
    412 	NVME_SC_FUSED_MISSING		= 0xa,
    413 	NVME_SC_INVALID_NS		= 0xb,
    414 	NVME_SC_CMD_SEQ_ERROR		= 0xc,
    415 	NVME_SC_LBA_RANGE		= 0x80,
    416 	NVME_SC_CAP_EXCEEDED		= 0x81,
    417 	NVME_SC_NS_NOT_READY		= 0x82,
    418 	NVME_SC_CQ_INVALID		= 0x100,
    419 	NVME_SC_QID_INVALID		= 0x101,
    420 	NVME_SC_QUEUE_SIZE		= 0x102,
    421 	NVME_SC_ABORT_LIMIT		= 0x103,
    422 	NVME_SC_ABORT_MISSING		= 0x104,
    423 	NVME_SC_ASYNC_LIMIT		= 0x105,
    424 	NVME_SC_FIRMWARE_SLOT		= 0x106,
    425 	NVME_SC_FIRMWARE_IMAGE		= 0x107,
    426 	NVME_SC_INVALID_VECTOR		= 0x108,
    427 	NVME_SC_INVALID_LOG_PAGE	= 0x109,
    428 	NVME_SC_INVALID_FORMAT		= 0x10a,
    429 	NVME_SC_BAD_ATTRIBUTES		= 0x180,
    430 	NVME_SC_WRITE_FAULT		= 0x280,
    431 	NVME_SC_READ_ERROR		= 0x281,
    432 	NVME_SC_GUARD_CHECK		= 0x282,
    433 	NVME_SC_APPTAG_CHECK		= 0x283,
    434 	NVME_SC_REFTAG_CHECK		= 0x284,
    435 	NVME_SC_COMPARE_FAILED		= 0x285,
    436 	NVME_SC_ACCESS_DENIED		= 0x286,
    437 };
    438 
    439 struct nvme_completion {
    440 	__le32	result;		/* Used by admin commands to return data */
    441 	__u32	rsvd;
    442 	__le16	sq_head;	/* how much of this queue may be reclaimed */
    443 	__le16	sq_id;		/* submission queue that generated this entry */
    444 	__u16	command_id;	/* of the command which completed */
    445 	__le16	status;		/* did the command fail, and if so, why? */
    446 };
    447 
    448 struct nvme_user_io {
    449 	__u8	opcode;
    450 	__u8	flags;
    451 	__u16	control;
    452 	__u16	nblocks;
    453 	__u16	rsvd;
    454 	__u64	metadata;
    455 	__u64	addr;
    456 	__u64	slba;
    457 	__u32	dsmgmt;
    458 	__u32	reftag;
    459 	__u16	apptag;
    460 	__u16	appmask;
    461 };
    462 
    463 struct nvme_admin_cmd {
    464 	__u8	opcode;
    465 	__u8	flags;
    466 	__u16	rsvd1;
    467 	__u32	nsid;
    468 	__u32	cdw2;
    469 	__u32	cdw3;
    470 	__u64	metadata;
    471 	__u64	addr;
    472 	__u32	metadata_len;
    473 	__u32	data_len;
    474 	__u32	cdw10;
    475 	__u32	cdw11;
    476 	__u32	cdw12;
    477 	__u32	cdw13;
    478 	__u32	cdw14;
    479 	__u32	cdw15;
    480 	__u32	timeout_ms;
    481 	__u32	result;
    482 };
    483 
    484 #define NVME_IOCTL_ID		_IO('N', 0x40)
    485 #define NVME_IOCTL_ADMIN_CMD	_IOWR('N', 0x41, struct nvme_admin_cmd)
    486 #define NVME_IOCTL_SUBMIT_IO	_IOW('N', 0x42, struct nvme_user_io)
    487 
    488 #endif /* _UAPI_LINUX_NVME_H */
    489