NULL\r
};\r
\r
+EFI_PEI_PPI_DESCRIPTOR mNvmePassThruPpiListTemplate = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEdkiiPeiNvmExpressPassThruPpiGuid,\r
+ NULL\r
+};\r
+\r
EFI_PEI_NOTIFY_DESCRIPTOR mNvmeEndOfPeiNotifyListTemplate = {\r
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiEndOfPeiSignalPpiGuid,\r
Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;\r
PeiServicesInstallPpi (&Private->BlkIoPpiList);\r
\r
+ //\r
+ // Nvm Express Pass Thru PPI\r
+ //\r
+ Private->PassThruMode.Attributes = EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |\r
+ EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |\r
+ EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;\r
+ Private->PassThruMode.IoAlign = sizeof (UINTN);\r
+ Private->PassThruMode.NvmeVersion = EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;\r
+ Private->NvmePassThruPpi.Mode = &Private->PassThruMode;\r
+ Private->NvmePassThruPpi.GetDevicePath = NvmePassThruGetDevicePath;\r
+ Private->NvmePassThruPpi.GetNextNameSpace = NvmePassThruGetNextNameSpace;\r
+ Private->NvmePassThruPpi.PassThru = NvmePassThru;\r
+ CopyMem (\r
+ &Private->NvmePassThruPpiList,\r
+ &mNvmePassThruPpiListTemplate,\r
+ sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
+ );\r
+ Private->NvmePassThruPpiList.Ppi = &Private->NvmePassThruPpi;\r
+ PeiServicesInstallPpi (&Private->NvmePassThruPpiList);\r
+\r
//\r
// Check if the NVME controller supports the Security Receive/Send commands\r
//\r
#include <Ppi/BlockIo.h>\r
#include <Ppi/BlockIo2.h>\r
#include <Ppi/StorageSecurityCommand.h>\r
+#include <Ppi/NvmExpressPassThru.h>\r
#include <Ppi/IoMmu.h>\r
#include <Ppi/EndOfPeiPhase.h>\r
\r
PEI_NVME_CONTROLLER_PRIVATE_DATA *Controller;\r
};\r
\r
+#define NVME_CONTROLLER_NSID 0\r
+\r
//\r
// Unique signature for private data structure.\r
//\r
struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {\r
UINT32 Signature;\r
UINTN MmioBase;\r
+ EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;\r
UINTN DevicePathLength;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
EFI_PEI_RECOVERY_BLOCK_IO_PPI BlkIoPpi;\r
EFI_PEI_RECOVERY_BLOCK_IO2_PPI BlkIo2Ppi;\r
EDKII_PEI_STORAGE_SECURITY_CMD_PPI StorageSecurityPpi;\r
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI NvmePassThruPpi;\r
EFI_PEI_PPI_DESCRIPTOR BlkIoPpiList;\r
EFI_PEI_PPI_DESCRIPTOR BlkIo2PpiList;\r
EFI_PEI_PPI_DESCRIPTOR StorageSecurityPpiList;\r
+ EFI_PEI_PPI_DESCRIPTOR NvmePassThruPpiList;\r
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;\r
\r
//\r
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, BlkIo2Ppi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)\r
#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY(a) \\r
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, StorageSecurityPpi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)\r
+#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU(a) \\r
+ CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, NvmePassThruPpi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)\r
#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) \\r
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)\r
\r
gEdkiiPeiNvmExpressHostControllerPpiGuid ## CONSUMES\r
gEdkiiIoMmuPpiGuid ## CONSUMES\r
gEfiEndOfPeiSignalPpiGuid ## CONSUMES\r
+ gEdkiiPeiNvmExpressPassThruPpiGuid ## SOMETIMES_PRODUCES\r
gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_PRODUCES\r
gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_PRODUCES\r
gEdkiiPeiStorageSecurityCommandPpiGuid ## SOMETIMES_PRODUCES\r
The NvmExpressPei driver is used to manage non-volatile memory subsystem\r
which follows NVM Express specification at PEI phase.\r
\r
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
UINT32 BlockSize;\r
PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;\r
UINT32 Bytes;\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;\r
\r
Private = NamespaceInfo->Controller;\r
+ NvmePassThru = &Private->NvmePassThruPpi;\r
BlockSize = NamespaceInfo->Media.BlockSize;\r
Bytes = Blocks * BlockSize;\r
\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
\r
CommandPacket.NvmeCmd = &Command;\r
CommandPacket.NvmeCompletion = &Completion;\r
\r
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID;\r
\r
- Status = NvmePassThru (\r
- Private,\r
- NamespaceInfo->NamespaceId,\r
- &CommandPacket\r
- );\r
+ Status = NvmePassThru->PassThru (\r
+ NvmePassThru,\r
+ NamespaceInfo->NamespaceId,\r
+ &CommandPacket\r
+ );\r
+\r
return Status;\r
}\r
\r
IN VOID *Buffer\r
)\r
{\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
- EFI_STATUS Status;\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_STATUS Status;\r
\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
\r
Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_CMD;\r
//\r
CommandPacket.NvmeCmd->Cdw10 = 1;\r
CommandPacket.NvmeCmd->Flags = CDW10_VALID;\r
\r
- Status = NvmePassThru (\r
+ Status = NvmePassThruExecute (\r
Private,\r
NVME_CONTROLLER_NSID,\r
&CommandPacket\r
IN VOID *Buffer\r
)\r
{\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
- EFI_STATUS Status;\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_STATUS Status;\r
\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
\r
Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_CMD;\r
Command.Nsid = NamespaceId;\r
CommandPacket.NvmeCmd->Cdw10 = 0;\r
CommandPacket.NvmeCmd->Flags = CDW10_VALID;\r
\r
- Status = NvmePassThru (\r
+ Status = NvmePassThruExecute (\r
Private,\r
NamespaceId,\r
&CommandPacket\r
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private\r
)\r
{\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
- EFI_STATUS Status;\r
- NVME_ADMIN_CRIOCQ CrIoCq;\r
-\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_STATUS Status;\r
+ NVME_ADMIN_CRIOCQ CrIoCq;\r
+\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
ZeroMem (&CrIoCq, sizeof(NVME_ADMIN_CRIOCQ));\r
\r
CommandPacket.NvmeCmd = &Command;\r
CommandPacket.NvmeCompletion = &Completion;\r
\r
Command.Cdw0.Opcode = NVME_ADMIN_CRIOCQ_CMD;\r
- Command.Cdw0.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;\r
CommandPacket.TransferBuffer = Private->CqBuffer[NVME_IO_QUEUE];\r
CommandPacket.TransferLength = EFI_PAGE_SIZE;\r
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;\r
CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoCq, sizeof (NVME_ADMIN_CRIOCQ));\r
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;\r
\r
- Status = NvmePassThru (\r
+ Status = NvmePassThruExecute (\r
Private,\r
NVME_CONTROLLER_NSID,\r
&CommandPacket\r
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private\r
)\r
{\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
- EFI_STATUS Status;\r
- NVME_ADMIN_CRIOSQ CrIoSq;\r
-\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_STATUS Status;\r
+ NVME_ADMIN_CRIOSQ CrIoSq;\r
+\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
ZeroMem (&CrIoSq, sizeof(NVME_ADMIN_CRIOSQ));\r
\r
CommandPacket.NvmeCmd = &Command;\r
CommandPacket.NvmeCompletion = &Completion;\r
\r
Command.Cdw0.Opcode = NVME_ADMIN_CRIOSQ_CMD;\r
- Command.Cdw0.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;\r
CommandPacket.TransferBuffer = Private->SqBuffer[NVME_IO_QUEUE];\r
CommandPacket.TransferLength = EFI_PAGE_SIZE;\r
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;\r
CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoSq, sizeof (NVME_ADMIN_CRIOSQ));\r
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;\r
\r
- Status = NvmePassThru (\r
+ Status = NvmePassThruExecute (\r
Private,\r
NVME_CONTROLLER_NSID,\r
&CommandPacket\r
The NvmExpressPei driver is used to manage non-volatile memory subsystem\r
which follows NVM Express specification at PEI phase.\r
\r
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
\r
**/\r
EFI_STATUS\r
-NvmePassThru (\r
+NvmePassThruExecute (\r
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,\r
IN UINT32 NamespaceId,\r
- IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
)\r
{\r
EFI_STATUS Status;\r
}\r
\r
ZeroMem (Sq, sizeof (NVME_SQ));\r
- Sq->Opc = Packet->NvmeCmd->Cdw0.Opcode;\r
- Sq->Fuse = Packet->NvmeCmd->Cdw0.FusedOperation;\r
- Sq->Cid = Packet->NvmeCmd->Cdw0.Cid;\r
+ Sq->Opc = (UINT8)Packet->NvmeCmd->Cdw0.Opcode;\r
+ Sq->Fuse = (UINT8)Packet->NvmeCmd->Cdw0.FusedOperation;\r
+ Sq->Cid = Private->Cid[QueueId]++;;\r
Sq->Nsid = Packet->NvmeCmd->Nsid;\r
\r
//\r
//\r
// Copy the Respose Queue entry for this command to the callers response buffer\r
//\r
- CopyMem (Packet->NvmeCompletion, Cq, sizeof (EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ CopyMem (Packet->NvmeCompletion, Cq, sizeof (EFI_NVM_EXPRESS_COMPLETION));\r
\r
//\r
// Check the NVMe cmd execution result\r
\r
return Status;\r
}\r
+\r
+/**\r
+ Gets the device path information of the underlying NVM Express host controller.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[out] DevicePathLength The length of the device path in bytes specified\r
+ by DevicePath.\r
+ @param[out] DevicePath The device path of the underlying NVM Express\r
+ host controller.\r
+ This field re-uses EFI Device Path Protocol as\r
+ defined by Section 10.2 EFI Device Path Protocol\r
+ of UEFI 2.7 Specification.\r
+\r
+ @retval EFI_SUCCESS The operation succeeds.\r
+ @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is NULL.\r
+ @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThruGetDevicePath (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ OUT UINTN *DevicePathLength,\r
+ OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath\r
+ )\r
+{\r
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;\r
+\r
+ if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);\r
+\r
+ *DevicePathLength = Private->DevicePathLength;\r
+ *DevicePath = AllocateCopyPool (Private->DevicePathLength, Private->DevicePath);\r
+ if (*DevicePath == NULL) {\r
+ *DevicePathLength = 0;\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Used to retrieve the next namespace ID for this NVM Express controller.\r
+\r
+ If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first\r
+ valid namespace ID defined on the NVM Express controller is returned in the\r
+ location pointed to by NamespaceId and a status of EFI_SUCCESS is returned.\r
+\r
+ If on input the value pointed to by NamespaceId is an invalid namespace ID\r
+ other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.\r
+\r
+ If on input the value pointed to by NamespaceId is a valid namespace ID, then\r
+ the next valid namespace ID on the NVM Express controller is returned in the\r
+ location pointed to by NamespaceId, and EFI_SUCCESS is returned.\r
+\r
+ If the value pointed to by NamespaceId is the namespace ID of the last\r
+ namespace on the NVM Express controller, then EFI_NOT_FOUND is returned.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[in,out] NamespaceId On input, a pointer to a legal NamespaceId\r
+ for an NVM Express namespace present on the\r
+ NVM Express controller. On output, a pointer\r
+ to the next NamespaceId of an NVM Express\r
+ namespace on an NVM Express controller. An\r
+ input value of 0xFFFFFFFF retrieves the\r
+ first NamespaceId for an NVM Express\r
+ namespace present on an NVM Express\r
+ controller.\r
+\r
+ @retval EFI_SUCCESS The Namespace ID of the next Namespace was\r
+ returned.\r
+ @retval EFI_NOT_FOUND There are no more namespaces defined on this\r
+ controller.\r
+ @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than\r
+ 0xFFFFFFFF.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThruGetNextNameSpace (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ IN OUT UINT32 *NamespaceId\r
+ )\r
+{\r
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;\r
+ UINT32 DeviceIndex;\r
+ EFI_STATUS Status;\r
+\r
+ if (This == NULL || NamespaceId == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);\r
+\r
+ Status = EFI_NOT_FOUND;\r
+\r
+ //\r
+ // If active namespace number is 0, then valid namespace ID is unavailable\r
+ //\r
+ if (Private->ActiveNamespaceNum == 0) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ //\r
+ // If the NamespaceId input value is 0xFFFFFFFF, then get the first valid namespace ID\r
+ //\r
+ if (*NamespaceId == 0xFFFFFFFF) {\r
+ //\r
+ // Start with the first namespace ID\r
+ //\r
+ *NamespaceId = Private->NamespaceInfo[0].NamespaceId;\r
+ Status = EFI_SUCCESS;\r
+ } else {\r
+ if (*NamespaceId > Private->ControllerData->Nn) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((*NamespaceId + 1) > Private->ControllerData->Nn) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ for (DeviceIndex = 0; DeviceIndex < Private->ActiveNamespaceNum; DeviceIndex++) {\r
+ if (*NamespaceId == Private->NamespaceInfo[DeviceIndex].NamespaceId) {\r
+ if ((DeviceIndex + 1) < Private->ActiveNamespaceNum) {\r
+ *NamespaceId = Private->NamespaceInfo[DeviceIndex + 1].NamespaceId;\r
+ Status = EFI_SUCCESS;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return Status;\r
+\r
+}\r
+\r
+/**\r
+ Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function only\r
+ supports blocking execution of the command.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm Express command packet will\r
+ be sent.\r
+ A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in\r
+ the namespace ID specifies that the command packet should be sent to all\r
+ valid namespaces.\r
+ @param[in,out] Packet A pointer to the EDKII PEI NVM Express PassThru Command Packet to send\r
+ to the NVMe namespace specified by NamespaceId.\r
+\r
+ @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet was sent by the host.\r
+ TransferLength bytes were transferred to, or from DataBuffer.\r
+ @retval EFI_NOT_READY The EDKII PEI NVM Express Command Packet could not be sent because\r
+ the controller is not ready. The caller may retry again later.\r
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the EDKII PEI NVM\r
+ Express Command Packet.\r
+ @retval EFI_INVALID_PARAMETER Namespace, or the contents of EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET\r
+ are invalid.\r
+ The EDKII PEI NVM Express Command Packet was not sent, so no\r
+ additional status information is available.\r
+ @retval EFI_UNSUPPORTED The command described by the EDKII PEI NVM Express Command Packet\r
+ is not supported by the host adapter.\r
+ The EDKII PEI NVM Express Command Packet was not sent, so no\r
+ additional status information is available.\r
+ @retval EFI_TIMEOUT A timeout occurred while waiting for the EDKII PEI NVM Express Command\r
+ Packet to execute.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThru (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ IN UINT32 NamespaceId,\r
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
+ )\r
+{\r
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+\r
+ if (This == NULL || Packet == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);\r
+ //\r
+ // Check NamespaceId is valid or not.\r
+ //\r
+ if ((NamespaceId > Private->ControllerData->Nn) &&\r
+ (NamespaceId != (UINT32) -1)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = NvmePassThruExecute (\r
+ Private,\r
+ NamespaceId,\r
+ Packet\r
+ );\r
+\r
+ return Status;\r
+\r
+}\r
+\r
The NvmExpressPei driver is used to manage non-volatile memory subsystem\r
which follows NVM Express specification at PEI phase.\r
\r
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
#ifndef _NVM_EXPRESS_PEI_PASSTHRU_H_\r
#define _NVM_EXPRESS_PEI_PASSTHRU_H_\r
\r
-#define NVME_CONTROLLER_NSID 0\r
-\r
-typedef struct {\r
- UINT8 Opcode;\r
- UINT8 FusedOperation;\r
- #define NORMAL_CMD 0x00\r
- #define FUSED_FIRST_CMD 0x01\r
- #define FUSED_SECOND_CMD 0x02\r
- UINT16 Cid;\r
-} NVME_CDW0;\r
-\r
-typedef struct {\r
- NVME_CDW0 Cdw0;\r
- UINT8 Flags;\r
- #define CDW10_VALID 0x01\r
- #define CDW11_VALID 0x02\r
- #define CDW12_VALID 0x04\r
- #define CDW13_VALID 0x08\r
- #define CDW14_VALID 0x10\r
- #define CDW15_VALID 0x20\r
- UINT32 Nsid;\r
- UINT32 Cdw10;\r
- UINT32 Cdw11;\r
- UINT32 Cdw12;\r
- UINT32 Cdw13;\r
- UINT32 Cdw14;\r
- UINT32 Cdw15;\r
-} EDKII_PEI_NVM_EXPRESS_COMMAND;\r
-\r
-typedef struct {\r
- UINT32 Cdw0;\r
- UINT32 Cdw1;\r
- UINT32 Cdw2;\r
- UINT32 Cdw3;\r
-} EDKII_PEI_NVM_EXPRESS_COMPLETION;\r
-\r
-typedef struct {\r
- UINT64 CommandTimeout;\r
- VOID *TransferBuffer;\r
- UINT32 TransferLength;\r
- VOID *MetadataBuffer;\r
- UINT32 MetadataLength;\r
- UINT8 QueueType;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND *NvmeCmd;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION *NvmeCompletion;\r
-} EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;\r
\r
\r
/**\r
\r
**/\r
EFI_STATUS\r
-NvmePassThru (\r
+NvmePassThruExecute (\r
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,\r
IN UINT32 NamespaceId,\r
- IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
+ );\r
+\r
+/**\r
+ Gets the device path information of the underlying NVM Express host controller.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[out] DevicePathLength The length of the device path in bytes specified\r
+ by DevicePath.\r
+ @param[out] DevicePath The device path of the underlying NVM Express\r
+ host controller.\r
+ This field re-uses EFI Device Path Protocol as\r
+ defined by Section 10.2 EFI Device Path Protocol\r
+ of UEFI 2.7 Specification.\r
+\r
+ @retval EFI_SUCCESS The operation succeeds.\r
+ @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is NULL.\r
+ @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThruGetDevicePath (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ OUT UINTN *DevicePathLength,\r
+ OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath\r
+ );\r
+\r
+/**\r
+ Used to retrieve the next namespace ID for this NVM Express controller.\r
+\r
+ If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first\r
+ valid namespace ID defined on the NVM Express controller is returned in the\r
+ location pointed to by NamespaceId and a status of EFI_SUCCESS is returned.\r
+\r
+ If on input the value pointed to by NamespaceId is an invalid namespace ID\r
+ other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.\r
+\r
+ If on input the value pointed to by NamespaceId is a valid namespace ID, then\r
+ the next valid namespace ID on the NVM Express controller is returned in the\r
+ location pointed to by NamespaceId, and EFI_SUCCESS is returned.\r
+\r
+ If the value pointed to by NamespaceId is the namespace ID of the last\r
+ namespace on the NVM Express controller, then EFI_NOT_FOUND is returned.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[in,out] NamespaceId On input, a pointer to a legal NamespaceId\r
+ for an NVM Express namespace present on the\r
+ NVM Express controller. On output, a pointer\r
+ to the next NamespaceId of an NVM Express\r
+ namespace on an NVM Express controller. An\r
+ input value of 0xFFFFFFFF retrieves the\r
+ first NamespaceId for an NVM Express\r
+ namespace present on an NVM Express\r
+ controller.\r
+\r
+ @retval EFI_SUCCESS The Namespace ID of the next Namespace was\r
+ returned.\r
+ @retval EFI_NOT_FOUND There are no more namespaces defined on this\r
+ controller.\r
+ @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than\r
+ 0xFFFFFFFF.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThruGetNextNameSpace (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ IN OUT UINT32 *NamespaceId\r
+ );\r
+\r
+/**\r
+ Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function only\r
+ supports blocking execution of the command.\r
+\r
+ @param[in] This The PPI instance pointer.\r
+ @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm Express command packet will\r
+ be sent.\r
+ A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in\r
+ the namespace ID specifies that the command packet should be sent to all\r
+ valid namespaces.\r
+ @param[in,out] Packet A pointer to the EDKII PEI NVM Express PassThru Command Packet to send\r
+ to the NVMe namespace specified by NamespaceId.\r
+\r
+ @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet was sent by the host.\r
+ TransferLength bytes were transferred to, or from DataBuffer.\r
+ @retval EFI_NOT_READY The EDKII PEI NVM Express Command Packet could not be sent because\r
+ the controller is not ready. The caller may retry again later.\r
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the EDKII PEI NVM\r
+ Express Command Packet.\r
+ @retval EFI_INVALID_PARAMETER Namespace, or the contents of EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET\r
+ are invalid.\r
+ The EDKII PEI NVM Express Command Packet was not sent, so no\r
+ additional status information is available.\r
+ @retval EFI_UNSUPPORTED The command described by the EDKII PEI NVM Express Command Packet\r
+ is not supported by the host adapter.\r
+ The EDKII PEI NVM Express Command Packet was not sent, so no\r
+ additional status information is available.\r
+ @retval EFI_TIMEOUT A timeout occurred while waiting for the EDKII PEI NVM Express Command\r
+ Packet to execute.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NvmePassThru (\r
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,\r
+ IN UINT32 NamespaceId,\r
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet\r
);\r
\r
#endif\r
OUT UINTN *TransferLengthOut\r
)\r
{\r
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;\r
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;\r
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
+ EFI_NVM_EXPRESS_COMMAND Command;\r
+ EFI_NVM_EXPRESS_COMPLETION Completion;\r
EFI_STATUS Status;\r
UINT16 SpecificData;\r
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;\r
\r
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));\r
+ NvmePassThru = &Private->NvmePassThruPpi;\r
+ ZeroMem (&CommandPacket, sizeof(EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
+ ZeroMem (&Command, sizeof(EFI_NVM_EXPRESS_COMMAND));\r
+ ZeroMem (&Completion, sizeof(EFI_NVM_EXPRESS_COMPLETION));\r
\r
CommandPacket.NvmeCmd = &Command;\r
CommandPacket.NvmeCompletion = &Completion;\r
CommandPacket.CommandTimeout = Timeout;\r
CommandPacket.QueueType = NVME_ADMIN_QUEUE;\r
\r
- Status = NvmePassThru (\r
- Private,\r
- NVME_CONTROLLER_NSID,\r
- &CommandPacket\r
- );\r
+ Status = NvmePassThru->PassThru (\r
+ NvmePassThru,\r
+ NVME_CONTROLLER_NSID,\r
+ &CommandPacket\r
+ );\r
\r
if (!IsTrustSend) {\r
if (EFI_ERROR (Status)) {\r