]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c
MdeModulePkg/NvmExpressPei: Add logic to produce SSC PPI
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / NvmExpressPei / NvmExpressPei.c
index 2fe73e942c688123893b4c51fecc1c714dfcd472..bf33b4b9a03b9ff0b35b39c815513102761d3714 100644 (file)
@@ -24,11 +24,17 @@ EFI_PEI_PPI_DESCRIPTOR  mNvmeBlkIoPpiListTemplate = {
 };\r
 \r
 EFI_PEI_PPI_DESCRIPTOR  mNvmeBlkIo2PpiListTemplate = {\r
-  EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiPeiVirtualBlockIo2PpiGuid,\r
   NULL\r
 };\r
 \r
+EFI_PEI_PPI_DESCRIPTOR  mNvmeStorageSecurityPpiListTemplate = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEdkiiPeiStorageSecurityCommandPpiGuid,\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
@@ -185,8 +191,7 @@ NvmePeimEndOfPei (
   PEI_NVME_CONTROLLER_PRIVATE_DATA    *Private;\r
 \r
   Private = GET_NVME_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (NotifyDescriptor);\r
-  NvmeDisableController (Private);\r
-  NvmeFreeControllerResource (Private);\r
+  NvmeFreeDmaResource (Private);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -211,9 +216,13 @@ NvmExpressPeimEntry (
   EDKII_NVM_EXPRESS_HOST_CONTROLLER_PPI    *NvmeHcPpi;\r
   UINT8                                    Controller;\r
   UINTN                                    MmioBase;\r
+  UINTN                                    DevicePathLength;\r
+  EFI_DEVICE_PATH_PROTOCOL                 *DevicePath;\r
   PEI_NVME_CONTROLLER_PRIVATE_DATA         *Private;\r
   EFI_PHYSICAL_ADDRESS                     DeviceAddress;\r
 \r
+  DEBUG ((DEBUG_INFO, "%a: Enters.\n", __FUNCTION__));\r
+\r
   //\r
   // Locate the NVME host controller PPI\r
   //\r
@@ -243,16 +252,41 @@ NvmExpressPeimEntry (
       break;\r
     }\r
 \r
+    Status = NvmeHcPpi->GetNvmeHcDevicePath (\r
+                          NvmeHcPpi,\r
+                          Controller,\r
+                          &DevicePathLength,\r
+                          &DevicePath\r
+                          );\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((\r
+        DEBUG_ERROR, "%a: Fail to allocate get the device path for Controller %d.\n",\r
+        __FUNCTION__, Controller\r
+        ));\r
+      return Status;\r
+    }\r
+\r
+    //\r
+    // Check validity of the device path of the NVM Express controller.\r
+    //\r
+    Status = NvmeIsHcDevicePathValid (DevicePath, DevicePathLength);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((\r
+        DEBUG_ERROR, "%a: The device path is invalid for Controller %d.\n",\r
+        __FUNCTION__, Controller\r
+        ));\r
+      Controller++;\r
+      continue;\r
+    }\r
+\r
     //\r
     // Memory allocation for controller private data\r
     //\r
     Private = AllocateZeroPool (sizeof (PEI_NVME_CONTROLLER_PRIVATE_DATA));\r
     if (Private == NULL) {\r
       DEBUG ((\r
-        DEBUG_ERROR,\r
-        "%a: Fail to allocate private data for Controller %d.\n",\r
-        __FUNCTION__,\r
-        Controller\r
+        DEBUG_ERROR, "%a: Fail to allocate private data for Controller %d.\n",\r
+        __FUNCTION__, Controller\r
         ));\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -268,12 +302,9 @@ NvmExpressPeimEntry (
                );\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((\r
-        DEBUG_ERROR,\r
-        "%a: Fail to allocate DMA buffers for Controller %d.\n",\r
-        __FUNCTION__,\r
-        Controller\r
+        DEBUG_ERROR, "%a: Fail to allocate DMA buffers for Controller %d.\n",\r
+        __FUNCTION__, Controller\r
         ));\r
-      NvmeFreeControllerResource (Private);\r
       return Status;\r
     }\r
     ASSERT (DeviceAddress == ((EFI_PHYSICAL_ADDRESS) (UINTN) Private->Buffer));\r
@@ -282,20 +313,10 @@ NvmExpressPeimEntry (
     //\r
     // Initialize controller private data\r
     //\r
-    Private->Signature = NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;\r
-    Private->MmioBase  = MmioBase;\r
-    Private->BlkIoPpi.GetNumberOfBlockDevices  = NvmeBlockIoPeimGetDeviceNo;\r
-    Private->BlkIoPpi.GetBlockDeviceMediaInfo  = NvmeBlockIoPeimGetMediaInfo;\r
-    Private->BlkIoPpi.ReadBlocks               = NvmeBlockIoPeimReadBlocks;\r
-    Private->BlkIo2Ppi.Revision                = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;\r
-    Private->BlkIo2Ppi.GetNumberOfBlockDevices = NvmeBlockIoPeimGetDeviceNo2;\r
-    Private->BlkIo2Ppi.GetBlockDeviceMediaInfo = NvmeBlockIoPeimGetMediaInfo2;\r
-    Private->BlkIo2Ppi.ReadBlocks              = NvmeBlockIoPeimReadBlocks2;\r
-    CopyMem (&Private->BlkIoPpiList, &mNvmeBlkIoPpiListTemplate, sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
-    CopyMem (&Private->BlkIo2PpiList, &mNvmeBlkIo2PpiListTemplate, sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
-    CopyMem (&Private->EndOfPeiNotifyList, &mNvmeEndOfPeiNotifyListTemplate, sizeof (EFI_PEI_NOTIFY_DESCRIPTOR));\r
-    Private->BlkIoPpiList.Ppi   = &Private->BlkIoPpi;\r
-    Private->BlkIo2PpiList.Ppi  = &Private->BlkIo2Ppi;\r
+    Private->Signature        = NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;\r
+    Private->MmioBase         = MmioBase;\r
+    Private->DevicePathLength = DevicePathLength;\r
+    Private->DevicePath       = DevicePath;\r
 \r
     //\r
     // Initialize the NVME controller\r
@@ -305,11 +326,9 @@ NvmExpressPeimEntry (
       DEBUG ((\r
         DEBUG_ERROR,\r
         "%a: Controller initialization fail for Controller %d with Status - %r.\n",\r
-        __FUNCTION__,\r
-        Controller,\r
-        Status\r
+        __FUNCTION__, Controller, Status\r
         ));\r
-      NvmeFreeControllerResource (Private);\r
+      NvmeFreeDmaResource (Private);\r
       Controller++;\r
       continue;\r
     }\r
@@ -325,22 +344,68 @@ NvmExpressPeimEntry (
       DEBUG ((\r
         DEBUG_ERROR,\r
         "%a: Namespaces discovery fail for Controller %d with Status - %r.\n",\r
-        __FUNCTION__,\r
-        Controller,\r
-        Status\r
+        __FUNCTION__, Controller, Status\r
         ));\r
-      NvmeFreeControllerResource (Private);\r
+      NvmeFreeDmaResource (Private);\r
       Controller++;\r
       continue;\r
     }\r
 \r
+    Private->BlkIoPpi.GetNumberOfBlockDevices  = NvmeBlockIoPeimGetDeviceNo;\r
+    Private->BlkIoPpi.GetBlockDeviceMediaInfo  = NvmeBlockIoPeimGetMediaInfo;\r
+    Private->BlkIoPpi.ReadBlocks               = NvmeBlockIoPeimReadBlocks;\r
+    CopyMem (\r
+      &Private->BlkIoPpiList,\r
+      &mNvmeBlkIoPpiListTemplate,\r
+      sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
+      );\r
+    Private->BlkIoPpiList.Ppi                  = &Private->BlkIoPpi;\r
+\r
+    Private->BlkIo2Ppi.Revision                = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;\r
+    Private->BlkIo2Ppi.GetNumberOfBlockDevices = NvmeBlockIoPeimGetDeviceNo2;\r
+    Private->BlkIo2Ppi.GetBlockDeviceMediaInfo = NvmeBlockIoPeimGetMediaInfo2;\r
+    Private->BlkIo2Ppi.ReadBlocks              = NvmeBlockIoPeimReadBlocks2;\r
+    CopyMem (\r
+      &Private->BlkIo2PpiList,\r
+      &mNvmeBlkIo2PpiListTemplate,\r
+      sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
+      );\r
+    Private->BlkIo2PpiList.Ppi                 = &Private->BlkIo2Ppi;\r
     PeiServicesInstallPpi (&Private->BlkIoPpiList);\r
-    PeiServicesNotifyPpi (&Private->EndOfPeiNotifyList);\r
+\r
+    //\r
+    // Check if the NVME controller supports the Security Receive/Send commands\r
+    //\r
+    if ((Private->ControllerData->Oacs & SECURITY_SEND_RECEIVE_SUPPORTED) != 0) {\r
+      DEBUG ((\r
+        DEBUG_INFO,\r
+        "%a: Security Security Command PPI will be produced for Controller %d.\n",\r
+        __FUNCTION__, Controller\r
+        ));\r
+      Private->StorageSecurityPpi.Revision           = EDKII_STORAGE_SECURITY_PPI_REVISION;\r
+      Private->StorageSecurityPpi.GetNumberofDevices = NvmeStorageSecurityGetDeviceNo;\r
+      Private->StorageSecurityPpi.GetDevicePath      = NvmeStorageSecurityGetDevicePath;\r
+      Private->StorageSecurityPpi.ReceiveData        = NvmeStorageSecurityReceiveData;\r
+      Private->StorageSecurityPpi.SendData           = NvmeStorageSecuritySendData;\r
+      CopyMem (\r
+        &Private->StorageSecurityPpiList,\r
+        &mNvmeStorageSecurityPpiListTemplate,\r
+        sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
+        );\r
+      Private->StorageSecurityPpiList.Ppi            = &Private->StorageSecurityPpi;\r
+      PeiServicesInstallPpi (&Private->StorageSecurityPpiList);\r
+    }\r
+\r
+    CopyMem (\r
+      &Private->EndOfPeiNotifyList,\r
+      &mNvmeEndOfPeiNotifyListTemplate,\r
+      sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)\r
+      );\r
+    PeiServicesNotifyPpi  (&Private->EndOfPeiNotifyList);\r
+\r
     DEBUG ((\r
-      DEBUG_INFO,\r
-      "%a: BlockIO PPI has been installed on Controller %d.\n",\r
-      __FUNCTION__,\r
-      Controller\r
+      DEBUG_INFO, "%a: Controller %d has been successfully initialized.\n",\r
+      __FUNCTION__, Controller\r
       ));\r
     Controller++;\r
   }\r