1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright (C) 2017 NXP Semiconductors
4 * Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
5 */
6
7#ifndef __DRIVER_NVME_H__
8#define __DRIVER_NVME_H__
9
10#include <asm/io.h>
11
12struct nvme_id_power_state {
13	__le16			max_power;	/* centiwatts */
14	__u8			rsvd2;
15	__u8			flags;
16	__le32			entry_lat;	/* microseconds */
17	__le32			exit_lat;	/* microseconds */
18	__u8			read_tput;
19	__u8			read_lat;
20	__u8			write_tput;
21	__u8			write_lat;
22	__le16			idle_power;
23	__u8			idle_scale;
24	__u8			rsvd19;
25	__le16			active_power;
26	__u8			active_work_scale;
27	__u8			rsvd23[9];
28};
29
30enum {
31	NVME_PS_FLAGS_MAX_POWER_SCALE	= 1 << 0,
32	NVME_PS_FLAGS_NON_OP_STATE	= 1 << 1,
33};
34
35struct nvme_id_ctrl {
36	__le16			vid;
37	__le16			ssvid;
38	char			sn[20];
39	char			mn[40];
40	char			fr[8];
41	__u8			rab;
42	__u8			ieee[3];
43	__u8			mic;
44	__u8			mdts;
45	__u16			cntlid;
46	__u32			ver;
47	__u8			rsvd84[172];
48	__le16			oacs;
49	__u8			acl;
50	__u8			aerl;
51	__u8			frmw;
52	__u8			lpa;
53	__u8			elpe;
54	__u8			npss;
55	__u8			avscc;
56	__u8			apsta;
57	__le16			wctemp;
58	__le16			cctemp;
59	__u8			rsvd270[242];
60	__u8			sqes;
61	__u8			cqes;
62	__u8			rsvd514[2];
63	__le32			nn;
64	__le16			oncs;
65	__le16			fuses;
66	__u8			fna;
67	__u8			vwc;
68	__le16			awun;
69	__le16			awupf;
70	__u8			nvscc;
71	__u8			rsvd531;
72	__le16			acwu;
73	__u8			rsvd534[2];
74	__le32			sgls;
75	__u8			rsvd540[1508];
76	struct nvme_id_power_state	psd[32];
77	__u8			vs[1024];
78};
79
80enum {
81	NVME_CTRL_ONCS_COMPARE			= 1 << 0,
82	NVME_CTRL_ONCS_WRITE_UNCORRECTABLE	= 1 << 1,
83	NVME_CTRL_ONCS_DSM			= 1 << 2,
84	NVME_CTRL_VWC_PRESENT			= 1 << 0,
85};
86
87struct nvme_lbaf {
88	__le16			ms;
89	__u8			ds;
90	__u8			rp;
91};
92
93struct nvme_id_ns {
94	__le64			nsze;
95	__le64			ncap;
96	__le64			nuse;
97	__u8			nsfeat;
98	__u8			nlbaf;
99	__u8			flbas;
100	__u8			mc;
101	__u8			dpc;
102	__u8			dps;
103	__u8			nmic;
104	__u8			rescap;
105	__u8			fpi;
106	__u8			rsvd33;
107	__le16			nawun;
108	__le16			nawupf;
109	__le16			nacwu;
110	__le16			nabsn;
111	__le16			nabo;
112	__le16			nabspf;
113	__u16			rsvd46;
114	__le64			nvmcap[2];
115	__u8			rsvd64[40];
116	__u8			nguid[16];
117	__u8			eui64[8];
118	struct nvme_lbaf	lbaf[16];
119	__u8			rsvd192[192];
120	__u8			vs[3712];
121};
122
123enum {
124	NVME_NS_FEAT_THIN	= 1 << 0,
125	NVME_NS_FLBAS_LBA_MASK	= 0xf,
126	NVME_NS_FLBAS_META_EXT	= 0x10,
127	NVME_LBAF_RP_BEST	= 0,
128	NVME_LBAF_RP_BETTER	= 1,
129	NVME_LBAF_RP_GOOD	= 2,
130	NVME_LBAF_RP_DEGRADED	= 3,
131	NVME_NS_DPC_PI_LAST	= 1 << 4,
132	NVME_NS_DPC_PI_FIRST	= 1 << 3,
133	NVME_NS_DPC_PI_TYPE3	= 1 << 2,
134	NVME_NS_DPC_PI_TYPE2	= 1 << 1,
135	NVME_NS_DPC_PI_TYPE1	= 1 << 0,
136	NVME_NS_DPS_PI_FIRST	= 1 << 3,
137	NVME_NS_DPS_PI_MASK	= 0x7,
138	NVME_NS_DPS_PI_TYPE1	= 1,
139	NVME_NS_DPS_PI_TYPE2	= 2,
140	NVME_NS_DPS_PI_TYPE3	= 3,
141};
142
143struct nvme_smart_log {
144	__u8			critical_warning;
145	__u8			temperature[2];
146	__u8			avail_spare;
147	__u8			spare_thresh;
148	__u8			percent_used;
149	__u8			rsvd6[26];
150	__u8			data_units_read[16];
151	__u8			data_units_written[16];
152	__u8			host_reads[16];
153	__u8			host_writes[16];
154	__u8			ctrl_busy_time[16];
155	__u8			power_cycles[16];
156	__u8			power_on_hours[16];
157	__u8			unsafe_shutdowns[16];
158	__u8			media_errors[16];
159	__u8			num_err_log_entries[16];
160	__le32			warning_temp_time;
161	__le32			critical_comp_time;
162	__le16			temp_sensor[8];
163	__u8			rsvd216[296];
164};
165
166enum {
167	NVME_SMART_CRIT_SPARE		= 1 << 0,
168	NVME_SMART_CRIT_TEMPERATURE	= 1 << 1,
169	NVME_SMART_CRIT_RELIABILITY	= 1 << 2,
170	NVME_SMART_CRIT_MEDIA		= 1 << 3,
171	NVME_SMART_CRIT_VOLATILE_MEMORY	= 1 << 4,
172};
173
174struct nvme_lba_range_type {
175	__u8			type;
176	__u8			attributes;
177	__u8			rsvd2[14];
178	__u64			slba;
179	__u64			nlb;
180	__u8			guid[16];
181	__u8			rsvd48[16];
182};
183
184enum {
185	NVME_LBART_TYPE_FS	= 0x01,
186	NVME_LBART_TYPE_RAID	= 0x02,
187	NVME_LBART_TYPE_CACHE	= 0x03,
188	NVME_LBART_TYPE_SWAP	= 0x04,
189
190	NVME_LBART_ATTRIB_TEMP	= 1 << 0,
191	NVME_LBART_ATTRIB_HIDE	= 1 << 1,
192};
193
194struct nvme_reservation_status {
195	__le32	gen;
196	__u8	rtype;
197	__u8	regctl[2];
198	__u8	resv5[2];
199	__u8	ptpls;
200	__u8	resv10[13];
201	struct {
202		__le16	cntlid;
203		__u8	rcsts;
204		__u8	resv3[5];
205		__le64	hostid;
206		__le64	rkey;
207	} regctl_ds[];
208};
209
210/* I/O commands */
211
212enum nvme_opcode {
213	nvme_cmd_flush		= 0x00,
214	nvme_cmd_write		= 0x01,
215	nvme_cmd_read		= 0x02,
216	nvme_cmd_write_uncor	= 0x04,
217	nvme_cmd_compare	= 0x05,
218	nvme_cmd_write_zeroes	= 0x08,
219	nvme_cmd_dsm		= 0x09,
220	nvme_cmd_resv_register	= 0x0d,
221	nvme_cmd_resv_report	= 0x0e,
222	nvme_cmd_resv_acquire	= 0x11,
223	nvme_cmd_resv_release	= 0x15,
224};
225
226struct nvme_common_command {
227	__u8			opcode;
228	__u8			flags;
229	__u16			command_id;
230	__le32			nsid;
231	__le32			cdw2[2];
232	__le64			metadata;
233	__le64			prp1;
234	__le64			prp2;
235	__le32			cdw10[6];
236};
237
238struct nvme_rw_command {
239	__u8			opcode;
240	__u8			flags;
241	__u16			command_id;
242	__le32			nsid;
243	__u64			rsvd2;
244	__le64			metadata;
245	__le64			prp1;
246	__le64			prp2;
247	__le64			slba;
248	__le16			length;
249	__le16			control;
250	__le32			dsmgmt;
251	__le32			reftag;
252	__le16			apptag;
253	__le16			appmask;
254};
255
256enum {
257	NVME_RW_LR			= 1 << 15,
258	NVME_RW_FUA			= 1 << 14,
259	NVME_RW_DSM_FREQ_UNSPEC		= 0,
260	NVME_RW_DSM_FREQ_TYPICAL	= 1,
261	NVME_RW_DSM_FREQ_RARE		= 2,
262	NVME_RW_DSM_FREQ_READS		= 3,
263	NVME_RW_DSM_FREQ_WRITES		= 4,
264	NVME_RW_DSM_FREQ_RW		= 5,
265	NVME_RW_DSM_FREQ_ONCE		= 6,
266	NVME_RW_DSM_FREQ_PREFETCH	= 7,
267	NVME_RW_DSM_FREQ_TEMP		= 8,
268	NVME_RW_DSM_LATENCY_NONE	= 0 << 4,
269	NVME_RW_DSM_LATENCY_IDLE	= 1 << 4,
270	NVME_RW_DSM_LATENCY_NORM	= 2 << 4,
271	NVME_RW_DSM_LATENCY_LOW		= 3 << 4,
272	NVME_RW_DSM_SEQ_REQ		= 1 << 6,
273	NVME_RW_DSM_COMPRESSED		= 1 << 7,
274	NVME_RW_PRINFO_PRCHK_REF	= 1 << 10,
275	NVME_RW_PRINFO_PRCHK_APP	= 1 << 11,
276	NVME_RW_PRINFO_PRCHK_GUARD	= 1 << 12,
277	NVME_RW_PRINFO_PRACT		= 1 << 13,
278};
279
280struct nvme_dsm_cmd {
281	__u8			opcode;
282	__u8			flags;
283	__u16			command_id;
284	__le32			nsid;
285	__u64			rsvd2[2];
286	__le64			prp1;
287	__le64			prp2;
288	__le32			nr;
289	__le32			attributes;
290	__u32			rsvd12[4];
291};
292
293enum {
294	NVME_DSMGMT_IDR		= 1 << 0,
295	NVME_DSMGMT_IDW		= 1 << 1,
296	NVME_DSMGMT_AD		= 1 << 2,
297};
298
299struct nvme_dsm_range {
300	__le32			cattr;
301	__le32			nlb;
302	__le64			slba;
303};
304
305/* Admin commands */
306
307enum nvme_admin_opcode {
308	nvme_admin_delete_sq		= 0x00,
309	nvme_admin_create_sq		= 0x01,
310	nvme_admin_get_log_page		= 0x02,
311	nvme_admin_delete_cq		= 0x04,
312	nvme_admin_create_cq		= 0x05,
313	nvme_admin_identify		= 0x06,
314	nvme_admin_abort_cmd		= 0x08,
315	nvme_admin_set_features		= 0x09,
316	nvme_admin_get_features		= 0x0a,
317	nvme_admin_async_event		= 0x0c,
318	nvme_admin_activate_fw		= 0x10,
319	nvme_admin_download_fw		= 0x11,
320	nvme_admin_format_nvm		= 0x80,
321	nvme_admin_security_send	= 0x81,
322	nvme_admin_security_recv	= 0x82,
323};
324
325enum {
326	NVME_QUEUE_PHYS_CONTIG	= (1 << 0),
327	NVME_CQ_IRQ_ENABLED	= (1 << 1),
328	NVME_SQ_PRIO_URGENT	= (0 << 1),
329	NVME_SQ_PRIO_HIGH	= (1 << 1),
330	NVME_SQ_PRIO_MEDIUM	= (2 << 1),
331	NVME_SQ_PRIO_LOW	= (3 << 1),
332	NVME_FEAT_ARBITRATION	= 0x01,
333	NVME_FEAT_POWER_MGMT	= 0x02,
334	NVME_FEAT_LBA_RANGE	= 0x03,
335	NVME_FEAT_TEMP_THRESH	= 0x04,
336	NVME_FEAT_ERR_RECOVERY	= 0x05,
337	NVME_FEAT_VOLATILE_WC	= 0x06,
338	NVME_FEAT_NUM_QUEUES	= 0x07,
339	NVME_FEAT_IRQ_COALESCE	= 0x08,
340	NVME_FEAT_IRQ_CONFIG	= 0x09,
341	NVME_FEAT_WRITE_ATOMIC	= 0x0a,
342	NVME_FEAT_ASYNC_EVENT	= 0x0b,
343	NVME_FEAT_AUTO_PST	= 0x0c,
344	NVME_FEAT_SW_PROGRESS	= 0x80,
345	NVME_FEAT_HOST_ID	= 0x81,
346	NVME_FEAT_RESV_MASK	= 0x82,
347	NVME_FEAT_RESV_PERSIST	= 0x83,
348	NVME_LOG_ERROR		= 0x01,
349	NVME_LOG_SMART		= 0x02,
350	NVME_LOG_FW_SLOT	= 0x03,
351	NVME_LOG_RESERVATION	= 0x80,
352	NVME_FWACT_REPL		= (0 << 3),
353	NVME_FWACT_REPL_ACTV	= (1 << 3),
354	NVME_FWACT_ACTV		= (2 << 3),
355};
356
357struct nvme_identify {
358	__u8			opcode;
359	__u8			flags;
360	__u16			command_id;
361	__le32			nsid;
362	__u64			rsvd2[2];
363	__le64			prp1;
364	__le64			prp2;
365	__le32			cns;
366	__u32			rsvd11[5];
367};
368
369struct nvme_features {
370	__u8			opcode;
371	__u8			flags;
372	__u16			command_id;
373	__le32			nsid;
374	__u64			rsvd2[2];
375	__le64			prp1;
376	__le64			prp2;
377	__le32			fid;
378	__le32			dword11;
379	__u32			rsvd12[4];
380};
381
382struct nvme_create_cq {
383	__u8			opcode;
384	__u8			flags;
385	__u16			command_id;
386	__u32			rsvd1[5];
387	__le64			prp1;
388	__u64			rsvd8;
389	__le16			cqid;
390	__le16			qsize;
391	__le16			cq_flags;
392	__le16			irq_vector;
393	__u32			rsvd12[4];
394};
395
396struct nvme_create_sq {
397	__u8			opcode;
398	__u8			flags;
399	__u16			command_id;
400	__u32			rsvd1[5];
401	__le64			prp1;
402	__u64			rsvd8;
403	__le16			sqid;
404	__le16			qsize;
405	__le16			sq_flags;
406	__le16			cqid;
407	__u32			rsvd12[4];
408};
409
410struct nvme_delete_queue {
411	__u8			opcode;
412	__u8			flags;
413	__u16			command_id;
414	__u32			rsvd1[9];
415	__le16			qid;
416	__u16			rsvd10;
417	__u32			rsvd11[5];
418};
419
420struct nvme_abort_cmd {
421	__u8			opcode;
422	__u8			flags;
423	__u16			command_id;
424	__u32			rsvd1[9];
425	__le16			sqid;
426	__u16			cid;
427	__u32			rsvd11[5];
428};
429
430struct nvme_download_firmware {
431	__u8			opcode;
432	__u8			flags;
433	__u16			command_id;
434	__u32			rsvd1[5];
435	__le64			prp1;
436	__le64			prp2;
437	__le32			numd;
438	__le32			offset;
439	__u32			rsvd12[4];
440};
441
442struct nvme_format_cmd {
443	__u8			opcode;
444	__u8			flags;
445	__u16			command_id;
446	__le32			nsid;
447	__u64			rsvd2[4];
448	__le32			cdw10;
449	__u32			rsvd11[5];
450};
451
452struct nvme_command {
453	union {
454		struct nvme_common_command common;
455		struct nvme_rw_command rw;
456		struct nvme_identify identify;
457		struct nvme_features features;
458		struct nvme_create_cq create_cq;
459		struct nvme_create_sq create_sq;
460		struct nvme_delete_queue delete_queue;
461		struct nvme_download_firmware dlfw;
462		struct nvme_format_cmd format;
463		struct nvme_dsm_cmd dsm;
464		struct nvme_abort_cmd abort;
465	};
466};
467
468enum {
469	NVME_SC_SUCCESS			= 0x0,
470	NVME_SC_INVALID_OPCODE		= 0x1,
471	NVME_SC_INVALID_FIELD		= 0x2,
472	NVME_SC_CMDID_CONFLICT		= 0x3,
473	NVME_SC_DATA_XFER_ERROR		= 0x4,
474	NVME_SC_POWER_LOSS		= 0x5,
475	NVME_SC_INTERNAL		= 0x6,
476	NVME_SC_ABORT_REQ		= 0x7,
477	NVME_SC_ABORT_QUEUE		= 0x8,
478	NVME_SC_FUSED_FAIL		= 0x9,
479	NVME_SC_FUSED_MISSING		= 0xa,
480	NVME_SC_INVALID_NS		= 0xb,
481	NVME_SC_CMD_SEQ_ERROR		= 0xc,
482	NVME_SC_SGL_INVALID_LAST	= 0xd,
483	NVME_SC_SGL_INVALID_COUNT	= 0xe,
484	NVME_SC_SGL_INVALID_DATA	= 0xf,
485	NVME_SC_SGL_INVALID_METADATA	= 0x10,
486	NVME_SC_SGL_INVALID_TYPE	= 0x11,
487	NVME_SC_LBA_RANGE		= 0x80,
488	NVME_SC_CAP_EXCEEDED		= 0x81,
489	NVME_SC_NS_NOT_READY		= 0x82,
490	NVME_SC_RESERVATION_CONFLICT	= 0x83,
491	NVME_SC_CQ_INVALID		= 0x100,
492	NVME_SC_QID_INVALID		= 0x101,
493	NVME_SC_QUEUE_SIZE		= 0x102,
494	NVME_SC_ABORT_LIMIT		= 0x103,
495	NVME_SC_ABORT_MISSING		= 0x104,
496	NVME_SC_ASYNC_LIMIT		= 0x105,
497	NVME_SC_FIRMWARE_SLOT		= 0x106,
498	NVME_SC_FIRMWARE_IMAGE		= 0x107,
499	NVME_SC_INVALID_VECTOR		= 0x108,
500	NVME_SC_INVALID_LOG_PAGE	= 0x109,
501	NVME_SC_INVALID_FORMAT		= 0x10a,
502	NVME_SC_FIRMWARE_NEEDS_RESET	= 0x10b,
503	NVME_SC_INVALID_QUEUE		= 0x10c,
504	NVME_SC_FEATURE_NOT_SAVEABLE	= 0x10d,
505	NVME_SC_FEATURE_NOT_CHANGEABLE	= 0x10e,
506	NVME_SC_FEATURE_NOT_PER_NS	= 0x10f,
507	NVME_SC_FW_NEEDS_RESET_SUBSYS	= 0x110,
508	NVME_SC_BAD_ATTRIBUTES		= 0x180,
509	NVME_SC_INVALID_PI		= 0x181,
510	NVME_SC_READ_ONLY		= 0x182,
511	NVME_SC_WRITE_FAULT		= 0x280,
512	NVME_SC_READ_ERROR		= 0x281,
513	NVME_SC_GUARD_CHECK		= 0x282,
514	NVME_SC_APPTAG_CHECK		= 0x283,
515	NVME_SC_REFTAG_CHECK		= 0x284,
516	NVME_SC_COMPARE_FAILED		= 0x285,
517	NVME_SC_ACCESS_DENIED		= 0x286,
518	NVME_SC_DNR			= 0x4000,
519};
520
521struct nvme_completion {
522	__le32	result;		/* Used by admin commands to return data */
523	__u32	rsvd;
524	__le16	sq_head;	/* how much of this queue may be reclaimed */
525	__le16	sq_id;		/* submission queue that generated this entry */
526	__u16	command_id;	/* of the command which completed */
527	__le16	status;		/* did the command fail, and if so, why? */
528};
529
530/*
531 * Registers should always be accessed with double word or quad word
532 * accesses. Registers with 64-bit address pointers should be written
533 * to with dword accesses by writing the low dword first (ptr[0]),
534 * then the high dword (ptr[1]) second.
535 */
536static inline u64 nvme_readq(__le64 volatile *regs)
537{
538	__u32 *ptr = (__u32 *)regs;
539	u64 val_lo = readl(ptr);
540	u64 val_hi = readl(ptr + 1);
541
542	return val_lo + (val_hi << 32);
543}
544
545static inline void nvme_writeq(const u64 val, __le64 volatile *regs)
546{
547	__u32 *ptr = (__u32 *)regs;
548	u32 val_lo = lower_32_bits(val);
549	u32 val_hi = upper_32_bits(val);
550	writel(val_lo, ptr);
551	writel(val_hi, ptr + 1);
552}
553
554struct nvme_bar {
555	__u64 cap;	/* Controller Capabilities */
556	__u32 vs;	/* Version */
557	__u32 intms;	/* Interrupt Mask Set */
558	__u32 intmc;	/* Interrupt Mask Clear */
559	__u32 cc;	/* Controller Configuration */
560	__u32 rsvd1;	/* Reserved */
561	__u32 csts;	/* Controller Status */
562	__u32 rsvd2;	/* Reserved */
563	__u32 aqa;	/* Admin Queue Attributes */
564	__u64 asq;	/* Admin SQ Base Address */
565	__u64 acq;	/* Admin CQ Base Address */
566};
567
568#define NVME_CAP_MQES(cap)	((cap) & 0xffff)
569#define NVME_CAP_TIMEOUT(cap)	(((cap) >> 24) & 0xff)
570#define NVME_CAP_STRIDE(cap)	(((cap) >> 32) & 0xf)
571#define NVME_CAP_MPSMIN(cap)	(((cap) >> 48) & 0xf)
572#define NVME_CAP_MPSMAX(cap)	(((cap) >> 52) & 0xf)
573
574#define NVME_VS(major, minor)	(((major) << 16) | ((minor) << 8))
575
576enum {
577	NVME_CC_ENABLE		= 1 << 0,
578	NVME_CC_CSS_NVM		= 0 << 4,
579	NVME_CC_MPS_SHIFT	= 7,
580	NVME_CC_ARB_RR		= 0 << 11,
581	NVME_CC_ARB_WRRU	= 1 << 11,
582	NVME_CC_ARB_VS		= 7 << 11,
583	NVME_CC_SHN_NONE	= 0 << 14,
584	NVME_CC_SHN_NORMAL	= 1 << 14,
585	NVME_CC_SHN_ABRUPT	= 2 << 14,
586	NVME_CC_SHN_MASK	= 3 << 14,
587	NVME_CC_IOSQES		= 6 << 16,
588	NVME_CC_IOCQES		= 4 << 20,
589	NVME_CSTS_RDY		= 1 << 0,
590	NVME_CSTS_CFS		= 1 << 1,
591	NVME_CSTS_SHST_NORMAL	= 0 << 2,
592	NVME_CSTS_SHST_OCCUR	= 1 << 2,
593	NVME_CSTS_SHST_CMPLT	= 2 << 2,
594	NVME_CSTS_SHST_MASK	= 3 << 2,
595};
596
597/* Represents an NVM Express device. Each nvme_dev is a PCI function. */
598struct nvme_dev {
599	struct udevice *udev;
600	struct list_head node;
601	struct nvme_queue **queues;
602	u32 __iomem *dbs;
603	int instance;
604	unsigned queue_count;
605	unsigned online_queues;
606	unsigned max_qid;
607	int q_depth;
608	u32 db_stride;
609	u32 ctrl_config;
610	struct nvme_bar __iomem *bar;
611	struct list_head namespaces;
612	char vendor[8];
613	char serial[20];
614	char model[40];
615	char firmware_rev[8];
616	u32 max_transfer_shift;
617	u64 cap;
618	u32 stripe_size;
619	u32 page_size;
620	u8 vwc;
621	u64 *prp_pool;
622	u32 prp_entry_num;
623	u32 nn;
624};
625
626/* Admin queue and a single I/O queue. */
627enum nvme_queue_id {
628	NVME_ADMIN_Q,
629	NVME_IO_Q,
630	NVME_Q_NUM,
631};
632
633/*
634 * An NVM Express queue. Each device has at least two (one for admin
635 * commands and one for I/O commands).
636 */
637struct nvme_queue {
638	struct nvme_dev *dev;
639	struct nvme_command *sq_cmds;
640	struct nvme_completion *cqes;
641	u32 __iomem *q_db;
642	u16 q_depth;
643	s16 cq_vector;
644	u16 sq_head;
645	u16 sq_tail;
646	u16 cq_head;
647	u16 qid;
648	u8 cq_phase;
649	u8 cqe_seen;
650	unsigned long cmdid_data[];
651};
652
653/*
654 * An NVM Express namespace is equivalent to a SCSI LUN.
655 * Each namespace is operated as an independent "device".
656 */
657struct nvme_ns {
658	struct list_head list;
659	struct nvme_dev *dev;
660	unsigned ns_id;
661	u8 eui64[8];
662	int devnum;
663	int lba_shift;
664	u8 flbas;
665};
666
667struct nvme_ops {
668	/**
669	 * setup_queue - Controller-specific NVM Express queue setup.
670	 *
671	 * @nvmeq: NVM Express queue
672	 * Return: 0 if OK, -ve on error
673	 */
674	int (*setup_queue)(struct nvme_queue *nvmeq);
675	/**
676	 * submit_cmd - Controller-specific NVM Express command submission.
677	 *
678	 * If this function pointer is set to NULL, normal command
679	 * submission is performed according to the NVM Express spec.
680	 *
681	 * @nvmeq: NVM Express queue
682	 * @cmd:   NVM Express command
683	 */
684	void (*submit_cmd)(struct nvme_queue *nvmeq, struct nvme_command *cmd);
685	/**
686	 * complete_cmd - Controller-specific NVM Express command completion
687	 *
688	 * @nvmeq: NVM Express queue
689	 * @cmd:   NVM Express command
690	 */
691	void (*complete_cmd)(struct nvme_queue *nvmeq, struct nvme_command *cmd);
692};
693
694/**
695 * nvme_init() - Initialize NVM Express device
696 * @udev:	The NVM Express device
697 * Return: 0 if OK, -ve on error
698 */
699int nvme_init(struct udevice *udev);
700
701/**
702 * nvme_shutdown() - Shutdown NVM Express device
703 * @udev:	The NVM Express device
704 * Return: 0 if OK, -ve on error
705 */
706int nvme_shutdown(struct udevice *udev);
707
708#endif /* __DRIVER_NVME_H__ */
709