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