};\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
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
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
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
);\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
//\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
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
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