]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Include/IndustryStandard/Nvme.h
MdePkg: Apply uncrustify changes
[mirror_edk2.git] / MdePkg / Include / IndustryStandard / Nvme.h
CommitLineData
111cd0dd
DR
1/** @file\r
2 Definitions based on NVMe spec. version 1.1.\r
3\r
4 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
a607eb97 5 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
9344f092 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
111cd0dd
DR
7\r
8 @par Specification Reference:\r
9 NVMe Specification 1.1\r
10\r
11**/\r
12\r
13#ifndef __NVM_E_H__\r
14#define __NVM_E_H__\r
15\r
16#pragma pack(1)\r
17\r
18//\r
19// controller register offsets\r
20//\r
2f88bd3a
MK
21#define NVME_CAP_OFFSET 0x0000 // Controller Capabilities\r
22#define NVME_VER_OFFSET 0x0008 // Version\r
23#define NVME_INTMS_OFFSET 0x000c // Interrupt Mask Set\r
24#define NVME_INTMC_OFFSET 0x0010 // Interrupt Mask Clear\r
25#define NVME_CC_OFFSET 0x0014 // Controller Configuration\r
26#define NVME_CSTS_OFFSET 0x001c // Controller Status\r
27#define NVME_NSSR_OFFSET 0x0020 // NVM Subsystem Reset\r
28#define NVME_AQA_OFFSET 0x0024 // Admin Queue Attributes\r
29#define NVME_ASQ_OFFSET 0x0028 // Admin Submission Queue Base Address\r
30#define NVME_ACQ_OFFSET 0x0030 // Admin Completion Queue Base Address\r
31#define NVME_SQ0_OFFSET 0x1000 // Submission Queue 0 (admin) Tail Doorbell\r
32#define NVME_CQ0_OFFSET 0x1004 // Completion Queue 0 (admin) Head Doorbell\r
111cd0dd
DR
33\r
34//\r
35// These register offsets are defined as 0x1000 + (N * (4 << CAP.DSTRD))\r
36// Get the doorbell stride bit shift value from the controller capabilities.\r
37//\r
2f88bd3a
MK
38#define NVME_SQTDBL_OFFSET(QID, DSTRD) 0x1000 + ((2 * (QID)) * (4 << (DSTRD))) // Submission Queue y (NVM) Tail Doorbell\r
39#define NVME_CQHDBL_OFFSET(QID, DSTRD) 0x1000 + (((2 * (QID)) + 1) * (4 << (DSTRD))) // Completion Queue y (NVM) Head Doorbell\r
111cd0dd
DR
40\r
41#pragma pack(1)\r
42\r
43//\r
44// 3.1.1 Offset 00h: CAP - Controller Capabilities\r
45//\r
46typedef struct {\r
2f88bd3a
MK
47 UINT16 Mqes; // Maximum Queue Entries Supported\r
48 UINT8 Cqr : 1; // Contiguous Queues Required\r
49 UINT8 Ams : 2; // Arbitration Mechanism Supported\r
50 UINT8 Rsvd1 : 5;\r
51 UINT8 To; // Timeout\r
52 UINT16 Dstrd : 4;\r
53 UINT16 Nssrs : 1; // NVM Subsystem Reset Supported NSSRS\r
54 UINT16 Css : 4; // Command Sets Supported - Bit 37\r
55 UINT16 Rsvd3 : 7;\r
56 UINT8 Mpsmin : 4;\r
57 UINT8 Mpsmax : 4;\r
58 UINT8 Rsvd4;\r
111cd0dd
DR
59} NVME_CAP;\r
60\r
61//\r
62// 3.1.2 Offset 08h: VS - Version\r
63//\r
64typedef struct {\r
2f88bd3a
MK
65 UINT16 Mnr; // Minor version number\r
66 UINT16 Mjr; // Major version number\r
111cd0dd
DR
67} NVME_VER;\r
68\r
69//\r
70// 3.1.5 Offset 14h: CC - Controller Configuration\r
71//\r
72typedef struct {\r
2f88bd3a
MK
73 UINT16 En : 1; // Enable\r
74 UINT16 Rsvd1 : 3;\r
75 UINT16 Css : 3; // I/O Command Set Selected\r
76 UINT16 Mps : 4; // Memory Page Size\r
77 UINT16 Ams : 3; // Arbitration Mechanism Selected\r
78 UINT16 Shn : 2; // Shutdown Notification\r
79 UINT8 Iosqes : 4; // I/O Submission Queue Entry Size\r
80 UINT8 Iocqes : 4; // I/O Completion Queue Entry Size\r
81 UINT8 Rsvd2;\r
111cd0dd 82} NVME_CC;\r
2f88bd3a
MK
83#define NVME_CC_SHN_NORMAL_SHUTDOWN 1\r
84#define NVME_CC_SHN_ABRUPT_SHUTDOWN 2\r
111cd0dd
DR
85\r
86//\r
87// 3.1.6 Offset 1Ch: CSTS - Controller Status\r
88//\r
89typedef struct {\r
2f88bd3a
MK
90 UINT32 Rdy : 1; // Ready\r
91 UINT32 Cfs : 1; // Controller Fatal Status\r
92 UINT32 Shst : 2; // Shutdown Status\r
93 UINT32 Nssro : 1; // NVM Subsystem Reset Occurred\r
94 UINT32 Rsvd1 : 27;\r
111cd0dd 95} NVME_CSTS;\r
2f88bd3a
MK
96#define NVME_CSTS_SHST_SHUTDOWN_OCCURRING 1\r
97#define NVME_CSTS_SHST_SHUTDOWN_COMPLETED 2\r
111cd0dd
DR
98//\r
99// 3.1.8 Offset 24h: AQA - Admin Queue Attributes\r
100//\r
101typedef struct {\r
2f88bd3a
MK
102 UINT16 Asqs : 12; // Submission Queue Size\r
103 UINT16 Rsvd1 : 4;\r
104 UINT16 Acqs : 12; // Completion Queue Size\r
105 UINT16 Rsvd2 : 4;\r
111cd0dd
DR
106} NVME_AQA;\r
107\r
108//\r
109// 3.1.9 Offset 28h: ASQ - Admin Submission Queue Base Address\r
110//\r
2f88bd3a 111#define NVME_ASQ UINT64\r
111cd0dd
DR
112//\r
113// 3.1.10 Offset 30h: ACQ - Admin Completion Queue Base Address\r
114//\r
2f88bd3a 115#define NVME_ACQ UINT64\r
111cd0dd
DR
116\r
117//\r
118// 3.1.11 Offset (1000h + ((2y) * (4 << CAP.DSTRD))): SQyTDBL - Submission Queue y Tail Doorbell\r
119//\r
120typedef struct {\r
2f88bd3a
MK
121 UINT16 Sqt;\r
122 UINT16 Rsvd1;\r
111cd0dd
DR
123} NVME_SQTDBL;\r
124\r
125//\r
126// 3.1.12 Offset (1000h + ((2y + 1) * (4 << CAP.DSTRD))): CQyHDBL - Completion Queue y Head Doorbell\r
127//\r
128typedef struct {\r
2f88bd3a
MK
129 UINT16 Cqh;\r
130 UINT16 Rsvd1;\r
111cd0dd
DR
131} NVME_CQHDBL;\r
132\r
133//\r
134// NVM command set structures\r
135//\r
136// Read Command\r
137//\r
138typedef struct {\r
139 //\r
140 // CDW 10, 11\r
141 //\r
2f88bd3a 142 UINT64 Slba; /* Starting Sector Address */\r
111cd0dd
DR
143 //\r
144 // CDW 12\r
145 //\r
2f88bd3a
MK
146 UINT16 Nlb; /* Number of Sectors */\r
147 UINT16 Rsvd1 : 10;\r
148 UINT16 Prinfo : 4; /* Protection Info Check */\r
149 UINT16 Fua : 1; /* Force Unit Access */\r
150 UINT16 Lr : 1; /* Limited Retry */\r
111cd0dd
DR
151 //\r
152 // CDW 13\r
153 //\r
2f88bd3a
MK
154 UINT32 Af : 4; /* Access Frequency */\r
155 UINT32 Al : 2; /* Access Latency */\r
156 UINT32 Sr : 1; /* Sequential Request */\r
157 UINT32 In : 1; /* Incompressible */\r
158 UINT32 Rsvd2 : 24;\r
111cd0dd
DR
159 //\r
160 // CDW 14\r
161 //\r
2f88bd3a 162 UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */\r
111cd0dd
DR
163 //\r
164 // CDW 15\r
165 //\r
2f88bd3a
MK
166 UINT16 Elbat; /* Expected Logical Block Application Tag */\r
167 UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */\r
111cd0dd
DR
168} NVME_READ;\r
169\r
170//\r
171// Write Command\r
172//\r
173typedef struct {\r
174 //\r
175 // CDW 10, 11\r
176 //\r
2f88bd3a 177 UINT64 Slba; /* Starting Sector Address */\r
111cd0dd
DR
178 //\r
179 // CDW 12\r
180 //\r
2f88bd3a
MK
181 UINT16 Nlb; /* Number of Sectors */\r
182 UINT16 Rsvd1 : 10;\r
183 UINT16 Prinfo : 4; /* Protection Info Check */\r
184 UINT16 Fua : 1; /* Force Unit Access */\r
185 UINT16 Lr : 1; /* Limited Retry */\r
111cd0dd
DR
186 //\r
187 // CDW 13\r
188 //\r
2f88bd3a
MK
189 UINT32 Af : 4; /* Access Frequency */\r
190 UINT32 Al : 2; /* Access Latency */\r
191 UINT32 Sr : 1; /* Sequential Request */\r
192 UINT32 In : 1; /* Incompressible */\r
193 UINT32 Rsvd2 : 24;\r
111cd0dd
DR
194 //\r
195 // CDW 14\r
196 //\r
2f88bd3a 197 UINT32 Ilbrt; /* Initial Logical Block Reference Tag */\r
111cd0dd
DR
198 //\r
199 // CDW 15\r
200 //\r
2f88bd3a
MK
201 UINT16 Lbat; /* Logical Block Application Tag */\r
202 UINT16 Lbatm; /* Logical Block Application Tag Mask */\r
111cd0dd
DR
203} NVME_WRITE;\r
204\r
205//\r
206// Flush\r
207//\r
208typedef struct {\r
209 //\r
210 // CDW 10\r
211 //\r
2f88bd3a 212 UINT32 Flush; /* Flush */\r
111cd0dd
DR
213} NVME_FLUSH;\r
214\r
215//\r
216// Write Uncorrectable command\r
217//\r
218typedef struct {\r
219 //\r
220 // CDW 10, 11\r
221 //\r
2f88bd3a 222 UINT64 Slba; /* Starting LBA */\r
111cd0dd
DR
223 //\r
224 // CDW 12\r
225 //\r
2f88bd3a
MK
226 UINT32 Nlb : 16; /* Number of Logical Blocks */\r
227 UINT32 Rsvd1 : 16;\r
111cd0dd
DR
228} NVME_WRITE_UNCORRECTABLE;\r
229\r
230//\r
231// Write Zeroes command\r
232//\r
233typedef struct {\r
234 //\r
235 // CDW 10, 11\r
236 //\r
2f88bd3a 237 UINT64 Slba; /* Starting LBA */\r
111cd0dd
DR
238 //\r
239 // CDW 12\r
240 //\r
2f88bd3a
MK
241 UINT16 Nlb; /* Number of Logical Blocks */\r
242 UINT16 Rsvd1 : 10;\r
243 UINT16 Prinfo : 4; /* Protection Info Check */\r
244 UINT16 Fua : 1; /* Force Unit Access */\r
245 UINT16 Lr : 1; /* Limited Retry */\r
111cd0dd
DR
246 //\r
247 // CDW 13\r
248 //\r
2f88bd3a 249 UINT32 Rsvd2;\r
111cd0dd
DR
250 //\r
251 // CDW 14\r
252 //\r
2f88bd3a 253 UINT32 Ilbrt; /* Initial Logical Block Reference Tag */\r
111cd0dd
DR
254 //\r
255 // CDW 15\r
256 //\r
2f88bd3a
MK
257 UINT16 Lbat; /* Logical Block Application Tag */\r
258 UINT16 Lbatm; /* Logical Block Application Tag Mask */\r
111cd0dd
DR
259} NVME_WRITE_ZEROES;\r
260\r
261//\r
262// Compare command\r
263//\r
264typedef struct {\r
265 //\r
266 // CDW 10, 11\r
267 //\r
2f88bd3a 268 UINT64 Slba; /* Starting LBA */\r
111cd0dd
DR
269 //\r
270 // CDW 12\r
271 //\r
2f88bd3a
MK
272 UINT16 Nlb; /* Number of Logical Blocks */\r
273 UINT16 Rsvd1 : 10;\r
274 UINT16 Prinfo : 4; /* Protection Info Check */\r
275 UINT16 Fua : 1; /* Force Unit Access */\r
276 UINT16 Lr : 1; /* Limited Retry */\r
111cd0dd
DR
277 //\r
278 // CDW 13\r
279 //\r
2f88bd3a 280 UINT32 Rsvd2;\r
111cd0dd
DR
281 //\r
282 // CDW 14\r
283 //\r
2f88bd3a 284 UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */\r
111cd0dd
DR
285 //\r
286 // CDW 15\r
287 //\r
2f88bd3a
MK
288 UINT16 Elbat; /* Expected Logical Block Application Tag */\r
289 UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */\r
111cd0dd
DR
290} NVME_COMPARE;\r
291\r
292typedef union {\r
293 NVME_READ Read;\r
294 NVME_WRITE Write;\r
295 NVME_FLUSH Flush;\r
296 NVME_WRITE_UNCORRECTABLE WriteUncorrectable;\r
297 NVME_WRITE_ZEROES WriteZeros;\r
298 NVME_COMPARE Compare;\r
299} NVME_CMD;\r
300\r
301typedef struct {\r
2f88bd3a
MK
302 UINT16 Mp; /* Maximum Power */\r
303 UINT8 Rsvd1; /* Reserved as of Nvm Express 1.1 Spec */\r
304 UINT8 Mps : 1; /* Max Power Scale */\r
305 UINT8 Nops : 1; /* Non-Operational State */\r
306 UINT8 Rsvd2 : 6; /* Reserved as of Nvm Express 1.1 Spec */\r
307 UINT32 Enlat; /* Entry Latency */\r
308 UINT32 Exlat; /* Exit Latency */\r
309 UINT8 Rrt : 5; /* Relative Read Throughput */\r
310 UINT8 Rsvd3 : 3; /* Reserved as of Nvm Express 1.1 Spec */\r
311 UINT8 Rrl : 5; /* Relative Read Latency */\r
312 UINT8 Rsvd4 : 3; /* Reserved as of Nvm Express 1.1 Spec */\r
313 UINT8 Rwt : 5; /* Relative Write Throughput */\r
314 UINT8 Rsvd5 : 3; /* Reserved as of Nvm Express 1.1 Spec */\r
315 UINT8 Rwl : 5; /* Relative Write Latency */\r
316 UINT8 Rsvd6 : 3; /* Reserved as of Nvm Express 1.1 Spec */\r
317 UINT8 Rsvd7[16]; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
318} NVME_PSDESCRIPTOR;\r
319\r
320//\r
321// Identify Controller Data\r
322//\r
323typedef struct {\r
324 //\r
325 // Controller Capabilities and Features 0-255\r
326 //\r
2f88bd3a
MK
327 UINT16 Vid; /* PCI Vendor ID */\r
328 UINT16 Ssvid; /* PCI sub-system vendor ID */\r
329 UINT8 Sn[20]; /* Product serial number */\r
111cd0dd 330\r
2f88bd3a
MK
331 UINT8 Mn[40]; /* Product model number */\r
332 UINT8 Fr[8]; /* Firmware Revision */\r
333 UINT8 Rab; /* Recommended Arbitration Burst */\r
334 UINT8 Ieee_oui[3]; /* Organization Unique Identifier */\r
335 UINT8 Cmic; /* Multi-interface Capabilities */\r
336 UINT8 Mdts; /* Maximum Data Transfer Size */\r
337 UINT8 Cntlid[2]; /* Controller ID */\r
338 UINT8 Rsvd1[176]; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
339 //\r
340 // Admin Command Set Attributes\r
341 //\r
2f88bd3a
MK
342 UINT16 Oacs; /* Optional Admin Command Support */\r
343 #define NAMESPACE_MANAGEMENT_SUPPORTED BIT3\r
344 #define FW_DOWNLOAD_ACTIVATE_SUPPORTED BIT2\r
345 #define FORMAT_NVM_SUPPORTED BIT1\r
346 #define SECURITY_SEND_RECEIVE_SUPPORTED BIT0\r
347 UINT8 Acl; /* Abort Command Limit */\r
348 UINT8 Aerl; /* Async Event Request Limit */\r
349 UINT8 Frmw; /* Firmware updates */\r
350 UINT8 Lpa; /* Log Page Attributes */\r
351 UINT8 Elpe; /* Error Log Page Entries */\r
352 UINT8 Npss; /* Number of Power States Support */\r
353 UINT8 Avscc; /* Admin Vendor Specific Command Configuration */\r
354 UINT8 Apsta; /* Autonomous Power State Transition Attributes */\r
443300be 355 //\r
356 // Below fields before Rsvd2 are defined in NVM Express 1.3 Spec\r
357 //\r
2f88bd3a
MK
358 UINT16 Wctemp; /* Warning Composite Temperature Threshold */\r
359 UINT16 Cctemp; /* Critical Composite Temperature Threshold */\r
360 UINT16 Mtfa; /* Maximum Time for Firmware Activation */\r
361 UINT32 Hmpre; /* Host Memory Buffer Preferred Size */\r
362 UINT32 Hmmin; /* Host Memory Buffer Minimum Size */\r
363 UINT8 Tnvmcap[16]; /* Total NVM Capacity */\r
364 UINT8 Rsvd2[216]; /* Reserved as of NVM Express */\r
111cd0dd
DR
365 //\r
366 // NVM Command Set Attributes\r
367 //\r
2f88bd3a
MK
368 UINT8 Sqes; /* Submission Queue Entry Size */\r
369 UINT8 Cqes; /* Completion Queue Entry Size */\r
370 UINT16 Rsvd3; /* Reserved as of Nvm Express 1.1 Spec */\r
371 UINT32 Nn; /* Number of Namespaces */\r
372 UINT16 Oncs; /* Optional NVM Command Support */\r
373 UINT16 Fuses; /* Fused Operation Support */\r
374 UINT8 Fna; /* Format NVM Attributes */\r
375 UINT8 Vwc; /* Volatile Write Cache */\r
376 UINT16 Awun; /* Atomic Write Unit Normal */\r
377 UINT16 Awupf; /* Atomic Write Unit Power Fail */\r
378 UINT8 Nvscc; /* NVM Vendor Specific Command Configuration */\r
379 UINT8 Rsvd4; /* Reserved as of Nvm Express 1.1 Spec */\r
380 UINT16 Acwu; /* Atomic Compare & Write Unit */\r
381 UINT16 Rsvd5; /* Reserved as of Nvm Express 1.1 Spec */\r
382 UINT32 Sgls; /* SGL Support */\r
383 UINT8 Rsvd6[164]; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
384 //\r
385 // I/O Command set Attributes\r
386 //\r
2f88bd3a 387 UINT8 Rsvd7[1344]; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
388 //\r
389 // Power State Descriptors\r
390 //\r
2f88bd3a 391 NVME_PSDESCRIPTOR PsDescriptor[32];\r
111cd0dd 392\r
2f88bd3a 393 UINT8 VendorData[1024]; /* Vendor specific data */\r
111cd0dd
DR
394} NVME_ADMIN_CONTROLLER_DATA;\r
395\r
396typedef struct {\r
2f88bd3a
MK
397 UINT16 Ms; /* Metadata Size */\r
398 UINT8 Lbads; /* LBA Data Size */\r
399 UINT8 Rp : 2; /* Relative Performance */\r
400 #define LBAF_RP_BEST 00b\r
401 #define LBAF_RP_BETTER 01b\r
402 #define LBAF_RP_GOOD 10b\r
403 #define LBAF_RP_DEGRADED 11b\r
404 UINT8 Rsvd1 : 6; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
405} NVME_LBAFORMAT;\r
406\r
407//\r
408// Identify Namespace Data\r
409//\r
410typedef struct {\r
411 //\r
412 // NVM Command Set Specific\r
413 //\r
2f88bd3a
MK
414 UINT64 Nsze; /* Namespace Size (total number of blocks in formatted namespace) */\r
415 UINT64 Ncap; /* Namespace Capacity (max number of logical blocks) */\r
416 UINT64 Nuse; /* Namespace Utilization */\r
417 UINT8 Nsfeat; /* Namespace Features */\r
418 UINT8 Nlbaf; /* Number of LBA Formats */\r
419 UINT8 Flbas; /* Formatted LBA size */\r
420 UINT8 Mc; /* Metadata Capabilities */\r
421 UINT8 Dpc; /* End-to-end Data Protection capabilities */\r
422 UINT8 Dps; /* End-to-end Data Protection Type Settings */\r
423 UINT8 Nmic; /* Namespace Multi-path I/O and Namespace Sharing Capabilities */\r
424 UINT8 Rescap; /* Reservation Capabilities */\r
425 UINT8 Rsvd1[88]; /* Reserved as of Nvm Express 1.1 Spec */\r
426 UINT64 Eui64; /* IEEE Extended Unique Identifier */\r
111cd0dd
DR
427 //\r
428 // LBA Format\r
429 //\r
2f88bd3a 430 NVME_LBAFORMAT LbaFormat[16];\r
111cd0dd 431\r
2f88bd3a
MK
432 UINT8 Rsvd2[192]; /* Reserved as of Nvm Express 1.1 Spec */\r
433 UINT8 VendorData[3712]; /* Vendor specific data */\r
111cd0dd
DR
434} NVME_ADMIN_NAMESPACE_DATA;\r
435\r
436//\r
437// NvmExpress Admin Identify Cmd\r
438//\r
439typedef struct {\r
440 //\r
441 // CDW 10\r
442 //\r
2f88bd3a
MK
443 UINT32 Cns : 2;\r
444 UINT32 Rsvd1 : 30;\r
111cd0dd
DR
445} NVME_ADMIN_IDENTIFY;\r
446\r
447//\r
448// NvmExpress Admin Create I/O Completion Queue\r
449//\r
450typedef struct {\r
451 //\r
452 // CDW 10\r
453 //\r
2f88bd3a
MK
454 UINT32 Qid : 16; /* Queue Identifier */\r
455 UINT32 Qsize : 16; /* Queue Size */\r
111cd0dd
DR
456\r
457 //\r
458 // CDW 11\r
459 //\r
2f88bd3a
MK
460 UINT32 Pc : 1; /* Physically Contiguous */\r
461 UINT32 Ien : 1; /* Interrupts Enabled */\r
462 UINT32 Rsvd1 : 14; /* reserved as of Nvm Express 1.1 Spec */\r
463 UINT32 Iv : 16; /* Interrupt Vector for MSI-X or MSI*/\r
111cd0dd
DR
464} NVME_ADMIN_CRIOCQ;\r
465\r
466//\r
467// NvmExpress Admin Create I/O Submission Queue\r
468//\r
469typedef struct {\r
470 //\r
471 // CDW 10\r
472 //\r
2f88bd3a
MK
473 UINT32 Qid : 16; /* Queue Identifier */\r
474 UINT32 Qsize : 16; /* Queue Size */\r
111cd0dd
DR
475\r
476 //\r
477 // CDW 11\r
478 //\r
2f88bd3a
MK
479 UINT32 Pc : 1; /* Physically Contiguous */\r
480 UINT32 Qprio : 2; /* Queue Priority */\r
481 UINT32 Rsvd1 : 13; /* Reserved as of Nvm Express 1.1 Spec */\r
482 UINT32 Cqid : 16; /* Completion Queue ID */\r
111cd0dd
DR
483} NVME_ADMIN_CRIOSQ;\r
484\r
485//\r
486// NvmExpress Admin Delete I/O Completion Queue\r
487//\r
488typedef struct {\r
489 //\r
490 // CDW 10\r
491 //\r
2f88bd3a
MK
492 UINT16 Qid;\r
493 UINT16 Rsvd1;\r
111cd0dd
DR
494} NVME_ADMIN_DEIOCQ;\r
495\r
496//\r
497// NvmExpress Admin Delete I/O Submission Queue\r
498//\r
499typedef struct {\r
500 //\r
501 // CDW 10\r
502 //\r
2f88bd3a
MK
503 UINT16 Qid;\r
504 UINT16 Rsvd1;\r
111cd0dd
DR
505} NVME_ADMIN_DEIOSQ;\r
506\r
507//\r
508// NvmExpress Admin Abort Command\r
509//\r
510typedef struct {\r
511 //\r
512 // CDW 10\r
513 //\r
2f88bd3a
MK
514 UINT32 Sqid : 16; /* Submission Queue identifier */\r
515 UINT32 Cid : 16; /* Command Identifier */\r
111cd0dd
DR
516} NVME_ADMIN_ABORT;\r
517\r
518//\r
519// NvmExpress Admin Firmware Activate Command\r
520//\r
521typedef struct {\r
522 //\r
523 // CDW 10\r
524 //\r
2f88bd3a
MK
525 UINT32 Fs : 3; /* Submission Queue identifier */\r
526 UINT32 Aa : 2; /* Command Identifier */\r
527 UINT32 Rsvd1 : 27;\r
111cd0dd
DR
528} NVME_ADMIN_FIRMWARE_ACTIVATE;\r
529\r
530//\r
531// NvmExpress Admin Firmware Image Download Command\r
532//\r
533typedef struct {\r
534 //\r
535 // CDW 10\r
536 //\r
2f88bd3a 537 UINT32 Numd; /* Number of Dwords */\r
111cd0dd
DR
538 //\r
539 // CDW 11\r
540 //\r
2f88bd3a 541 UINT32 Ofst; /* Offset */\r
111cd0dd
DR
542} NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD;\r
543\r
544//\r
545// NvmExpress Admin Get Features Command\r
546//\r
547typedef struct {\r
548 //\r
549 // CDW 10\r
550 //\r
2f88bd3a
MK
551 UINT32 Fid : 8; /* Feature Identifier */\r
552 UINT32 Sel : 3; /* Select */\r
553 UINT32 Rsvd1 : 21;\r
111cd0dd
DR
554} NVME_ADMIN_GET_FEATURES;\r
555\r
556//\r
557// NvmExpress Admin Get Log Page Command\r
558//\r
559typedef struct {\r
560 //\r
561 // CDW 10\r
562 //\r
2f88bd3a
MK
563 UINT32 Lid : 8; /* Log Page Identifier */\r
564 #define LID_ERROR_INFO 0x1\r
565 #define LID_SMART_INFO 0x2\r
566 #define LID_FW_SLOT_INFO 0x3\r
567 UINT32 Rsvd1 : 8;\r
568 UINT32 Numd : 12; /* Number of Dwords */\r
569 UINT32 Rsvd2 : 4; /* Reserved as of Nvm Express 1.1 Spec */\r
111cd0dd
DR
570} NVME_ADMIN_GET_LOG_PAGE;\r
571\r
572//\r
573// NvmExpress Admin Set Features Command\r
574//\r
575typedef struct {\r
576 //\r
577 // CDW 10\r
578 //\r
2f88bd3a
MK
579 UINT32 Fid : 8; /* Feature Identifier */\r
580 UINT32 Rsvd1 : 23;\r
581 UINT32 Sv : 1; /* Save */\r
111cd0dd
DR
582} NVME_ADMIN_SET_FEATURES;\r
583\r
584//\r
585// NvmExpress Admin Format NVM Command\r
586//\r
587typedef struct {\r
588 //\r
589 // CDW 10\r
590 //\r
2f88bd3a
MK
591 UINT32 Lbaf : 4; /* LBA Format */\r
592 UINT32 Ms : 1; /* Metadata Settings */\r
593 UINT32 Pi : 3; /* Protection Information */\r
594 UINT32 Pil : 1; /* Protection Information Location */\r
595 UINT32 Ses : 3; /* Secure Erase Settings */\r
596 UINT32 Rsvd1 : 20;\r
111cd0dd
DR
597} NVME_ADMIN_FORMAT_NVM;\r
598\r
599//\r
600// NvmExpress Admin Security Receive Command\r
601//\r
602typedef struct {\r
603 //\r
604 // CDW 10\r
605 //\r
2f88bd3a
MK
606 UINT32 Rsvd1 : 8;\r
607 UINT32 Spsp : 16; /* SP Specific */\r
608 UINT32 Secp : 8; /* Security Protocol */\r
111cd0dd
DR
609 //\r
610 // CDW 11\r
611 //\r
2f88bd3a 612 UINT32 Al; /* Allocation Length */\r
111cd0dd
DR
613} NVME_ADMIN_SECURITY_RECEIVE;\r
614\r
615//\r
616// NvmExpress Admin Security Send Command\r
617//\r
618typedef struct {\r
619 //\r
620 // CDW 10\r
621 //\r
2f88bd3a
MK
622 UINT32 Rsvd1 : 8;\r
623 UINT32 Spsp : 16; /* SP Specific */\r
624 UINT32 Secp : 8; /* Security Protocol */\r
111cd0dd
DR
625 //\r
626 // CDW 11\r
627 //\r
2f88bd3a 628 UINT32 Tl; /* Transfer Length */\r
111cd0dd
DR
629} NVME_ADMIN_SECURITY_SEND;\r
630\r
631typedef union {\r
632 NVME_ADMIN_IDENTIFY Identify;\r
633 NVME_ADMIN_CRIOCQ CrIoCq;\r
634 NVME_ADMIN_CRIOSQ CrIoSq;\r
635 NVME_ADMIN_DEIOCQ DeIoCq;\r
636 NVME_ADMIN_DEIOSQ DeIoSq;\r
637 NVME_ADMIN_ABORT Abort;\r
638 NVME_ADMIN_FIRMWARE_ACTIVATE Activate;\r
639 NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD FirmwareImageDownload;\r
640 NVME_ADMIN_GET_FEATURES GetFeatures;\r
641 NVME_ADMIN_GET_LOG_PAGE GetLogPage;\r
642 NVME_ADMIN_SET_FEATURES SetFeatures;\r
643 NVME_ADMIN_FORMAT_NVM FormatNvm;\r
644 NVME_ADMIN_SECURITY_RECEIVE SecurityReceive;\r
645 NVME_ADMIN_SECURITY_SEND SecuritySend;\r
646} NVME_ADMIN_CMD;\r
647\r
648typedef struct {\r
2f88bd3a
MK
649 UINT32 Cdw10;\r
650 UINT32 Cdw11;\r
651 UINT32 Cdw12;\r
652 UINT32 Cdw13;\r
653 UINT32 Cdw14;\r
654 UINT32 Cdw15;\r
111cd0dd
DR
655} NVME_RAW;\r
656\r
657typedef union {\r
2f88bd3a
MK
658 NVME_ADMIN_CMD Admin; // Union of Admin commands\r
659 NVME_CMD Nvm; // Union of Nvm commands\r
660 NVME_RAW Raw;\r
111cd0dd
DR
661} NVME_PAYLOAD;\r
662\r
663//\r
664// Submission Queue\r
665//\r
666typedef struct {\r
667 //\r
b219e2cd 668 // CDW 0, Common to all commands\r
111cd0dd 669 //\r
2f88bd3a
MK
670 UINT8 Opc; // Opcode\r
671 UINT8 Fuse : 2; // Fused Operation\r
672 UINT8 Rsvd1 : 5;\r
673 UINT8 Psdt : 1; // PRP or SGL for Data Transfer\r
674 UINT16 Cid; // Command Identifier\r
111cd0dd
DR
675\r
676 //\r
677 // CDW 1\r
678 //\r
2f88bd3a 679 UINT32 Nsid; // Namespace Identifier\r
111cd0dd
DR
680\r
681 //\r
682 // CDW 2,3\r
683 //\r
2f88bd3a 684 UINT64 Rsvd2;\r
111cd0dd
DR
685\r
686 //\r
687 // CDW 4,5\r
688 //\r
2f88bd3a 689 UINT64 Mptr; // Metadata Pointer\r
111cd0dd
DR
690\r
691 //\r
692 // CDW 6-9\r
693 //\r
2f88bd3a 694 UINT64 Prp[2]; // First and second PRP entries\r
111cd0dd 695\r
2f88bd3a 696 NVME_PAYLOAD Payload;\r
111cd0dd
DR
697} NVME_SQ;\r
698\r
699//\r
700// Completion Queue\r
701//\r
702typedef struct {\r
703 //\r
704 // CDW 0\r
705 //\r
2f88bd3a 706 UINT32 Dword0;\r
111cd0dd
DR
707 //\r
708 // CDW 1\r
709 //\r
2f88bd3a 710 UINT32 Rsvd1;\r
111cd0dd
DR
711 //\r
712 // CDW 2\r
713 //\r
2f88bd3a
MK
714 UINT16 Sqhd; // Submission Queue Head Pointer\r
715 UINT16 Sqid; // Submission Queue Identifier\r
111cd0dd
DR
716 //\r
717 // CDW 3\r
718 //\r
2f88bd3a
MK
719 UINT16 Cid; // Command Identifier\r
720 UINT16 Pt : 1; // Phase Tag\r
721 UINT16 Sc : 8; // Status Code\r
722 UINT16 Sct : 3; // Status Code Type\r
723 UINT16 Rsvd2 : 2;\r
724 UINT16 Mo : 1; // More\r
725 UINT16 Dnr : 1; // Do Not Retry\r
111cd0dd
DR
726} NVME_CQ;\r
727\r
728//\r
729// Nvm Express Admin cmd opcodes\r
730//\r
2f88bd3a
MK
731#define NVME_ADMIN_DEIOSQ_CMD 0x00\r
732#define NVME_ADMIN_CRIOSQ_CMD 0x01\r
733#define NVME_ADMIN_GET_LOG_PAGE_CMD 0x02\r
734#define NVME_ADMIN_DEIOCQ_CMD 0x04\r
735#define NVME_ADMIN_CRIOCQ_CMD 0x05\r
736#define NVME_ADMIN_IDENTIFY_CMD 0x06\r
737#define NVME_ADMIN_ABORT_CMD 0x08\r
738#define NVME_ADMIN_SET_FEATURES_CMD 0x09\r
739#define NVME_ADMIN_GET_FEATURES_CMD 0x0A\r
740#define NVME_ADMIN_ASYNC_EVENT_REQUEST_CMD 0x0C\r
741#define NVME_ADMIN_NAMESACE_MANAGEMENT_CMD 0x0D\r
742#define NVME_ADMIN_FW_COMMIT_CMD 0x10\r
743#define NVME_ADMIN_FW_IAMGE_DOWNLOAD_CMD 0x11\r
744#define NVME_ADMIN_NAMESACE_ATTACHMENT_CMD 0x15\r
745#define NVME_ADMIN_FORMAT_NVM_CMD 0x80\r
746#define NVME_ADMIN_SECURITY_SEND_CMD 0x81\r
747#define NVME_ADMIN_SECURITY_RECEIVE_CMD 0x82\r
748\r
749#define NVME_IO_FLUSH_OPC 0\r
750#define NVME_IO_WRITE_OPC 1\r
751#define NVME_IO_READ_OPC 2\r
111cd0dd
DR
752\r
753typedef enum {\r
754 DeleteIOSubmissionQueueOpcode = NVME_ADMIN_DEIOSQ_CMD,\r
755 CreateIOSubmissionQueueOpcode = NVME_ADMIN_CRIOSQ_CMD,\r
2f88bd3a 756 GetLogPageOpcode = NVME_ADMIN_GET_LOG_PAGE_CMD,\r
111cd0dd
DR
757 DeleteIOCompletionQueueOpcode = NVME_ADMIN_DEIOCQ_CMD,\r
758 CreateIOCompletionQueueOpcode = NVME_ADMIN_CRIOCQ_CMD,\r
2f88bd3a
MK
759 IdentifyOpcode = NVME_ADMIN_IDENTIFY_CMD,\r
760 AbortOpcode = NVME_ADMIN_ABORT_CMD,\r
761 SetFeaturesOpcode = NVME_ADMIN_SET_FEATURES_CMD,\r
762 GetFeaturesOpcode = NVME_ADMIN_GET_FEATURES_CMD,\r
763 AsyncEventRequestOpcode = NVME_ADMIN_ASYNC_EVENT_REQUEST_CMD,\r
764 NamespaceManagementOpcode = NVME_ADMIN_NAMESACE_MANAGEMENT_CMD,\r
765 FirmwareCommitOpcode = NVME_ADMIN_FW_COMMIT_CMD,\r
766 FirmwareImageDownloadOpcode = NVME_ADMIN_FW_IAMGE_DOWNLOAD_CMD,\r
767 NamespaceAttachmentOpcode = NVME_ADMIN_NAMESACE_ATTACHMENT_CMD,\r
768 FormatNvmOpcode = NVME_ADMIN_FORMAT_NVM_CMD,\r
769 SecuritySendOpcode = NVME_ADMIN_SECURITY_SEND_CMD,\r
770 SecurityReceiveOpcode = NVME_ADMIN_SECURITY_RECEIVE_CMD\r
111cd0dd
DR
771} NVME_ADMIN_COMMAND_OPCODE;\r
772\r
773//\r
774// Controller or Namespace Structure (CNS) field\r
775// (ref. spec. v1.1 figure 82).\r
776//\r
777typedef enum {\r
2f88bd3a
MK
778 IdentifyNamespaceCns = 0x0,\r
779 IdentifyControllerCns = 0x1,\r
780 IdentifyActiveNsListCns = 0x2\r
111cd0dd
DR
781} NVME_ADMIN_IDENTIFY_CNS;\r
782\r
783//\r
784// Commit Action\r
785// (ref. spec. 1.1 figure 60).\r
786//\r
787typedef enum {\r
2f88bd3a 788 ActivateActionReplace = 0x0,\r
111cd0dd 789 ActivateActionReplaceActivate = 0x1,\r
2f88bd3a 790 ActivateActionActivate = 0x2\r
111cd0dd
DR
791} NVME_FW_ACTIVATE_ACTION;\r
792\r
793//\r
794// Firmware Slot\r
795// (ref. spec. 1.1 Figure 60).\r
796//\r
797typedef enum {\r
798 FirmwareSlotCtrlChooses = 0x0,\r
2f88bd3a
MK
799 FirmwareSlot1 = 0x1,\r
800 FirmwareSlot2 = 0x2,\r
801 FirmwareSlot3 = 0x3,\r
802 FirmwareSlot4 = 0x4,\r
803 FirmwareSlot5 = 0x5,\r
804 FirmwareSlot6 = 0x6,\r
805 FirmwareSlot7 = 0x7\r
111cd0dd
DR
806} NVME_FW_ACTIVATE_SLOT;\r
807\r
808//\r
809// Get Log Page ? Log Page Identifiers\r
810// (ref. spec. v1.1 Figure 73).\r
811//\r
812typedef enum {\r
2f88bd3a
MK
813 ErrorInfoLogID = LID_ERROR_INFO,\r
814 SmartHealthInfoLogID = LID_SMART_INFO,\r
111cd0dd
DR
815 FirmwareSlotInfoLogID = LID_FW_SLOT_INFO\r
816} NVME_LOG_ID;\r
817\r
818//\r
819// Get Log Page ? Firmware Slot Information Log\r
820// (ref. spec. v1.1 Figure 77).\r
821//\r
822typedef struct {\r
823 //\r
824 // Indicates the firmware slot from which the actively running firmware revision was loaded.\r
825 //\r
2f88bd3a
MK
826 UINT8 ActivelyRunningFwSlot : 3;\r
827 UINT8 : 1;\r
111cd0dd
DR
828 //\r
829 // Indicates the firmware slot that is going to be activated at the next controller reset. If this field is 0h, then the controller does not indicate the firmware slot that is going to be activated at the next controller reset.\r
830 //\r
2f88bd3a
MK
831 UINT8 NextActiveFwSlot : 3;\r
832 UINT8 : 1;\r
111cd0dd
DR
833} NVME_ACTIVE_FW_INFO;\r
834\r
835//\r
836// Get Log Page ? Firmware Slot Information Log\r
837// (ref. spec. v1.1 Figure 77).\r
838//\r
839typedef struct {\r
840 //\r
841 // Specifies information about the active firmware revision.\r
2f88bd3a
MK
842 // s\r
843 NVME_ACTIVE_FW_INFO ActiveFwInfo;\r
844 UINT8 Reserved1[7];\r
111cd0dd
DR
845 //\r
846 // Contains the revision of the firmware downloaded to firmware slot 1/7. If no valid firmware revision is present or if this slot is unsupported, all zeros shall be returned.\r
847 //\r
2f88bd3a
MK
848 CHAR8 FwRevisionSlot[7][8];\r
849 UINT8 Reserved2[448];\r
111cd0dd
DR
850} NVME_FW_SLOT_INFO_LOG;\r
851\r
852//\r
853// SMART / Health Information (Log Identifier 02h)\r
854// (ref. spec. v1.1 5.10.1.2)\r
855//\r
856typedef struct {\r
857 //\r
858 // This field indicates critical warnings for the state of the controller.\r
859 //\r
2f88bd3a
MK
860 UINT8 CriticalWarningAvailableSpare : 1;\r
861 UINT8 CriticalWarningTemperature : 1;\r
862 UINT8 CriticalWarningReliability : 1;\r
863 UINT8 CriticalWarningMediaReadOnly : 1;\r
864 UINT8 CriticalWarningVolatileBackup : 1;\r
865 UINT8 CriticalWarningReserved : 3;\r
111cd0dd
DR
866 //\r
867 // Contains a value corresponding to a temperature in degrees Kelvin that represents the current composite temperature of the controller and namespace(s) associated with that controller. The manner in which this value is computed is implementation specific and may not represent the actual temperature of any physical point in the NVM subsystem.\r
868 //\r
2f88bd3a 869 UINT16 CompositeTemp;\r
111cd0dd
DR
870 //\r
871 // Contains a normalized percentage (0 to 100%) of the remaining spare capacity available.\r
872 //\r
2f88bd3a 873 UINT8 AvailableSpare;\r
111cd0dd
DR
874 //\r
875 // When the Available Spare falls below the threshold indicated in this field, an asynchronous event completion may occur. The value is indicated as a normalized percentage (0 to 100%).\r
876 //\r
2f88bd3a 877 UINT8 AvailableSpareThreshold;\r
111cd0dd 878 //\r
b219e2cd 879 // Contains a vendor specific estimate of the percentage of NVM subsystem life used based on the actual usage and the manufacturer's prediction of NVM life. A value of 100 indicates that the estimated endurance of the NVM in the NVM subsystem has been consumed, but may not indicate an NVM subsystem failure. The value is allowed to exceed 100. Percentages greater than 254 shall be represented as 255. This value shall be updated once per power-on hour (when the controller is not in a sleep state).\r
111cd0dd 880 //\r
2f88bd3a
MK
881 UINT8 PercentageUsed;\r
882 UINT8 Reserved1[26];\r
111cd0dd
DR
883 //\r
884 // Contains the number of 512 byte data units the host has read from the controller; this value does not include metadata.\r
885 //\r
2f88bd3a 886 UINT8 DataUnitsRead[16];\r
111cd0dd
DR
887 //\r
888 // Contains the number of 512 byte data units the host has written to the controller; this value does not include metadata.\r
889 //\r
2f88bd3a 890 UINT8 DataUnitsWritten[16];\r
111cd0dd
DR
891 //\r
892 // Contains the number of read commands completed by the controller.\r
893 //\r
2f88bd3a 894 UINT8 HostReadCommands[16];\r
111cd0dd
DR
895 //\r
896 // Contains the number of write commands completed by the controller.\r
897 //\r
2f88bd3a 898 UINT8 HostWriteCommands[16];\r
111cd0dd
DR
899 //\r
900 // Contains the amount of time the controller is busy with I/O commands. This value is reported in minutes.\r
901 //\r
2f88bd3a 902 UINT8 ControllerBusyTime[16];\r
111cd0dd
DR
903 //\r
904 // Contains the number of power cycles.\r
905 //\r
2f88bd3a 906 UINT8 PowerCycles[16];\r
111cd0dd
DR
907 //\r
908 // Contains the number of power-on hours.\r
909 //\r
2f88bd3a 910 UINT8 PowerOnHours[16];\r
111cd0dd
DR
911 //\r
912 // Contains the number of unsafe shutdowns.\r
913 //\r
2f88bd3a 914 UINT8 UnsafeShutdowns[16];\r
111cd0dd
DR
915 //\r
916 // Contains the number of occurrences where the controller detected an unrecovered data integrity error.\r
917 //\r
2f88bd3a 918 UINT8 MediaAndDataIntegrityErrors[16];\r
111cd0dd
DR
919 //\r
920 // Contains the number of Error Information log entries over the life of the controller.\r
921 //\r
2f88bd3a 922 UINT8 NumberErrorInformationLogEntries[16];\r
111cd0dd
DR
923 //\r
924 // Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater than or equal to the Warning Composite Temperature Threshold (WCTEMP) field and less than the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure in Figure 90.\r
925 //\r
2f88bd3a 926 UINT32 WarningCompositeTemperatureTime;\r
111cd0dd
DR
927 //\r
928 // Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure in Figure 90.\r
929 //\r
2f88bd3a 930 UINT32 CriticalCompositeTemperatureTime;\r
111cd0dd
DR
931 //\r
932 // Contains the current temperature in degrees Kelvin reported by the temperature sensor. An implementation that does not implement the temperature sensor reports a temperature of zero degrees Kelvin.\r
933 //\r
2f88bd3a
MK
934 UINT16 TemperatureSensor[8];\r
935 UINT8 Reserved2[296];\r
111cd0dd
DR
936} NVME_SMART_HEALTH_INFO_LOG;\r
937\r
938#pragma pack()\r
939\r
940#endif\r