mirror of https://github.com/acidanthera/audk.git
791 lines
22 KiB
C
791 lines
22 KiB
C
/** @file
|
|
NvmExpressDxe driver is used to manage non-volatile memory subsystem which follows
|
|
NVM Express specification.
|
|
|
|
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php.
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef _NVME_HCI_H_
|
|
#define _NVME_HCI_H_
|
|
|
|
#define NVME_BAR 0
|
|
|
|
//
|
|
// controller register offsets
|
|
//
|
|
#define NVME_CAP_OFFSET 0x0000 // Controller Capabilities
|
|
#define NVME_VER_OFFSET 0x0008 // Version
|
|
#define NVME_INTMS_OFFSET 0x000c // Interrupt Mask Set
|
|
#define NVME_INTMC_OFFSET 0x0010 // Interrupt Mask Clear
|
|
#define NVME_CC_OFFSET 0x0014 // Controller Configuration
|
|
#define NVME_CSTS_OFFSET 0x001c // Controller Status
|
|
#define NVME_AQA_OFFSET 0x0024 // Admin Queue Attributes
|
|
#define NVME_ASQ_OFFSET 0x0028 // Admin Submission Queue Base Address
|
|
#define NVME_ACQ_OFFSET 0x0030 // Admin Completion Queue Base Address
|
|
#define NVME_SQ0_OFFSET 0x1000 // Submission Queue 0 (admin) Tail Doorbell
|
|
#define NVME_CQ0_OFFSET 0x1004 // Completion Queue 0 (admin) Head Doorbell
|
|
|
|
//
|
|
// These register offsets are defined as 0x1000 + (N * (4 << CAP.DSTRD))
|
|
// Get the doorbell stride bit shift value from the controller capabilities.
|
|
//
|
|
#define NVME_SQTDBL_OFFSET(QID, DSTRD) 0x1000 + ((2 * (QID)) * (4 << (DSTRD))) // Submission Queue y (NVM) Tail Doorbell
|
|
#define NVME_CQHDBL_OFFSET(QID, DSTRD) 0x1000 + (((2 * (QID)) + 1) * (4 << (DSTRD))) // Completion Queue y (NVM) Head Doorbell
|
|
|
|
|
|
#pragma pack(1)
|
|
|
|
//
|
|
// 3.1.1 Offset 00h: CAP - Controller Capabilities
|
|
//
|
|
typedef struct {
|
|
UINT16 Mqes; // Maximum Queue Entries Supported
|
|
UINT8 Cqr:1; // Contiguous Queues Required
|
|
UINT8 Ams:2; // Arbitration Mechanism Supported
|
|
UINT8 Rsvd1:5;
|
|
UINT8 To; // Timeout
|
|
UINT16 Dstrd:4;
|
|
UINT16 Rsvd2:1;
|
|
UINT16 Css:4; // Command Sets Supported
|
|
UINT16 Rsvd3:7;
|
|
UINT8 Mpsmin:4;
|
|
UINT8 Mpsmax:4;
|
|
UINT8 Rsvd4;
|
|
} NVME_CAP;
|
|
|
|
//
|
|
// 3.1.2 Offset 08h: VS - Version
|
|
//
|
|
typedef struct {
|
|
UINT16 Mnr; // Minor version number
|
|
UINT16 Mjr; // Major version number
|
|
} NVME_VER;
|
|
|
|
//
|
|
// 3.1.5 Offset 14h: CC - Controller Configuration
|
|
//
|
|
typedef struct {
|
|
UINT16 En:1; // Enable
|
|
UINT16 Rsvd1:3;
|
|
UINT16 Css:3; // Command Set Selected
|
|
UINT16 Mps:4; // Memory Page Size
|
|
UINT16 Ams:3; // Arbitration Mechanism Selected
|
|
UINT16 Shn:2; // Shutdown Notification
|
|
UINT8 Iosqes:4; // I/O Submission Queue Entry Size
|
|
UINT8 Iocqes:4; // I/O Completion Queue Entry Size
|
|
UINT8 Rsvd2;
|
|
} NVME_CC;
|
|
|
|
//
|
|
// 3.1.6 Offset 1Ch: CSTS - Controller Status
|
|
//
|
|
typedef struct {
|
|
UINT32 Rdy:1; // Ready
|
|
UINT32 Cfs:1; // Controller Fatal Status
|
|
UINT32 Shst:2; // Shutdown Status
|
|
UINT32 Nssro:1; // NVM Subsystem Reset Occurred
|
|
UINT32 Rsvd1:27;
|
|
} NVME_CSTS;
|
|
|
|
//
|
|
// 3.1.8 Offset 24h: AQA - Admin Queue Attributes
|
|
//
|
|
typedef struct {
|
|
UINT16 Asqs:12; // Submission Queue Size
|
|
UINT16 Rsvd1:4;
|
|
UINT16 Acqs:12; // Completion Queue Size
|
|
UINT16 Rsvd2:4;
|
|
} NVME_AQA;
|
|
|
|
//
|
|
// 3.1.9 Offset 28h: ASQ - Admin Submission Queue Base Address
|
|
//
|
|
typedef struct {
|
|
UINT64 Rsvd1:12;
|
|
UINT64 Asqb:52; // Admin Submission Queue Base Address
|
|
} NVME_ASQ;
|
|
|
|
//
|
|
// 3.1.10 Offset 30h: ACQ - Admin Completion Queue Base Address
|
|
//
|
|
typedef struct {
|
|
UINT64 Rsvd1:12;
|
|
UINT64 Acqb:52; // Admin Completion Queue Base Address
|
|
} NVME_ACQ;
|
|
|
|
//
|
|
// 3.1.11 Offset (1000h + ((2y) * (4 << CAP.DSTRD))): SQyTDBL - Submission Queue y Tail Doorbell
|
|
//
|
|
typedef struct {
|
|
UINT16 Sqt;
|
|
UINT16 Rsvd1;
|
|
} NVME_SQTDBL;
|
|
|
|
//
|
|
// 3.1.12 Offset (1000h + ((2y + 1) * (4 << CAP.DSTRD))): CQyHDBL - Completion Queue y Head Doorbell
|
|
//
|
|
typedef struct {
|
|
UINT16 Cqh;
|
|
UINT16 Rsvd1;
|
|
} NVME_CQHDBL;
|
|
|
|
//
|
|
// NVM command set structures
|
|
//
|
|
// Read Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10, 11
|
|
//
|
|
UINT64 Slba; /* Starting Sector Address */
|
|
//
|
|
// CDW 12
|
|
//
|
|
UINT16 Nlb; /* Number of Sectors */
|
|
UINT16 Rsvd1:10;
|
|
UINT16 Prinfo:4; /* Protection Info Check */
|
|
UINT16 Fua:1; /* Force Unit Access */
|
|
UINT16 Lr:1; /* Limited Retry */
|
|
//
|
|
// CDW 13
|
|
//
|
|
UINT32 Af:4; /* Access Frequency */
|
|
UINT32 Al:2; /* Access Latency */
|
|
UINT32 Sr:1; /* Sequential Request */
|
|
UINT32 In:1; /* Incompressible */
|
|
UINT32 Rsvd2:24;
|
|
//
|
|
// CDW 14
|
|
//
|
|
UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */
|
|
//
|
|
// CDW 15
|
|
//
|
|
UINT16 Elbat; /* Expected Logical Block Application Tag */
|
|
UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */
|
|
} NVME_READ;
|
|
|
|
//
|
|
// Write Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10, 11
|
|
//
|
|
UINT64 Slba; /* Starting Sector Address */
|
|
//
|
|
// CDW 12
|
|
//
|
|
UINT16 Nlb; /* Number of Sectors */
|
|
UINT16 Rsvd1:10;
|
|
UINT16 Prinfo:4; /* Protection Info Check */
|
|
UINT16 Fua:1; /* Force Unit Access */
|
|
UINT16 Lr:1; /* Limited Retry */
|
|
//
|
|
// CDW 13
|
|
//
|
|
UINT32 Af:4; /* Access Frequency */
|
|
UINT32 Al:2; /* Access Latency */
|
|
UINT32 Sr:1; /* Sequential Request */
|
|
UINT32 In:1; /* Incompressible */
|
|
UINT32 Rsvd2:24;
|
|
//
|
|
// CDW 14
|
|
//
|
|
UINT32 Ilbrt; /* Initial Logical Block Reference Tag */
|
|
//
|
|
// CDW 15
|
|
//
|
|
UINT16 Lbat; /* Logical Block Application Tag */
|
|
UINT16 Lbatm; /* Logical Block Application Tag Mask */
|
|
} NVME_WRITE;
|
|
|
|
//
|
|
// Flush
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Flush; /* Flush */
|
|
} NVME_FLUSH;
|
|
|
|
//
|
|
// Write Uncorrectable command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10, 11
|
|
//
|
|
UINT64 Slba; /* Starting LBA */
|
|
//
|
|
// CDW 12
|
|
//
|
|
UINT32 Nlb:16; /* Number of Logical Blocks */
|
|
UINT32 Rsvd1:16;
|
|
} NVME_WRITE_UNCORRECTABLE;
|
|
|
|
//
|
|
// Write Zeroes command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10, 11
|
|
//
|
|
UINT64 Slba; /* Starting LBA */
|
|
//
|
|
// CDW 12
|
|
//
|
|
UINT16 Nlb; /* Number of Logical Blocks */
|
|
UINT16 Rsvd1:10;
|
|
UINT16 Prinfo:4; /* Protection Info Check */
|
|
UINT16 Fua:1; /* Force Unit Access */
|
|
UINT16 Lr:1; /* Limited Retry */
|
|
//
|
|
// CDW 13
|
|
//
|
|
UINT32 Rsvd2;
|
|
//
|
|
// CDW 14
|
|
//
|
|
UINT32 Ilbrt; /* Initial Logical Block Reference Tag */
|
|
//
|
|
// CDW 15
|
|
//
|
|
UINT16 Lbat; /* Logical Block Application Tag */
|
|
UINT16 Lbatm; /* Logical Block Application Tag Mask */
|
|
} NVME_WRITE_ZEROES;
|
|
|
|
//
|
|
// Compare command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10, 11
|
|
//
|
|
UINT64 Slba; /* Starting LBA */
|
|
//
|
|
// CDW 12
|
|
//
|
|
UINT16 Nlb; /* Number of Logical Blocks */
|
|
UINT16 Rsvd1:10;
|
|
UINT16 Prinfo:4; /* Protection Info Check */
|
|
UINT16 Fua:1; /* Force Unit Access */
|
|
UINT16 Lr:1; /* Limited Retry */
|
|
//
|
|
// CDW 13
|
|
//
|
|
UINT32 Rsvd2;
|
|
//
|
|
// CDW 14
|
|
//
|
|
UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */
|
|
//
|
|
// CDW 15
|
|
//
|
|
UINT16 Elbat; /* Expected Logical Block Application Tag */
|
|
UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */
|
|
} NVME_COMPARE;
|
|
|
|
typedef union {
|
|
NVME_READ Read;
|
|
NVME_WRITE Write;
|
|
NVME_FLUSH Flush;
|
|
NVME_WRITE_UNCORRECTABLE WriteUncorrectable;
|
|
NVME_WRITE_ZEROES WriteZeros;
|
|
NVME_COMPARE Compare;
|
|
} NVME_CMD;
|
|
|
|
typedef struct {
|
|
UINT16 Mp; /* Maximum Power */
|
|
UINT8 Rsvd1; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 Mps:1; /* Max Power Scale */
|
|
UINT8 Nops:1; /* Non-Operational State */
|
|
UINT8 Rsvd2:6; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT32 Enlat; /* Entry Latency */
|
|
UINT32 Exlat; /* Exit Latency */
|
|
UINT8 Rrt:5; /* Relative Read Throughput */
|
|
UINT8 Rsvd3:3; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 Rrl:5; /* Relative Read Leatency */
|
|
UINT8 Rsvd4:3; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 Rwt:5; /* Relative Write Throughput */
|
|
UINT8 Rsvd5:3; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 Rwl:5; /* Relative Write Leatency */
|
|
UINT8 Rsvd6:3; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 Rsvd7[16]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
} NVME_PSDESCRIPTOR;
|
|
|
|
//
|
|
// Identify Controller Data
|
|
//
|
|
typedef struct {
|
|
//
|
|
// Controller Capabilities and Features 0-255
|
|
//
|
|
UINT16 Vid; /* PCI Vendor ID */
|
|
UINT16 Ssvid; /* PCI sub-system vendor ID */
|
|
UINT8 Sn[20]; /* Produce serial number */
|
|
|
|
UINT8 Mn[40]; /* Proeduct model number */
|
|
UINT8 Fr[8]; /* Firmware Revision */
|
|
UINT8 Rab; /* Recommended Arbitration Burst */
|
|
UINT8 Ieee_oiu[3]; /* Organization Unique Identifier */
|
|
UINT8 Cmic; /* Multi-interface Capabilities */
|
|
UINT8 Mdts; /* Maximum Data Transfer Size */
|
|
UINT8 Cntlid[2]; /* Controller ID */
|
|
UINT8 Rsvd1[176]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
//
|
|
// Admin Command Set Attributes
|
|
//
|
|
UINT16 Oacs; /* Optional Admin Command Support */
|
|
UINT8 Acl; /* Abort Command Limit */
|
|
UINT8 Aerl; /* Async Event Request Limit */
|
|
UINT8 Frmw; /* Firmware updates */
|
|
UINT8 Lpa; /* Log Page Attributes */
|
|
UINT8 Elpe; /* Error Log Page Entries */
|
|
UINT8 Npss; /* Number of Power States Support */
|
|
UINT8 Avscc; /* Admin Vendor Specific Command Configuration */
|
|
UINT8 Apsta; /* Autonomous Power State Transition Attributes */
|
|
UINT8 Rsvd2[246]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
//
|
|
// NVM Command Set Attributes
|
|
//
|
|
UINT8 Sqes; /* Submission Queue Entry Size */
|
|
UINT8 Cqes; /* Completion Queue Entry Size */
|
|
UINT16 Rsvd3; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT32 Nn; /* Number of Namespaces */
|
|
UINT16 Oncs; /* Optional NVM Command Support */
|
|
UINT16 Fuses; /* Fused Operation Support */
|
|
UINT8 Fna; /* Format NVM Attributes */
|
|
UINT8 Vwc; /* Volatile Write Cache */
|
|
UINT16 Awun; /* Atomic Write Unit Normal */
|
|
UINT16 Awupf; /* Atomic Write Unit Power Fail */
|
|
UINT8 Nvscc; /* NVM Vendor Specific Command Configuration */
|
|
UINT8 Rsvd4; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT16 Acwu; /* Atomic Compare & Write Unit */
|
|
UINT16 Rsvd5; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT32 Sgls; /* SGL Support */
|
|
UINT8 Rsvd6[164]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
//
|
|
// I/O Command set Attributes
|
|
//
|
|
UINT8 Rsvd7[1344]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
//
|
|
// Power State Descriptors
|
|
//
|
|
NVME_PSDESCRIPTOR PsDescriptor[32];
|
|
|
|
UINT8 VendorData[1024]; /* Vendor specific data */
|
|
} NVME_ADMIN_CONTROLLER_DATA;
|
|
|
|
typedef struct {
|
|
UINT16 Ms; /* Metadata Size */
|
|
UINT8 Lbads; /* LBA Data Size */
|
|
UINT8 Rp:2; /* Relative Performance */
|
|
#define LBAF_RP_BEST 00b
|
|
#define LBAF_RP_BETTER 01b
|
|
#define LBAF_RP_GOOD 10b
|
|
#define LBAF_RP_DEGRADED 11b
|
|
UINT8 Rsvd1:6; /* Reserved as of Nvm Express 1.1 Spec */
|
|
} NVME_LBAFORMAT;
|
|
|
|
//
|
|
// Identify Namespace Data
|
|
//
|
|
typedef struct {
|
|
//
|
|
// NVM Command Set Specific
|
|
//
|
|
UINT64 Nsze; /* Namespace Size (total number of blocks in formatted namespace) */
|
|
UINT64 Ncap; /* Namespace Capacity (max number of logical blocks) */
|
|
UINT64 Nuse; /* Namespace Utilization */
|
|
UINT8 Nsfeat; /* Namespace Features */
|
|
UINT8 Nlbaf; /* Number of LBA Formats */
|
|
UINT8 Flbas; /* Formatted LBA size */
|
|
UINT8 Mc; /* Metadata Capabilities */
|
|
UINT8 Dpc; /* End-to-end Data Protection capabilities */
|
|
UINT8 Dps; /* End-to-end Data Protection Type Settings */
|
|
UINT8 Nmic; /* Namespace Multi-path I/O and Namespace Sharing Capabilities */
|
|
UINT8 Rescap; /* Reservation Capabilities */
|
|
UINT8 Rsvd1[88]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT64 Eui64; /* IEEE Extended Unique Identifier */
|
|
//
|
|
// LBA Format
|
|
//
|
|
NVME_LBAFORMAT LbaFormat[16];
|
|
|
|
UINT8 Rsvd2[192]; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT8 VendorData[3712]; /* Vendor specific data */
|
|
} NVME_ADMIN_NAMESPACE_DATA;
|
|
|
|
//
|
|
// NvmExpress Admin Identify Cmd
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Cns:2;
|
|
UINT32 Rsvd1:30;
|
|
} NVME_ADMIN_IDENTIFY;
|
|
|
|
//
|
|
// NvmExpress Admin Create I/O Completion Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Qid:16; /* Queue Identifier */
|
|
UINT32 Qsize:16; /* Queue Size */
|
|
|
|
//
|
|
// CDW 11
|
|
//
|
|
UINT32 Pc:1; /* Physically Contiguous */
|
|
UINT32 Ien:1; /* Interrupts Enabled */
|
|
UINT32 Rsvd1:14; /* reserved as of Nvm Express 1.1 Spec */
|
|
UINT32 Iv:16; /* Interrupt Vector */
|
|
} NVME_ADMIN_CRIOCQ;
|
|
|
|
//
|
|
// NvmExpress Admin Create I/O Submission Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Qid:16; /* Queue Identifier */
|
|
UINT32 Qsize:16; /* Queue Size */
|
|
|
|
//
|
|
// CDW 11
|
|
//
|
|
UINT32 Pc:1; /* Physically Contiguous */
|
|
UINT32 Qprio:2; /* Queue Priority */
|
|
UINT32 Rsvd1:13; /* Reserved as of Nvm Express 1.1 Spec */
|
|
UINT32 Cqid:16; /* Completion Queue ID */
|
|
} NVME_ADMIN_CRIOSQ;
|
|
|
|
//
|
|
// NvmExpress Admin Delete I/O Completion Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT16 Qid;
|
|
UINT16 Rsvd1;
|
|
} NVME_ADMIN_DEIOCQ;
|
|
|
|
//
|
|
// NvmExpress Admin Delete I/O Submission Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT16 Qid;
|
|
UINT16 Rsvd1;
|
|
} NVME_ADMIN_DEIOSQ;
|
|
|
|
//
|
|
// NvmExpress Admin Abort Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Sqid:16; /* Submission Queue identifier */
|
|
UINT32 Cid:16; /* Command Identifier */
|
|
} NVME_ADMIN_ABORT;
|
|
|
|
//
|
|
// NvmExpress Admin Firmware Activate Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Fs:3; /* Submission Queue identifier */
|
|
UINT32 Aa:2; /* Command Identifier */
|
|
UINT32 Rsvd1:27;
|
|
} NVME_ADMIN_FIRMWARE_ACTIVATE;
|
|
|
|
//
|
|
// NvmExpress Admin Firmware Image Download Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Numd; /* Number of Dwords */
|
|
//
|
|
// CDW 11
|
|
//
|
|
UINT32 Ofst; /* Offset */
|
|
} NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD;
|
|
|
|
//
|
|
// NvmExpress Admin Get Features Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Fid:8; /* Feature Identifier */
|
|
UINT32 Sel:3; /* Select */
|
|
UINT32 Rsvd1:21;
|
|
} NVME_ADMIN_GET_FEATURES;
|
|
|
|
//
|
|
// NvmExpress Admin Get Log Page Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Lid:8; /* Log Page Identifier */
|
|
#define LID_ERROR_INFO
|
|
#define LID_SMART_INFO
|
|
#define LID_FW_SLOT_INFO
|
|
UINT32 Rsvd1:8;
|
|
UINT32 Numd:12; /* Number of Dwords */
|
|
UINT32 Rsvd2:4; /* Reserved as of Nvm Express 1.1 Spec */
|
|
} NVME_ADMIN_GET_LOG_PAGE;
|
|
|
|
//
|
|
// NvmExpress Admin Set Features Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Fid:8; /* Feature Identifier */
|
|
UINT32 Rsvd1:23;
|
|
UINT32 Sv:1; /* Save */
|
|
} NVME_ADMIN_SET_FEATURES;
|
|
|
|
//
|
|
// NvmExpress Admin Format NVM Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Lbaf:4; /* LBA Format */
|
|
UINT32 Ms:1; /* Metadata Settings */
|
|
UINT32 Pi:3; /* Protection Information */
|
|
UINT32 Pil:1; /* Protection Information Location */
|
|
UINT32 Ses:3; /* Secure Erase Settings */
|
|
UINT32 Rsvd1:20;
|
|
} NVME_ADMIN_FORMAT_NVM;
|
|
|
|
//
|
|
// NvmExpress Admin Security Receive Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Rsvd1:8;
|
|
UINT32 Spsp:16; /* SP Specific */
|
|
UINT32 Secp:8; /* Security Protocol */
|
|
//
|
|
// CDW 11
|
|
//
|
|
UINT32 Al; /* Allocation Length */
|
|
} NVME_ADMIN_SECURITY_RECEIVE;
|
|
|
|
//
|
|
// NvmExpress Admin Security Send Command
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 10
|
|
//
|
|
UINT32 Rsvd1:8;
|
|
UINT32 Spsp:16; /* SP Specific */
|
|
UINT32 Secp:8; /* Security Protocol */
|
|
//
|
|
// CDW 11
|
|
//
|
|
UINT32 Tl; /* Transfer Length */
|
|
} NVME_ADMIN_SECURITY_SEND;
|
|
|
|
typedef union {
|
|
NVME_ADMIN_IDENTIFY Identify;
|
|
NVME_ADMIN_CRIOCQ CrIoCq;
|
|
NVME_ADMIN_CRIOSQ CrIoSq;
|
|
NVME_ADMIN_DEIOCQ DeIoCq;
|
|
NVME_ADMIN_DEIOSQ DeIoSq;
|
|
NVME_ADMIN_ABORT Abort;
|
|
NVME_ADMIN_FIRMWARE_ACTIVATE Activate;
|
|
NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD FirmwareImageDownload;
|
|
NVME_ADMIN_GET_FEATURES GetFeatures;
|
|
NVME_ADMIN_GET_LOG_PAGE GetLogPage;
|
|
NVME_ADMIN_SET_FEATURES SetFeatures;
|
|
NVME_ADMIN_FORMAT_NVM FormatNvm;
|
|
NVME_ADMIN_SECURITY_RECEIVE SecurityReceive;
|
|
NVME_ADMIN_SECURITY_SEND SecuritySend;
|
|
} NVME_ADMIN_CMD;
|
|
|
|
typedef struct {
|
|
UINT32 Cdw10;
|
|
UINT32 Cdw11;
|
|
UINT32 Cdw12;
|
|
UINT32 Cdw13;
|
|
UINT32 Cdw14;
|
|
UINT32 Cdw15;
|
|
} NVME_RAW;
|
|
|
|
typedef union {
|
|
NVME_ADMIN_CMD Admin; // Union of Admin commands
|
|
NVME_CMD Nvm; // Union of Nvm commands
|
|
NVME_RAW Raw;
|
|
} NVME_PAYLOAD;
|
|
|
|
//
|
|
// Submission Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 0, Common to all comnmands
|
|
//
|
|
UINT8 Opc; // Opcode
|
|
UINT8 Fuse:2; // Fused Operation
|
|
UINT8 Rsvd1:5;
|
|
UINT8 Psdt:1; // PRP or SGL for Data Transfer
|
|
UINT16 Cid; // Command Identifier
|
|
|
|
//
|
|
// CDW 1
|
|
//
|
|
UINT32 Nsid; // Namespace Identifier
|
|
|
|
//
|
|
// CDW 2,3
|
|
//
|
|
UINT64 Rsvd2;
|
|
|
|
//
|
|
// CDW 4,5
|
|
//
|
|
UINT64 Mptr; // Metadata Pointer
|
|
|
|
//
|
|
// CDW 6-9
|
|
//
|
|
UINT64 Prp[2]; // First and second PRP entries
|
|
|
|
NVME_PAYLOAD Payload;
|
|
|
|
} NVME_SQ;
|
|
|
|
//
|
|
// Completion Queue
|
|
//
|
|
typedef struct {
|
|
//
|
|
// CDW 0
|
|
//
|
|
UINT32 Dword0;
|
|
//
|
|
// CDW 1
|
|
//
|
|
UINT32 Rsvd1;
|
|
//
|
|
// CDW 2
|
|
//
|
|
UINT16 Sqhd; // Submission Queue Head Pointer
|
|
UINT16 Sqid; // Submission Queue Identifier
|
|
//
|
|
// CDW 3
|
|
//
|
|
UINT16 Cid; // Command Identifier
|
|
UINT16 Pt:1; // Phase Tag
|
|
UINT16 Sc:8; // Status Code
|
|
UINT16 Sct:3; // Status Code Type
|
|
UINT16 Rsvd2:2;
|
|
UINT16 Mo:1; // More
|
|
UINT16 Dnr:1; // Retry
|
|
} NVME_CQ;
|
|
|
|
//
|
|
// Nvm Express Admin cmd opcodes
|
|
//
|
|
#define NVME_ADMIN_CRIOSQ_OPC 1
|
|
#define NVME_ADMIN_CRIOCQ_OPC 5
|
|
#define NVME_ADMIN_IDENTIFY_OPC 6
|
|
|
|
#define NVME_IO_FLUSH_OPC 0
|
|
#define NVME_IO_WRITE_OPC 1
|
|
#define NVME_IO_READ_OPC 2
|
|
|
|
//
|
|
// Offset from the beginning of private data queue buffer
|
|
//
|
|
#define NVME_ASQ_BUF_OFFSET EFI_PAGE_SIZE
|
|
|
|
/**
|
|
Initialize the Nvm Express controller.
|
|
|
|
@param[in] Private The pointer to the NVME_CONTROLLER_PRIVATE_DATA data structure.
|
|
|
|
@retval EFI_SUCCESS The NVM Express Controller is initialized successfully.
|
|
@retval Others A device error occurred while initializing the controller.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeControllerInit (
|
|
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
|
);
|
|
|
|
/**
|
|
Get identify controller data.
|
|
|
|
@param Private The pointer to the NVME_CONTROLLER_PRIVATE_DATA data structure.
|
|
@param Buffer The buffer used to store the identify controller data.
|
|
|
|
@return EFI_SUCCESS Successfully get the identify controller data.
|
|
@return EFI_DEVICE_ERROR Fail to get the identify controller data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeIdentifyController (
|
|
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
|
IN VOID *Buffer
|
|
);
|
|
|
|
/**
|
|
Get specified identify namespace data.
|
|
|
|
@param Private The pointer to the NVME_CONTROLLER_PRIVATE_DATA data structure.
|
|
@param NamespaceId The specified namespace identifier.
|
|
@param Buffer The buffer used to store the identify namespace data.
|
|
|
|
@return EFI_SUCCESS Successfully get the identify namespace data.
|
|
@return EFI_DEVICE_ERROR Fail to get the identify namespace data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeIdentifyNamespace (
|
|
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
|
IN UINT32 NamespaceId,
|
|
IN VOID *Buffer
|
|
);
|
|
|
|
#pragma pack()
|
|
|
|
#endif
|
|
|