]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h
SecurityPkg OpalPassword: Add solution without SMM device code
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordSmm / OpalNvmeReg.h
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