/** @file\r
FAT recovery PEIM entry point, Ppi Functions and FAT Api functions.\r
\r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials are licensed and made available\r
under the terms and conditions of the BSD License which accompanies this\r
\r
@param PrivateData Global memory map for accessing global \r
variables. \r
+ @param BlockIo2 Boolean to show whether using BlockIo2 or BlockIo\r
\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
EFI_STATUS\r
UpdateBlocksAndVolumes (\r
- IN OUT PEI_FAT_PRIVATE_DATA *PrivateData\r
+ IN OUT PEI_FAT_PRIVATE_DATA *PrivateData,\r
+ IN BOOLEAN BlockIo2\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_PEI_PPI_DESCRIPTOR *TempPpiDescriptor;\r
- UINTN BlockIoPpiInstance;\r
- EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIoPpi;\r
- UINTN NumberBlockDevices;\r
- UINTN Index;\r
- EFI_PEI_BLOCK_IO_MEDIA Media;\r
- PEI_FAT_VOLUME Volume;\r
- EFI_PEI_SERVICES **PeiServices;\r
+ EFI_STATUS Status;\r
+ EFI_PEI_PPI_DESCRIPTOR *TempPpiDescriptor;\r
+ UINTN BlockIoPpiInstance;\r
+ EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIoPpi;\r
+ EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2Ppi;\r
+ UINTN NumberBlockDevices;\r
+ UINTN Index;\r
+ EFI_PEI_BLOCK_IO_MEDIA Media;\r
+ EFI_PEI_BLOCK_IO2_MEDIA Media2;\r
+ PEI_FAT_VOLUME Volume;\r
+ EFI_PEI_SERVICES **PeiServices;\r
\r
PeiServices = (EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
-\r
+ BlockIo2Ppi = NULL;\r
+ BlockIoPpi = NULL;\r
//\r
// Clean up caches\r
//\r
// Assuming all device Block Io Peims are dispatched already\r
//\r
for (BlockIoPpiInstance = 0; BlockIoPpiInstance < PEI_FAT_MAX_BLOCK_IO_PPI; BlockIoPpiInstance++) {\r
- Status = PeiServicesLocatePpi (\r
- &gEfiPeiVirtualBlockIoPpiGuid,\r
- BlockIoPpiInstance,\r
- &TempPpiDescriptor,\r
- (VOID **) &BlockIoPpi\r
- );\r
+ if (BlockIo2) {\r
+ Status = PeiServicesLocatePpi (\r
+ &gEfiPeiVirtualBlockIo2PpiGuid,\r
+ BlockIoPpiInstance,\r
+ &TempPpiDescriptor,\r
+ (VOID **) &BlockIo2Ppi\r
+ );\r
+ } else {\r
+ Status = PeiServicesLocatePpi (\r
+ &gEfiPeiVirtualBlockIoPpiGuid,\r
+ BlockIoPpiInstance,\r
+ &TempPpiDescriptor,\r
+ (VOID **) &BlockIoPpi\r
+ );\r
+ }\r
if (EFI_ERROR (Status)) {\r
//\r
// Done with all Block Io Ppis\r
break;\r
}\r
\r
- Status = BlockIoPpi->GetNumberOfBlockDevices (\r
- PeiServices,\r
- BlockIoPpi,\r
- &NumberBlockDevices\r
- );\r
+ if (BlockIo2) {\r
+ Status = BlockIo2Ppi->GetNumberOfBlockDevices (\r
+ PeiServices,\r
+ BlockIo2Ppi,\r
+ &NumberBlockDevices\r
+ );\r
+ } else {\r
+ Status = BlockIoPpi->GetNumberOfBlockDevices (\r
+ PeiServices,\r
+ BlockIoPpi,\r
+ &NumberBlockDevices\r
+ );\r
+ }\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r
\r
for (Index = 1; Index <= NumberBlockDevices && PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE; Index++) {\r
\r
- Status = BlockIoPpi->GetBlockDeviceMediaInfo (\r
- PeiServices,\r
- BlockIoPpi,\r
- Index,\r
- &Media\r
- );\r
- if (EFI_ERROR (Status) || !Media.MediaPresent) {\r
- continue;\r
+ if (BlockIo2) {\r
+ Status = BlockIo2Ppi->GetBlockDeviceMediaInfo (\r
+ PeiServices,\r
+ BlockIo2Ppi,\r
+ Index,\r
+ &Media2\r
+ );\r
+ if (EFI_ERROR (Status) || !Media2.MediaPresent) {\r
+ continue;\r
+ }\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo2 = BlockIo2Ppi;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].InterfaceType = Media2.InterfaceType;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media2.LastBlock;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = Media2.BlockSize;\r
+ } else {\r
+ Status = BlockIoPpi->GetBlockDeviceMediaInfo (\r
+ PeiServices,\r
+ BlockIoPpi,\r
+ Index,\r
+ &Media\r
+ );\r
+ if (EFI_ERROR (Status) || !Media.MediaPresent) {\r
+ continue;\r
+ }\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo = BlockIoPpi;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].DevType = Media.DeviceType;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media.LastBlock;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = (UINT32) Media.BlockSize;\r
}\r
\r
- PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = (UINT32) Media.BlockSize;\r
- PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media.LastBlock;\r
- PrivateData->BlockDevice[PrivateData->BlockDeviceCount].IoAlign = 0;\r
+ PrivateData->BlockDevice[PrivateData->BlockDeviceCount].IoAlign = 0;\r
//\r
// Not used here\r
//\r
PrivateData->BlockDevice[PrivateData->BlockDeviceCount].Logical = FALSE;\r
PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PartitionChecked = FALSE;\r
\r
- PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo = BlockIoPpi;\r
PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PhysicalDevNo = (UINT8) Index;\r
- PrivateData->BlockDevice[PrivateData->BlockDeviceCount].DevType = Media.DeviceType;\r
-\r
PrivateData->BlockDeviceCount++;\r
}\r
}\r
IN VOID *Ppi\r
)\r
{\r
- UpdateBlocksAndVolumes (mPrivateData);\r
-\r
+ if (CompareGuid (NotifyDescriptor->Guid, &gEfiPeiVirtualBlockIo2PpiGuid)) {\r
+ UpdateBlocksAndVolumes (mPrivateData, TRUE);\r
+ } else {\r
+ UpdateBlocksAndVolumes (mPrivateData, FALSE);\r
+ }\r
return EFI_SUCCESS;\r
}\r
\r
\r
PrivateData->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);\r
PrivateData->PpiDescriptor.Guid = &gEfiPeiDeviceRecoveryModulePpiGuid;\r
- PrivateData->PpiDescriptor.Ppi = &PrivateData->DeviceRecoveryPpi;\r
+ PrivateData->PpiDescriptor.Ppi = &PrivateData->DeviceRecoveryPpi;\r
\r
Status = PeiServicesInstallPpi (&PrivateData->PpiDescriptor);\r
if (EFI_ERROR (Status)) {\r
//\r
PrivateData->BlockDeviceCount = 0;\r
\r
- UpdateBlocksAndVolumes (PrivateData);\r
+ UpdateBlocksAndVolumes (PrivateData, TRUE);\r
+ UpdateBlocksAndVolumes (PrivateData, FALSE);\r
\r
//\r
// PrivateData is allocated now, set it to the module variable\r
//\r
// Installs Block Io Ppi notification function\r
//\r
- PrivateData->NotifyDescriptor.Flags =\r
+ PrivateData->NotifyDescriptor[0].Flags =\r
+ (\r
+ EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK\r
+ );\r
+ PrivateData->NotifyDescriptor[0].Guid = &gEfiPeiVirtualBlockIoPpiGuid;\r
+ PrivateData->NotifyDescriptor[0].Notify = BlockIoNotifyEntry;\r
+ PrivateData->NotifyDescriptor[1].Flags =\r
(\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |\r
EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST\r
);\r
- PrivateData->NotifyDescriptor.Guid = &gEfiPeiVirtualBlockIoPpiGuid;\r
- PrivateData->NotifyDescriptor.Notify = BlockIoNotifyEntry;\r
- return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor);\r
+ PrivateData->NotifyDescriptor[1].Guid = &gEfiPeiVirtualBlockIo2PpiGuid;\r
+ PrivateData->NotifyDescriptor[1].Notify = BlockIoNotifyEntry;\r
+ return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor[0]);\r
}\r
\r
\r
//\r
RecoveryCapsuleCount = 0;\r
for (Index = 0; Index < PrivateData->VolumeCount; Index++) {\r
- Status = FindRecoveryFile (PrivateData, Index, PEI_FAT_RECOVERY_CAPSULE_WITHOUT_NT_EMULATOR, &Handle);\r
+ Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle);\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r
//\r
RecoveryCapsuleCount = 0;\r
for (Index = 0; Index < PrivateData->VolumeCount; Index++) {\r
- Status = FindRecoveryFile (PrivateData, Index, PEI_FAT_RECOVERY_CAPSULE_WITHOUT_NT_EMULATOR, &Handle);\r
+ Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle);\r
\r
if (EFI_ERROR (Status)) {\r
continue;\r
// Fill in the Capsule Type GUID according to the block device type\r
//\r
if (BlockDeviceNo < PrivateData->BlockDeviceCount) {\r
- switch (PrivateData->BlockDevice[BlockDeviceNo].DevType) {\r
- case LegacyFloppy:\r
- CopyGuid (CapsuleType, &gRecoveryOnFatFloppyDiskGuid);\r
- break;\r
-\r
- case IdeCDROM:\r
- case IdeLS120:\r
- CopyGuid (CapsuleType, &gRecoveryOnFatIdeDiskGuid);\r
- break;\r
-\r
- case UsbMassStorage:\r
- CopyGuid (CapsuleType, &gRecoveryOnFatUsbDiskGuid);\r
- break;\r
-\r
- default:\r
- break;\r
+ if (PrivateData->BlockDevice[BlockDeviceNo].BlockIo2 != NULL) {\r
+ switch (PrivateData->BlockDevice[BlockDeviceNo].InterfaceType) {\r
+ case MSG_ATAPI_DP:\r
+ CopyGuid (CapsuleType, &gRecoveryOnFatIdeDiskGuid);\r
+ break;\r
+\r
+ case MSG_USB_DP:\r
+ CopyGuid (CapsuleType, &gRecoveryOnFatUsbDiskGuid);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ if (PrivateData->BlockDevice[BlockDeviceNo].BlockIo != NULL) {\r
+ switch (PrivateData->BlockDevice[BlockDeviceNo].DevType) {\r
+ case LegacyFloppy:\r
+ CopyGuid (CapsuleType, &gRecoveryOnFatFloppyDiskGuid);\r
+ break;\r
+\r
+ case IdeCDROM:\r
+ case IdeLS120:\r
+ CopyGuid (CapsuleType, &gRecoveryOnFatIdeDiskGuid);\r
+ break;\r
+\r
+ case UsbMassStorage:\r
+ CopyGuid (CapsuleType, &gRecoveryOnFatUsbDiskGuid);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
\r
//\r
RecoveryCapsuleCount = 0;\r
for (Index = 0; Index < PrivateData->VolumeCount; Index++) {\r
- Status = FindRecoveryFile (PrivateData, Index, PEI_FAT_RECOVERY_CAPSULE_WITHOUT_NT_EMULATOR, &Handle);\r
+ Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle);\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r