mirror of https://github.com/acidanthera/audk.git
456 lines
15 KiB
C
456 lines
15 KiB
C
/** @file
|
|
Header file for NVMe function definitions
|
|
|
|
Copyright (c) 2016 - 2018, 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 __OPAL_PASSWORD_NVME_MODE_H__
|
|
#define __OPAL_PASSWORD_NVME_MODE_H__
|
|
|
|
|
|
#include "OpalNvmeReg.h"
|
|
|
|
#define NVME_MAX_SECTORS 0x10000
|
|
//
|
|
// QueueId
|
|
//
|
|
#define NVME_ADMIN_QUEUE 0x00
|
|
#define NVME_IO_QUEUE 0x01
|
|
|
|
typedef struct {
|
|
UINT8 Opcode;
|
|
UINT8 FusedOperation;
|
|
#define NORMAL_CMD 0x00
|
|
#define FUSED_FIRST_CMD 0x01
|
|
#define FUSED_SECOND_CMD 0x02
|
|
UINT16 Cid;
|
|
} NVME_CDW0;
|
|
|
|
typedef struct {
|
|
NVME_CDW0 Cdw0;
|
|
UINT8 Flags;
|
|
#define CDW10_VALID 0x01
|
|
#define CDW11_VALID 0x02
|
|
#define CDW12_VALID 0x04
|
|
#define CDW13_VALID 0x08
|
|
#define CDW14_VALID 0x10
|
|
#define CDW15_VALID 0x20
|
|
UINT32 Nsid;
|
|
UINT32 Cdw10;
|
|
UINT32 Cdw11;
|
|
UINT32 Cdw12;
|
|
UINT32 Cdw13;
|
|
UINT32 Cdw14;
|
|
UINT32 Cdw15;
|
|
} NVM_EXPRESS_COMMAND;
|
|
|
|
typedef struct {
|
|
UINT32 Cdw0;
|
|
UINT32 Cdw1;
|
|
UINT32 Cdw2;
|
|
UINT32 Cdw3;
|
|
} NVM_EXPRESS_RESPONSE;
|
|
|
|
typedef struct {
|
|
UINT64 CommandTimeout;
|
|
UINT64 TransferBuffer;
|
|
UINT32 TransferLength;
|
|
UINT64 MetadataBuffer;
|
|
UINT32 MetadataLength;
|
|
UINT8 QueueId;
|
|
NVM_EXPRESS_COMMAND *NvmeCmd;
|
|
NVM_EXPRESS_RESPONSE *NvmeResponse;
|
|
} NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
|
|
|
|
|
|
#pragma pack(1)
|
|
|
|
// Internal fields
|
|
typedef enum {
|
|
NvmeStatusUnknown,
|
|
NvmeStatusInit,
|
|
NvmeStatusInuse,
|
|
NvmeStatusMax,
|
|
} NVME_STATUS;
|
|
|
|
typedef struct {
|
|
UINT32 Nbar;
|
|
VOID *BaseMem;
|
|
VOID *BaseMemMapping;
|
|
BOOLEAN PollCancellation;
|
|
UINT16 NvmeInitWaitTime;
|
|
|
|
NVME_STATUS State;
|
|
UINT8 BusID;
|
|
UINT8 DeviceID;
|
|
UINT8 FuncID;
|
|
UINTN PciBase;
|
|
|
|
UINT32 Nsid;
|
|
UINT64 Nsuuid;
|
|
UINT32 BlockSize;
|
|
EFI_LBA LastBlock;
|
|
|
|
//
|
|
// Pointers to 4kB aligned submission & completion queues.
|
|
//
|
|
NVME_SQ *SqBuffer[NVME_MAX_IO_QUEUES];
|
|
NVME_CQ *CqBuffer[NVME_MAX_IO_QUEUES];
|
|
UINT16 Cid[NVME_MAX_IO_QUEUES];
|
|
|
|
//
|
|
// Submission and completion queue indices.
|
|
//
|
|
NVME_SQTDBL SqTdbl[NVME_MAX_IO_QUEUES];
|
|
NVME_CQHDBL CqHdbl[NVME_MAX_IO_QUEUES];
|
|
UINT8 Pt[NVME_MAX_IO_QUEUES];
|
|
|
|
UINTN SqeCount[NVME_MAX_IO_QUEUES];
|
|
|
|
//
|
|
// Nvme controller capabilities
|
|
//
|
|
NVME_CAP Cap;
|
|
|
|
//
|
|
// pointer to identify controller Data
|
|
//
|
|
NVME_ADMIN_CONTROLLER_DATA *ControllerData;
|
|
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
|
} NVME_CONTEXT;
|
|
|
|
#pragma pack()
|
|
|
|
/**
|
|
Transfer MMIO Data to memory.
|
|
|
|
@param[in,out] MemBuffer - Destination: Memory address
|
|
@param[in] MmioAddr - Source: MMIO address
|
|
@param[in] Size - Size for read
|
|
|
|
@retval EFI_SUCCESS - MMIO read sucessfully
|
|
**/
|
|
EFI_STATUS
|
|
NvmeMmioRead (
|
|
IN OUT VOID *MemBuffer,
|
|
IN UINTN MmioAddr,
|
|
IN UINTN Size
|
|
);
|
|
|
|
/**
|
|
Transfer memory Data to MMIO.
|
|
|
|
@param[in,out] MmioAddr - Destination: MMIO address
|
|
@param[in] MemBuffer - Source: Memory address
|
|
@param[in] Size - Size for write
|
|
|
|
@retval EFI_SUCCESS - MMIO write sucessfully
|
|
**/
|
|
EFI_STATUS
|
|
NvmeMmioWrite (
|
|
IN OUT UINTN MmioAddr,
|
|
IN VOID *MemBuffer,
|
|
IN UINTN Size
|
|
);
|
|
|
|
/**
|
|
Transfer memory data to MMIO.
|
|
|
|
@param[in,out] MmioAddr - Destination: MMIO address
|
|
@param[in] MemBuffer - Source: Memory address
|
|
@param[in] Size - Size for write
|
|
|
|
@retval EFI_SUCCESS - MMIO write sucessfully
|
|
**/
|
|
EFI_STATUS
|
|
OpalPciWrite (
|
|
IN OUT UINTN MmioAddr,
|
|
IN VOID *MemBuffer,
|
|
IN UINTN Size
|
|
);
|
|
|
|
/**
|
|
Transfer MMIO data to memory.
|
|
|
|
@param[in,out] MemBuffer - Destination: Memory address
|
|
@param[in] MmioAddr - Source: MMIO address
|
|
@param[in] Size - Size for read
|
|
|
|
@retval EFI_SUCCESS - MMIO read sucessfully
|
|
**/
|
|
EFI_STATUS
|
|
OpalPciRead (
|
|
IN OUT VOID *MemBuffer,
|
|
IN UINTN MmioAddr,
|
|
IN UINTN Size
|
|
);
|
|
|
|
/**
|
|
Allocate transfer-related Data struct which is used at Nvme.
|
|
|
|
@param[in, out] Nvme The pointer to the NVME_CONTEXT Data structure.
|
|
|
|
@retval EFI_OUT_OF_RESOURCE No enough resource.
|
|
@retval EFI_SUCCESS Successful to allocate resource.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
NvmeAllocateResource (
|
|
IN OUT NVME_CONTEXT *Nvme
|
|
);
|
|
|
|
/**
|
|
Free allocated transfer-related Data struct which is used at NVMe.
|
|
|
|
@param[in, out] Nvme The pointer to the NVME_CONTEXT Data structure.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
NvmeFreeResource (
|
|
IN OUT NVME_CONTEXT *Nvme
|
|
);
|
|
|
|
/**
|
|
Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports
|
|
both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking
|
|
I/O functionality is optional.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] NamespaceId - Is a 32 bit Namespace ID to which the Express HCI command packet will be sent.
|
|
A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace
|
|
ID specifies that the command packet should be sent to all valid namespaces.
|
|
@param[in] NamespaceUuid - Is a 64 bit Namespace UUID to which the Express HCI command packet will be sent.
|
|
A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace
|
|
UUID specifies that the command packet should be sent to all valid namespaces.
|
|
@param[in,out] Packet - A pointer to the NVM Express HCI Command Packet to send to the NVMe namespace specified
|
|
by NamespaceId.
|
|
|
|
@retval EFI_SUCCESS - The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred
|
|
to, or from DataBuffer.
|
|
@retval EFI_NOT_READY - The NVM Express Command Packet could not be sent because the controller is not ready. The caller
|
|
may retry again later.
|
|
@retval EFI_DEVICE_ERROR - A device error occurred while attempting to send the NVM Express Command Packet.
|
|
@retval EFI_INVALID_PARAMETER - Namespace, or the contents of NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM
|
|
Express Command Packet was not sent, so no additional status information is available.
|
|
@retval EFI_UNSUPPORTED - The command described by the NVM Express Command Packet is not supported by the host adapter.
|
|
The NVM Express Command Packet was not sent, so no additional status information is available.
|
|
@retval EFI_TIMEOUT - A timeout occurred while waiting for the NVM Express Command Packet to execute.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmePassThru (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT32 NamespaceId,
|
|
IN UINT64 NamespaceUuid,
|
|
IN OUT NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
|
|
);
|
|
|
|
/**
|
|
Waits until all NVME commands completed.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] Qid - Queue index
|
|
|
|
@retval EFI_SUCCESS - All NVME commands have completed
|
|
@retval EFI_TIMEOUT - Timeout occured
|
|
@retval EFI_NOT_READY - Not all NVME commands have completed
|
|
@retval others - Error occurred on device side.
|
|
**/
|
|
EFI_STATUS
|
|
NvmeWaitAllComplete (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT8 Qid
|
|
);
|
|
|
|
/**
|
|
Initialize the Nvm Express controller.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT 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_CONTEXT *Nvme
|
|
);
|
|
|
|
/**
|
|
Un-initialize the Nvm Express controller.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
|
|
@retval EFI_SUCCESS - The NVM Express Controller is un-initialized successfully.
|
|
@retval Others - A device error occurred while un-initializing the controller.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeControllerExit (
|
|
IN NVME_CONTEXT *Nvme
|
|
);
|
|
|
|
/**
|
|
Check whether there are available command slots.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] Qid - Queue index
|
|
|
|
@retval EFI_SUCCESS - Available command slot is found
|
|
@retval EFI_NOT_READY - No available command slot is found
|
|
@retval EFI_DEVICE_ERROR - Error occurred on device side.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeHasFreeCmdSlot (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT8 Qid
|
|
);
|
|
|
|
/**
|
|
Check whether all command slots are clean.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] Qid - Queue index
|
|
|
|
@retval EFI_SUCCESS - All command slots are clean
|
|
@retval EFI_NOT_READY - Not all command slots are clean
|
|
@retval EFI_DEVICE_ERROR - Error occurred on device side.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeIsAllCmdSlotClean (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT8 Qid
|
|
);
|
|
|
|
/**
|
|
Read sector Data from the NVMe device.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in,out] Buffer - The Buffer used to store the Data read from the device.
|
|
@param[in] Lba - The start block number.
|
|
@param[in] Blocks - Total block number to be read.
|
|
|
|
@retval EFI_SUCCESS - Datum are read from the device.
|
|
@retval Others - Fail to read all the datum.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeReadSectors (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN OUT UINT64 Buffer,
|
|
IN UINT64 Lba,
|
|
IN UINT32 Blocks
|
|
);
|
|
|
|
/**
|
|
Write sector Data to the NVMe device.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] Buffer - The Buffer to be written into the device.
|
|
@param[in] Lba - The start block number.
|
|
@param[in] Blocks - Total block number to be written.
|
|
|
|
@retval EFI_SUCCESS - Datum are written into the Buffer.
|
|
@retval Others - Fail to write all the datum.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeWriteSectors (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT64 Buffer,
|
|
IN UINT64 Lba,
|
|
IN UINT32 Blocks
|
|
);
|
|
|
|
/**
|
|
Flushes all modified Data to the device.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
|
|
@retval EFI_SUCCESS - Datum are written into the Buffer.
|
|
@retval Others - Fail to write all the datum.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeFlush (
|
|
IN NVME_CONTEXT *Nvme
|
|
);
|
|
|
|
/**
|
|
Read some blocks from the device.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[out] Buffer - The Buffer used to store the Data read from the device.
|
|
@param[in] Lba - The start block number.
|
|
@param[in] Blocks - Total block number to be read.
|
|
|
|
@retval EFI_SUCCESS - Datum are read from the device.
|
|
@retval Others - Fail to read all the datum.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeRead (
|
|
IN NVME_CONTEXT *Nvme,
|
|
OUT UINT64 Buffer,
|
|
IN UINT64 Lba,
|
|
IN UINTN Blocks
|
|
);
|
|
|
|
/**
|
|
Write some blocks to the device.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] Buffer - The Buffer to be written into the device.
|
|
@param[in] Lba - The start block number.
|
|
@param[in] Blocks - Total block number to be written.
|
|
|
|
@retval EFI_SUCCESS - Datum are written into the Buffer.
|
|
@retval Others - Fail to write all the datum.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeWrite (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN UINT64 Buffer,
|
|
IN UINT64 Lba,
|
|
IN UINTN Blocks
|
|
);
|
|
|
|
/**
|
|
Security send and receive commands.
|
|
|
|
@param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
|
|
@param[in] SendCommand - The flag to indicate the command type, TRUE for Send command and FALSE for receive command
|
|
@param[in] SecurityProtocol - Security Protocol
|
|
@param[in] SpSpecific - Security Protocol Specific
|
|
@param[in] TransferLength - Transfer Length of Buffer (in bytes) - always a multiple of 512
|
|
@param[in,out] TransferBuffer - Address of Data to transfer
|
|
|
|
@return EFI_SUCCESS - Successfully create io submission queue.
|
|
@return others - Fail to send/receive commands.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
NvmeSecuritySendReceive (
|
|
IN NVME_CONTEXT *Nvme,
|
|
IN BOOLEAN SendCommand,
|
|
IN UINT8 SecurityProtocol,
|
|
IN UINT16 SpSpecific,
|
|
IN UINTN TransferLength,
|
|
IN OUT VOID *TransferBuffer
|
|
);
|
|
|
|
#endif
|