]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/NvmExpressPei: Produce NVM Express PassThru PPI
authorMaggie Chu <maggie.chu@intel.com>
Mon, 17 Jun 2019 02:11:26 +0000 (10:11 +0800)
committerHao A Wu <hao.a.wu@intel.com>
Mon, 24 Jun 2019 01:07:58 +0000 (09:07 +0800)
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>
Reviewed-by: 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
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.inf
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiBlockIo.c
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.c
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.c
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiPassThru.h
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiStorageSecurity.c

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