* [PATCH] MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI
@ 2019-06-17 2:11 Maggie Chu
2019-06-18 12:34 ` [edk2-devel] " Wu, Hao A
0 siblings, 1 reply; 3+ messages in thread
From: Maggie Chu @ 2019-06-17 2:11 UTC (permalink / raw)
To: devel; +Cc: Hao A Wu, Jian J Wang, Ray Ni, Star Zeng
https://bugzilla.tianocore.org/show_bug.cgi?id=1879
This commit will add codes to produce the NVM Express PassThru PPI.
Signed-off-by: Maggie Chu <maggie.chu@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
---
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c | 26 +++
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h | 8 +
.../Bus/Pci/NvmExpressPei/NvmExpressPei.inf | 1 +
.../Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c | 27 +--
.../Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c | 74 ++++---
.../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c | 218 ++++++++++++++++++++-
.../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h | 159 ++++++++++-----
.../NvmExpressPei/NvmExpressPeiStorageSecurity.c | 24 +--
8 files changed, 420 insertions(+), 117 deletions(-)
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
index 0e79b29f82..987eed420e 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
@@ -28,6 +28,12 @@ EFI_PEI_PPI_DESCRIPTOR mNvmeStorageSecurityPpiListTemplate = {
NULL
};
+EFI_PEI_PPI_DESCRIPTOR mNvmePassThruPpiListTemplate = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEdkiiPeiNvmExpressPassThruPpiGuid,
+ NULL
+};
+
EFI_PEI_NOTIFY_DESCRIPTOR mNvmeEndOfPeiNotifyListTemplate = {
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiEndOfPeiSignalPpiGuid,
@@ -392,6 +398,26 @@ NvmExpressPeimEntry (
Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
PeiServicesInstallPpi (&Private->BlkIoPpiList);
+ //
+ // Nvm Express Pass Thru PPI
+ //
+ Private->PassThruMode.Attributes = EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
+ EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |
+ EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;
+ Private->PassThruMode.IoAlign = sizeof (UINTN);
+ Private->PassThruMode.NvmeVersion = EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;
+ Private->NvmePassThruPpi.Mode = &Private->PassThruMode;
+ Private->NvmePassThruPpi.GetDevicePath = NvmePassThruGetDevicePath;
+ Private->NvmePassThruPpi.GetNextNameSpace = NvmePassThruGetNextNameSpace;
+ Private->NvmePassThruPpi.PassThru = NvmePassThru;
+ CopyMem (
+ &Private->NvmePassThruPpiList,
+ &mNvmePassThruPpiListTemplate,
+ sizeof (EFI_PEI_PPI_DESCRIPTOR)
+ );
+ Private->NvmePassThruPpiList.Ppi = &Private->NvmePassThruPpi;
+ PeiServicesInstallPpi (&Private->NvmePassThruPpiList);
+
//
// Check if the NVME controller supports the Security Receive/Send commands
//
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
index 6b2e2f0326..8cd905191b 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
@@ -19,6 +19,7 @@
#include <Ppi/BlockIo.h>
#include <Ppi/BlockIo2.h>
#include <Ppi/StorageSecurityCommand.h>
+#include <Ppi/NvmExpressPassThru.h>
#include <Ppi/IoMmu.h>
#include <Ppi/EndOfPeiPhase.h>
@@ -74,6 +75,8 @@ struct _PEI_NVME_NAMESPACE_INFO {
PEI_NVME_CONTROLLER_PRIVATE_DATA *Controller;
};
+#define NVME_CONTROLLER_NSID 0
+
//
// Unique signature for private data structure.
//
@@ -85,15 +88,18 @@ struct _PEI_NVME_NAMESPACE_INFO {
struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
UINT32 Signature;
UINTN MmioBase;
+ EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
UINTN DevicePathLength;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_PEI_RECOVERY_BLOCK_IO_PPI BlkIoPpi;
EFI_PEI_RECOVERY_BLOCK_IO2_PPI BlkIo2Ppi;
EDKII_PEI_STORAGE_SECURITY_CMD_PPI StorageSecurityPpi;
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI NvmePassThruPpi;
EFI_PEI_PPI_DESCRIPTOR BlkIoPpiList;
EFI_PEI_PPI_DESCRIPTOR BlkIo2PpiList;
EFI_PEI_PPI_DESCRIPTOR StorageSecurityPpiList;
+ EFI_PEI_PPI_DESCRIPTOR NvmePassThruPpiList;
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
//
@@ -145,6 +151,8 @@ struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, BlkIo2Ppi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY(a) \
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, StorageSecurityPpi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
+#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU(a) \
+ CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, NvmePassThruPpi, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
#define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) \
CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
index a8e4808e6b..4dd6c5704f 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
@@ -56,6 +56,7 @@
gEdkiiPeiNvmExpressHostControllerPpiGuid ## CONSUMES
gEdkiiIoMmuPpiGuid ## CONSUMES
gEfiEndOfPeiSignalPpiGuid ## CONSUMES
+ gEdkiiPeiNvmExpressPassThruPpiGuid ## SOMETIMES_PRODUCES
gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_PRODUCES
gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_PRODUCES
gEdkiiPeiStorageSecurityCommandPpiGuid ## SOMETIMES_PRODUCES
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
index 94cdd05f33..a9bf4f8190 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
@@ -2,7 +2,7 @@
The NvmExpressPei driver is used to manage non-volatile memory subsystem
which follows NVM Express specification at PEI phase.
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -34,17 +34,19 @@ ReadSectors (
UINT32 BlockSize;
PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
UINT32 Bytes;
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
+ EFI_NVM_EXPRESS_COMMAND Command;
+ EFI_NVM_EXPRESS_COMPLETION Completion;
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
Private = NamespaceInfo->Controller;
+ NvmePassThru = &Private->NvmePassThruPpi;
BlockSize = NamespaceInfo->Media.BlockSize;
Bytes = Blocks * BlockSize;
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_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;
@@ -63,11 +65,12 @@ ReadSectors (
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID;
- Status = NvmePassThru (
- Private,
- NamespaceInfo->NamespaceId,
- &CommandPacket
- );
+ Status = NvmePassThru->PassThru (
+ NvmePassThru,
+ NamespaceInfo->NamespaceId,
+ &CommandPacket
+ );
+
return Status;
}
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
index c290f5b56f..1d7e3d26e0 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
@@ -320,14 +320,14 @@ NvmeIdentifyController (
IN VOID *Buffer
)
{
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_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;
//
@@ -348,7 +348,7 @@ NvmeIdentifyController (
CommandPacket.NvmeCmd->Cdw10 = 1;
CommandPacket.NvmeCmd->Flags = CDW10_VALID;
- Status = NvmePassThru (
+ Status = NvmePassThruExecute (
Private,
NVME_CONTROLLER_NSID,
&CommandPacket
@@ -374,14 +374,14 @@ NvmeIdentifyNamespace (
IN VOID *Buffer
)
{
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_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;
Command.Nsid = NamespaceId;
@@ -398,7 +398,7 @@ NvmeIdentifyNamespace (
CommandPacket.NvmeCmd->Cdw10 = 0;
CommandPacket.NvmeCmd->Flags = CDW10_VALID;
- Status = NvmePassThru (
+ Status = NvmePassThruExecute (
Private,
NamespaceId,
&CommandPacket
@@ -454,22 +454,21 @@ NvmeCreateIoCompletionQueue (
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
)
{
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
- EFI_STATUS Status;
- NVME_ADMIN_CRIOCQ CrIoCq;
-
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
+ 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;
+
+ 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
CommandPacket.TransferBuffer = Private->CqBuffer[NVME_IO_QUEUE];
CommandPacket.TransferLength = EFI_PAGE_SIZE;
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
@@ -481,7 +480,7 @@ NvmeCreateIoCompletionQueue (
CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoCq, sizeof (NVME_ADMIN_CRIOCQ));
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
- Status = NvmePassThru (
+ Status = NvmePassThruExecute (
Private,
NVME_CONTROLLER_NSID,
&CommandPacket
@@ -503,22 +502,21 @@ NvmeCreateIoSubmissionQueue (
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
)
{
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
- EFI_STATUS Status;
- NVME_ADMIN_CRIOSQ CrIoSq;
-
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
+ 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;
+
+ 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
CommandPacket.TransferBuffer = Private->SqBuffer[NVME_IO_QUEUE];
CommandPacket.TransferLength = EFI_PAGE_SIZE;
CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
@@ -532,7 +530,7 @@ NvmeCreateIoSubmissionQueue (
CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoSq, sizeof (NVME_ADMIN_CRIOSQ));
CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
- Status = NvmePassThru (
+ Status = NvmePassThruExecute (
Private,
NVME_CONTROLLER_NSID,
&CommandPacket
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
index a33f5a872e..370a54e5a2 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
@@ -2,7 +2,7 @@
The NvmExpressPei driver is used to manage non-volatile memory subsystem
which follows NVM Express specification at PEI phase.
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -332,10 +332,10 @@ NvmeCheckCqStatus (
**/
EFI_STATUS
-NvmePassThru (
+NvmePassThruExecute (
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
IN UINT32 NamespaceId,
- IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
)
{
EFI_STATUS Status;
@@ -411,9 +411,9 @@ NvmePassThru (
}
ZeroMem (Sq, sizeof (NVME_SQ));
- Sq->Opc = Packet->NvmeCmd->Cdw0.Opcode;
- Sq->Fuse = Packet->NvmeCmd->Cdw0.FusedOperation;
- Sq->Cid = Packet->NvmeCmd->Cdw0.Cid;
+ Sq->Opc = (UINT8)Packet->NvmeCmd->Cdw0.Opcode;
+ Sq->Fuse = (UINT8)Packet->NvmeCmd->Cdw0.FusedOperation;
+ Sq->Cid = Private->Cid[QueueId]++;;
Sq->Nsid = Packet->NvmeCmd->Nsid;
//
@@ -603,7 +603,7 @@ NvmePassThru (
//
// Copy the Respose Queue entry for this command to the callers response buffer
//
- CopyMem (Packet->NvmeCompletion, Cq, sizeof (EDKII_PEI_NVM_EXPRESS_COMPLETION));
+ CopyMem (Packet->NvmeCompletion, Cq, sizeof (EFI_NVM_EXPRESS_COMPLETION));
//
// Check the NVMe cmd execution result
@@ -622,3 +622,207 @@ Exit:
return Status;
}
+
+/**
+ Gets the device path information of the underlying NVM Express host controller.
+
+ @param[in] This The PPI instance pointer.
+ @param[out] DevicePathLength The length of the device path in bytes specified
+ by DevicePath.
+ @param[out] DevicePath The device path of the underlying NVM Express
+ host controller.
+ This field re-uses EFI Device Path Protocol as
+ defined by Section 10.2 EFI Device Path Protocol
+ of UEFI 2.7 Specification.
+
+ @retval EFI_SUCCESS The operation succeeds.
+ @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is NULL.
+ @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of resources.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThruGetDevicePath (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ OUT UINTN *DevicePathLength,
+ OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
+ )
+{
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
+
+ if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
+
+ *DevicePathLength = Private->DevicePathLength;
+ *DevicePath = AllocateCopyPool (Private->DevicePathLength, Private->DevicePath);
+ if (*DevicePath == NULL) {
+ *DevicePathLength = 0;
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Used to retrieve the next namespace ID for this NVM Express controller.
+
+ If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first
+ valid namespace ID defined on the NVM Express controller is returned in the
+ location pointed to by NamespaceId and a status of EFI_SUCCESS is returned.
+
+ If on input the value pointed to by NamespaceId is an invalid namespace ID
+ other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
+
+ If on input the value pointed to by NamespaceId is a valid namespace ID, then
+ the next valid namespace ID on the NVM Express controller is returned in the
+ location pointed to by NamespaceId, and EFI_SUCCESS is returned.
+
+ If the value pointed to by NamespaceId is the namespace ID of the last
+ namespace on the NVM Express controller, then EFI_NOT_FOUND is returned.
+
+ @param[in] This The PPI instance pointer.
+ @param[in,out] NamespaceId On input, a pointer to a legal NamespaceId
+ for an NVM Express namespace present on the
+ NVM Express controller. On output, a pointer
+ to the next NamespaceId of an NVM Express
+ namespace on an NVM Express controller. An
+ input value of 0xFFFFFFFF retrieves the
+ first NamespaceId for an NVM Express
+ namespace present on an NVM Express
+ controller.
+
+ @retval EFI_SUCCESS The Namespace ID of the next Namespace was
+ returned.
+ @retval EFI_NOT_FOUND There are no more namespaces defined on this
+ controller.
+ @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than
+ 0xFFFFFFFF.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThruGetNextNameSpace (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ IN OUT UINT32 *NamespaceId
+ )
+{
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
+ UINT32 DeviceIndex;
+ EFI_STATUS Status;
+
+ if (This == NULL || NamespaceId == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
+
+ Status = EFI_NOT_FOUND;
+
+ //
+ // If active namespace number is 0, then valid namespace ID is unavailable
+ //
+ if (Private->ActiveNamespaceNum == 0) {
+ return EFI_NOT_FOUND;
+ }
+
+ //
+ // If the NamespaceId input value is 0xFFFFFFFF, then get the first valid namespace ID
+ //
+ if (*NamespaceId == 0xFFFFFFFF) {
+ //
+ // Start with the first namespace ID
+ //
+ *NamespaceId = Private->NamespaceInfo[0].NamespaceId;
+ Status = EFI_SUCCESS;
+ } else {
+ if (*NamespaceId > Private->ControllerData->Nn) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((*NamespaceId + 1) > Private->ControllerData->Nn) {
+ return EFI_NOT_FOUND;
+ }
+
+ for (DeviceIndex = 0; DeviceIndex < Private->ActiveNamespaceNum; DeviceIndex++) {
+ if (*NamespaceId == Private->NamespaceInfo[DeviceIndex].NamespaceId) {
+ if ((DeviceIndex + 1) < Private->ActiveNamespaceNum) {
+ *NamespaceId = Private->NamespaceInfo[DeviceIndex + 1].NamespaceId;
+ Status = EFI_SUCCESS;
+ }
+ break;
+ }
+ }
+ }
+
+ return Status;
+
+}
+
+/**
+ Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function only
+ supports blocking execution of the command.
+
+ @param[in] This The PPI instance pointer.
+ @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm Express command packet will
+ be sent.
+ A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in
+ the namespace ID specifies that the command packet should be sent to all
+ valid namespaces.
+ @param[in,out] Packet A pointer to the EDKII PEI NVM Express PassThru Command Packet to send
+ to the NVMe namespace specified by NamespaceId.
+
+ @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet was sent by the host.
+ TransferLength bytes were transferred to, or from DataBuffer.
+ @retval EFI_NOT_READY The EDKII PEI NVM Express Command Packet could not be sent because
+ the controller is not ready. The caller may retry again later.
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the EDKII PEI NVM
+ Express Command Packet.
+ @retval EFI_INVALID_PARAMETER Namespace, or the contents of EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
+ are invalid.
+ The EDKII PEI NVM Express Command Packet was not sent, so no
+ additional status information is available.
+ @retval EFI_UNSUPPORTED The command described by the EDKII PEI NVM Express Command Packet
+ is not supported by the host adapter.
+ The EDKII PEI NVM Express Command Packet was not sent, so no
+ additional status information is available.
+ @retval EFI_TIMEOUT A timeout occurred while waiting for the EDKII PEI NVM Express Command
+ Packet to execute.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThru (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ IN UINT32 NamespaceId,
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
+ )
+{
+ PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+
+ if (This == NULL || Packet == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
+ //
+ // Check NamespaceId is valid or not.
+ //
+ if ((NamespaceId > Private->ControllerData->Nn) &&
+ (NamespaceId != (UINT32) -1)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = NvmePassThruExecute (
+ Private,
+ NamespaceId,
+ Packet
+ );
+
+ return Status;
+
+}
+
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
index 81066bbd54..00e8f0abda 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
@@ -2,7 +2,7 @@
The NvmExpressPei driver is used to manage non-volatile memory subsystem
which follows NVM Express specification at PEI phase.
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -11,52 +11,6 @@
#ifndef _NVM_EXPRESS_PEI_PASSTHRU_H_
#define _NVM_EXPRESS_PEI_PASSTHRU_H_
-#define NVME_CONTROLLER_NSID 0
-
-typedef struct {
- UINT8 Opcode;
- UINT8 FusedOperation;
- #define NORMAL_CMD 0x00
- #define FUSED_FIRST_CMD 0x01
- #define FUSED_SECOND_CMD 0x02
- UINT16 Cid;
-} NVME_CDW0;
-
-typedef struct {
- NVME_CDW0 Cdw0;
- UINT8 Flags;
- #define CDW10_VALID 0x01
- #define CDW11_VALID 0x02
- #define CDW12_VALID 0x04
- #define CDW13_VALID 0x08
- #define CDW14_VALID 0x10
- #define CDW15_VALID 0x20
- UINT32 Nsid;
- UINT32 Cdw10;
- UINT32 Cdw11;
- UINT32 Cdw12;
- UINT32 Cdw13;
- UINT32 Cdw14;
- UINT32 Cdw15;
-} EDKII_PEI_NVM_EXPRESS_COMMAND;
-
-typedef struct {
- UINT32 Cdw0;
- UINT32 Cdw1;
- UINT32 Cdw2;
- UINT32 Cdw3;
-} EDKII_PEI_NVM_EXPRESS_COMPLETION;
-
-typedef struct {
- UINT64 CommandTimeout;
- VOID *TransferBuffer;
- UINT32 TransferLength;
- VOID *MetadataBuffer;
- UINT32 MetadataLength;
- UINT8 QueueType;
- EDKII_PEI_NVM_EXPRESS_COMMAND *NvmeCmd;
- EDKII_PEI_NVM_EXPRESS_COMPLETION *NvmeCompletion;
-} EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
/**
@@ -91,10 +45,117 @@ typedef struct {
**/
EFI_STATUS
-NvmePassThru (
+NvmePassThruExecute (
IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
IN UINT32 NamespaceId,
- IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
+ );
+
+/**
+ Gets the device path information of the underlying NVM Express host controller.
+
+ @param[in] This The PPI instance pointer.
+ @param[out] DevicePathLength The length of the device path in bytes specified
+ by DevicePath.
+ @param[out] DevicePath The device path of the underlying NVM Express
+ host controller.
+ This field re-uses EFI Device Path Protocol as
+ defined by Section 10.2 EFI Device Path Protocol
+ of UEFI 2.7 Specification.
+
+ @retval EFI_SUCCESS The operation succeeds.
+ @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is NULL.
+ @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of resources.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThruGetDevicePath (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ OUT UINTN *DevicePathLength,
+ OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
+ );
+
+/**
+ Used to retrieve the next namespace ID for this NVM Express controller.
+
+ If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first
+ valid namespace ID defined on the NVM Express controller is returned in the
+ location pointed to by NamespaceId and a status of EFI_SUCCESS is returned.
+
+ If on input the value pointed to by NamespaceId is an invalid namespace ID
+ other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
+
+ If on input the value pointed to by NamespaceId is a valid namespace ID, then
+ the next valid namespace ID on the NVM Express controller is returned in the
+ location pointed to by NamespaceId, and EFI_SUCCESS is returned.
+
+ If the value pointed to by NamespaceId is the namespace ID of the last
+ namespace on the NVM Express controller, then EFI_NOT_FOUND is returned.
+
+ @param[in] This The PPI instance pointer.
+ @param[in,out] NamespaceId On input, a pointer to a legal NamespaceId
+ for an NVM Express namespace present on the
+ NVM Express controller. On output, a pointer
+ to the next NamespaceId of an NVM Express
+ namespace on an NVM Express controller. An
+ input value of 0xFFFFFFFF retrieves the
+ first NamespaceId for an NVM Express
+ namespace present on an NVM Express
+ controller.
+
+ @retval EFI_SUCCESS The Namespace ID of the next Namespace was
+ returned.
+ @retval EFI_NOT_FOUND There are no more namespaces defined on this
+ controller.
+ @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than
+ 0xFFFFFFFF.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThruGetNextNameSpace (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ IN OUT UINT32 *NamespaceId
+ );
+
+/**
+ Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function only
+ supports blocking execution of the command.
+
+ @param[in] This The PPI instance pointer.
+ @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm Express command packet will
+ be sent.
+ A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in
+ the namespace ID specifies that the command packet should be sent to all
+ valid namespaces.
+ @param[in,out] Packet A pointer to the EDKII PEI NVM Express PassThru Command Packet to send
+ to the NVMe namespace specified by NamespaceId.
+
+ @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet was sent by the host.
+ TransferLength bytes were transferred to, or from DataBuffer.
+ @retval EFI_NOT_READY The EDKII PEI NVM Express Command Packet could not be sent because
+ the controller is not ready. The caller may retry again later.
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the EDKII PEI NVM
+ Express Command Packet.
+ @retval EFI_INVALID_PARAMETER Namespace, or the contents of EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
+ are invalid.
+ The EDKII PEI NVM Express Command Packet was not sent, so no
+ additional status information is available.
+ @retval EFI_UNSUPPORTED The command described by the EDKII PEI NVM Express Command Packet
+ is not supported by the host adapter.
+ The EDKII PEI NVM Express Command Packet was not sent, so no
+ additional status information is available.
+ @retval EFI_TIMEOUT A timeout occurred while waiting for the EDKII PEI NVM Express Command
+ Packet to execute.
+
+**/
+EFI_STATUS
+EFIAPI
+NvmePassThru (
+ IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
+ IN UINT32 NamespaceId,
+ IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
);
#endif
diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.c
index dda69988b1..094d61bb8a 100644
--- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.c
+++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.c
@@ -57,15 +57,17 @@ TrustTransferNvmeDevice (
OUT UINTN *TransferLengthOut
)
{
- EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
- EDKII_PEI_NVM_EXPRESS_COMMAND Command;
- EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
+ EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;
+ EFI_NVM_EXPRESS_COMMAND Command;
+ EFI_NVM_EXPRESS_COMPLETION Completion;
EFI_STATUS Status;
UINT16 SpecificData;
+ EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
- ZeroMem (&CommandPacket, sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
- ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
- ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
+ NvmePassThru = &Private->NvmePassThruPpi;
+ 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;
@@ -94,11 +96,11 @@ TrustTransferNvmeDevice (
CommandPacket.CommandTimeout = Timeout;
CommandPacket.QueueType = NVME_ADMIN_QUEUE;
- Status = NvmePassThru (
- Private,
- NVME_CONTROLLER_NSID,
- &CommandPacket
- );
+ Status = NvmePassThru->PassThru (
+ NvmePassThru,
+ NVME_CONTROLLER_NSID,
+ &CommandPacket
+ );
if (!IsTrustSend) {
if (EFI_ERROR (Status)) {
--
2.16.2.windows.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [edk2-devel] [PATCH] MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI
2019-06-17 2:11 [PATCH] MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI Maggie Chu
@ 2019-06-18 12:34 ` Wu, Hao A
2019-06-24 1:10 ` Wu, Hao A
0 siblings, 1 reply; 3+ messages in thread
From: Wu, Hao A @ 2019-06-18 12:34 UTC (permalink / raw)
To: devel@edk2.groups.io, Chu, Maggie; +Cc: Wang, Jian J, Ni, Ray, Zeng, Star
> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Maggie Chu
> Sent: Monday, June 17, 2019 10:11 AM
> To: devel@edk2.groups.io
> Cc: Wu, Hao A; Wang, Jian J; Ni, Ray; Zeng, Star
> Subject: [edk2-devel] [PATCH] MdeModulePkg/NvmExpressPei: Produce
> NVM Express PassThru PPI
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=1879
> This commit will add codes to produce the NVM Express PassThru PPI.
>
> Signed-off-by: Maggie Chu <maggie.chu@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> ---
> MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c | 26 +++
> MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h | 8 +
> .../Bus/Pci/NvmExpressPei/NvmExpressPei.inf | 1 +
> .../Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c | 27 +--
> .../Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c | 74 ++++---
> .../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c | 218
> ++++++++++++++++++++-
> .../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h | 159 ++++++++++----
> -
> .../NvmExpressPei/NvmExpressPeiStorageSecurity.c | 24 +--
> 8 files changed, 420 insertions(+), 117 deletions(-)
>
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> index 0e79b29f82..987eed420e 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> @@ -28,6 +28,12 @@ EFI_PEI_PPI_DESCRIPTOR
> mNvmeStorageSecurityPpiListTemplate = {
> NULL
> };
>
> +EFI_PEI_PPI_DESCRIPTOR mNvmePassThruPpiListTemplate = {
> + (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> + &gEdkiiPeiNvmExpressPassThruPpiGuid,
> + NULL
> +};
> +
> EFI_PEI_NOTIFY_DESCRIPTOR mNvmeEndOfPeiNotifyListTemplate = {
> (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> &gEfiEndOfPeiSignalPpiGuid,
> @@ -392,6 +398,26 @@ NvmExpressPeimEntry (
> Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
> PeiServicesInstallPpi (&Private->BlkIoPpiList);
>
> + //
> + // Nvm Express Pass Thru PPI
> + //
> + Private->PassThruMode.Attributes =
> EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
> +
> EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |
> +
> EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;
> + Private->PassThruMode.IoAlign = sizeof (UINTN);
> + Private->PassThruMode.NvmeVersion =
> EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;
> + Private->NvmePassThruPpi.Mode = &Private->PassThruMode;
> + Private->NvmePassThruPpi.GetDevicePath =
> NvmePassThruGetDevicePath;
> + Private->NvmePassThruPpi.GetNextNameSpace =
> NvmePassThruGetNextNameSpace;
> + Private->NvmePassThruPpi.PassThru = NvmePassThru;
> + CopyMem (
> + &Private->NvmePassThruPpiList,
> + &mNvmePassThruPpiListTemplate,
> + sizeof (EFI_PEI_PPI_DESCRIPTOR)
> + );
> + Private->NvmePassThruPpiList.Ppi = &Private->NvmePassThruPpi;
> + PeiServicesInstallPpi (&Private->NvmePassThruPpiList);
> +
> //
> // Check if the NVME controller supports the Security Receive/Send
> commands
> //
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> index 6b2e2f0326..8cd905191b 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> @@ -19,6 +19,7 @@
> #include <Ppi/BlockIo.h>
> #include <Ppi/BlockIo2.h>
> #include <Ppi/StorageSecurityCommand.h>
> +#include <Ppi/NvmExpressPassThru.h>
> #include <Ppi/IoMmu.h>
> #include <Ppi/EndOfPeiPhase.h>
>
> @@ -74,6 +75,8 @@ struct _PEI_NVME_NAMESPACE_INFO {
> PEI_NVME_CONTROLLER_PRIVATE_DATA *Controller;
> };
>
> +#define NVME_CONTROLLER_NSID 0
> +
> //
> // Unique signature for private data structure.
> //
> @@ -85,15 +88,18 @@ struct _PEI_NVME_NAMESPACE_INFO {
> struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
> UINT32 Signature;
> UINTN MmioBase;
> + EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
> UINTN DevicePathLength;
> EFI_DEVICE_PATH_PROTOCOL *DevicePath;
>
> EFI_PEI_RECOVERY_BLOCK_IO_PPI BlkIoPpi;
> EFI_PEI_RECOVERY_BLOCK_IO2_PPI BlkIo2Ppi;
> EDKII_PEI_STORAGE_SECURITY_CMD_PPI StorageSecurityPpi;
> + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI NvmePassThruPpi;
> EFI_PEI_PPI_DESCRIPTOR BlkIoPpiList;
> EFI_PEI_PPI_DESCRIPTOR BlkIo2PpiList;
> EFI_PEI_PPI_DESCRIPTOR StorageSecurityPpiList;
> + EFI_PEI_PPI_DESCRIPTOR NvmePassThruPpiList;
> EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
>
> //
> @@ -145,6 +151,8 @@ struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
> CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, BlkIo2Ppi,
> NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> #define
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY(a)
> \
> CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, StorageSecurityPpi,
> NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> +#define
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU(a) \
> + CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, NvmePassThruPpi,
> NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> #define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a)
> \
> CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList,
> NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
>
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> index a8e4808e6b..4dd6c5704f 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> @@ -56,6 +56,7 @@
> gEdkiiPeiNvmExpressHostControllerPpiGuid ## CONSUMES
> gEdkiiIoMmuPpiGuid ## CONSUMES
> gEfiEndOfPeiSignalPpiGuid ## CONSUMES
> + gEdkiiPeiNvmExpressPassThruPpiGuid ## SOMETIMES_PRODUCES
> gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_PRODUCES
> gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_PRODUCES
> gEdkiiPeiStorageSecurityCommandPpiGuid ## SOMETIMES_PRODUCES
> diff --git
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> index 94cdd05f33..a9bf4f8190 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> @@ -2,7 +2,7 @@
> The NvmExpressPei driver is used to manage non-volatile memory
> subsystem
> which follows NVM Express specification at PEI phase.
>
> - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -34,17 +34,19 @@ ReadSectors (
> UINT32 BlockSize;
> PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> UINT32 Bytes;
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> + EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> + EFI_NVM_EXPRESS_COMMAND Command;
> + EFI_NVM_EXPRESS_COMPLETION Completion;
> + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
>
> Private = NamespaceInfo->Controller;
> + NvmePassThru = &Private->NvmePassThruPpi;
> BlockSize = NamespaceInfo->Media.BlockSize;
> Bytes = Blocks * BlockSize;
>
> - ZeroMem (&CommandPacket,
> sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_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;
> @@ -63,11 +65,12 @@ ReadSectors (
>
> CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID |
> CDW12_VALID;
>
> - Status = NvmePassThru (
> - Private,
> - NamespaceInfo->NamespaceId,
> - &CommandPacket
> - );
> + Status = NvmePassThru->PassThru (
> + NvmePassThru,
> + NamespaceInfo->NamespaceId,
> + &CommandPacket
> + );
> +
> return Status;
> }
>
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> index c290f5b56f..1d7e3d26e0 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> @@ -320,14 +320,14 @@ NvmeIdentifyController (
> IN VOID *Buffer
> )
> {
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_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;
> //
> @@ -348,7 +348,7 @@ NvmeIdentifyController (
> CommandPacket.NvmeCmd->Cdw10 = 1;
> CommandPacket.NvmeCmd->Flags = CDW10_VALID;
>
> - Status = NvmePassThru (
> + Status = NvmePassThruExecute (
> Private,
> NVME_CONTROLLER_NSID,
> &CommandPacket
> @@ -374,14 +374,14 @@ NvmeIdentifyNamespace (
> IN VOID *Buffer
> )
> {
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_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;
> Command.Nsid = NamespaceId;
> @@ -398,7 +398,7 @@ NvmeIdentifyNamespace (
> CommandPacket.NvmeCmd->Cdw10 = 0;
> CommandPacket.NvmeCmd->Flags = CDW10_VALID;
>
> - Status = NvmePassThru (
> + Status = NvmePassThruExecute (
> Private,
> NamespaceId,
> &CommandPacket
> @@ -454,22 +454,21 @@ NvmeCreateIoCompletionQueue (
> IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
> )
> {
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> - EFI_STATUS Status;
> - NVME_ADMIN_CRIOCQ CrIoCq;
> -
> - ZeroMem (&CommandPacket,
> sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> + 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;
> +
> + 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
> CommandPacket.TransferBuffer = Private->CqBuffer[NVME_IO_QUEUE];
> CommandPacket.TransferLength = EFI_PAGE_SIZE;
> CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
> @@ -481,7 +480,7 @@ NvmeCreateIoCompletionQueue (
> CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoCq, sizeof
> (NVME_ADMIN_CRIOCQ));
> CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
>
> - Status = NvmePassThru (
> + Status = NvmePassThruExecute (
> Private,
> NVME_CONTROLLER_NSID,
> &CommandPacket
> @@ -503,22 +502,21 @@ NvmeCreateIoSubmissionQueue (
> IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
> )
> {
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> - EFI_STATUS Status;
> - NVME_ADMIN_CRIOSQ CrIoSq;
> -
> - ZeroMem (&CommandPacket,
> sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> + 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;
> +
> + 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
> CommandPacket.TransferBuffer = Private->SqBuffer[NVME_IO_QUEUE];
> CommandPacket.TransferLength = EFI_PAGE_SIZE;
> CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
> @@ -532,7 +530,7 @@ NvmeCreateIoSubmissionQueue (
> CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoSq, sizeof
> (NVME_ADMIN_CRIOSQ));
> CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
>
> - Status = NvmePassThru (
> + Status = NvmePassThruExecute (
> Private,
> NVME_CONTROLLER_NSID,
> &CommandPacket
> diff --git
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> index a33f5a872e..370a54e5a2 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> @@ -2,7 +2,7 @@
> The NvmExpressPei driver is used to manage non-volatile memory
> subsystem
> which follows NVM Express specification at PEI phase.
>
> - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -332,10 +332,10 @@ NvmeCheckCqStatus (
>
> **/
> EFI_STATUS
> -NvmePassThru (
> +NvmePassThruExecute (
> IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
> IN UINT32 NamespaceId,
> - IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
> )
> {
> EFI_STATUS Status;
> @@ -411,9 +411,9 @@ NvmePassThru (
> }
>
> ZeroMem (Sq, sizeof (NVME_SQ));
> - Sq->Opc = Packet->NvmeCmd->Cdw0.Opcode;
> - Sq->Fuse = Packet->NvmeCmd->Cdw0.FusedOperation;
> - Sq->Cid = Packet->NvmeCmd->Cdw0.Cid;
> + Sq->Opc = (UINT8)Packet->NvmeCmd->Cdw0.Opcode;
> + Sq->Fuse = (UINT8)Packet->NvmeCmd->Cdw0.FusedOperation;
> + Sq->Cid = Private->Cid[QueueId]++;;
> Sq->Nsid = Packet->NvmeCmd->Nsid;
>
> //
> @@ -603,7 +603,7 @@ NvmePassThru (
> //
> // Copy the Respose Queue entry for this command to the callers response
> buffer
> //
> - CopyMem (Packet->NvmeCompletion, Cq, sizeof
> (EDKII_PEI_NVM_EXPRESS_COMPLETION));
> + CopyMem (Packet->NvmeCompletion, Cq, sizeof
> (EFI_NVM_EXPRESS_COMPLETION));
>
> //
> // Check the NVMe cmd execution result
> @@ -622,3 +622,207 @@ Exit:
>
> return Status;
> }
> +
> +/**
> + Gets the device path information of the underlying NVM Express host
> controller.
> +
> + @param[in] This The PPI instance pointer.
> + @param[out] DevicePathLength The length of the device path in bytes
> specified
> + by DevicePath.
> + @param[out] DevicePath The device path of the underlying NVM
> Express
> + host controller.
> + This field re-uses EFI Device Path Protocol as
> + defined by Section 10.2 EFI Device Path Protocol
> + of UEFI 2.7 Specification.
> +
> + @retval EFI_SUCCESS The operation succeeds.
> + @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is
> NULL.
> + @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of
> resources.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThruGetDevicePath (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + OUT UINTN *DevicePathLength,
> + OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> + )
> +{
> + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> +
> + if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private =
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
> +
> + *DevicePathLength = Private->DevicePathLength;
> + *DevicePath = AllocateCopyPool (Private->DevicePathLength, Private-
> >DevicePath);
> + if (*DevicePath == NULL) {
> + *DevicePathLength = 0;
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Used to retrieve the next namespace ID for this NVM Express controller.
> +
> + If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the
> first
> + valid namespace ID defined on the NVM Express controller is returned in
> the
> + location pointed to by NamespaceId and a status of EFI_SUCCESS is
> returned.
> +
> + If on input the value pointed to by NamespaceId is an invalid namespace
> ID
> + other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
> +
> + If on input the value pointed to by NamespaceId is a valid namespace ID,
> then
> + the next valid namespace ID on the NVM Express controller is returned in
> the
> + location pointed to by NamespaceId, and EFI_SUCCESS is returned.
> +
> + If the value pointed to by NamespaceId is the namespace ID of the last
> + namespace on the NVM Express controller, then EFI_NOT_FOUND is
> returned.
> +
> + @param[in] This The PPI instance pointer.
> + @param[in,out] NamespaceId On input, a pointer to a legal
> NamespaceId
> + for an NVM Express namespace present on the
> + NVM Express controller. On output, a pointer
> + to the next NamespaceId of an NVM Express
> + namespace on an NVM Express controller. An
> + input value of 0xFFFFFFFF retrieves the
> + first NamespaceId for an NVM Express
> + namespace present on an NVM Express
> + controller.
> +
> + @retval EFI_SUCCESS The Namespace ID of the next Namespace was
> + returned.
> + @retval EFI_NOT_FOUND There are no more namespaces defined on
> this
> + controller.
> + @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other
> than
> + 0xFFFFFFFF.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThruGetNextNameSpace (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + IN OUT UINT32 *NamespaceId
> + )
> +{
> + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> + UINT32 DeviceIndex;
> + EFI_STATUS Status;
> +
> + if (This == NULL || NamespaceId == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private =
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
> +
> + Status = EFI_NOT_FOUND;
> +
> + //
> + // If active namespace number is 0, then valid namespace ID is
> unavailable
> + //
> + if (Private->ActiveNamespaceNum == 0) {
> + return EFI_NOT_FOUND;
> + }
> +
> + //
> + // If the NamespaceId input value is 0xFFFFFFFF, then get the first valid
> namespace ID
> + //
> + if (*NamespaceId == 0xFFFFFFFF) {
> + //
> + // Start with the first namespace ID
> + //
> + *NamespaceId = Private->NamespaceInfo[0].NamespaceId;
> + Status = EFI_SUCCESS;
> + } else {
> + if (*NamespaceId > Private->ControllerData->Nn) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if ((*NamespaceId + 1) > Private->ControllerData->Nn) {
> + return EFI_NOT_FOUND;
> + }
> +
> + for (DeviceIndex = 0; DeviceIndex < Private->ActiveNamespaceNum;
> DeviceIndex++) {
> + if (*NamespaceId == Private-
> >NamespaceInfo[DeviceIndex].NamespaceId) {
> + if ((DeviceIndex + 1) < Private->ActiveNamespaceNum) {
> + *NamespaceId = Private->NamespaceInfo[DeviceIndex +
> 1].NamespaceId;
> + Status = EFI_SUCCESS;
> + }
> + break;
> + }
> + }
> + }
> +
> + return Status;
> +
> +}
> +
> +/**
> + Sends an NVM Express Command Packet to an NVM Express controller or
> namespace. This function only
> + supports blocking execution of the command.
> +
> + @param[in] This The PPI instance pointer.
> + @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm
> Express command packet will
> + be sent.
> + A Value of 0 denotes the NVM Express controller, a Value
> of all 0FFh in
> + the namespace ID specifies that the command packet
> should be sent to all
> + valid namespaces.
> + @param[in,out] Packet A pointer to the EDKII PEI NVM Express
> PassThru Command Packet to send
> + to the NVMe namespace specified by NamespaceId.
> +
> + @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet
> was sent by the host.
> + TransferLength bytes were transferred to, or from
> DataBuffer.
> + @retval EFI_NOT_READY The EDKII PEI NVM Express Command
> Packet could not be sent because
> + the controller is not ready. The caller may retry again later.
> + @retval EFI_DEVICE_ERROR A device error occurred while attempting
> to send the EDKII PEI NVM
> + Express Command Packet.
> + @retval EFI_INVALID_PARAMETER Namespace, or the contents of
> EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> + are invalid.
> + The EDKII PEI NVM Express Command Packet was not sent,
> so no
> + additional status information is available.
> + @retval EFI_UNSUPPORTED The command described by the EDKII PEI
> NVM Express Command Packet
> + is not supported by the host adapter.
> + The EDKII PEI NVM Express Command Packet was not sent,
> so no
> + additional status information is available.
> + @retval EFI_TIMEOUT A timeout occurred while waiting for the
> EDKII PEI NVM Express Command
> + Packet to execute.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThru (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + IN UINT32 NamespaceId,
> + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
> + )
> +{
> + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> +
> + if (This == NULL || Packet == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private =
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU (This);
> + //
> + // Check NamespaceId is valid or not.
> + //
> + if ((NamespaceId > Private->ControllerData->Nn) &&
> + (NamespaceId != (UINT32) -1)) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Status = NvmePassThruExecute (
> + Private,
> + NamespaceId,
> + Packet
> + );
> +
> + return Status;
> +
> +}
> +
> diff --git
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> index 81066bbd54..00e8f0abda 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> @@ -2,7 +2,7 @@
> The NvmExpressPei driver is used to manage non-volatile memory
> subsystem
> which follows NVM Express specification at PEI phase.
>
> - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -11,52 +11,6 @@
> #ifndef _NVM_EXPRESS_PEI_PASSTHRU_H_
> #define _NVM_EXPRESS_PEI_PASSTHRU_H_
>
> -#define NVME_CONTROLLER_NSID 0
> -
> -typedef struct {
> - UINT8 Opcode;
> - UINT8 FusedOperation;
> - #define NORMAL_CMD 0x00
> - #define FUSED_FIRST_CMD 0x01
> - #define FUSED_SECOND_CMD 0x02
> - UINT16 Cid;
> -} NVME_CDW0;
> -
> -typedef struct {
> - NVME_CDW0 Cdw0;
> - UINT8 Flags;
> - #define CDW10_VALID 0x01
> - #define CDW11_VALID 0x02
> - #define CDW12_VALID 0x04
> - #define CDW13_VALID 0x08
> - #define CDW14_VALID 0x10
> - #define CDW15_VALID 0x20
> - UINT32 Nsid;
> - UINT32 Cdw10;
> - UINT32 Cdw11;
> - UINT32 Cdw12;
> - UINT32 Cdw13;
> - UINT32 Cdw14;
> - UINT32 Cdw15;
> -} EDKII_PEI_NVM_EXPRESS_COMMAND;
> -
> -typedef struct {
> - UINT32 Cdw0;
> - UINT32 Cdw1;
> - UINT32 Cdw2;
> - UINT32 Cdw3;
> -} EDKII_PEI_NVM_EXPRESS_COMPLETION;
> -
> -typedef struct {
> - UINT64 CommandTimeout;
> - VOID *TransferBuffer;
> - UINT32 TransferLength;
> - VOID *MetadataBuffer;
> - UINT32 MetadataLength;
> - UINT8 QueueType;
> - EDKII_PEI_NVM_EXPRESS_COMMAND *NvmeCmd;
> - EDKII_PEI_NVM_EXPRESS_COMPLETION *NvmeCompletion;
> -} EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
>
>
> /**
> @@ -91,10 +45,117 @@ typedef struct {
>
> **/
> EFI_STATUS
> -NvmePassThru (
> +NvmePassThruExecute (
> IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
> IN UINT32 NamespaceId,
> - IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
> + );
> +
> +/**
> + Gets the device path information of the underlying NVM Express host
> controller.
> +
> + @param[in] This The PPI instance pointer.
> + @param[out] DevicePathLength The length of the device path in bytes
> specified
> + by DevicePath.
> + @param[out] DevicePath The device path of the underlying NVM
> Express
> + host controller.
> + This field re-uses EFI Device Path Protocol as
> + defined by Section 10.2 EFI Device Path Protocol
> + of UEFI 2.7 Specification.
> +
> + @retval EFI_SUCCESS The operation succeeds.
> + @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is
> NULL.
> + @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of
> resources.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThruGetDevicePath (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + OUT UINTN *DevicePathLength,
> + OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> + );
> +
> +/**
> + Used to retrieve the next namespace ID for this NVM Express controller.
> +
> + If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the
> first
> + valid namespace ID defined on the NVM Express controller is returned in
> the
> + location pointed to by NamespaceId and a status of EFI_SUCCESS is
> returned.
> +
> + If on input the value pointed to by NamespaceId is an invalid namespace
> ID
> + other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
> +
> + If on input the value pointed to by NamespaceId is a valid namespace ID,
> then
> + the next valid namespace ID on the NVM Express controller is returned in
> the
> + location pointed to by NamespaceId, and EFI_SUCCESS is returned.
> +
> + If the value pointed to by NamespaceId is the namespace ID of the last
> + namespace on the NVM Express controller, then EFI_NOT_FOUND is
> returned.
> +
> + @param[in] This The PPI instance pointer.
> + @param[in,out] NamespaceId On input, a pointer to a legal
> NamespaceId
> + for an NVM Express namespace present on the
> + NVM Express controller. On output, a pointer
> + to the next NamespaceId of an NVM Express
> + namespace on an NVM Express controller. An
> + input value of 0xFFFFFFFF retrieves the
> + first NamespaceId for an NVM Express
> + namespace present on an NVM Express
> + controller.
> +
> + @retval EFI_SUCCESS The Namespace ID of the next Namespace was
> + returned.
> + @retval EFI_NOT_FOUND There are no more namespaces defined on
> this
> + controller.
> + @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other
> than
> + 0xFFFFFFFF.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThruGetNextNameSpace (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + IN OUT UINT32 *NamespaceId
> + );
> +
> +/**
> + Sends an NVM Express Command Packet to an NVM Express controller or
> namespace. This function only
> + supports blocking execution of the command.
> +
> + @param[in] This The PPI instance pointer.
> + @param[in] NamespaceId Is a 32 bit Namespace ID to which the Nvm
> Express command packet will
> + be sent.
> + A Value of 0 denotes the NVM Express controller, a Value
> of all 0FFh in
> + the namespace ID specifies that the command packet
> should be sent to all
> + valid namespaces.
> + @param[in,out] Packet A pointer to the EDKII PEI NVM Express
> PassThru Command Packet to send
> + to the NVMe namespace specified by NamespaceId.
> +
> + @retval EFI_SUCCESS The EDKII PEI NVM Express Command Packet
> was sent by the host.
> + TransferLength bytes were transferred to, or from
> DataBuffer.
> + @retval EFI_NOT_READY The EDKII PEI NVM Express Command
> Packet could not be sent because
> + the controller is not ready. The caller may retry again later.
> + @retval EFI_DEVICE_ERROR A device error occurred while attempting
> to send the EDKII PEI NVM
> + Express Command Packet.
> + @retval EFI_INVALID_PARAMETER Namespace, or the contents of
> EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> + are invalid.
> + The EDKII PEI NVM Express Command Packet was not sent,
> so no
> + additional status information is available.
> + @retval EFI_UNSUPPORTED The command described by the EDKII PEI
> NVM Express Command Packet
> + is not supported by the host adapter.
> + The EDKII PEI NVM Express Command Packet was not sent,
> so no
> + additional status information is available.
> + @retval EFI_TIMEOUT A timeout occurred while waiting for the
> EDKII PEI NVM Express Command
> + Packet to execute.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +NvmePassThru (
> + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> + IN UINT32 NamespaceId,
> + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
> );
>
> #endif
> diff --git
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> c
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> c
> index dda69988b1..094d61bb8a 100644
> ---
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> c
> +++
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> c
> @@ -57,15 +57,17 @@ TrustTransferNvmeDevice (
> OUT UINTN *TransferLengthOut
> )
> {
> - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> + EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> CommandPacket;
> + EFI_NVM_EXPRESS_COMMAND Command;
> + EFI_NVM_EXPRESS_COMPLETION Completion;
> EFI_STATUS Status;
> UINT16 SpecificData;
> + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
>
> - ZeroMem (&CommandPacket,
> sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> - ZeroMem (&Completion, sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> + NvmePassThru = &Private->NvmePassThruPpi;
> + 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;
> @@ -94,11 +96,11 @@ TrustTransferNvmeDevice (
> CommandPacket.CommandTimeout = Timeout;
> CommandPacket.QueueType = NVME_ADMIN_QUEUE;
>
> - Status = NvmePassThru (
> - Private,
> - NVME_CONTROLLER_NSID,
> - &CommandPacket
> - );
> + Status = NvmePassThru->PassThru (
> + NvmePassThru,
> + NVME_CONTROLLER_NSID,
> + &CommandPacket
> + );
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
>
> if (!IsTrustSend) {
> if (EFI_ERROR (Status)) {
> --
> 2.16.2.windows.1
>
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [edk2-devel] [PATCH] MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI
2019-06-18 12:34 ` [edk2-devel] " Wu, Hao A
@ 2019-06-24 1:10 ` Wu, Hao A
0 siblings, 0 replies; 3+ messages in thread
From: Wu, Hao A @ 2019-06-24 1:10 UTC (permalink / raw)
To: devel@edk2.groups.io, Wu, Hao A, Chu, Maggie
Cc: Wang, Jian J, Ni, Ray, Zeng, Star
> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Wu, Hao A
> Sent: Tuesday, June 18, 2019 8:34 PM
> To: devel@edk2.groups.io; Chu, Maggie
> Cc: Wang, Jian J; Ni, Ray; Zeng, Star
> Subject: Re: [edk2-devel] [PATCH] MdeModulePkg/NvmExpressPei: Produce
> NVM Express PassThru PPI
>
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> > Maggie Chu
> > Sent: Monday, June 17, 2019 10:11 AM
> > To: devel@edk2.groups.io
> > Cc: Wu, Hao A; Wang, Jian J; Ni, Ray; Zeng, Star
> > Subject: [edk2-devel] [PATCH] MdeModulePkg/NvmExpressPei: Produce
> > NVM Express PassThru PPI
> >
> > https://bugzilla.tianocore.org/show_bug.cgi?id=1879
> > This commit will add codes to produce the NVM Express PassThru PPI.
> >
> > Signed-off-by: Maggie Chu <maggie.chu@intel.com>
> > Cc: Hao A Wu <hao.a.wu@intel.com>
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > ---
> > MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c | 26 +++
> > MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h | 8 +
> > .../Bus/Pci/NvmExpressPei/NvmExpressPei.inf | 1 +
> > .../Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c | 27 +--
> > .../Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c | 74 ++++---
> > .../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c | 218
> > ++++++++++++++++++++-
> > .../Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h | 159
> ++++++++++----
> > -
> > .../NvmExpressPei/NvmExpressPeiStorageSecurity.c | 24 +--
> > 8 files changed, 420 insertions(+), 117 deletions(-)
> >
> > diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> > index 0e79b29f82..987eed420e 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
> > @@ -28,6 +28,12 @@ EFI_PEI_PPI_DESCRIPTOR
> > mNvmeStorageSecurityPpiListTemplate = {
> > NULL
> > };
> >
> > +EFI_PEI_PPI_DESCRIPTOR mNvmePassThruPpiListTemplate = {
> > + (EFI_PEI_PPI_DESCRIPTOR_PPI |
> > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > + &gEdkiiPeiNvmExpressPassThruPpiGuid,
> > + NULL
> > +};
> > +
> > EFI_PEI_NOTIFY_DESCRIPTOR mNvmeEndOfPeiNotifyListTemplate = {
> > (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > &gEfiEndOfPeiSignalPpiGuid,
> > @@ -392,6 +398,26 @@ NvmExpressPeimEntry (
> > Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
> > PeiServicesInstallPpi (&Private->BlkIoPpiList);
> >
> > + //
> > + // Nvm Express Pass Thru PPI
> > + //
> > + Private->PassThruMode.Attributes =
> > EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
> > +
> > EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |
> > +
> > EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;
> > + Private->PassThruMode.IoAlign = sizeof (UINTN);
> > + Private->PassThruMode.NvmeVersion =
> > EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;
> > + Private->NvmePassThruPpi.Mode = &Private->PassThruMode;
> > + Private->NvmePassThruPpi.GetDevicePath =
> > NvmePassThruGetDevicePath;
> > + Private->NvmePassThruPpi.GetNextNameSpace =
> > NvmePassThruGetNextNameSpace;
> > + Private->NvmePassThruPpi.PassThru = NvmePassThru;
> > + CopyMem (
> > + &Private->NvmePassThruPpiList,
> > + &mNvmePassThruPpiListTemplate,
> > + sizeof (EFI_PEI_PPI_DESCRIPTOR)
> > + );
> > + Private->NvmePassThruPpiList.Ppi = &Private->NvmePassThruPpi;
> > + PeiServicesInstallPpi (&Private->NvmePassThruPpiList);
> > +
> > //
> > // Check if the NVME controller supports the Security Receive/Send
> > commands
> > //
> > diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> > index 6b2e2f0326..8cd905191b 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
> > @@ -19,6 +19,7 @@
> > #include <Ppi/BlockIo.h>
> > #include <Ppi/BlockIo2.h>
> > #include <Ppi/StorageSecurityCommand.h>
> > +#include <Ppi/NvmExpressPassThru.h>
> > #include <Ppi/IoMmu.h>
> > #include <Ppi/EndOfPeiPhase.h>
> >
> > @@ -74,6 +75,8 @@ struct _PEI_NVME_NAMESPACE_INFO {
> > PEI_NVME_CONTROLLER_PRIVATE_DATA *Controller;
> > };
> >
> > +#define NVME_CONTROLLER_NSID 0
> > +
> > //
> > // Unique signature for private data structure.
> > //
> > @@ -85,15 +88,18 @@ struct _PEI_NVME_NAMESPACE_INFO {
> > struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
> > UINT32 Signature;
> > UINTN MmioBase;
> > + EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
> > UINTN DevicePathLength;
> > EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> >
> > EFI_PEI_RECOVERY_BLOCK_IO_PPI BlkIoPpi;
> > EFI_PEI_RECOVERY_BLOCK_IO2_PPI BlkIo2Ppi;
> > EDKII_PEI_STORAGE_SECURITY_CMD_PPI StorageSecurityPpi;
> > + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI NvmePassThruPpi;
> > EFI_PEI_PPI_DESCRIPTOR BlkIoPpiList;
> > EFI_PEI_PPI_DESCRIPTOR BlkIo2PpiList;
> > EFI_PEI_PPI_DESCRIPTOR StorageSecurityPpiList;
> > + EFI_PEI_PPI_DESCRIPTOR NvmePassThruPpiList;
> > EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
> >
> > //
> > @@ -145,6 +151,8 @@ struct _PEI_NVME_CONTROLLER_PRIVATE_DATA {
> > CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, BlkIo2Ppi,
> > NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> > #define
> >
> GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY(a)
> > \
> > CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, StorageSecurityPpi,
> > NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> > +#define
> > GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU(a)
> \
> > + CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, NvmePassThruPpi,
> > NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> > #define GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a)
> > \
> > CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList,
> > NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE)
> >
> > diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> > index a8e4808e6b..4dd6c5704f 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
> > @@ -56,6 +56,7 @@
> > gEdkiiPeiNvmExpressHostControllerPpiGuid ## CONSUMES
> > gEdkiiIoMmuPpiGuid ## CONSUMES
> > gEfiEndOfPeiSignalPpiGuid ## CONSUMES
> > + gEdkiiPeiNvmExpressPassThruPpiGuid ## SOMETIMES_PRODUCES
> > gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_PRODUCES
> > gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_PRODUCES
> > gEdkiiPeiStorageSecurityCommandPpiGuid ##
> SOMETIMES_PRODUCES
> > diff --git
> > a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> > index 94cdd05f33..a9bf4f8190 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
> > @@ -2,7 +2,7 @@
> > The NvmExpressPei driver is used to manage non-volatile memory
> > subsystem
> > which follows NVM Express specification at PEI phase.
> >
> > - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> > + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
> >
> > SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> > @@ -34,17 +34,19 @@ ReadSectors (
> > UINT32 BlockSize;
> > PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> > UINT32 Bytes;
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> > + EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > + EFI_NVM_EXPRESS_COMMAND Command;
> > + EFI_NVM_EXPRESS_COMPLETION Completion;
> > + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
> >
> > Private = NamespaceInfo->Controller;
> > + NvmePassThru = &Private->NvmePassThruPpi;
> > BlockSize = NamespaceInfo->Media.BlockSize;
> > Bytes = Blocks * BlockSize;
> >
> > - ZeroMem (&CommandPacket,
> > sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_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;
> > @@ -63,11 +65,12 @@ ReadSectors (
> >
> > CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID |
> > CDW12_VALID;
> >
> > - Status = NvmePassThru (
> > - Private,
> > - NamespaceInfo->NamespaceId,
> > - &CommandPacket
> > - );
> > + Status = NvmePassThru->PassThru (
> > + NvmePassThru,
> > + NamespaceInfo->NamespaceId,
> > + &CommandPacket
> > + );
> > +
> > return Status;
> > }
> >
> > diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> > index c290f5b56f..1d7e3d26e0 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
> > @@ -320,14 +320,14 @@ NvmeIdentifyController (
> > IN VOID *Buffer
> > )
> > {
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_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;
> > //
> > @@ -348,7 +348,7 @@ NvmeIdentifyController (
> > CommandPacket.NvmeCmd->Cdw10 = 1;
> > CommandPacket.NvmeCmd->Flags = CDW10_VALID;
> >
> > - Status = NvmePassThru (
> > + Status = NvmePassThruExecute (
> > Private,
> > NVME_CONTROLLER_NSID,
> > &CommandPacket
> > @@ -374,14 +374,14 @@ NvmeIdentifyNamespace (
> > IN VOID *Buffer
> > )
> > {
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_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(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_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;
> > Command.Nsid = NamespaceId;
> > @@ -398,7 +398,7 @@ NvmeIdentifyNamespace (
> > CommandPacket.NvmeCmd->Cdw10 = 0;
> > CommandPacket.NvmeCmd->Flags = CDW10_VALID;
> >
> > - Status = NvmePassThru (
> > + Status = NvmePassThruExecute (
> > Private,
> > NamespaceId,
> > &CommandPacket
> > @@ -454,22 +454,21 @@ NvmeCreateIoCompletionQueue (
> > IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
> > )
> > {
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> > - EFI_STATUS Status;
> > - NVME_ADMIN_CRIOCQ CrIoCq;
> > -
> > - ZeroMem (&CommandPacket,
> > sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> > + 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;
> > +
> > + 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
> > CommandPacket.TransferBuffer = Private->CqBuffer[NVME_IO_QUEUE];
> > CommandPacket.TransferLength = EFI_PAGE_SIZE;
> > CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
> > @@ -481,7 +480,7 @@ NvmeCreateIoCompletionQueue (
> > CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoCq, sizeof
> > (NVME_ADMIN_CRIOCQ));
> > CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
> >
> > - Status = NvmePassThru (
> > + Status = NvmePassThruExecute (
> > Private,
> > NVME_CONTROLLER_NSID,
> > &CommandPacket
> > @@ -503,22 +502,21 @@ NvmeCreateIoSubmissionQueue (
> > IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private
> > )
> > {
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> > - EFI_STATUS Status;
> > - NVME_ADMIN_CRIOSQ CrIoSq;
> > -
> > - ZeroMem (&CommandPacket,
> > sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> > + 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;
> > +
> > + 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.Cid = Private->Cid[NVME_ADMIN_QUEUE]++;
> > CommandPacket.TransferBuffer = Private->SqBuffer[NVME_IO_QUEUE];
> > CommandPacket.TransferLength = EFI_PAGE_SIZE;
> > CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;
> > @@ -532,7 +530,7 @@ NvmeCreateIoSubmissionQueue (
> > CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoSq, sizeof
> > (NVME_ADMIN_CRIOSQ));
> > CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID;
> >
> > - Status = NvmePassThru (
> > + Status = NvmePassThruExecute (
> > Private,
> > NVME_CONTROLLER_NSID,
> > &CommandPacket
> > diff --git
> > a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> > index a33f5a872e..370a54e5a2 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
> > @@ -2,7 +2,7 @@
> > The NvmExpressPei driver is used to manage non-volatile memory
> > subsystem
> > which follows NVM Express specification at PEI phase.
> >
> > - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> > + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
> >
> > SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> > @@ -332,10 +332,10 @@ NvmeCheckCqStatus (
> >
> > **/
> > EFI_STATUS
> > -NvmePassThru (
> > +NvmePassThruExecute (
> > IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
> > IN UINT32 NamespaceId,
> > - IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > *Packet
> > + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> > )
> > {
> > EFI_STATUS Status;
> > @@ -411,9 +411,9 @@ NvmePassThru (
> > }
> >
> > ZeroMem (Sq, sizeof (NVME_SQ));
> > - Sq->Opc = Packet->NvmeCmd->Cdw0.Opcode;
> > - Sq->Fuse = Packet->NvmeCmd->Cdw0.FusedOperation;
> > - Sq->Cid = Packet->NvmeCmd->Cdw0.Cid;
> > + Sq->Opc = (UINT8)Packet->NvmeCmd->Cdw0.Opcode;
> > + Sq->Fuse = (UINT8)Packet->NvmeCmd->Cdw0.FusedOperation;
> > + Sq->Cid = Private->Cid[QueueId]++;;
> > Sq->Nsid = Packet->NvmeCmd->Nsid;
> >
> > //
> > @@ -603,7 +603,7 @@ NvmePassThru (
> > //
> > // Copy the Respose Queue entry for this command to the callers
> response
> > buffer
> > //
> > - CopyMem (Packet->NvmeCompletion, Cq, sizeof
> > (EDKII_PEI_NVM_EXPRESS_COMPLETION));
> > + CopyMem (Packet->NvmeCompletion, Cq, sizeof
> > (EFI_NVM_EXPRESS_COMPLETION));
> >
> > //
> > // Check the NVMe cmd execution result
> > @@ -622,3 +622,207 @@ Exit:
> >
> > return Status;
> > }
> > +
> > +/**
> > + Gets the device path information of the underlying NVM Express host
> > controller.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[out] DevicePathLength The length of the device path in bytes
> > specified
> > + by DevicePath.
> > + @param[out] DevicePath The device path of the underlying NVM
> > Express
> > + host controller.
> > + This field re-uses EFI Device Path Protocol as
> > + defined by Section 10.2 EFI Device Path Protocol
> > + of UEFI 2.7 Specification.
> > +
> > + @retval EFI_SUCCESS The operation succeeds.
> > + @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is
> > NULL.
> > + @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of
> > resources.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThruGetDevicePath (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + OUT UINTN *DevicePathLength,
> > + OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> > + )
> > +{
> > + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> > +
> > + if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + Private =
> > GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU
> (This);
> > +
> > + *DevicePathLength = Private->DevicePathLength;
> > + *DevicePath = AllocateCopyPool (Private->DevicePathLength,
> Private-
> > >DevicePath);
> > + if (*DevicePath == NULL) {
> > + *DevicePathLength = 0;
> > + return EFI_OUT_OF_RESOURCES;
> > + }
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Used to retrieve the next namespace ID for this NVM Express controller.
> > +
> > + If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the
> > first
> > + valid namespace ID defined on the NVM Express controller is returned in
> > the
> > + location pointed to by NamespaceId and a status of EFI_SUCCESS is
> > returned.
> > +
> > + If on input the value pointed to by NamespaceId is an invalid namespace
> > ID
> > + other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
> > +
> > + If on input the value pointed to by NamespaceId is a valid namespace ID,
> > then
> > + the next valid namespace ID on the NVM Express controller is returned
> in
> > the
> > + location pointed to by NamespaceId, and EFI_SUCCESS is returned.
> > +
> > + If the value pointed to by NamespaceId is the namespace ID of the last
> > + namespace on the NVM Express controller, then EFI_NOT_FOUND is
> > returned.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[in,out] NamespaceId On input, a pointer to a legal
> > NamespaceId
> > + for an NVM Express namespace present on the
> > + NVM Express controller. On output, a pointer
> > + to the next NamespaceId of an NVM Express
> > + namespace on an NVM Express controller. An
> > + input value of 0xFFFFFFFF retrieves the
> > + first NamespaceId for an NVM Express
> > + namespace present on an NVM Express
> > + controller.
> > +
> > + @retval EFI_SUCCESS The Namespace ID of the next Namespace
> was
> > + returned.
> > + @retval EFI_NOT_FOUND There are no more namespaces defined
> on
> > this
> > + controller.
> > + @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value
> other
> > than
> > + 0xFFFFFFFF.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThruGetNextNameSpace (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + IN OUT UINT32 *NamespaceId
> > + )
> > +{
> > + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> > + UINT32 DeviceIndex;
> > + EFI_STATUS Status;
> > +
> > + if (This == NULL || NamespaceId == NULL) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + Private =
> > GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU
> (This);
> > +
> > + Status = EFI_NOT_FOUND;
> > +
> > + //
> > + // If active namespace number is 0, then valid namespace ID is
> > unavailable
> > + //
> > + if (Private->ActiveNamespaceNum == 0) {
> > + return EFI_NOT_FOUND;
> > + }
> > +
> > + //
> > + // If the NamespaceId input value is 0xFFFFFFFF, then get the first valid
> > namespace ID
> > + //
> > + if (*NamespaceId == 0xFFFFFFFF) {
> > + //
> > + // Start with the first namespace ID
> > + //
> > + *NamespaceId = Private->NamespaceInfo[0].NamespaceId;
> > + Status = EFI_SUCCESS;
> > + } else {
> > + if (*NamespaceId > Private->ControllerData->Nn) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + if ((*NamespaceId + 1) > Private->ControllerData->Nn) {
> > + return EFI_NOT_FOUND;
> > + }
> > +
> > + for (DeviceIndex = 0; DeviceIndex < Private->ActiveNamespaceNum;
> > DeviceIndex++) {
> > + if (*NamespaceId == Private-
> > >NamespaceInfo[DeviceIndex].NamespaceId) {
> > + if ((DeviceIndex + 1) < Private->ActiveNamespaceNum) {
> > + *NamespaceId = Private->NamespaceInfo[DeviceIndex +
> > 1].NamespaceId;
> > + Status = EFI_SUCCESS;
> > + }
> > + break;
> > + }
> > + }
> > + }
> > +
> > + return Status;
> > +
> > +}
> > +
> > +/**
> > + Sends an NVM Express Command Packet to an NVM Express controller
> or
> > namespace. This function only
> > + supports blocking execution of the command.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[in] NamespaceId Is a 32 bit Namespace ID to which the
> Nvm
> > Express command packet will
> > + be sent.
> > + A Value of 0 denotes the NVM Express controller, a
> Value
> > of all 0FFh in
> > + the namespace ID specifies that the command packet
> > should be sent to all
> > + valid namespaces.
> > + @param[in,out] Packet A pointer to the EDKII PEI NVM Express
> > PassThru Command Packet to send
> > + to the NVMe namespace specified by NamespaceId.
> > +
> > + @retval EFI_SUCCESS The EDKII PEI NVM Express Command
> Packet
> > was sent by the host.
> > + TransferLength bytes were transferred to, or from
> > DataBuffer.
> > + @retval EFI_NOT_READY The EDKII PEI NVM Express Command
> > Packet could not be sent because
> > + the controller is not ready. The caller may retry again
> later.
> > + @retval EFI_DEVICE_ERROR A device error occurred while
> attempting
> > to send the EDKII PEI NVM
> > + Express Command Packet.
> > + @retval EFI_INVALID_PARAMETER Namespace, or the contents of
> > EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > + are invalid.
> > + The EDKII PEI NVM Express Command Packet was not
> sent,
> > so no
> > + additional status information is available.
> > + @retval EFI_UNSUPPORTED The command described by the EDKII
> PEI
> > NVM Express Command Packet
> > + is not supported by the host adapter.
> > + The EDKII PEI NVM Express Command Packet was not
> sent,
> > so no
> > + additional status information is available.
> > + @retval EFI_TIMEOUT A timeout occurred while waiting for the
> > EDKII PEI NVM Express Command
> > + Packet to execute.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThru (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + IN UINT32 NamespaceId,
> > + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> > + )
> > +{
> > + PEI_NVME_CONTROLLER_PRIVATE_DATA *Private;
> > + EFI_STATUS Status;
> > +
> > + if (This == NULL || Packet == NULL) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + Private =
> > GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NVME_PASSTHRU
> (This);
> > + //
> > + // Check NamespaceId is valid or not.
> > + //
> > + if ((NamespaceId > Private->ControllerData->Nn) &&
> > + (NamespaceId != (UINT32) -1)) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + Status = NvmePassThruExecute (
> > + Private,
> > + NamespaceId,
> > + Packet
> > + );
> > +
> > + return Status;
> > +
> > +}
> > +
> > diff --git
> > a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> > index 81066bbd54..00e8f0abda 100644
> > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> > +++
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
> > @@ -2,7 +2,7 @@
> > The NvmExpressPei driver is used to manage non-volatile memory
> > subsystem
> > which follows NVM Express specification at PEI phase.
> >
> > - Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> > + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
> >
> > SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> > @@ -11,52 +11,6 @@
> > #ifndef _NVM_EXPRESS_PEI_PASSTHRU_H_
> > #define _NVM_EXPRESS_PEI_PASSTHRU_H_
> >
> > -#define NVME_CONTROLLER_NSID 0
> > -
> > -typedef struct {
> > - UINT8 Opcode;
> > - UINT8 FusedOperation;
> > - #define NORMAL_CMD 0x00
> > - #define FUSED_FIRST_CMD 0x01
> > - #define FUSED_SECOND_CMD 0x02
> > - UINT16 Cid;
> > -} NVME_CDW0;
> > -
> > -typedef struct {
> > - NVME_CDW0 Cdw0;
> > - UINT8 Flags;
> > - #define CDW10_VALID 0x01
> > - #define CDW11_VALID 0x02
> > - #define CDW12_VALID 0x04
> > - #define CDW13_VALID 0x08
> > - #define CDW14_VALID 0x10
> > - #define CDW15_VALID 0x20
> > - UINT32 Nsid;
> > - UINT32 Cdw10;
> > - UINT32 Cdw11;
> > - UINT32 Cdw12;
> > - UINT32 Cdw13;
> > - UINT32 Cdw14;
> > - UINT32 Cdw15;
> > -} EDKII_PEI_NVM_EXPRESS_COMMAND;
> > -
> > -typedef struct {
> > - UINT32 Cdw0;
> > - UINT32 Cdw1;
> > - UINT32 Cdw2;
> > - UINT32 Cdw3;
> > -} EDKII_PEI_NVM_EXPRESS_COMPLETION;
> > -
> > -typedef struct {
> > - UINT64 CommandTimeout;
> > - VOID *TransferBuffer;
> > - UINT32 TransferLength;
> > - VOID *MetadataBuffer;
> > - UINT32 MetadataLength;
> > - UINT8 QueueType;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND *NvmeCmd;
> > - EDKII_PEI_NVM_EXPRESS_COMPLETION *NvmeCompletion;
> > -} EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
> >
> >
> > /**
> > @@ -91,10 +45,117 @@ typedef struct {
> >
> > **/
> > EFI_STATUS
> > -NvmePassThru (
> > +NvmePassThruExecute (
> > IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,
> > IN UINT32 NamespaceId,
> > - IN OUT EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > *Packet
> > + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> > + );
> > +
> > +/**
> > + Gets the device path information of the underlying NVM Express host
> > controller.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[out] DevicePathLength The length of the device path in bytes
> > specified
> > + by DevicePath.
> > + @param[out] DevicePath The device path of the underlying NVM
> > Express
> > + host controller.
> > + This field re-uses EFI Device Path Protocol as
> > + defined by Section 10.2 EFI Device Path Protocol
> > + of UEFI 2.7 Specification.
> > +
> > + @retval EFI_SUCCESS The operation succeeds.
> > + @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is
> > NULL.
> > + @retval EFI_OUT_OF_RESOURCES The operation fails due to lack of
> > resources.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThruGetDevicePath (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + OUT UINTN *DevicePathLength,
> > + OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> > + );
> > +
> > +/**
> > + Used to retrieve the next namespace ID for this NVM Express controller.
> > +
> > + If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the
> > first
> > + valid namespace ID defined on the NVM Express controller is returned in
> > the
> > + location pointed to by NamespaceId and a status of EFI_SUCCESS is
> > returned.
> > +
> > + If on input the value pointed to by NamespaceId is an invalid namespace
> > ID
> > + other than 0xFFFFFFFF, then EFI_INVALID_PARAMETER is returned.
> > +
> > + If on input the value pointed to by NamespaceId is a valid namespace ID,
> > then
> > + the next valid namespace ID on the NVM Express controller is returned
> in
> > the
> > + location pointed to by NamespaceId, and EFI_SUCCESS is returned.
> > +
> > + If the value pointed to by NamespaceId is the namespace ID of the last
> > + namespace on the NVM Express controller, then EFI_NOT_FOUND is
> > returned.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[in,out] NamespaceId On input, a pointer to a legal
> > NamespaceId
> > + for an NVM Express namespace present on the
> > + NVM Express controller. On output, a pointer
> > + to the next NamespaceId of an NVM Express
> > + namespace on an NVM Express controller. An
> > + input value of 0xFFFFFFFF retrieves the
> > + first NamespaceId for an NVM Express
> > + namespace present on an NVM Express
> > + controller.
> > +
> > + @retval EFI_SUCCESS The Namespace ID of the next Namespace
> was
> > + returned.
> > + @retval EFI_NOT_FOUND There are no more namespaces defined
> on
> > this
> > + controller.
> > + @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value
> other
> > than
> > + 0xFFFFFFFF.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThruGetNextNameSpace (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + IN OUT UINT32 *NamespaceId
> > + );
> > +
> > +/**
> > + Sends an NVM Express Command Packet to an NVM Express controller
> or
> > namespace. This function only
> > + supports blocking execution of the command.
> > +
> > + @param[in] This The PPI instance pointer.
> > + @param[in] NamespaceId Is a 32 bit Namespace ID to which the
> Nvm
> > Express command packet will
> > + be sent.
> > + A Value of 0 denotes the NVM Express controller, a
> Value
> > of all 0FFh in
> > + the namespace ID specifies that the command packet
> > should be sent to all
> > + valid namespaces.
> > + @param[in,out] Packet A pointer to the EDKII PEI NVM Express
> > PassThru Command Packet to send
> > + to the NVMe namespace specified by NamespaceId.
> > +
> > + @retval EFI_SUCCESS The EDKII PEI NVM Express Command
> Packet
> > was sent by the host.
> > + TransferLength bytes were transferred to, or from
> > DataBuffer.
> > + @retval EFI_NOT_READY The EDKII PEI NVM Express Command
> > Packet could not be sent because
> > + the controller is not ready. The caller may retry again
> later.
> > + @retval EFI_DEVICE_ERROR A device error occurred while
> attempting
> > to send the EDKII PEI NVM
> > + Express Command Packet.
> > + @retval EFI_INVALID_PARAMETER Namespace, or the contents of
> > EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > + are invalid.
> > + The EDKII PEI NVM Express Command Packet was not
> sent,
> > so no
> > + additional status information is available.
> > + @retval EFI_UNSUPPORTED The command described by the EDKII
> PEI
> > NVM Express Command Packet
> > + is not supported by the host adapter.
> > + The EDKII PEI NVM Express Command Packet was not
> sent,
> > so no
> > + additional status information is available.
> > + @retval EFI_TIMEOUT A timeout occurred while waiting for the
> > EDKII PEI NVM Express Command
> > + Packet to execute.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +NvmePassThru (
> > + IN EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *This,
> > + IN UINT32 NamespaceId,
> > + IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> *Packet
> > );
> >
> > #endif
> > diff --git
> >
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> > c
> >
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> > c
> > index dda69988b1..094d61bb8a 100644
> > ---
> >
> a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> > c
> > +++
> >
> b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.
> > c
> > @@ -57,15 +57,17 @@ TrustTransferNvmeDevice (
> > OUT UINTN *TransferLengthOut
> > )
> > {
> > - EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > - EDKII_PEI_NVM_EXPRESS_COMMAND Command;
> > - EDKII_PEI_NVM_EXPRESS_COMPLETION Completion;
> > + EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET
> > CommandPacket;
> > + EFI_NVM_EXPRESS_COMMAND Command;
> > + EFI_NVM_EXPRESS_COMPLETION Completion;
> > EFI_STATUS Status;
> > UINT16 SpecificData;
> > + EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI *NvmePassThru;
> >
> > - ZeroMem (&CommandPacket,
> > sizeof(EDKII_PEI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));
> > - ZeroMem (&Command, sizeof(EDKII_PEI_NVM_EXPRESS_COMMAND));
> > - ZeroMem (&Completion,
> sizeof(EDKII_PEI_NVM_EXPRESS_COMPLETION));
> > + NvmePassThru = &Private->NvmePassThruPpi;
> > + 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;
> > @@ -94,11 +96,11 @@ TrustTransferNvmeDevice (
> > CommandPacket.CommandTimeout = Timeout;
> > CommandPacket.QueueType = NVME_ADMIN_QUEUE;
> >
> > - Status = NvmePassThru (
> > - Private,
> > - NVME_CONTROLLER_NSID,
> > - &CommandPacket
> > - );
> > + Status = NvmePassThru->PassThru (
> > + NvmePassThru,
> > + NVME_CONTROLLER_NSID,
> > + &CommandPacket
> > + );
>
>
> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Thanks for the contribution.
Pushed via commit ba3aa1c4e7.
Best Regards,
Hao Wu
>
> Best Regards,
> Hao Wu
>
>
> >
> > if (!IsTrustSend) {
> > if (EFI_ERROR (Status)) {
> > --
> > 2.16.2.windows.1
> >
> >
> >
>
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-06-24 1:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-17 2:11 [PATCH] MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI Maggie Chu
2019-06-18 12:34 ` [edk2-devel] " Wu, Hao A
2019-06-24 1:10 ` Wu, Hao A
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox