]> git.proxmox.com Git - mirror_edk2.git/blobdiff - FatPkg/FatPei/FatLiteApi.c
FatPkg: Add RecoveryBlockIo2Ppi support
[mirror_edk2.git] / FatPkg / FatPei / FatLiteApi.c
index 46054be284ae1a3b8eb343e55bfc4d5fc963283d..e63f1f546638552babe740e3f3c69762a4c2b625 100644 (file)
@@ -1,7 +1,7 @@
 /** @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 - 2015, 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
@@ -45,24 +45,28 @@ BlockIoNotifyEntry (
 \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
@@ -80,12 +84,21 @@ UpdateBlocksAndVolumes (
   // 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
@@ -93,29 +106,47 @@ UpdateBlocksAndVolumes (
       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
+      } 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
       }\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
       //\r
       // Not used here\r
@@ -123,10 +154,18 @@ UpdateBlocksAndVolumes (
       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
+      if (BlockIo2) {\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
+        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
       PrivateData->BlockDeviceCount++;\r
     }\r
   }\r
@@ -184,8 +223,11 @@ BlockIoNotifyEntry (
   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
@@ -247,7 +289,7 @@ FatPeimEntry (
 \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
@@ -258,7 +300,8 @@ FatPeimEntry (
   //\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
@@ -268,14 +311,20 @@ FatPeimEntry (
   //\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
@@ -428,22 +477,38 @@ GetRecoveryCapsuleInfo (
       // 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