]> git.proxmox.com Git - mirror_edk2.git/commitdiff
FatPkg: Add RecoveryBlockIo2Ppi support
authorFeng Tian <feng.tian@intel.com>
Wed, 20 May 2015 05:57:50 +0000 (05:57 +0000)
committerJordan Justen <jordan.l.justen@intel.com>
Thu, 7 Apr 2016 06:22:43 +0000 (23:22 -0700)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Feng Tian <feng.tian@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
(based on FatPkg commit add52adf722d2b0f1db4c8780a30289dacd59e02)

[jordan.l.justen@intel.com: Use script to relicense to 2-clause BSD]
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Acked-by: Mark Doran <mark.doran@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
FatPkg/FatPei/FatLiteApi.c
FatPkg/FatPei/FatLiteLib.c
FatPkg/FatPei/FatLitePeim.h
FatPkg/FatPei/FatPei.inf

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
index 06f031defe6924ff6870747699b258c8a6505a5f..109789a54baa0e412e52913256dc8c92fb4c0d82 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   General purpose supporting routines for FAT recovery PEIM\r
 \r
-Copyright (c) 2006 - 2013, 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
@@ -87,7 +87,17 @@ FatReadBlock (
     // Status = BlockDev->ReadFunc\r
     //  (PrivateData->PeiServices, BlockDev->PhysicalDevNo, Lba, BufferSize, Buffer);\r
     //\r
-    Status = BlockDev->BlockIo->ReadBlocks (\r
+    if (BlockDev->BlockIo2 != NULL) {\r
+      Status = BlockDev->BlockIo2->ReadBlocks (\r
+                                    (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
+                                    BlockDev->BlockIo2,\r
+                                    BlockDev->PhysicalDevNo,\r
+                                    Lba,\r
+                                    BufferSize,\r
+                                    Buffer\r
+                                    );\r
+    } else {\r
+      Status = BlockDev->BlockIo->ReadBlocks (\r
                                   (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
                                   BlockDev->BlockIo,\r
                                   BlockDev->PhysicalDevNo,\r
@@ -95,6 +105,7 @@ FatReadBlock (
                                   BufferSize,\r
                                   Buffer\r
                                   );\r
+    }\r
 \r
   } else {\r
     Status = FatReadDisk (\r
index 69429fe03a17924d1da1342e5dcf246de90fdc2f..e838390de4db24929b91ca9b9c100420f58eee79 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Data structures for FAT recovery PEIM\r
 \r
-Copyright (c) 2006 - 2010, 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
@@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <Guid/RecoveryDevice.h>\r
 #include <Ppi/BlockIo.h>\r
+#include <Ppi/BlockIo2.h>\r
 #include <Ppi/DeviceRecoveryModule.h>\r
 \r
 #include <Library/DebugLib.h>\r
@@ -73,11 +74,13 @@ typedef struct {
   // Following fields only valid for physical device\r
   //\r
   EFI_PEI_BLOCK_DEVICE_TYPE     DevType;\r
+  UINT8                         InterfaceType;\r
   //\r
   // EFI_PEI_READ_BLOCKS         ReadFunc;\r
   //\r
-  EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIo;\r
-  UINT8                         PhysicalDevNo;\r
+  EFI_PEI_RECOVERY_BLOCK_IO_PPI  *BlockIo;\r
+  EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2;\r
+  UINT8                          PhysicalDevNo;\r
 } PEI_FAT_BLOCK_DEVICE;\r
 \r
 //\r
@@ -150,7 +153,7 @@ typedef struct {
   UINTN                               Signature;\r
   EFI_PEI_DEVICE_RECOVERY_MODULE_PPI  DeviceRecoveryPpi;\r
   EFI_PEI_PPI_DESCRIPTOR              PpiDescriptor;\r
-  EFI_PEI_NOTIFY_DESCRIPTOR           NotifyDescriptor;\r
+  EFI_PEI_NOTIFY_DESCRIPTOR           NotifyDescriptor[2];\r
 \r
   UINT8                               UnicodeCaseMap[0x300];\r
   CHAR8                               *EngUpperMap;\r
index 83a67bb8c1488e5917ad370d1699c422faf6d789..0304b00609d246e6b9a8ee81c0f4cbda1651ef90 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 #    Lite Fat driver only used in Pei Phase.\r
 #\r
-#  Copyright (c) 2006 - 2014, 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
 \r
 [Ppis]\r
   gEfiPeiVirtualBlockIoPpiGuid                  # PPI_NOTIFY SOMETIMES_CONSUMED\r
+  gEfiPeiVirtualBlockIo2PpiGuid                 # PPI_NOTIFY SOMETIMES_CONSUMED\r
   gEfiPeiDeviceRecoveryModulePpiGuid            # SOMETIMES_PRODUCED\r
 \r
 \r
 [FeaturePcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport               ## CONSUMES\r
-  \r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport         ## CONSUMES\r
 \r
 [Depex]\r
   gEfiPeiMemoryDiscoveredPpiGuid AND gEfiPeiBootInRecoveryModePpiGuid\r