• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Header file for Registers and Structure definitions
3 
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 #ifndef __OPAL_PASSWORD_NVME_REG_H__
15 #define __OPAL_PASSWORD_NVME_REG_H__
16 
17 //
18 // PCI Header for PCIe root port configuration
19 //
20 #define NVME_PCIE_PCICMD                         0x04
21 #define NVME_PCIE_BNUM                           0x18
22 #define NVME_PCIE_SEC_BNUM                       0x19
23 #define NVME_PCIE_IOBL                           0x1C
24 #define NVME_PCIE_MBL                            0x20
25 #define NVME_PCIE_PMBL                           0x24
26 #define NVME_PCIE_PMBU32                         0x28
27 #define NVME_PCIE_PMLU32                         0x2C
28 #define NVME_PCIE_INTR                           0x3C
29 
30 //
31 // NVMe related definitions
32 //
33 #define PCI_CLASS_MASS_STORAGE_NVM                0x08  // mass storage sub-class non-volatile memory.
34 #define PCI_IF_NVMHCI                             0x02  // mass storage programming interface NVMHCI.
35 
36 #define NVME_ASQ_SIZE                                    1     // Number of admin submission queue entries, which is 0-based
37 #define NVME_ACQ_SIZE                                    1     // Number of admin completion queue entries, which is 0-based
38 
39 #define NVME_CSQ_SIZE                                    63     // Number of I/O submission queue entries, which is 0-based
40 #define NVME_CCQ_SIZE                                    63     // Number of I/O completion queue entries, which is 0-based
41 
42 #define NVME_MAX_IO_QUEUES                               2     // Number of I/O queues supported by the driver, 1 for AQ, 1 for CQ
43 
44 #define NVME_CSQ_DEPTH                                   (NVME_CSQ_SIZE+1)
45 #define NVME_CCQ_DEPTH                                   (NVME_CCQ_SIZE+1)
46 #define NVME_PRP_SIZE                                    (4)    // Pages of PRP list
47 
48 #define NVME_CONTROLLER_ID                               0
49 
50 //
51 // Time out Value for Nvme transaction execution
52 //
53 #define NVME_GENERIC_TIMEOUT                             5000000   ///< us
54 #define NVME_CMD_WAIT                                    100       ///< us
55 #define NVME_CMD_TIMEOUT                                 20000000  ///< us
56 
57 
58 
59 #define NVME_MEM_MAX_SIZE \
60   (( \
61   1                                         /* Controller Data */ +  \
62   1                                         /* Identify Data */   +  \
63   1                                         /* ASQ */             +  \
64   1                                         /* ACQ */             +  \
65   1                                         /* SQs */             +  \
66   1                                         /* CQs */             +  \
67   NVME_PRP_SIZE * NVME_CSQ_DEPTH            /* PRPs */               \
68   ) * EFI_PAGE_SIZE)
69 
70 
71 //
72 // controller register offsets
73 //
74 #define NVME_CAP_OFFSET          0x0000  // Controller Capabilities
75 #define NVME_VER_OFFSET          0x0008  // Version
76 #define NVME_INTMS_OFFSET        0x000c  // Interrupt Mask Set
77 #define NVME_INTMC_OFFSET        0x0010  // Interrupt Mask Clear
78 #define NVME_CC_OFFSET           0x0014  // Controller Configuration
79 #define NVME_CSTS_OFFSET         0x001c  // Controller Status
80 #define NVME_AQA_OFFSET          0x0024  // Admin Queue Attributes
81 #define NVME_ASQ_OFFSET          0x0028  // Admin Submission Queue Base Address
82 #define NVME_ACQ_OFFSET          0x0030  // Admin Completion Queue Base Address
83 #define NVME_SQ0_OFFSET          0x1000  // Submission Queue 0 (admin) Tail Doorbell
84 #define NVME_CQ0_OFFSET          0x1004  // Completion Queue 0 (admin) Head Doorbell
85 
86 //
87 // These register offsets are defined as 0x1000 + (N * (4 << CAP.DSTRD))
88 // Get the doorbell stride bit shift Value from the controller capabilities.
89 //
90 #define NVME_SQTDBL_OFFSET(QID, DSTRD)    0x1000 + ((2 * (QID)) * (4 << (DSTRD)))       // Submission Queue y (NVM) Tail Doorbell
91 #define NVME_CQHDBL_OFFSET(QID, DSTRD)    0x1000 + (((2 * (QID)) + 1) * (4 << (DSTRD))) // Completion Queue y (NVM) Head Doorbell
92 
93 
94 #pragma pack(1)
95 
96 //
97 // 3.1.1 Offset 00h: CAP - Controller Capabilities
98 //
99 typedef struct {
100   UINT16 Mqes;      // Maximum Queue Entries Supported
101   UINT8  Cqr:1;     // Contiguous Queues Required
102   UINT8  Ams:2;     // Arbitration Mechanism Supported
103   UINT8  Rsvd1:5;
104   UINT8  To;        // Timeout
105   UINT16 Dstrd:4;
106   UINT16 Rsvd2:1;
107   UINT16 Css:4;     // Command Sets Supported
108   UINT16 Rsvd3:7;
109   UINT8  Mpsmin:4;
110   UINT8  Mpsmax:4;
111   UINT8  Rsvd4;
112 } NVME_CAP;
113 
114 //
115 // 3.1.2 Offset 08h: VS - Version
116 //
117 typedef struct {
118   UINT16 Mnr;       // Minor version number
119   UINT16 Mjr;       // Major version number
120 } NVME_VER;
121 
122 //
123 // 3.1.5 Offset 14h: CC - Controller Configuration
124 //
125 typedef struct {
126   UINT16 En:1;       // Enable
127   UINT16 Rsvd1:3;
128   UINT16 Css:3;      // Command Set Selected
129   UINT16 Mps:4;      // Memory Page Size
130   UINT16 Ams:3;      // Arbitration Mechanism Selected
131   UINT16 Shn:2;      // Shutdown Notification
132   UINT8  Iosqes:4;   // I/O Submission Queue Entry Size
133   UINT8  Iocqes:4;   // I/O Completion Queue Entry Size
134   UINT8  Rsvd2;
135 } NVME_CC;
136 
137 //
138 // 3.1.6 Offset 1Ch: CSTS - Controller Status
139 //
140 typedef struct {
141   UINT32 Rdy:1;      // Ready
142   UINT32 Cfs:1;      // Controller Fatal Status
143   UINT32 Shst:2;     // Shutdown Status
144   UINT32 Nssro:1;    // NVM Subsystem Reset Occurred
145   UINT32 Rsvd1:27;
146 } NVME_CSTS;
147 
148 //
149 // 3.1.8 Offset 24h: AQA - Admin Queue Attributes
150 //
151 typedef struct {
152   UINT16 Asqs:12;    // Submission Queue Size
153   UINT16 Rsvd1:4;
154   UINT16 Acqs:12;    // Completion Queue Size
155   UINT16 Rsvd2:4;
156 } NVME_AQA;
157 
158 //
159 // 3.1.9 Offset 28h: ASQ - Admin Submission Queue Base Address
160 //
161 #define NVME_ASQ      UINT64
162 
163 //
164 // 3.1.10 Offset 30h: ACQ - Admin Completion Queue Base Address
165 //
166 #define NVME_ACQ      UINT64
167 
168 //
169 // 3.1.11 Offset (1000h + ((2y) * (4 << CAP.DSTRD))): SQyTDBL - Submission Queue y Tail Doorbell
170 //
171 typedef struct {
172   UINT16 Sqt;
173   UINT16 Rsvd1;
174 } NVME_SQTDBL;
175 
176 //
177 // 3.1.12 Offset (1000h + ((2y + 1) * (4 << CAP.DSTRD))): CQyHDBL - Completion Queue y Head Doorbell
178 //
179 typedef struct {
180   UINT16 Cqh;
181   UINT16 Rsvd1;
182 } NVME_CQHDBL;
183 
184 //
185 // NVM command set structures
186 //
187 // Read Command
188 //
189 typedef struct {
190   //
191   // CDW 10, 11
192   //
193   UINT64 Slba;                /* Starting Sector Address */
194   //
195   // CDW 12
196   //
197   UINT16 Nlb;                 /* Number of Sectors */
198   UINT16 Rsvd1:10;
199   UINT16 Prinfo:4;            /* Protection Info Check */
200   UINT16 Fua:1;               /* Force Unit Access */
201   UINT16 Lr:1;                /* Limited Retry */
202   //
203   // CDW 13
204   //
205   UINT32 Af:4;                /* Access Frequency */
206   UINT32 Al:2;                /* Access Latency */
207   UINT32 Sr:1;                /* Sequential Request */
208   UINT32 In:1;                /* Incompressible */
209   UINT32 Rsvd2:24;
210   //
211   // CDW 14
212   //
213   UINT32 Eilbrt;              /* Expected Initial Logical Block Reference Tag */
214   //
215   // CDW 15
216   //
217   UINT16 Elbat;               /* Expected Logical Block Application Tag */
218   UINT16 Elbatm;              /* Expected Logical Block Application Tag Mask */
219 } NVME_READ;
220 
221 //
222 // Write Command
223 //
224 typedef struct {
225   //
226   // CDW 10, 11
227   //
228   UINT64 Slba;                /* Starting Sector Address */
229   //
230   // CDW 12
231   //
232   UINT16 Nlb;                 /* Number of Sectors */
233   UINT16 Rsvd1:10;
234   UINT16 Prinfo:4;            /* Protection Info Check */
235   UINT16 Fua:1;               /* Force Unit Access */
236   UINT16 Lr:1;                /* Limited Retry */
237   //
238   // CDW 13
239   //
240   UINT32 Af:4;                /* Access Frequency */
241   UINT32 Al:2;                /* Access Latency */
242   UINT32 Sr:1;                /* Sequential Request */
243   UINT32 In:1;                /* Incompressible */
244   UINT32 Rsvd2:24;
245   //
246   // CDW 14
247   //
248   UINT32 Ilbrt;               /* Initial Logical Block Reference Tag */
249   //
250   // CDW 15
251   //
252   UINT16 Lbat;                /* Logical Block Application Tag */
253   UINT16 Lbatm;               /* Logical Block Application Tag Mask */
254 } NVME_WRITE;
255 
256 //
257 // Flush
258 //
259 typedef struct {
260   //
261   // CDW 10
262   //
263   UINT32 Flush;               /* Flush */
264 } NVME_FLUSH;
265 
266 //
267 // Write Uncorrectable command
268 //
269 typedef struct {
270   //
271   // CDW 10, 11
272   //
273   UINT64 Slba;                /* Starting LBA */
274   //
275   // CDW 12
276   //
277   UINT32 Nlb:16;              /* Number of  Logical Blocks */
278   UINT32 Rsvd1:16;
279 } NVME_WRITE_UNCORRECTABLE;
280 
281 //
282 // Write Zeroes command
283 //
284 typedef struct {
285   //
286   // CDW 10, 11
287   //
288   UINT64 Slba;                /* Starting LBA */
289   //
290   // CDW 12
291   //
292   UINT16 Nlb;                 /* Number of Logical Blocks */
293   UINT16 Rsvd1:10;
294   UINT16 Prinfo:4;            /* Protection Info Check */
295   UINT16 Fua:1;               /* Force Unit Access */
296   UINT16 Lr:1;                /* Limited Retry */
297   //
298   // CDW 13
299   //
300   UINT32 Rsvd2;
301   //
302   // CDW 14
303   //
304   UINT32 Ilbrt;               /* Initial Logical Block Reference Tag */
305   //
306   // CDW 15
307   //
308   UINT16 Lbat;                /* Logical Block Application Tag */
309   UINT16 Lbatm;               /* Logical Block Application Tag Mask */
310 } NVME_WRITE_ZEROES;
311 
312 //
313 // Compare command
314 //
315 typedef struct {
316   //
317   // CDW 10, 11
318   //
319   UINT64 Slba;                /* Starting LBA */
320   //
321   // CDW 12
322   //
323   UINT16 Nlb;                 /* Number of Logical Blocks */
324   UINT16 Rsvd1:10;
325   UINT16 Prinfo:4;            /* Protection Info Check */
326   UINT16 Fua:1;               /* Force Unit Access */
327   UINT16 Lr:1;                /* Limited Retry */
328   //
329   // CDW 13
330   //
331   UINT32 Rsvd2;
332   //
333   // CDW 14
334   //
335   UINT32 Eilbrt;              /* Expected Initial Logical Block Reference Tag */
336   //
337   // CDW 15
338   //
339   UINT16 Elbat;               /* Expected Logical Block Application Tag */
340   UINT16 Elbatm;              /* Expected Logical Block Application Tag Mask */
341 } NVME_COMPARE;
342 
343 typedef union {
344   NVME_READ                   Read;
345   NVME_WRITE                  Write;
346   NVME_FLUSH                  Flush;
347   NVME_WRITE_UNCORRECTABLE    WriteUncorrectable;
348   NVME_WRITE_ZEROES           WriteZeros;
349   NVME_COMPARE                Compare;
350 } NVME_CMD;
351 
352 typedef struct {
353   UINT16 Mp;                /* Maximum Power */
354   UINT8  Rsvd1;             /* Reserved as of Nvm Express 1.1 Spec */
355   UINT8  Mps:1;             /* Max Power Scale */
356   UINT8  Nops:1;            /* Non-Operational State */
357   UINT8  Rsvd2:6;           /* Reserved as of Nvm Express 1.1 Spec */
358   UINT32 Enlat;             /* Entry Latency */
359   UINT32 Exlat;             /* Exit Latency */
360   UINT8  Rrt:5;             /* Relative Read Throughput */
361   UINT8  Rsvd3:3;           /* Reserved as of Nvm Express 1.1 Spec */
362   UINT8  Rrl:5;             /* Relative Read Leatency */
363   UINT8  Rsvd4:3;           /* Reserved as of Nvm Express 1.1 Spec */
364   UINT8  Rwt:5;             /* Relative Write Throughput */
365   UINT8  Rsvd5:3;           /* Reserved as of Nvm Express 1.1 Spec */
366   UINT8  Rwl:5;             /* Relative Write Leatency */
367   UINT8  Rsvd6:3;           /* Reserved as of Nvm Express 1.1 Spec */
368   UINT8  Rsvd7[16];         /* Reserved as of Nvm Express 1.1 Spec */
369 } NVME_PSDESCRIPTOR;
370 
371 //
372 //  Identify Controller Data
373 //
374 typedef struct {
375   //
376   // Controller Capabilities and Features 0-255
377   //
378   UINT16 Vid;                 /* PCI Vendor ID */
379   UINT16 Ssvid;               /* PCI sub-system vendor ID */
380   UINT8  Sn[20];              /* Produce serial number */
381 
382   UINT8  Mn[40];              /* Proeduct model number */
383   UINT8  Fr[8];               /* Firmware Revision */
384   UINT8  Rab;                 /* Recommended Arbitration Burst */
385   UINT8  Ieee_oiu[3];         /* Organization Unique Identifier */
386   UINT8  Cmic;                /* Multi-interface Capabilities */
387   UINT8  Mdts;                /* Maximum Data Transfer Size */
388   UINT8  Cntlid[2];           /* Controller ID */
389   UINT8  Rsvd1[176];          /* Reserved as of Nvm Express 1.1 Spec */
390   //
391   // Admin Command Set Attributes
392   //
393   UINT16 Oacs;                /* Optional Admin Command Support */
394   UINT8  Acl;                 /* Abort Command Limit */
395   UINT8  Aerl;                /* Async Event Request Limit */
396   UINT8  Frmw;                /* Firmware updates */
397   UINT8  Lpa;                 /* Log Page Attributes */
398   UINT8  Elpe;                /* Error Log Page Entries */
399   UINT8  Npss;                /* Number of Power States Support */
400   UINT8  Avscc;               /* Admin Vendor Specific Command Configuration */
401   UINT8  Apsta;               /* Autonomous Power State Transition Attributes */
402   UINT8  Rsvd2[246];          /* Reserved as of Nvm Express 1.1 Spec */
403   //
404   // NVM Command Set Attributes
405   //
406   UINT8  Sqes;                /* Submission Queue Entry Size */
407   UINT8  Cqes;                /* Completion Queue Entry Size */
408   UINT16 Rsvd3;               /* Reserved as of Nvm Express 1.1 Spec */
409   UINT32 Nn;                  /* Number of Namespaces */
410   UINT16 Oncs;                /* Optional NVM Command Support */
411   UINT16 Fuses;               /* Fused Operation Support */
412   UINT8  Fna;                 /* Format NVM Attributes */
413   UINT8  Vwc;                 /* Volatile Write Cache */
414   UINT16 Awun;                /* Atomic Write Unit Normal */
415   UINT16 Awupf;               /* Atomic Write Unit Power Fail */
416   UINT8  Nvscc;               /* NVM Vendor Specific Command Configuration */
417   UINT8  Rsvd4;               /* Reserved as of Nvm Express 1.1 Spec */
418   UINT16 Acwu;                /* Atomic Compare & Write Unit */
419   UINT16 Rsvd5;               /* Reserved as of Nvm Express 1.1 Spec */
420   UINT32 Sgls;                /* SGL Support  */
421   UINT8  Rsvd6[164];          /* Reserved as of Nvm Express 1.1 Spec */
422   //
423   // I/O Command set Attributes
424   //
425   UINT8 Rsvd7[1344];          /* Reserved as of Nvm Express 1.1 Spec */
426   //
427   // Power State Descriptors
428   //
429   NVME_PSDESCRIPTOR PsDescriptor[32];
430 
431   UINT8  VendorData[1024];    /* Vendor specific Data */
432 } NVME_ADMIN_CONTROLLER_DATA;
433 
434 typedef struct {
435   UINT16        Security  : 1;    /* supports security send/receive commands */
436   UINT16        Format    : 1;    /* supports format nvm command */
437   UINT16        Firmware  : 1;    /* supports firmware activate/download commands */
438   UINT16        Oacs_rsvd : 13;
439  } OACS; // optional admin command support: NVME_ADMIN_CONTROLLER_DATA.Oacs
440 
441 typedef struct {
442   UINT16 Ms;                /* Metadata Size */
443   UINT8  Lbads;             /* LBA Data Size */
444   UINT8  Rp:2;              /* Relative Performance */
445     #define LBAF_RP_BEST      00b
446     #define LBAF_RP_BETTER    01b
447     #define LBAF_RP_GOOD      10b
448     #define LBAF_RP_DEGRADED  11b
449   UINT8  Rsvd1:6;           /* Reserved as of Nvm Express 1.1 Spec */
450 } NVME_LBAFORMAT;
451 
452 //
453 // Identify Namespace Data
454 //
455 typedef struct {
456   //
457   // NVM Command Set Specific
458   //
459   UINT64 Nsze;                /* Namespace Size (total number of blocks in formatted namespace) */
460   UINT64 Ncap;                /* Namespace Capacity (max number of logical blocks) */
461   UINT64 Nuse;                /* Namespace Utilization */
462   UINT8  Nsfeat;              /* Namespace Features */
463   UINT8  Nlbaf;               /* Number of LBA Formats */
464   UINT8  Flbas;               /* Formatted LBA Size */
465   UINT8  Mc;                  /* Metadata Capabilities */
466   UINT8  Dpc;                 /* End-to-end Data Protection capabilities */
467   UINT8  Dps;                 /* End-to-end Data Protection Type Settings */
468   UINT8  Nmic;                /* Namespace Multi-path I/O and Namespace Sharing Capabilities */
469   UINT8  Rescap;              /* Reservation Capabilities */
470   UINT8  Rsvd1[88];           /* Reserved as of Nvm Express 1.1 Spec */
471   UINT64 Eui64;               /* IEEE Extended Unique Identifier */
472   //
473   // LBA Format
474   //
475   NVME_LBAFORMAT LbaFormat[16];
476 
477   UINT8 Rsvd2[192];           /* Reserved as of Nvm Express 1.1 Spec */
478   UINT8 VendorData[3712];     /* Vendor specific Data */
479 } NVME_ADMIN_NAMESPACE_DATA;
480 
481 //
482 // NvmExpress Admin Identify Cmd
483 //
484 typedef struct {
485   //
486   // CDW 10
487   //
488   UINT32 Cns:2;
489   UINT32 Rsvd1:30;
490 } NVME_ADMIN_IDENTIFY;
491 
492 //
493 // NvmExpress Admin Create I/O Completion Queue
494 //
495 typedef struct {
496   //
497   // CDW 10
498   //
499   UINT32 Qid:16;              /* Queue Identifier */
500   UINT32 Qsize:16;            /* Queue Size */
501 
502   //
503   // CDW 11
504   //
505   UINT32 Pc:1;                /* Physically Contiguous */
506   UINT32 Ien:1;               /* Interrupts Enabled */
507   UINT32 Rsvd1:14;            /* reserved as of Nvm Express 1.1 Spec */
508   UINT32 Iv:16;               /* Interrupt Vector */
509 } NVME_ADMIN_CRIOCQ;
510 
511 //
512 // NvmExpress Admin Create I/O Submission Queue
513 //
514 typedef struct {
515   //
516   // CDW 10
517   //
518   UINT32 Qid:16;              /* Queue Identifier */
519   UINT32 Qsize:16;            /* Queue Size */
520 
521   //
522   // CDW 11
523   //
524   UINT32 Pc:1;                /* Physically Contiguous */
525   UINT32 Qprio:2;             /* Queue Priority */
526   UINT32 Rsvd1:13;            /* Reserved as of Nvm Express 1.1 Spec */
527   UINT32 Cqid:16;             /* Completion Queue ID */
528 } NVME_ADMIN_CRIOSQ;
529 
530 //
531 // NvmExpress Admin Delete I/O Completion Queue
532 //
533 typedef struct {
534   //
535   // CDW 10
536   //
537   UINT16 Qid;
538   UINT16 Rsvd1;
539 } NVME_ADMIN_DEIOCQ;
540 
541 //
542 // NvmExpress Admin Delete I/O Submission Queue
543 //
544 typedef struct {
545   //
546   // CDW 10
547   //
548   UINT16 Qid;
549   UINT16 Rsvd1;
550 } NVME_ADMIN_DEIOSQ;
551 
552 //
553 // NvmExpress Admin Security Send
554 //
555 typedef struct {
556   //
557   // CDW 10
558   //
559   UINT32 Resv:8;              /* Reserve */
560   UINT32 Spsp:16;             /* SP Specific */
561   UINT32 Secp:8;              /* Security Protocol */
562 
563   //
564   // CDW 11
565   //
566   UINT32 Tl;                  /* Transfer Length */
567 } NVME_ADMIN_SECSEND;
568 
569 //
570 // NvmExpress Admin Abort Command
571 //
572 typedef struct {
573   //
574   // CDW 10
575   //
576   UINT32 Sqid:16;             /* Submission Queue identifier */
577   UINT32 Cid:16;              /* Command Identifier */
578 } NVME_ADMIN_ABORT;
579 
580 //
581 // NvmExpress Admin Firmware Activate Command
582 //
583 typedef struct {
584   //
585   // CDW 10
586   //
587   UINT32 Fs:3;                /* Submission Queue identifier */
588   UINT32 Aa:2;                /* Command Identifier */
589   UINT32 Rsvd1:27;
590 } NVME_ADMIN_FIRMWARE_ACTIVATE;
591 
592 //
593 // NvmExpress Admin Firmware Image Download Command
594 //
595 typedef struct {
596   //
597   // CDW 10
598   //
599   UINT32 Numd;                /* Number of Dwords */
600   //
601   // CDW 11
602   //
603   UINT32 Ofst;                /* Offset */
604 } NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD;
605 
606 //
607 // NvmExpress Admin Get Features Command
608 //
609 typedef struct {
610   //
611   // CDW 10
612   //
613   UINT32 Fid:8;                /* Feature Identifier */
614   UINT32 Sel:3;                /* Select */
615   UINT32 Rsvd1:21;
616 } NVME_ADMIN_GET_FEATURES;
617 
618 //
619 // NvmExpress Admin Get Log Page Command
620 //
621 typedef struct {
622   //
623   // CDW 10
624   //
625   UINT32 Lid:8;               /* Log Page Identifier */
626     #define LID_ERROR_INFO
627     #define LID_SMART_INFO
628     #define LID_FW_SLOT_INFO
629   UINT32 Rsvd1:8;
630   UINT32 Numd:12;             /* Number of Dwords */
631   UINT32 Rsvd2:4;             /* Reserved as of Nvm Express 1.1 Spec */
632 } NVME_ADMIN_GET_LOG_PAGE;
633 
634 //
635 // NvmExpress Admin Set Features Command
636 //
637 typedef struct {
638   //
639   // CDW 10
640   //
641   UINT32 Fid:8;               /* Feature Identifier */
642   UINT32 Rsvd1:23;
643   UINT32 Sv:1;                /* Save */
644 } NVME_ADMIN_SET_FEATURES;
645 
646 //
647 // NvmExpress Admin Format NVM Command
648 //
649 typedef struct {
650   //
651   // CDW 10
652   //
653   UINT32 Lbaf:4;              /* LBA Format */
654   UINT32 Ms:1;                /* Metadata Settings */
655   UINT32 Pi:3;                /* Protection Information */
656   UINT32 Pil:1;               /* Protection Information Location */
657   UINT32 Ses:3;               /* Secure Erase Settings */
658   UINT32 Rsvd1:20;
659 } NVME_ADMIN_FORMAT_NVM;
660 
661 //
662 // NvmExpress Admin Security Receive Command
663 //
664 typedef struct {
665   //
666   // CDW 10
667   //
668   UINT32 Rsvd1:8;
669   UINT32 Spsp:16;             /* SP Specific */
670   UINT32 Secp:8;              /* Security Protocol */
671   //
672   // CDW 11
673   //
674   UINT32 Al;                  /* Allocation Length */
675 } NVME_ADMIN_SECURITY_RECEIVE;
676 
677 //
678 // NvmExpress Admin Security Send Command
679 //
680 typedef struct {
681   //
682   // CDW 10
683   //
684   UINT32 Rsvd1:8;
685   UINT32 Spsp:16;             /* SP Specific */
686   UINT32 Secp:8;              /* Security Protocol */
687   //
688   // CDW 11
689   //
690   UINT32 Tl;                  /* Transfer Length */
691 } NVME_ADMIN_SECURITY_SEND;
692 
693 typedef union {
694   NVME_ADMIN_IDENTIFY                   Identify;
695   NVME_ADMIN_CRIOCQ                     CrIoCq;
696   NVME_ADMIN_CRIOSQ                     CrIoSq;
697   NVME_ADMIN_DEIOCQ                     DeIoCq;
698   NVME_ADMIN_DEIOSQ                     DeIoSq;
699   NVME_ADMIN_ABORT                      Abort;
700   NVME_ADMIN_FIRMWARE_ACTIVATE          Activate;
701   NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD    FirmwareImageDownload;
702   NVME_ADMIN_GET_FEATURES               GetFeatures;
703   NVME_ADMIN_GET_LOG_PAGE               GetLogPage;
704   NVME_ADMIN_SET_FEATURES               SetFeatures;
705   NVME_ADMIN_FORMAT_NVM                 FormatNvm;
706   NVME_ADMIN_SECURITY_RECEIVE           SecurityReceive;
707   NVME_ADMIN_SECURITY_SEND              SecuritySend;
708 } NVME_ADMIN_CMD;
709 
710 typedef struct {
711   UINT32 Cdw10;
712   UINT32 Cdw11;
713   UINT32 Cdw12;
714   UINT32 Cdw13;
715   UINT32 Cdw14;
716   UINT32 Cdw15;
717 } NVME_RAW;
718 
719 typedef union {
720   NVME_ADMIN_CMD Admin;   // Union of Admin commands
721   NVME_CMD       Nvm;     // Union of Nvm commands
722   NVME_RAW       Raw;
723 } NVME_PAYLOAD;
724 
725 //
726 // Submission Queue
727 //
728 typedef struct {
729   //
730   // CDW 0, Common to all comnmands
731   //
732   UINT8  Opc;               // Opcode
733   UINT8  Fuse:2;            // Fused Operation
734   UINT8  Rsvd1:5;
735   UINT8  Psdt:1;            // PRP or SGL for Data Transfer
736   UINT16 Cid;               // Command Identifier
737 
738   //
739   // CDW 1
740   //
741   UINT32 Nsid;              // Namespace Identifier
742 
743   //
744   // CDW 2,3
745   //
746   UINT64 Rsvd2;
747 
748   //
749   // CDW 4,5
750   //
751   UINT64 Mptr;              // Metadata Pointer
752 
753   //
754   // CDW 6-9
755   //
756   UINT64 Prp[2];            // First and second PRP entries
757 
758   NVME_PAYLOAD Payload;
759 
760 } NVME_SQ;
761 
762 //
763 // Completion Queue
764 //
765 typedef struct {
766   //
767   // CDW 0
768   //
769   UINT32 Dword0;
770   //
771   // CDW 1
772   //
773   UINT32 Rsvd1;
774   //
775   // CDW 2
776   //
777   UINT16 Sqhd;              // Submission Queue Head Pointer
778   UINT16 Sqid;              // Submission Queue Identifier
779   //
780   // CDW 3
781   //
782   UINT16 Cid;               // Command Identifier
783   UINT16 Pt:1;              // Phase Tag
784   UINT16 Sc:8;              // Status Code
785   UINT16 Sct:3;             // Status Code Type
786   UINT16 Rsvd2:2;
787   UINT16 Mo:1;              // More
788   UINT16 Dnr:1;             // Retry
789 } NVME_CQ;
790 
791 //
792 // Nvm Express Admin cmd opcodes
793 //
794 #define NVME_ADMIN_DELIOSQ_OPC               0
795 #define NVME_ADMIN_CRIOSQ_OPC                1
796 #define NVME_ADMIN_DELIOCQ_OPC               4
797 #define NVME_ADMIN_CRIOCQ_OPC                5
798 #define NVME_ADMIN_IDENTIFY_OPC              6
799 #define NVME_ADMIN_SECURITY_SEND_OPC         0x81
800 #define NVME_ADMIN_SECURITY_RECV_OPC         0x82
801 
802 #define NVME_IO_FLUSH_OPC                    0
803 #define NVME_IO_WRITE_OPC                    1
804 #define NVME_IO_READ_OPC                     2
805 
806 //
807 // Offset from the beginning of private Data queue Buffer
808 //
809 #define NVME_ASQ_BUF_OFFSET                  EFI_PAGE_SIZE
810 
811 #pragma pack()
812 
813 #endif
814 
815