MdeModulePkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
committed by
mergify[bot]
parent
7c7184e201
commit
1436aea4d5
@@ -12,7 +12,7 @@
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = {
|
||||
NvmExpressComponentNameGetDriverName,
|
||||
NvmExpressComponentNameGetControllerName,
|
||||
"eng"
|
||||
@@ -21,20 +21,20 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentNa
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) NvmExpressComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) NvmExpressComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)NvmExpressComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)NvmExpressComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressDriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressDriverNameTable[] = {
|
||||
{ "eng;en", L"NVM Express Driver" },
|
||||
{ NULL, NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerNameTable[] = {
|
||||
{ "eng;en", L"NVM Express Controller" },
|
||||
{ NULL, NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -79,9 +79,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerName
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
@@ -164,17 +164,17 @@ NvmExpressComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
|
||||
//
|
||||
// Make sure this driver is currently managing ControllHandle
|
||||
@@ -198,13 +198,14 @@ NvmExpressComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the child context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
gNvmExpressDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -212,7 +213,8 @@ NvmExpressComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
ControllerNameTable = Device->ControllerNameTable;
|
||||
}
|
||||
|
||||
@@ -223,5 +225,4 @@ NvmExpressComponentNameGetControllerName (
|
||||
ControllerName,
|
||||
(BOOLEAN)(This == &gNvmExpressComponentName)
|
||||
);
|
||||
|
||||
}
|
||||
|
@@ -12,7 +12,7 @@
|
||||
//
|
||||
// NVM Express Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
NvmExpressDriverBindingSupported,
|
||||
NvmExpressDriverBindingStart,
|
||||
NvmExpressDriverBindingStop,
|
||||
@@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
//
|
||||
// NVM Express EFI Driver Supported EFI Version Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion = {
|
||||
EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion = {
|
||||
sizeof (EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL), // Size of Protocol structure.
|
||||
0 // Version number to be filled at start up.
|
||||
};
|
||||
@@ -32,7 +32,7 @@ EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion =
|
||||
//
|
||||
// Template for NVM Express Pass Thru Mode data structure.
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassThruMode = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassThruMode = {
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO |
|
||||
@@ -56,24 +56,24 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassT
|
||||
**/
|
||||
EFI_STATUS
|
||||
EnumerateNvmeDevNamespace (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
UINT32 NamespaceId
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
UINT32 NamespaceId
|
||||
)
|
||||
{
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Lbads;
|
||||
UINT32 Flbas;
|
||||
UINT32 LbaFmtIdx;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
VOID *DummyInterface;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Lbads;
|
||||
UINT32 Flbas;
|
||||
UINT32 LbaFmtIdx;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
VOID *DummyInterface;
|
||||
|
||||
NewDevicePathNode = NULL;
|
||||
DevicePath = NULL;
|
||||
@@ -82,8 +82,8 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Allocate a buffer for Identify Namespace data
|
||||
//
|
||||
NamespaceData = AllocateZeroPool(sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if(NamespaceData == NULL) {
|
||||
NamespaceData = AllocateZeroPool (sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if (NamespaceData == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
@@ -96,9 +96,10 @@ EnumerateNvmeDevNamespace (
|
||||
NamespaceId,
|
||||
(VOID *)NamespaceData
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate Namespace
|
||||
//
|
||||
@@ -108,7 +109,7 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// allocate device private data for each discovered namespace
|
||||
//
|
||||
Device = AllocateZeroPool(sizeof(NVME_DEVICE_PRIVATE_DATA));
|
||||
Device = AllocateZeroPool (sizeof (NVME_DEVICE_PRIVATE_DATA));
|
||||
if (Device == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Exit;
|
||||
@@ -117,9 +118,9 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Initialize SSD namespace instance data
|
||||
//
|
||||
Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE;
|
||||
Device->NamespaceId = NamespaceId;
|
||||
Device->NamespaceUuid = NamespaceData->Eui64;
|
||||
Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE;
|
||||
Device->NamespaceId = NamespaceId;
|
||||
Device->NamespaceUuid = NamespaceData->Eui64;
|
||||
|
||||
Device->ControllerHandle = Private->ControllerHandle;
|
||||
Device->DriverBindingHandle = Private->DriverBindingHandle;
|
||||
@@ -128,17 +129,17 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Build BlockIo media structure
|
||||
//
|
||||
Device->Media.MediaId = 0;
|
||||
Device->Media.RemovableMedia = FALSE;
|
||||
Device->Media.MediaPresent = TRUE;
|
||||
Device->Media.MediaId = 0;
|
||||
Device->Media.RemovableMedia = FALSE;
|
||||
Device->Media.MediaPresent = TRUE;
|
||||
Device->Media.LogicalPartition = FALSE;
|
||||
Device->Media.ReadOnly = FALSE;
|
||||
Device->Media.WriteCaching = FALSE;
|
||||
Device->Media.IoAlign = Private->PassThruMode.IoAlign;
|
||||
Device->Media.ReadOnly = FALSE;
|
||||
Device->Media.WriteCaching = FALSE;
|
||||
Device->Media.IoAlign = Private->PassThruMode.IoAlign;
|
||||
|
||||
Flbas = NamespaceData->Flbas;
|
||||
LbaFmtIdx = Flbas & 0xF;
|
||||
Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads;
|
||||
Flbas = NamespaceData->Flbas;
|
||||
LbaFmtIdx = Flbas & 0xF;
|
||||
Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads;
|
||||
Device->Media.BlockSize = (UINT32)1 << Lbads;
|
||||
|
||||
Device->Media.LastBlock = NamespaceData->Nsze - 1;
|
||||
@@ -148,21 +149,21 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Create BlockIo Protocol instance
|
||||
//
|
||||
Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
|
||||
Device->BlockIo.Media = &Device->Media;
|
||||
Device->BlockIo.Reset = NvmeBlockIoReset;
|
||||
Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks;
|
||||
Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks;
|
||||
Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks;
|
||||
Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
|
||||
Device->BlockIo.Media = &Device->Media;
|
||||
Device->BlockIo.Reset = NvmeBlockIoReset;
|
||||
Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks;
|
||||
Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks;
|
||||
Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks;
|
||||
|
||||
//
|
||||
// Create BlockIo2 Protocol instance
|
||||
//
|
||||
Device->BlockIo2.Media = &Device->Media;
|
||||
Device->BlockIo2.Reset = NvmeBlockIoResetEx;
|
||||
Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx;
|
||||
Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx;
|
||||
Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx;
|
||||
Device->BlockIo2.Media = &Device->Media;
|
||||
Device->BlockIo2.Reset = NvmeBlockIoResetEx;
|
||||
Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx;
|
||||
Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx;
|
||||
Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx;
|
||||
InitializeListHead (&Device->AsyncQueue);
|
||||
|
||||
//
|
||||
@@ -186,7 +187,7 @@ EnumerateNvmeDevNamespace (
|
||||
&NewDevicePathNode
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@@ -199,10 +200,10 @@ EnumerateNvmeDevNamespace (
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
DeviceHandle = NULL;
|
||||
DeviceHandle = NULL;
|
||||
RemainingDevicePath = DevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) {
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
|
||||
Status = EFI_ALREADY_STARTED;
|
||||
FreePool (DevicePath);
|
||||
goto Exit;
|
||||
@@ -228,7 +229,7 @@ EnumerateNvmeDevNamespace (
|
||||
NULL
|
||||
);
|
||||
|
||||
if(EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@@ -242,7 +243,7 @@ EnumerateNvmeDevNamespace (
|
||||
EFI_NATIVE_INTERFACE,
|
||||
&Device->StorageSecurity
|
||||
);
|
||||
if(EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Device->DeviceHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
@@ -262,7 +263,7 @@ EnumerateNvmeDevNamespace (
|
||||
gBS->OpenProtocol (
|
||||
Private->ControllerHandle,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
(VOID **)&DummyInterface,
|
||||
Private->DriverBindingHandle,
|
||||
Device->DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@@ -304,7 +305,7 @@ EnumerateNvmeDevNamespace (
|
||||
}
|
||||
|
||||
Exit:
|
||||
if(NamespaceData != NULL) {
|
||||
if (NamespaceData != NULL) {
|
||||
FreePool (NamespaceData);
|
||||
}
|
||||
|
||||
@@ -312,12 +313,14 @@ Exit:
|
||||
FreePool (NewDevicePathNode);
|
||||
}
|
||||
|
||||
if(EFI_ERROR(Status) && (Device != NULL) && (Device->DevicePath != NULL)) {
|
||||
if (EFI_ERROR (Status) && (Device != NULL) && (Device->DevicePath != NULL)) {
|
||||
FreePool (Device->DevicePath);
|
||||
}
|
||||
if(EFI_ERROR(Status) && (Device != NULL)) {
|
||||
|
||||
if (EFI_ERROR (Status) && (Device != NULL)) {
|
||||
FreePool (Device);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -333,15 +336,15 @@ Exit:
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverAllNamespaces (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 NamespaceId;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru;
|
||||
EFI_STATUS Status;
|
||||
UINT32 NamespaceId;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru;
|
||||
|
||||
NamespaceId = 0xFFFFFFFF;
|
||||
Passthru = &Private->Passthru;
|
||||
NamespaceId = 0xFFFFFFFF;
|
||||
Passthru = &Private->Passthru;
|
||||
|
||||
while (TRUE) {
|
||||
Status = Passthru->GetNextNamespace (
|
||||
@@ -358,7 +361,7 @@ DiscoverAllNamespaces (
|
||||
NamespaceId
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -382,25 +385,25 @@ DiscoverAllNamespaces (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnregisterNvmeNamespace (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
BOOLEAN IsEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
VOID *DummyInterface;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
BOOLEAN IsEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
VOID *DummyInterface;
|
||||
|
||||
BlockIo = NULL;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -409,7 +412,7 @@ UnregisterNvmeNamespace (
|
||||
return Status;
|
||||
}
|
||||
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
|
||||
//
|
||||
// Wait for the device's asynchronous I/O queue to become empty.
|
||||
@@ -457,7 +460,7 @@ UnregisterNvmeNamespace (
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
(VOID **)&DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@@ -471,7 +474,7 @@ UnregisterNvmeNamespace (
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiStorageSecurityCommandProtocolGuid,
|
||||
(VOID **) &StorageSecurity,
|
||||
(VOID **)&StorageSecurity,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -485,18 +488,18 @@ UnregisterNvmeNamespace (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **)&DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
if(Device->DevicePath != NULL) {
|
||||
if (Device->DevicePath != NULL) {
|
||||
FreePool (Device->DevicePath);
|
||||
}
|
||||
|
||||
@@ -520,25 +523,25 @@ UnregisterNvmeNamespace (
|
||||
VOID
|
||||
EFIAPI
|
||||
ProcessAsyncTaskList (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID* Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NVME_CQ *Cq;
|
||||
UINT16 QueueId;
|
||||
UINT32 Data;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
BOOLEAN HasNewItem;
|
||||
EFI_STATUS Status;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NVME_CQ *Cq;
|
||||
UINT16 QueueId;
|
||||
UINT32 Data;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
BOOLEAN HasNewItem;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Private = (NVME_CONTROLLER_PRIVATE_DATA*)Context;
|
||||
Private = (NVME_CONTROLLER_PRIVATE_DATA *)Context;
|
||||
QueueId = 2;
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
HasNewItem = FALSE;
|
||||
@@ -549,7 +552,8 @@ ProcessAsyncTaskList (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->UnsubmittedSubtasks);
|
||||
!IsNull (&Private->UnsubmittedSubtasks, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->UnsubmittedSubtasks, Link);
|
||||
Subtask = NVME_BLKIO2_SUBTASK_FROM_LINK (Link);
|
||||
BlkIo2Request = Subtask->BlockIo2Request;
|
||||
@@ -563,7 +567,8 @@ ProcessAsyncTaskList (
|
||||
if (Token->TransactionStatus != EFI_SUCCESS) {
|
||||
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
|
||||
BlkIo2Request->LastSubtaskSubmitted &&
|
||||
(BlkIo2Request->UnsubmittedSubtaskNum == 0)) {
|
||||
(BlkIo2Request->UnsubmittedSubtaskNum == 0))
|
||||
{
|
||||
//
|
||||
// Remove the BlockIo2 request from the device asynchronous queue.
|
||||
//
|
||||
@@ -594,7 +599,8 @@ ProcessAsyncTaskList (
|
||||
Token->TransactionStatus = EFI_DEVICE_ERROR;
|
||||
|
||||
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
|
||||
Subtask->IsLast) {
|
||||
Subtask->IsLast)
|
||||
{
|
||||
//
|
||||
// Remove the BlockIo2 request from the device asynchronous queue.
|
||||
//
|
||||
@@ -625,8 +631,9 @@ ProcessAsyncTaskList (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->AsyncPassThruQueue);
|
||||
!IsNull (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink) {
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
AsyncRequest = NVME_PASS_THRU_ASYNC_REQ_FROM_THIS (Link);
|
||||
if (AsyncRequest->CommandId == Cq->Cid) {
|
||||
//
|
||||
@@ -636,7 +643,7 @@ ProcessAsyncTaskList (
|
||||
CopyMem (
|
||||
AsyncRequest->Packet->NvmeCompletion,
|
||||
Cq,
|
||||
sizeof(EFI_NVM_EXPRESS_COMPLETION)
|
||||
sizeof (EFI_NVM_EXPRESS_COMPLETION)
|
||||
);
|
||||
|
||||
//
|
||||
@@ -645,12 +652,15 @@ ProcessAsyncTaskList (
|
||||
if (AsyncRequest->MapData != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapData);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapMeta != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapMeta);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapPrpList != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapPrpList);
|
||||
}
|
||||
|
||||
if (AsyncRequest->PrpListHost != NULL) {
|
||||
PciIo->FreeBuffer (
|
||||
PciIo,
|
||||
@@ -674,19 +684,19 @@ ProcessAsyncTaskList (
|
||||
Private->CqHdbl[QueueId].Cqh++;
|
||||
if (Private->CqHdbl[QueueId].Cqh > MIN (NVME_ASYNC_CCQ_SIZE, Private->Cap.Mqes)) {
|
||||
Private->CqHdbl[QueueId].Cqh = 0;
|
||||
Private->Pt[QueueId] ^= 1;
|
||||
Private->Pt[QueueId] ^= 1;
|
||||
}
|
||||
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
}
|
||||
|
||||
if (HasNewItem) {
|
||||
Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[QueueId]);
|
||||
Data = ReadUnaligned32 ((UINT32 *)&Private->CqHdbl[QueueId]);
|
||||
PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_CQHDBL_OFFSET(QueueId, Private->Cap.Dstrd),
|
||||
NVME_CQHDBL_OFFSET (QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
@@ -766,8 +776,9 @@ NvmExpressDriverBindingSupported (
|
||||
|
||||
if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) ||
|
||||
(DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) ||
|
||||
(DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH))) {
|
||||
return EFI_UNSUPPORTED;
|
||||
(DevicePathNodeLength (DevicePathNode.DevPath) != sizeof (NVME_NAMESPACE_DEVICE_PATH)))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -778,7 +789,7 @@ NvmExpressDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -807,7 +818,7 @@ NvmExpressDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
(VOID **)&PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -853,7 +864,6 @@ Done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Starts a device controller or a bus controller.
|
||||
|
||||
@@ -915,7 +925,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -927,7 +937,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
(VOID **)&PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -965,14 +975,14 @@ NvmExpressDriverBindingStart (
|
||||
AllocateAnyPages,
|
||||
EfiBootServicesData,
|
||||
6,
|
||||
(VOID**)&Private->Buffer,
|
||||
(VOID **)&Private->Buffer,
|
||||
0
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Bytes = EFI_PAGES_TO_SIZE (6);
|
||||
Bytes = EFI_PAGES_TO_SIZE (6);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
EfiPciIoOperationBusMasterCommonBuffer,
|
||||
@@ -988,7 +998,7 @@ NvmExpressDriverBindingStart (
|
||||
|
||||
Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;
|
||||
|
||||
Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
|
||||
Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
|
||||
Private->ControllerHandle = Controller;
|
||||
Private->ImageHandle = This->DriverBindingHandle;
|
||||
Private->DriverBindingHandle = This->DriverBindingHandle;
|
||||
@@ -1004,7 +1014,7 @@ NvmExpressDriverBindingStart (
|
||||
InitializeListHead (&Private->UnsubmittedSubtasks);
|
||||
|
||||
Status = NvmeControllerInit (Private);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@@ -1046,7 +1056,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &Passthru,
|
||||
(VOID **)&Passthru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1065,7 +1075,6 @@ NvmExpressDriverBindingStart (
|
||||
Status = DiscoverAllNamespaces (
|
||||
Private
|
||||
);
|
||||
|
||||
} else if (!IsDevicePathEnd (RemainingDevicePath)) {
|
||||
//
|
||||
// Enumerate the specified NVME namespace
|
||||
@@ -1127,7 +1136,6 @@ Exit:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stops a device controller or a bus controller.
|
||||
|
||||
@@ -1157,10 +1165,10 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -1175,7 +1183,7 @@ NvmExpressDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &PassThru,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1201,11 +1209,11 @@ NvmExpressDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
PassThru,
|
||||
NULL
|
||||
);
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
PassThru,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (Private->TimerEvent != NULL) {
|
||||
gBS->CloseEvent (Private->TimerEvent);
|
||||
@@ -1224,17 +1232,17 @@ NvmExpressDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
NvmeUnregisterShutdownNotification ();
|
||||
|
||||
@@ -1272,15 +1280,15 @@ NvmExpressDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
|
||||
//
|
||||
// Get the list of the device handles managed by this driver.
|
||||
@@ -1289,13 +1297,13 @@ NvmExpressUnload (
|
||||
// those protocols installed at image handle.
|
||||
//
|
||||
DeviceHandleBuffer = NULL;
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
NULL,
|
||||
&DeviceHandleCount,
|
||||
&DeviceHandleBuffer
|
||||
);
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
NULL,
|
||||
&DeviceHandleCount,
|
||||
&DeviceHandleBuffer
|
||||
);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
@@ -1342,7 +1350,7 @@ NvmExpressUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiComponentNameProtocolGuid,
|
||||
(VOID **) &ComponentName
|
||||
(VOID **)&ComponentName
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@@ -1355,7 +1363,7 @@ NvmExpressUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiComponentName2ProtocolGuid,
|
||||
(VOID **) &ComponentName2
|
||||
(VOID **)&ComponentName2
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@@ -1374,6 +1382,7 @@ EXIT:
|
||||
if (DeviceHandleBuffer != NULL) {
|
||||
gBS->FreePool (DeviceHandleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -1394,7 +1403,7 @@ NvmExpressDriverEntry (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
@@ -1411,12 +1420,12 @@ NvmExpressDriverEntry (
|
||||
// EFI drivers that are on PCI and other plug in cards.
|
||||
//
|
||||
gNvmExpressDriverSupportedEfiVersion.FirmwareVersion = 0x00020028;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiDriverSupportedEfiVersionProtocolGuid,
|
||||
&gNvmExpressDriverSupportedEfiVersion,
|
||||
NULL
|
||||
);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiDriverSupportedEfiVersionProtocolGuid,
|
||||
&gNvmExpressDriverSupportedEfiVersion,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
return Status;
|
||||
}
|
||||
|
@@ -41,8 +41,8 @@
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/ReportStatusCodeLib.h>
|
||||
|
||||
typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA;
|
||||
typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA;
|
||||
typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA;
|
||||
typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA;
|
||||
|
||||
#include "NvmExpressBlockIo.h"
|
||||
#include "NvmExpressDiskInfo.h"
|
||||
@@ -53,67 +53,67 @@ extern EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2;
|
||||
extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion;
|
||||
|
||||
#define PCI_CLASS_MASS_STORAGE_NVM 0x08 // mass storage sub-class non-volatile memory.
|
||||
#define PCI_IF_NVMHCI 0x02 // mass storage programming interface NVMHCI.
|
||||
#define PCI_CLASS_MASS_STORAGE_NVM 0x08 // mass storage sub-class non-volatile memory.
|
||||
#define PCI_IF_NVMHCI 0x02 // mass storage programming interface NVMHCI.
|
||||
|
||||
#define NVME_ASQ_SIZE 1 // Number of admin submission queue entries, which is 0-based
|
||||
#define NVME_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based
|
||||
#define NVME_ASQ_SIZE 1 // Number of admin submission queue entries, which is 0-based
|
||||
#define NVME_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based
|
||||
|
||||
#define NVME_CSQ_SIZE 1 // Number of I/O submission queue entries, which is 0-based
|
||||
#define NVME_CCQ_SIZE 1 // Number of I/O completion queue entries, which is 0-based
|
||||
#define NVME_CSQ_SIZE 1 // Number of I/O submission queue entries, which is 0-based
|
||||
#define NVME_CCQ_SIZE 1 // Number of I/O completion queue entries, which is 0-based
|
||||
|
||||
//
|
||||
// Number of asynchronous I/O submission queue entries, which is 0-based.
|
||||
// The asynchronous I/O submission queue size is 4kB in total.
|
||||
//
|
||||
#define NVME_ASYNC_CSQ_SIZE 63
|
||||
#define NVME_ASYNC_CSQ_SIZE 63
|
||||
//
|
||||
// Number of asynchronous I/O completion queue entries, which is 0-based.
|
||||
// The asynchronous I/O completion queue size is 4kB in total.
|
||||
//
|
||||
#define NVME_ASYNC_CCQ_SIZE 255
|
||||
#define NVME_ASYNC_CCQ_SIZE 255
|
||||
|
||||
#define NVME_MAX_QUEUES 3 // Number of queues supported by the driver
|
||||
#define NVME_MAX_QUEUES 3 // Number of queues supported by the driver
|
||||
|
||||
#define NVME_CONTROLLER_ID 0
|
||||
#define NVME_CONTROLLER_ID 0
|
||||
|
||||
//
|
||||
// Time out value for Nvme transaction execution
|
||||
//
|
||||
#define NVME_GENERIC_TIMEOUT EFI_TIMER_PERIOD_SECONDS (5)
|
||||
#define NVME_GENERIC_TIMEOUT EFI_TIMER_PERIOD_SECONDS (5)
|
||||
|
||||
//
|
||||
// Nvme async transfer timer interval, set by experience.
|
||||
//
|
||||
#define NVME_HC_ASYNC_TIMER EFI_TIMER_PERIOD_MILLISECONDS (1)
|
||||
#define NVME_HC_ASYNC_TIMER EFI_TIMER_PERIOD_MILLISECONDS (1)
|
||||
|
||||
//
|
||||
// Unique signature for private data structure.
|
||||
//
|
||||
#define NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('N','V','M','E')
|
||||
#define NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('N','V','M','E')
|
||||
|
||||
//
|
||||
// Nvme private data structure.
|
||||
//
|
||||
struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_HANDLE ImageHandle;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_HANDLE ImageHandle;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 PciAttributes;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 PciAttributes;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
|
||||
EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru;
|
||||
|
||||
//
|
||||
// pointer to identify controller data
|
||||
//
|
||||
NVME_ADMIN_CONTROLLER_DATA *ControllerData;
|
||||
NVME_ADMIN_CONTROLLER_DATA *ControllerData;
|
||||
|
||||
//
|
||||
// 6 x 4kB aligned buffers will be carved out of this buffer.
|
||||
@@ -124,45 +124,45 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
// 5th 4kB boundary is the start of I/O submission queue #2.
|
||||
// 6th 4kB boundary is the start of I/O completion queue #2.
|
||||
//
|
||||
UINT8 *Buffer;
|
||||
UINT8 *BufferPciAddr;
|
||||
UINT8 *Buffer;
|
||||
UINT8 *BufferPciAddr;
|
||||
|
||||
//
|
||||
// Pointers to 4kB aligned submission & completion queues.
|
||||
//
|
||||
NVME_SQ *SqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
|
||||
//
|
||||
// Submission and completion queue indices.
|
||||
//
|
||||
NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES];
|
||||
NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES];
|
||||
UINT16 AsyncSqHead;
|
||||
NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES];
|
||||
NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES];
|
||||
UINT16 AsyncSqHead;
|
||||
|
||||
//
|
||||
// Flag to indicate internal IO queue creation.
|
||||
//
|
||||
BOOLEAN CreateIoQueue;
|
||||
BOOLEAN CreateIoQueue;
|
||||
|
||||
UINT8 Pt[NVME_MAX_QUEUES];
|
||||
UINT16 Cid[NVME_MAX_QUEUES];
|
||||
UINT8 Pt[NVME_MAX_QUEUES];
|
||||
UINT16 Cid[NVME_MAX_QUEUES];
|
||||
|
||||
//
|
||||
// Nvme controller capabilities
|
||||
//
|
||||
NVME_CAP Cap;
|
||||
NVME_CAP Cap;
|
||||
|
||||
VOID *Mapping;
|
||||
VOID *Mapping;
|
||||
|
||||
//
|
||||
// For Non-blocking operations.
|
||||
//
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY AsyncPassThruQueue;
|
||||
LIST_ENTRY UnsubmittedSubtasks;
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY AsyncPassThruQueue;
|
||||
LIST_ENTRY UnsubmittedSubtasks;
|
||||
};
|
||||
|
||||
#define NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU(a) \
|
||||
@@ -175,7 +175,7 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
//
|
||||
// Unique signature for private data structure.
|
||||
//
|
||||
#define NVME_DEVICE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('X','S','S','D')
|
||||
#define NVME_DEVICE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('X','S','S','D')
|
||||
|
||||
//
|
||||
// Nvme device private data structure
|
||||
@@ -208,7 +208,6 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
NVME_ADMIN_NAMESPACE_DATA NamespaceData;
|
||||
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Controller;
|
||||
|
||||
};
|
||||
|
||||
//
|
||||
@@ -235,7 +234,7 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
NVME_DEVICE_PRIVATE_DATA_SIGNATURE \
|
||||
)
|
||||
|
||||
#define NVME_DEVICE_PRIVATE_DATA_FROM_STORAGE_SECURITY(a)\
|
||||
#define NVME_DEVICE_PRIVATE_DATA_FROM_STORAGE_SECURITY(a) \
|
||||
CR (a, \
|
||||
NVME_DEVICE_PRIVATE_DATA, \
|
||||
StorageSecurity, \
|
||||
@@ -245,38 +244,38 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
//
|
||||
// Nvme block I/O 2 request.
|
||||
//
|
||||
#define NVME_BLKIO2_REQUEST_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'R')
|
||||
#define NVME_BLKIO2_REQUEST_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'R')
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN UnsubmittedSubtaskNum;
|
||||
BOOLEAN LastSubtaskSubmitted;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN UnsubmittedSubtaskNum;
|
||||
BOOLEAN LastSubtaskSubmitted;
|
||||
//
|
||||
// The queue for Nvme read/write sub-tasks of a BlockIo2 request.
|
||||
//
|
||||
LIST_ENTRY SubtasksQueue;
|
||||
LIST_ENTRY SubtasksQueue;
|
||||
} NVME_BLKIO2_REQUEST;
|
||||
|
||||
#define NVME_BLKIO2_REQUEST_FROM_LINK(a) \
|
||||
CR (a, NVME_BLKIO2_REQUEST, Link, NVME_BLKIO2_REQUEST_SIGNATURE)
|
||||
|
||||
#define NVME_BLKIO2_SUBTASK_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'S')
|
||||
#define NVME_BLKIO2_SUBTASK_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'S')
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
BOOLEAN IsLast;
|
||||
UINT32 NamespaceId;
|
||||
EFI_EVENT Event;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket;
|
||||
BOOLEAN IsLast;
|
||||
UINT32 NamespaceId;
|
||||
EFI_EVENT Event;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket;
|
||||
//
|
||||
// The BlockIo2 request this subtask belongs to
|
||||
//
|
||||
NVME_BLKIO2_REQUEST *BlockIo2Request;
|
||||
NVME_BLKIO2_REQUEST *BlockIo2Request;
|
||||
} NVME_BLKIO2_SUBTASK;
|
||||
|
||||
#define NVME_BLKIO2_SUBTASK_FROM_LINK(a) \
|
||||
@@ -285,20 +284,20 @@ typedef struct {
|
||||
//
|
||||
// Nvme asynchronous passthru request.
|
||||
//
|
||||
#define NVME_PASS_THRU_ASYNC_REQ_SIG SIGNATURE_32 ('N', 'P', 'A', 'R')
|
||||
#define NVME_PASS_THRU_ASYNC_REQ_SIG SIGNATURE_32 ('N', 'P', 'A', 'R')
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
UINT16 CommandId;
|
||||
VOID *MapPrpList;
|
||||
UINTN PrpListNo;
|
||||
VOID *PrpListHost;
|
||||
VOID *MapData;
|
||||
VOID *MapMeta;
|
||||
EFI_EVENT CallerEvent;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
UINT16 CommandId;
|
||||
VOID *MapPrpList;
|
||||
UINTN PrpListNo;
|
||||
VOID *PrpListHost;
|
||||
VOID *MapData;
|
||||
VOID *MapMeta;
|
||||
EFI_EVENT CallerEvent;
|
||||
} NVME_PASS_THRU_ASYNC_REQ;
|
||||
|
||||
#define NVME_PASS_THRU_ASYNC_REQ_FROM_THIS(a) \
|
||||
@@ -426,11 +425,11 @@ NvmExpressComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -555,10 +554,10 @@ NvmExpressDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -594,10 +593,10 @@ NvmExpressDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressPassThru (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -636,8 +635,8 @@ NvmExpressPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNextNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -667,9 +666,9 @@ NvmExpressGetNextNamespace (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -706,9 +705,9 @@ NvmExpressGetNamespace (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressBuildDevicePath (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -719,7 +718,7 @@ NvmExpressBuildDevicePath (
|
||||
**/
|
||||
VOID
|
||||
NvmeDumpStatus (
|
||||
IN NVME_CQ *Cq
|
||||
IN NVME_CQ *Cq
|
||||
);
|
||||
|
||||
/**
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -23,8 +23,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -49,11 +49,11 @@ NvmeBlockIoReset (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -79,11 +79,11 @@ NvmeBlockIoReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -99,7 +99,7 @@ NvmeBlockIoWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -162,12 +162,12 @@ NvmeBlockIoResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReadBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -212,11 +212,11 @@ EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoWriteBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -246,8 +246,8 @@ NvmeBlockIoWriteBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoFlushBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -325,14 +325,14 @@ NvmeBlockIoFlushBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeStorageSecurityReceiveData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -399,13 +399,13 @@ NvmeStorageSecurityReceiveData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeStorageSecuritySendData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "NvmExpress.h"
|
||||
|
||||
EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
EFI_DISK_INFO_NVME_INTERFACE_GUID,
|
||||
NvmExpressDiskInfoInquiry,
|
||||
NvmExpressDiskInfoIdentify,
|
||||
@@ -27,13 +27,12 @@ EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
**/
|
||||
VOID
|
||||
InitializeDiskInfo (
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
)
|
||||
{
|
||||
CopyMem (&Device->DiskInfo, &gNvmExpressDiskInfoProtocolTemplate, sizeof (EFI_DISK_INFO_PROTOCOL));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides inquiry information for the controller type.
|
||||
|
||||
@@ -53,15 +52,14 @@ InitializeDiskInfo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides identify information for the controller type.
|
||||
|
||||
@@ -83,13 +81,13 @@ NvmExpressDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_DISK_INFO (This);
|
||||
|
||||
@@ -98,6 +96,7 @@ NvmExpressDiskInfoIdentify (
|
||||
Status = EFI_SUCCESS;
|
||||
CopyMem (IdentifyData, &Device->NamespaceData, sizeof (Device->NamespaceData));
|
||||
}
|
||||
|
||||
*IdentifyDataSize = sizeof (Device->NamespaceData);
|
||||
return Status;
|
||||
}
|
||||
@@ -122,16 +121,15 @@ NvmExpressDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function is used to get controller information.
|
||||
|
||||
@@ -146,11 +144,10 @@ NvmExpressDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
@@ -20,10 +20,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
InitializeDiskInfo (
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Provides inquiry information for the controller type.
|
||||
|
||||
@@ -43,9 +42,9 @@ InitializeDiskInfo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -69,9 +68,9 @@ NvmExpressDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -94,13 +93,12 @@ NvmExpressDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function is used to get controller information.
|
||||
|
||||
@@ -115,9 +113,9 @@ NvmExpressDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -9,13 +9,13 @@
|
||||
|
||||
#include "NvmExpress.h"
|
||||
|
||||
#define NVME_SHUTDOWN_PROCESS_TIMEOUT 45
|
||||
#define NVME_SHUTDOWN_PROCESS_TIMEOUT 45
|
||||
|
||||
//
|
||||
// The number of NVME controllers managed by this driver, used by
|
||||
// NvmeRegisterShutdownNotification() and NvmeUnregisterShutdownNotification().
|
||||
//
|
||||
UINTN mNvmeControllerNumber = 0;
|
||||
UINTN mNvmeControllerNumber = 0;
|
||||
|
||||
/**
|
||||
Read Nvm Express controller capability register.
|
||||
@@ -29,13 +29,13 @@ UINTN mNvmeControllerNumber = 0;
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadNvmeControllerCapabilities (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CAP *Cap
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CAP *Cap
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Status = PciIo->Mem.Read (
|
||||
@@ -47,11 +47,11 @@ ReadNvmeControllerCapabilities (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
WriteUnaligned64 ((UINT64*)Cap, Data);
|
||||
WriteUnaligned64 ((UINT64 *)Cap, Data);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -67,13 +67,13 @@ ReadNvmeControllerCapabilities (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadNvmeControllerConfiguration (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CC *Cc
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CC *Cc
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Status = PciIo->Mem.Read (
|
||||
@@ -85,11 +85,11 @@ ReadNvmeControllerConfiguration (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
WriteUnaligned32 ((UINT32*)Cc, Data);
|
||||
WriteUnaligned32 ((UINT32 *)Cc, Data);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -105,16 +105,16 @@ ReadNvmeControllerConfiguration (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteNvmeControllerConfiguration (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CC *Cc
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CC *Cc
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned32 ((UINT32*)Cc);
|
||||
Data = ReadUnaligned32 ((UINT32 *)Cc);
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
@@ -124,7 +124,7 @@ WriteNvmeControllerConfiguration (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -151,13 +151,13 @@ WriteNvmeControllerConfiguration (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadNvmeControllerStatus (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CSTS *Csts
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_CSTS *Csts
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Status = PciIo->Mem.Read (
|
||||
@@ -169,16 +169,14 @@ ReadNvmeControllerStatus (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
WriteUnaligned32 ((UINT32*)Csts, Data);
|
||||
WriteUnaligned32 ((UINT32 *)Csts, Data);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Write Nvm Express admin queue attributes register.
|
||||
|
||||
@@ -191,16 +189,16 @@ ReadNvmeControllerStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteNvmeAdminQueueAttributes (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_AQA *Aqa
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_AQA *Aqa
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned32 ((UINT32*)Aqa);
|
||||
Data = ReadUnaligned32 ((UINT32 *)Aqa);
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
@@ -210,7 +208,7 @@ WriteNvmeAdminQueueAttributes (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -220,7 +218,6 @@ WriteNvmeAdminQueueAttributes (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write Nvm Express admin submission queue base address register.
|
||||
|
||||
@@ -233,16 +230,16 @@ WriteNvmeAdminQueueAttributes (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteNvmeAdminSubmissionQueueBaseAddress (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_ASQ *Asq
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_ASQ *Asq
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned64 ((UINT64*)Asq);
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned64 ((UINT64 *)Asq);
|
||||
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
@@ -253,7 +250,7 @@ WriteNvmeAdminSubmissionQueueBaseAddress (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -262,8 +259,6 @@ WriteNvmeAdminSubmissionQueueBaseAddress (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Write Nvm Express admin completion queue base address register.
|
||||
|
||||
@@ -276,16 +271,16 @@ WriteNvmeAdminSubmissionQueueBaseAddress (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteNvmeAdminCompletionQueueBaseAddress (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_ACQ *Acq
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN NVME_ACQ *Acq
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Data;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned64 ((UINT64*)Acq);
|
||||
PciIo = Private->PciIo;
|
||||
Data = ReadUnaligned64 ((UINT64 *)Acq);
|
||||
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
@@ -296,7 +291,7 @@ WriteNvmeAdminCompletionQueueBaseAddress (
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -316,20 +311,20 @@ WriteNvmeAdminCompletionQueueBaseAddress (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeDisableController (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT8 Timeout;
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT8 Timeout;
|
||||
|
||||
//
|
||||
// Read Controller Configuration Register.
|
||||
//
|
||||
Status = ReadNvmeControllerConfiguration (Private, &Cc);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -340,7 +335,7 @@ NvmeDisableController (
|
||||
//
|
||||
Status = WriteNvmeControllerConfiguration (Private, &Cc);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -354,15 +349,15 @@ NvmeDisableController (
|
||||
Timeout = Private->Cap.To;
|
||||
}
|
||||
|
||||
for(Index = (Timeout * 500); Index != 0; --Index) {
|
||||
gBS->Stall(1000);
|
||||
for (Index = (Timeout * 500); Index != 0; --Index) {
|
||||
gBS->Stall (1000);
|
||||
|
||||
//
|
||||
// Check if the controller is initialized
|
||||
//
|
||||
Status = ReadNvmeControllerStatus (Private, &Csts);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -395,14 +390,14 @@ NvmeDisableController (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeEnableController (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT8 Timeout;
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT8 Timeout;
|
||||
|
||||
//
|
||||
// Enable the controller.
|
||||
@@ -414,7 +409,7 @@ NvmeEnableController (
|
||||
Cc.Iocqes = 4;
|
||||
|
||||
Status = WriteNvmeControllerConfiguration (Private, &Cc);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -428,15 +423,15 @@ NvmeEnableController (
|
||||
Timeout = Private->Cap.To;
|
||||
}
|
||||
|
||||
for(Index = (Timeout * 500); Index != 0; --Index) {
|
||||
gBS->Stall(1000);
|
||||
for (Index = (Timeout * 500); Index != 0; --Index) {
|
||||
gBS->Stall (1000);
|
||||
|
||||
//
|
||||
// Check if the controller is initialized
|
||||
//
|
||||
Status = ReadNvmeControllerStatus (Private, &Csts);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -469,25 +464,25 @@ NvmeEnableController (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeIdentifyController (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN VOID *Buffer
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
|
||||
ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CommandPacket, sizeof (EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof (EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof (EFI_NVM_EXPRESS_COMPLETION));
|
||||
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_CMD;
|
||||
//
|
||||
// According to Nvm Express 1.1 spec Figure 38, When not used, the field shall be cleared to 0h.
|
||||
// For the Identify command, the Namespace Identifier is only used for the Namespace data structure.
|
||||
//
|
||||
Command.Nsid = 0;
|
||||
Command.Nsid = 0;
|
||||
|
||||
CommandPacket.NvmeCmd = &Command;
|
||||
CommandPacket.NvmeCompletion = &Completion;
|
||||
@@ -498,8 +493,8 @@ NvmeIdentifyController (
|
||||
//
|
||||
// Set bit 0 (Cns bit) to 1 to identify a controller
|
||||
//
|
||||
Command.Cdw10 = 1;
|
||||
Command.Flags = CDW10_VALID;
|
||||
Command.Cdw10 = 1;
|
||||
Command.Flags = CDW10_VALID;
|
||||
|
||||
Status = Private->Passthru.PassThru (
|
||||
&Private->Passthru,
|
||||
@@ -524,25 +519,25 @@ NvmeIdentifyController (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeIdentifyNamespace (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT32 NamespaceId,
|
||||
IN VOID *Buffer
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT32 NamespaceId,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
|
||||
ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CommandPacket, sizeof (EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof (EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof (EFI_NVM_EXPRESS_COMPLETION));
|
||||
|
||||
CommandPacket.NvmeCmd = &Command;
|
||||
CommandPacket.NvmeCompletion = &Completion;
|
||||
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_CMD;
|
||||
Command.Nsid = NamespaceId;
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_CMD;
|
||||
Command.Nsid = NamespaceId;
|
||||
CommandPacket.TransferBuffer = Buffer;
|
||||
CommandPacket.TransferLength = sizeof (NVME_ADMIN_NAMESPACE_DATA);
|
||||
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
|
||||
@@ -574,30 +569,30 @@ NvmeIdentifyNamespace (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeCreateIoCompletionQueue (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_CRIOCQ CrIoCq;
|
||||
UINT32 Index;
|
||||
UINT16 QueueSize;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_CRIOCQ CrIoCq;
|
||||
UINT32 Index;
|
||||
UINT16 QueueSize;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
Private->CreateIoQueue = TRUE;
|
||||
|
||||
for (Index = 1; Index < NVME_MAX_QUEUES; Index++) {
|
||||
ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CrIoCq, sizeof(NVME_ADMIN_CRIOCQ));
|
||||
ZeroMem (&CommandPacket, sizeof (EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof (EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof (EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CrIoCq, sizeof (NVME_ADMIN_CRIOCQ));
|
||||
|
||||
CommandPacket.NvmeCmd = &Command;
|
||||
CommandPacket.NvmeCompletion = &Completion;
|
||||
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_CRIOCQ_CMD;
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_CRIOCQ_CMD;
|
||||
CommandPacket.TransferBuffer = Private->CqBufferPciAddr[Index];
|
||||
CommandPacket.TransferLength = EFI_PAGE_SIZE;
|
||||
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
|
||||
@@ -646,30 +641,30 @@ NvmeCreateIoCompletionQueue (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeCreateIoSubmissionQueue (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_CRIOSQ CrIoSq;
|
||||
UINT32 Index;
|
||||
UINT16 QueueSize;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
|
||||
EFI_NVM_EXPRESS_COMMAND Command;
|
||||
EFI_NVM_EXPRESS_COMPLETION Completion;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_CRIOSQ CrIoSq;
|
||||
UINT32 Index;
|
||||
UINT16 QueueSize;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
Private->CreateIoQueue = TRUE;
|
||||
|
||||
for (Index = 1; Index < NVME_MAX_QUEUES; Index++) {
|
||||
ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CrIoSq, sizeof(NVME_ADMIN_CRIOSQ));
|
||||
ZeroMem (&CommandPacket, sizeof (EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
|
||||
ZeroMem (&Command, sizeof (EFI_NVM_EXPRESS_COMMAND));
|
||||
ZeroMem (&Completion, sizeof (EFI_NVM_EXPRESS_COMPLETION));
|
||||
ZeroMem (&CrIoSq, sizeof (NVME_ADMIN_CRIOSQ));
|
||||
|
||||
CommandPacket.NvmeCmd = &Command;
|
||||
CommandPacket.NvmeCompletion = &Completion;
|
||||
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_CRIOSQ_CMD;
|
||||
Command.Cdw0.Opcode = NVME_ADMIN_CRIOSQ_CMD;
|
||||
CommandPacket.TransferBuffer = Private->SqBufferPciAddr[Index];
|
||||
CommandPacket.TransferLength = EFI_PAGE_SIZE;
|
||||
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
|
||||
@@ -720,17 +715,18 @@ NvmeCreateIoSubmissionQueue (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeControllerInit (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 Supports;
|
||||
NVME_AQA Aqa;
|
||||
NVME_ASQ Asq;
|
||||
NVME_ACQ Acq;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
EFI_STATUS Status;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 Supports;
|
||||
NVME_AQA Aqa;
|
||||
NVME_ASQ Asq;
|
||||
NVME_ACQ Acq;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
|
||||
//
|
||||
// Save original PCI attributes and enable this controller.
|
||||
//
|
||||
@@ -799,12 +795,12 @@ NvmeControllerInit (
|
||||
//
|
||||
ASSERT ((Private->Cap.Mpsmin + 12) <= EFI_PAGE_SHIFT);
|
||||
|
||||
Private->Cid[0] = 0;
|
||||
Private->Cid[1] = 0;
|
||||
Private->Cid[2] = 0;
|
||||
Private->Pt[0] = 0;
|
||||
Private->Pt[1] = 0;
|
||||
Private->Pt[2] = 0;
|
||||
Private->Cid[0] = 0;
|
||||
Private->Cid[1] = 0;
|
||||
Private->Cid[2] = 0;
|
||||
Private->Pt[0] = 0;
|
||||
Private->Pt[1] = 0;
|
||||
Private->Pt[2] = 0;
|
||||
Private->SqTdbl[0].Sqt = 0;
|
||||
Private->SqTdbl[1].Sqt = 0;
|
||||
Private->SqTdbl[2].Sqt = 0;
|
||||
@@ -815,7 +811,7 @@ NvmeControllerInit (
|
||||
|
||||
Status = NvmeDisableController (Private);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -869,7 +865,7 @@ NvmeControllerInit (
|
||||
//
|
||||
Status = WriteNvmeAdminQueueAttributes (Private, &Aqa);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -878,7 +874,7 @@ NvmeControllerInit (
|
||||
//
|
||||
Status = WriteNvmeAdminSubmissionQueueBaseAddress (Private, &Asq);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -887,12 +883,12 @@ NvmeControllerInit (
|
||||
//
|
||||
Status = WriteNvmeAdminCompletionQueueBaseAddress (Private, &Acq);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = NvmeEnableController (Private);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -900,7 +896,7 @@ NvmeControllerInit (
|
||||
// Allocate buffer for Identify Controller data
|
||||
//
|
||||
if (Private->ControllerData == NULL) {
|
||||
Private->ControllerData = (NVME_ADMIN_CONTROLLER_DATA *)AllocateZeroPool (sizeof(NVME_ADMIN_CONTROLLER_DATA));
|
||||
Private->ControllerData = (NVME_ADMIN_CONTROLLER_DATA *)AllocateZeroPool (sizeof (NVME_ADMIN_CONTROLLER_DATA));
|
||||
|
||||
if (Private->ControllerData == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@@ -912,8 +908,8 @@ NvmeControllerInit (
|
||||
//
|
||||
Status = NvmeIdentifyController (Private, Private->ControllerData);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
FreePool(Private->ControllerData);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (Private->ControllerData);
|
||||
Private->ControllerData = NULL;
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@@ -928,13 +924,13 @@ NvmeControllerInit (
|
||||
DEBUG ((DEBUG_INFO, " == NVME IDENTIFY CONTROLLER DATA ==\n"));
|
||||
DEBUG ((DEBUG_INFO, " PCI VID : 0x%x\n", Private->ControllerData->Vid));
|
||||
DEBUG ((DEBUG_INFO, " PCI SSVID : 0x%x\n", Private->ControllerData->Ssvid));
|
||||
DEBUG ((DEBUG_INFO, " SN : %a\n", Sn));
|
||||
DEBUG ((DEBUG_INFO, " MN : %a\n", Mn));
|
||||
DEBUG ((DEBUG_INFO, " FR : 0x%x\n", *((UINT64*)Private->ControllerData->Fr)));
|
||||
DEBUG ((DEBUG_INFO, " TNVMCAP (high 8-byte) : 0x%lx\n", *((UINT64*)(Private->ControllerData->Tnvmcap + 8))));
|
||||
DEBUG ((DEBUG_INFO, " TNVMCAP (low 8-byte) : 0x%lx\n", *((UINT64*)Private->ControllerData->Tnvmcap)));
|
||||
DEBUG ((DEBUG_INFO, " SN : %a\n", Sn));
|
||||
DEBUG ((DEBUG_INFO, " MN : %a\n", Mn));
|
||||
DEBUG ((DEBUG_INFO, " FR : 0x%x\n", *((UINT64 *)Private->ControllerData->Fr)));
|
||||
DEBUG ((DEBUG_INFO, " TNVMCAP (high 8-byte) : 0x%lx\n", *((UINT64 *)(Private->ControllerData->Tnvmcap + 8))));
|
||||
DEBUG ((DEBUG_INFO, " TNVMCAP (low 8-byte) : 0x%lx\n", *((UINT64 *)Private->ControllerData->Tnvmcap)));
|
||||
DEBUG ((DEBUG_INFO, " RAB : 0x%x\n", Private->ControllerData->Rab));
|
||||
DEBUG ((DEBUG_INFO, " IEEE : 0x%x\n", *(UINT32*)Private->ControllerData->Ieee_oui));
|
||||
DEBUG ((DEBUG_INFO, " IEEE : 0x%x\n", *(UINT32 *)Private->ControllerData->Ieee_oui));
|
||||
DEBUG ((DEBUG_INFO, " AERL : 0x%x\n", Private->ControllerData->Aerl));
|
||||
DEBUG ((DEBUG_INFO, " SQES : 0x%x\n", Private->ControllerData->Sqes));
|
||||
DEBUG ((DEBUG_INFO, " CQES : 0x%x\n", Private->ControllerData->Cqes));
|
||||
@@ -945,8 +941,8 @@ NvmeControllerInit (
|
||||
// One for blocking I/O, one for non-blocking I/O.
|
||||
//
|
||||
Status = NvmeCreateIoCompletionQueue (Private);
|
||||
if (EFI_ERROR(Status)) {
|
||||
return Status;
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -976,24 +972,24 @@ NvmeControllerInit (
|
||||
VOID
|
||||
EFIAPI
|
||||
NvmeShutdownAllControllers (
|
||||
IN EFI_RESET_TYPE ResetType,
|
||||
IN EFI_STATUS ResetStatus,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *ResetData OPTIONAL
|
||||
IN EFI_RESET_TYPE ResetType,
|
||||
IN EFI_STATUS ResetStatus,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *ResetData OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *Handles;
|
||||
UINTN HandleCount;
|
||||
UINTN HandleIndex;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfos;
|
||||
UINTN OpenInfoCount;
|
||||
UINTN OpenInfoIndex;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *NvmePassThru;
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
UINTN Index;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *Handles;
|
||||
UINTN HandleCount;
|
||||
UINTN HandleIndex;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfos;
|
||||
UINTN OpenInfoCount;
|
||||
UINTN OpenInfoIndex;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *NvmePassThru;
|
||||
NVME_CC Cc;
|
||||
NVME_CSTS Csts;
|
||||
UINTN Index;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
@@ -1023,11 +1019,12 @@ NvmeShutdownAllControllers (
|
||||
// gImageHandle equals to DriverBinding handle for this driver.
|
||||
//
|
||||
if (((OpenInfos[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) &&
|
||||
(OpenInfos[OpenInfoIndex].AgentHandle == gImageHandle)) {
|
||||
(OpenInfos[OpenInfoIndex].AgentHandle == gImageHandle))
|
||||
{
|
||||
Status = gBS->OpenProtocol (
|
||||
OpenInfos[OpenInfoIndex].ControllerHandle,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &NvmePassThru,
|
||||
(VOID **)&NvmePassThru,
|
||||
NULL,
|
||||
NULL,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1035,22 +1032,24 @@ NvmeShutdownAllControllers (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (NvmePassThru);
|
||||
|
||||
//
|
||||
// Read Controller Configuration Register.
|
||||
//
|
||||
Status = ReadNvmeControllerConfiguration (Private, &Cc);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// The host should set the Shutdown Notification (CC.SHN) field to 01b
|
||||
// to indicate a normal shutdown operation.
|
||||
//
|
||||
Cc.Shn = NVME_CC_SHN_NORMAL_SHUTDOWN;
|
||||
Status = WriteNvmeControllerConfiguration (Private, &Cc);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1061,10 +1060,11 @@ NvmeShutdownAllControllers (
|
||||
//
|
||||
for (Index = 0; Index < NVME_SHUTDOWN_PROCESS_TIMEOUT * 100; Index++) {
|
||||
Status = ReadNvmeControllerStatus (Private, &Csts);
|
||||
if (!EFI_ERROR(Status) && (Csts.Shst == NVME_CSTS_SHST_SHUTDOWN_COMPLETED)) {
|
||||
DEBUG((DEBUG_INFO, "NvmeShutdownController: shutdown processing is completed after %dms.\n", Index * 10));
|
||||
if (!EFI_ERROR (Status) && (Csts.Shst == NVME_CSTS_SHST_SHUTDOWN_COMPLETED)) {
|
||||
DEBUG ((DEBUG_INFO, "NvmeShutdownController: shutdown processing is completed after %dms.\n", Index * 10));
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Stall for 10ms
|
||||
//
|
||||
@@ -1072,7 +1072,7 @@ NvmeShutdownAllControllers (
|
||||
}
|
||||
|
||||
if (Index == NVME_SHUTDOWN_PROCESS_TIMEOUT * 100) {
|
||||
DEBUG((DEBUG_ERROR, "NvmeShutdownController: shutdown processing is timed out\n"));
|
||||
DEBUG ((DEBUG_ERROR, "NvmeShutdownController: shutdown processing is timed out\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1089,12 +1089,12 @@ NvmeRegisterShutdownNotification (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_RESET_NOTIFICATION_PROTOCOL *ResetNotify;
|
||||
EFI_STATUS Status;
|
||||
EFI_RESET_NOTIFICATION_PROTOCOL *ResetNotify;
|
||||
|
||||
mNvmeControllerNumber++;
|
||||
if (mNvmeControllerNumber == 1) {
|
||||
Status = gBS->LocateProtocol (&gEfiResetNotificationProtocolGuid, NULL, (VOID **) &ResetNotify);
|
||||
Status = gBS->LocateProtocol (&gEfiResetNotificationProtocolGuid, NULL, (VOID **)&ResetNotify);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = ResetNotify->RegisterResetNotify (ResetNotify, NvmeShutdownAllControllers);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@@ -1114,12 +1114,12 @@ NvmeUnregisterShutdownNotification (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_RESET_NOTIFICATION_PROTOCOL *ResetNotify;
|
||||
EFI_STATUS Status;
|
||||
EFI_RESET_NOTIFICATION_PROTOCOL *ResetNotify;
|
||||
|
||||
mNvmeControllerNumber--;
|
||||
if (mNvmeControllerNumber == 0) {
|
||||
Status = gBS->LocateProtocol (&gEfiResetNotificationProtocolGuid, NULL, (VOID **) &ResetNotify);
|
||||
Status = gBS->LocateProtocol (&gEfiResetNotificationProtocolGuid, NULL, (VOID **)&ResetNotify);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = ResetNotify->UnregisterResetNotify (ResetNotify, NvmeShutdownAllControllers);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
@@ -11,12 +11,12 @@
|
||||
#ifndef _NVME_HCI_H_
|
||||
#define _NVME_HCI_H_
|
||||
|
||||
#define NVME_BAR 0
|
||||
#define NVME_BAR 0
|
||||
|
||||
//
|
||||
// Offset from the beginning of private data queue buffer
|
||||
//
|
||||
#define NVME_ASQ_BUF_OFFSET EFI_PAGE_SIZE
|
||||
#define NVME_ASQ_BUF_OFFSET EFI_PAGE_SIZE
|
||||
|
||||
/**
|
||||
Initialize the Nvm Express controller.
|
||||
@@ -29,7 +29,7 @@
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeControllerInit (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -44,8 +44,8 @@ NvmeControllerInit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeIdentifyController (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN VOID *Buffer
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -61,10 +61,9 @@ NvmeIdentifyController (
|
||||
**/
|
||||
EFI_STATUS
|
||||
NvmeIdentifyNamespace (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT32 NamespaceId,
|
||||
IN VOID *Buffer
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT32 NamespaceId,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -18,7 +18,7 @@
|
||||
**/
|
||||
VOID
|
||||
NvmeDumpStatus (
|
||||
IN NVME_CQ *Cq
|
||||
IN NVME_CQ *Cq
|
||||
)
|
||||
{
|
||||
DEBUG ((DEBUG_VERBOSE, "Dump NVMe Completion Entry Status from [0x%x]:\n", Cq));
|
||||
@@ -97,6 +97,7 @@ NvmeDumpStatus (
|
||||
DEBUG ((DEBUG_VERBOSE, "Reservation Conflict\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0x1:
|
||||
@@ -159,6 +160,7 @@ NvmeDumpStatus (
|
||||
DEBUG ((DEBUG_VERBOSE, "Attempted Write to Read Only Range\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0x2:
|
||||
@@ -185,6 +187,7 @@ NvmeDumpStatus (
|
||||
DEBUG ((DEBUG_VERBOSE, "Access Denied\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -206,24 +209,24 @@ NvmeDumpStatus (
|
||||
@retval The pointer to the first PRP List of the PRP lists.
|
||||
|
||||
**/
|
||||
VOID*
|
||||
VOID *
|
||||
NvmeCreatePrpList (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_PHYSICAL_ADDRESS PhysicalAddr,
|
||||
IN UINTN Pages,
|
||||
OUT VOID **PrpListHost,
|
||||
IN OUT UINTN *PrpListNo,
|
||||
OUT VOID **Mapping
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_PHYSICAL_ADDRESS PhysicalAddr,
|
||||
IN UINTN Pages,
|
||||
OUT VOID **PrpListHost,
|
||||
IN OUT UINTN *PrpListNo,
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
UINTN PrpEntryNo;
|
||||
UINT64 PrpListBase;
|
||||
UINTN PrpListIndex;
|
||||
UINTN PrpEntryIndex;
|
||||
UINT64 Remainder;
|
||||
EFI_PHYSICAL_ADDRESS PrpListPhyAddr;
|
||||
UINTN Bytes;
|
||||
EFI_STATUS Status;
|
||||
UINTN PrpEntryNo;
|
||||
UINT64 PrpListBase;
|
||||
UINTN PrpListIndex;
|
||||
UINTN PrpEntryIndex;
|
||||
UINT64 Remainder;
|
||||
EFI_PHYSICAL_ADDRESS PrpListPhyAddr;
|
||||
UINTN Bytes;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// The number of Prp Entry in a memory page.
|
||||
@@ -257,7 +260,7 @@ NvmeCreatePrpList (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Bytes = EFI_PAGES_TO_SIZE (*PrpListNo);
|
||||
Bytes = EFI_PAGES_TO_SIZE (*PrpListNo);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
EfiPciIoOperationBusMasterCommonBuffer,
|
||||
@@ -271,45 +274,46 @@ NvmeCreatePrpList (
|
||||
DEBUG ((DEBUG_ERROR, "NvmeCreatePrpList: create PrpList failure!\n"));
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
//
|
||||
// Fill all PRP lists except of last one.
|
||||
//
|
||||
ZeroMem (*PrpListHost, Bytes);
|
||||
for (PrpListIndex = 0; PrpListIndex < *PrpListNo - 1; ++PrpListIndex) {
|
||||
PrpListBase = *(UINT64*)PrpListHost + PrpListIndex * EFI_PAGE_SIZE;
|
||||
PrpListBase = *(UINT64 *)PrpListHost + PrpListIndex * EFI_PAGE_SIZE;
|
||||
|
||||
for (PrpEntryIndex = 0; PrpEntryIndex < PrpEntryNo; ++PrpEntryIndex) {
|
||||
if (PrpEntryIndex != PrpEntryNo - 1) {
|
||||
//
|
||||
// Fill all PRP entries except of last one.
|
||||
//
|
||||
*((UINT64*)(UINTN)PrpListBase + PrpEntryIndex) = PhysicalAddr;
|
||||
PhysicalAddr += EFI_PAGE_SIZE;
|
||||
*((UINT64 *)(UINTN)PrpListBase + PrpEntryIndex) = PhysicalAddr;
|
||||
PhysicalAddr += EFI_PAGE_SIZE;
|
||||
} else {
|
||||
//
|
||||
// Fill last PRP entries with next PRP List pointer.
|
||||
//
|
||||
*((UINT64*)(UINTN)PrpListBase + PrpEntryIndex) = PrpListPhyAddr + (PrpListIndex + 1) * EFI_PAGE_SIZE;
|
||||
*((UINT64 *)(UINTN)PrpListBase + PrpEntryIndex) = PrpListPhyAddr + (PrpListIndex + 1) * EFI_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Fill last PRP list.
|
||||
//
|
||||
PrpListBase = *(UINT64*)PrpListHost + PrpListIndex * EFI_PAGE_SIZE;
|
||||
PrpListBase = *(UINT64 *)PrpListHost + PrpListIndex * EFI_PAGE_SIZE;
|
||||
for (PrpEntryIndex = 0; PrpEntryIndex < Remainder; ++PrpEntryIndex) {
|
||||
*((UINT64*)(UINTN)PrpListBase + PrpEntryIndex) = PhysicalAddr;
|
||||
PhysicalAddr += EFI_PAGE_SIZE;
|
||||
*((UINT64 *)(UINTN)PrpListBase + PrpEntryIndex) = PhysicalAddr;
|
||||
PhysicalAddr += EFI_PAGE_SIZE;
|
||||
}
|
||||
|
||||
return (VOID*)(UINTN)PrpListPhyAddr;
|
||||
return (VOID *)(UINTN)PrpListPhyAddr;
|
||||
|
||||
EXIT:
|
||||
PciIo->FreeBuffer (PciIo, *PrpListNo, *PrpListHost);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Aborts the asynchronous PassThru requests.
|
||||
|
||||
@@ -322,18 +326,18 @@ EXIT:
|
||||
**/
|
||||
EFI_STATUS
|
||||
AbortAsyncPassThruTasks (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
|
||||
PciIo = Private->PciIo;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
@@ -343,7 +347,8 @@ AbortAsyncPassThruTasks (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->UnsubmittedSubtasks);
|
||||
!IsNull (&Private->UnsubmittedSubtasks, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->UnsubmittedSubtasks, Link);
|
||||
Subtask = NVME_BLKIO2_SUBTASK_FROM_LINK (Link);
|
||||
BlkIo2Request = Subtask->BlockIo2Request;
|
||||
@@ -353,6 +358,7 @@ AbortAsyncPassThruTasks (
|
||||
if (Subtask->IsLast) {
|
||||
BlkIo2Request->LastSubtaskSubmitted = TRUE;
|
||||
}
|
||||
|
||||
Token->TransactionStatus = EFI_ABORTED;
|
||||
|
||||
RemoveEntryList (Link);
|
||||
@@ -365,19 +371,23 @@ AbortAsyncPassThruTasks (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->AsyncPassThruQueue);
|
||||
!IsNull (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink) {
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
AsyncRequest = NVME_PASS_THRU_ASYNC_REQ_FROM_THIS (Link);
|
||||
|
||||
if (AsyncRequest->MapData != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapData);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapMeta != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapMeta);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapPrpList != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapPrpList);
|
||||
}
|
||||
|
||||
if (AsyncRequest->PrpListHost != NULL) {
|
||||
PciIo->FreeBuffer (
|
||||
PciIo,
|
||||
@@ -392,7 +402,8 @@ AbortAsyncPassThruTasks (
|
||||
}
|
||||
|
||||
if (IsListEmpty (&Private->AsyncPassThruQueue) &&
|
||||
IsListEmpty (&Private->UnsubmittedSubtasks)) {
|
||||
IsListEmpty (&Private->UnsubmittedSubtasks))
|
||||
{
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
@@ -403,7 +414,6 @@ AbortAsyncPassThruTasks (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports
|
||||
both blocking I/O and non-blocking I/O. The blocking I/O functionality is required, and the non-blocking
|
||||
@@ -439,10 +449,10 @@ AbortAsyncPassThruTasks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressPassThru (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
)
|
||||
{
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
@@ -483,7 +493,7 @@ NvmExpressPassThru (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (Packet->QueueType != NVME_ADMIN_QUEUE && Packet->QueueType != NVME_IO_QUEUE) {
|
||||
if ((Packet->QueueType != NVME_ADMIN_QUEUE) && (Packet->QueueType != NVME_IO_QUEUE)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -492,31 +502,33 @@ NvmExpressPassThru (
|
||||
// EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL set is an illegal
|
||||
// configuration.
|
||||
//
|
||||
Attributes = This->Mode->Attributes;
|
||||
Attributes = This->Mode->Attributes;
|
||||
if ((Attributes & (EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL)) == 0) {
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL)) == 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Buffer alignment check for TransferBuffer & MetadataBuffer.
|
||||
//
|
||||
IoAlign = This->Mode->IoAlign;
|
||||
if (IoAlign > 0 && (((UINTN) Packet->TransferBuffer & (IoAlign - 1)) != 0)) {
|
||||
IoAlign = This->Mode->IoAlign;
|
||||
if ((IoAlign > 0) && (((UINTN)Packet->TransferBuffer & (IoAlign - 1)) != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (IoAlign > 0 && (((UINTN) Packet->MetadataBuffer & (IoAlign - 1)) != 0)) {
|
||||
if ((IoAlign > 0) && (((UINTN)Packet->MetadataBuffer & (IoAlign - 1)) != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);
|
||||
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);
|
||||
|
||||
//
|
||||
// Check NamespaceId is valid or not.
|
||||
//
|
||||
if ((NamespaceId > Private->ControllerData->Nn) &&
|
||||
(NamespaceId != (UINT32) -1)) {
|
||||
(NamespaceId != (UINT32)-1))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -555,13 +567,15 @@ NvmExpressPassThru (
|
||||
// Submission queue full check.
|
||||
//
|
||||
if ((Private->SqTdbl[QueueId].Sqt + 1) % QueueSize ==
|
||||
Private->AsyncSqHead) {
|
||||
Private->AsyncSqHead)
|
||||
{
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
}
|
||||
}
|
||||
Sq = Private->SqBuffer[QueueId] + Private->SqTdbl[QueueId].Sqt;
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
|
||||
Sq = Private->SqBuffer[QueueId] + Private->SqTdbl[QueueId].Sqt;
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
|
||||
if (Packet->NvmeCmd->Nsid != NamespaceId) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -584,7 +598,8 @@ NvmExpressPassThru (
|
||||
|
||||
Sq->Prp[0] = (UINT64)(UINTN)Packet->TransferBuffer;
|
||||
if ((Packet->QueueType == NVME_ADMIN_QUEUE) &&
|
||||
((Sq->Opc == NVME_ADMIN_CRIOCQ_CMD) || (Sq->Opc == NVME_ADMIN_CRIOSQ_CMD))) {
|
||||
((Sq->Opc == NVME_ADMIN_CRIOCQ_CMD) || (Sq->Opc == NVME_ADMIN_CRIOSQ_CMD)))
|
||||
{
|
||||
//
|
||||
// Currently, we only use the IO Completion/Submission queues created internally
|
||||
// by this driver during controller initialization. Any other IO queues created
|
||||
@@ -601,7 +616,8 @@ NvmExpressPassThru (
|
||||
// If the NVMe cmd has data in or out, then mapping the user buffer to the PCI controller specific addresses.
|
||||
//
|
||||
if (((Packet->TransferLength != 0) && (Packet->TransferBuffer == NULL)) ||
|
||||
((Packet->TransferLength == 0) && (Packet->TransferBuffer != NULL))) {
|
||||
((Packet->TransferLength == 0) && (Packet->TransferBuffer != NULL)))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -613,14 +629,14 @@ NvmExpressPassThru (
|
||||
|
||||
if ((Packet->TransferLength != 0) && (Packet->TransferBuffer != NULL)) {
|
||||
MapLength = Packet->TransferLength;
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
Flag,
|
||||
Packet->TransferBuffer,
|
||||
&MapLength,
|
||||
&PhyAddr,
|
||||
&MapData
|
||||
);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
Flag,
|
||||
Packet->TransferBuffer,
|
||||
&MapLength,
|
||||
&PhyAddr,
|
||||
&MapData
|
||||
);
|
||||
if (EFI_ERROR (Status) || (Packet->TransferLength != MapLength)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@@ -629,16 +645,16 @@ NvmExpressPassThru (
|
||||
Sq->Prp[1] = 0;
|
||||
}
|
||||
|
||||
if((Packet->MetadataLength != 0) && (Packet->MetadataBuffer != NULL)) {
|
||||
if ((Packet->MetadataLength != 0) && (Packet->MetadataBuffer != NULL)) {
|
||||
MapLength = Packet->MetadataLength;
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
Flag,
|
||||
Packet->MetadataBuffer,
|
||||
&MapLength,
|
||||
&PhyAddr,
|
||||
&MapMeta
|
||||
);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
Flag,
|
||||
Packet->MetadataBuffer,
|
||||
&MapLength,
|
||||
&PhyAddr,
|
||||
&MapMeta
|
||||
);
|
||||
if (EFI_ERROR (Status) || (Packet->MetadataLength != MapLength)) {
|
||||
PciIo->Unmap (
|
||||
PciIo,
|
||||
@@ -647,9 +663,11 @@ NvmExpressPassThru (
|
||||
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Sq->Mptr = PhyAddr;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If the buffer size spans more than two memory pages (page size as defined in CC.Mps),
|
||||
// then build a PRP list in the second PRP submission queue entry.
|
||||
@@ -662,7 +680,7 @@ NvmExpressPassThru (
|
||||
// Create PrpList for remaining data buffer.
|
||||
//
|
||||
PhyAddr = (Sq->Prp[0] + EFI_PAGE_SIZE) & ~(EFI_PAGE_SIZE - 1);
|
||||
Prp = NvmeCreatePrpList (PciIo, PhyAddr, EFI_SIZE_TO_PAGES(Offset + Bytes) - 1, &PrpListHost, &PrpListNo, &MapPrpList);
|
||||
Prp = NvmeCreatePrpList (PciIo, PhyAddr, EFI_SIZE_TO_PAGES (Offset + Bytes) - 1, &PrpListHost, &PrpListNo, &MapPrpList);
|
||||
if (Prp == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto EXIT;
|
||||
@@ -673,28 +691,35 @@ NvmExpressPassThru (
|
||||
Sq->Prp[1] = (Sq->Prp[0] + EFI_PAGE_SIZE) & ~(EFI_PAGE_SIZE - 1);
|
||||
}
|
||||
|
||||
if(Packet->NvmeCmd->Flags & CDW2_VALID) {
|
||||
if (Packet->NvmeCmd->Flags & CDW2_VALID) {
|
||||
Sq->Rsvd2 = (UINT64)Packet->NvmeCmd->Cdw2;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW3_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW3_VALID) {
|
||||
Sq->Rsvd2 |= LShiftU64 ((UINT64)Packet->NvmeCmd->Cdw3, 32);
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW10_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW10_VALID) {
|
||||
Sq->Payload.Raw.Cdw10 = Packet->NvmeCmd->Cdw10;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW11_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW11_VALID) {
|
||||
Sq->Payload.Raw.Cdw11 = Packet->NvmeCmd->Cdw11;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW12_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW12_VALID) {
|
||||
Sq->Payload.Raw.Cdw12 = Packet->NvmeCmd->Cdw12;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW13_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW13_VALID) {
|
||||
Sq->Payload.Raw.Cdw13 = Packet->NvmeCmd->Cdw13;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW14_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW14_VALID) {
|
||||
Sq->Payload.Raw.Cdw14 = Packet->NvmeCmd->Cdw14;
|
||||
}
|
||||
if(Packet->NvmeCmd->Flags & CDW15_VALID) {
|
||||
|
||||
if (Packet->NvmeCmd->Flags & CDW15_VALID) {
|
||||
Sq->Payload.Raw.Cdw15 = Packet->NvmeCmd->Cdw15;
|
||||
}
|
||||
|
||||
@@ -707,15 +732,16 @@ NvmExpressPassThru (
|
||||
} else {
|
||||
Private->SqTdbl[QueueId].Sqt ^= 1;
|
||||
}
|
||||
Data = ReadUnaligned32 ((UINT32*)&Private->SqTdbl[QueueId]);
|
||||
|
||||
Data = ReadUnaligned32 ((UINT32 *)&Private->SqTdbl[QueueId]);
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_SQTDBL_OFFSET(QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_SQTDBL_OFFSET (QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto EXIT;
|
||||
@@ -732,15 +758,15 @@ NvmExpressPassThru (
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
AsyncRequest->Signature = NVME_PASS_THRU_ASYNC_REQ_SIG;
|
||||
AsyncRequest->Packet = Packet;
|
||||
AsyncRequest->CommandId = Sq->Cid;
|
||||
AsyncRequest->CallerEvent = Event;
|
||||
AsyncRequest->MapData = MapData;
|
||||
AsyncRequest->MapMeta = MapMeta;
|
||||
AsyncRequest->MapPrpList = MapPrpList;
|
||||
AsyncRequest->PrpListNo = PrpListNo;
|
||||
AsyncRequest->PrpListHost = PrpListHost;
|
||||
AsyncRequest->Signature = NVME_PASS_THRU_ASYNC_REQ_SIG;
|
||||
AsyncRequest->Packet = Packet;
|
||||
AsyncRequest->CommandId = Sq->Cid;
|
||||
AsyncRequest->CallerEvent = Event;
|
||||
AsyncRequest->MapData = MapData;
|
||||
AsyncRequest->MapMeta = MapMeta;
|
||||
AsyncRequest->MapPrpList = MapPrpList;
|
||||
AsyncRequest->PrpListNo = PrpListNo;
|
||||
AsyncRequest->PrpListHost = PrpListHost;
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Private->AsyncPassThruQueue, &AsyncRequest->Link);
|
||||
@@ -760,9 +786,9 @@ NvmExpressPassThru (
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
Status = gBS->SetTimer(TimerEvent, TimerRelative, Packet->CommandTimeout);
|
||||
Status = gBS->SetTimer (TimerEvent, TimerRelative, Packet->CommandTimeout);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
@@ -788,14 +814,15 @@ NvmExpressPassThru (
|
||||
//
|
||||
// Dump every completion entry status for debugging.
|
||||
//
|
||||
DEBUG_CODE_BEGIN();
|
||||
NvmeDumpStatus(Cq);
|
||||
DEBUG_CODE_END();
|
||||
DEBUG_CODE_BEGIN ();
|
||||
NvmeDumpStatus (Cq);
|
||||
DEBUG_CODE_END ();
|
||||
}
|
||||
|
||||
//
|
||||
// Copy the Respose Queue entry for this command to the callers response buffer
|
||||
//
|
||||
CopyMem(Packet->NvmeCompletion, Cq, sizeof(EFI_NVM_EXPRESS_COMPLETION));
|
||||
CopyMem (Packet->NvmeCompletion, Cq, sizeof (EFI_NVM_EXPRESS_COMPLETION));
|
||||
} else {
|
||||
//
|
||||
// Timeout occurs for an NVMe command. Reset the controller to abort the
|
||||
@@ -840,16 +867,16 @@ NvmExpressPassThru (
|
||||
Private->Pt[QueueId] ^= 1;
|
||||
}
|
||||
|
||||
Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[QueueId]);
|
||||
Data = ReadUnaligned32 ((UINT32 *)&Private->CqHdbl[QueueId]);
|
||||
PreviousStatus = Status;
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_CQHDBL_OFFSET(QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
Status = PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_CQHDBL_OFFSET (QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
// The return status of PciIo->Mem.Write should not override
|
||||
// previous status if previous status contains error.
|
||||
Status = EFI_ERROR (PreviousStatus) ? PreviousStatus : Status;
|
||||
@@ -892,6 +919,7 @@ EXIT:
|
||||
if (TimerEvent != NULL) {
|
||||
gBS->CloseEvent (TimerEvent);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -931,14 +959,14 @@ EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNextNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
)
|
||||
{
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
UINT32 NextNamespaceId;
|
||||
EFI_STATUS Status;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
UINT32 NextNamespaceId;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if ((This == NULL) || (NamespaceId == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -966,7 +994,7 @@ NvmExpressGetNextNamespace (
|
||||
}
|
||||
|
||||
Status = NvmeIdentifyNamespace (Private, NextNamespaceId, NamespaceData);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@@ -990,7 +1018,7 @@ NvmExpressGetNextNamespace (
|
||||
}
|
||||
|
||||
Status = NvmeIdentifyNamespace (Private, NextNamespaceId, NamespaceData);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@@ -999,7 +1027,7 @@ NvmExpressGetNextNamespace (
|
||||
|
||||
Done:
|
||||
if (NamespaceData != NULL) {
|
||||
FreePool(NamespaceData);
|
||||
FreePool (NamespaceData);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -1032,13 +1060,13 @@ Done:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
)
|
||||
{
|
||||
NVME_NAMESPACE_DEVICE_PATH *Node;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
NVME_NAMESPACE_DEVICE_PATH *Node;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
|
||||
if ((This == NULL) || (DevicePath == NULL) || (NamespaceId == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -1052,7 +1080,7 @@ NvmExpressGetNamespace (
|
||||
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);
|
||||
|
||||
if (DevicePath->SubType == MSG_NVME_NAMESPACE_DP) {
|
||||
if (DevicePathNodeLength(DevicePath) != sizeof(NVME_NAMESPACE_DEVICE_PATH)) {
|
||||
if (DevicePathNodeLength (DevicePath) != sizeof (NVME_NAMESPACE_DEVICE_PATH)) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -1060,7 +1088,8 @@ NvmExpressGetNamespace (
|
||||
// Check NamespaceId in the device path node is valid or not.
|
||||
//
|
||||
if ((Node->NamespaceId == 0) ||
|
||||
(Node->NamespaceId > Private->ControllerData->Nn)) {
|
||||
(Node->NamespaceId > Private->ControllerData->Nn))
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -1106,15 +1135,15 @@ NvmExpressGetNamespace (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressBuildDevicePath (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
)
|
||||
{
|
||||
NVME_NAMESPACE_DEVICE_PATH *Node;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
NVME_NAMESPACE_DEVICE_PATH *Node;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
|
||||
//
|
||||
// Validate parameters
|
||||
@@ -1130,7 +1159,8 @@ NvmExpressBuildDevicePath (
|
||||
// Check NamespaceId is valid or not.
|
||||
//
|
||||
if ((NamespaceId == 0) ||
|
||||
(NamespaceId > Private->ControllerData->Nn)) {
|
||||
(NamespaceId > Private->ControllerData->Nn))
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -1142,14 +1172,14 @@ NvmExpressBuildDevicePath (
|
||||
Node->Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node->Header.SubType = MSG_NVME_NAMESPACE_DP;
|
||||
SetDevicePathNodeLength (&Node->Header, sizeof (NVME_NAMESPACE_DEVICE_PATH));
|
||||
Node->NamespaceId = NamespaceId;
|
||||
Node->NamespaceId = NamespaceId;
|
||||
|
||||
//
|
||||
// Allocate a buffer for Identify Namespace data.
|
||||
//
|
||||
NamespaceData = NULL;
|
||||
NamespaceData = AllocateZeroPool(sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if(NamespaceData == NULL) {
|
||||
NamespaceData = AllocateZeroPool (sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if (NamespaceData == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Exit;
|
||||
}
|
||||
@@ -1163,7 +1193,7 @@ NvmExpressBuildDevicePath (
|
||||
(VOID *)NamespaceData
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@@ -1172,7 +1202,7 @@ NvmExpressBuildDevicePath (
|
||||
*DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)Node;
|
||||
|
||||
Exit:
|
||||
if(NamespaceData != NULL) {
|
||||
if (NamespaceData != NULL) {
|
||||
FreePool (NamespaceData);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user