Revision: 17481
          http://sourceforge.net/p/edk2/code/17481
Author:   erictian
Date:     2015-05-20 06:32:03 +0000 (Wed, 20 May 2015)
Log Message:
-----------
MdeModulePkg/CdExpressPei: Add RecoveryBlockIo2Ppi support

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Feng Tian <[email protected]>
Reviewed-by: Star Zeng <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/CdExpressPei.inf
    trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.c
    trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.h

Modified: trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/CdExpressPei.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/CdExpressPei.inf        
2015-05-20 06:31:28 UTC (rev 17480)
+++ trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/CdExpressPei.inf        
2015-05-20 06:32:03 UTC (rev 17481)
@@ -5,7 +5,7 @@
 # finds whether there is Recovery data in the device. If it finds recovery
 # data, it will install Device Recovery Module PPI.
 #
-# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 #
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions
@@ -60,6 +60,9 @@
   ## NOTIFY
   ## CONSUMES
   gEfiPeiVirtualBlockIoPpiGuid
+  ## NOTIFY
+  ## CONSUMES
+  gEfiPeiVirtualBlockIo2PpiGuid
   gEfiPeiDeviceRecoveryModulePpiGuid            ## PRODUCES
 
 [FeaturePcd]

Modified: trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.c  
2015-05-20 06:31:28 UTC (rev 17480)
+++ trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.c  
2015-05-20 06:32:03 UTC (rev 17481)
@@ -1,7 +1,7 @@
 /** @file
   Source file for CD recovery PEIM
 
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 
 This program and the accompanying materials
 are licensed and made available under the terms and conditions
@@ -60,7 +60,8 @@
   }
 
   PrivateData->CapsuleCount = 0;
-  Status                    = UpdateBlocksAndVolumes (PrivateData);
+  Status = UpdateBlocksAndVolumes (PrivateData, TRUE);
+  Status = UpdateBlocksAndVolumes (PrivateData, FALSE);
 
   //
   // Installs Ppi
@@ -69,9 +70,9 @@
   PrivateData->DeviceRecoveryPpi.GetRecoveryCapsuleInfo     = 
GetRecoveryCapsuleInfo;
   PrivateData->DeviceRecoveryPpi.LoadRecoveryCapsule        = 
LoadRecoveryCapsule;
 
-  PrivateData->PpiDescriptor.Flags                          = 
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
-  PrivateData->PpiDescriptor.Guid = &gEfiPeiDeviceRecoveryModulePpiGuid;
-  PrivateData->PpiDescriptor.Ppi = &PrivateData->DeviceRecoveryPpi;
+  PrivateData->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | 
EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
+  PrivateData->PpiDescriptor.Guid  = &gEfiPeiDeviceRecoveryModulePpiGuid;
+  PrivateData->PpiDescriptor.Ppi   = &PrivateData->DeviceRecoveryPpi;
 
   Status = PeiServicesInstallPpi (&PrivateData->PpiDescriptor);
   if (EFI_ERROR (Status)) {
@@ -87,11 +88,19 @@
   //
   PrivateData->NotifyDescriptor.Flags =
     (
+      EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
+    );
+  PrivateData->NotifyDescriptor.Guid    = &gEfiPeiVirtualBlockIoPpiGuid;
+  PrivateData->NotifyDescriptor.Notify  = BlockIoNotifyEntry;
+
+  PrivateData->NotifyDescriptor2.Flags =
+    (
       EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
       EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
     );
-  PrivateData->NotifyDescriptor.Guid    = &gEfiPeiVirtualBlockIoPpiGuid;
-  PrivateData->NotifyDescriptor.Notify  = BlockIoNotifyEntry;
+  PrivateData->NotifyDescriptor2.Guid    = &gEfiPeiVirtualBlockIo2PpiGuid;
+  PrivateData->NotifyDescriptor2.Notify  = BlockIoNotifyEntry;
+
   return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor);
 
 }
@@ -117,7 +126,11 @@
   IN VOID                       *Ppi
   )
 {
-  UpdateBlocksAndVolumes (mPrivateData);
+  if (CompareGuid (NotifyDescriptor->Guid, &gEfiPeiVirtualBlockIo2PpiGuid)) {
+    UpdateBlocksAndVolumes (mPrivateData, TRUE);
+  } else {
+    UpdateBlocksAndVolumes (mPrivateData, FALSE);
+  }
 
   return EFI_SUCCESS;
 }
@@ -126,22 +139,26 @@
   Finds out all the current Block IO PPIs in the system and add them into 
private data.
 
   @param PrivateData                    The private data structure that 
contains recovery module information.
+  @param BlockIo2                       Boolean to show whether using BlockIo2 
or BlockIo.
 
   @retval EFI_SUCCESS                   The blocks and volumes are updated 
successfully.
 
 **/
 EFI_STATUS
 UpdateBlocksAndVolumes (
-  IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData
+  IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData,
+  IN     BOOLEAN                         BlockIo2
   )
 {
   EFI_STATUS                      Status;
   EFI_PEI_PPI_DESCRIPTOR          *TempPpiDescriptor;
   UINTN                           BlockIoPpiInstance;
   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIoPpi;
+  EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2Ppi;
   UINTN                           NumberBlockDevices;
   UINTN                           IndexBlockDevice;
   EFI_PEI_BLOCK_IO_MEDIA          Media;
+  EFI_PEI_BLOCK_IO2_MEDIA         Media2;
   EFI_PEI_SERVICES                **PeiServices;
 
   IndexBlockDevice = 0;
@@ -150,12 +167,21 @@
   // Assuming all device Block Io Peims are dispatched already
   //
   for (BlockIoPpiInstance = 0; BlockIoPpiInstance < 
PEI_CD_EXPRESS_MAX_BLOCK_IO_PPI; BlockIoPpiInstance++) {
-    Status = PeiServicesLocatePpi (
-                              &gEfiPeiVirtualBlockIoPpiGuid,
-                              BlockIoPpiInstance,
-                              &TempPpiDescriptor,
-                              (VOID **) &BlockIoPpi
-                              );
+    if (BlockIo2) {
+      Status = PeiServicesLocatePpi (
+                                &gEfiPeiVirtualBlockIo2PpiGuid,
+                                BlockIoPpiInstance,
+                                &TempPpiDescriptor,
+                                (VOID **) &BlockIo2Ppi
+                                );
+    } else {
+      Status = PeiServicesLocatePpi (
+                                &gEfiPeiVirtualBlockIoPpiGuid,
+                                BlockIoPpiInstance,
+                                &TempPpiDescriptor,
+                                (VOID **) &BlockIoPpi
+                                );
+    }
     if (EFI_ERROR (Status)) {
       //
       // Done with all Block Io Ppis
@@ -164,11 +190,19 @@
     }
 
     PeiServices = (EFI_PEI_SERVICES  **) GetPeiServicesTablePointer ();
-    Status = BlockIoPpi->GetNumberOfBlockDevices (
-                          PeiServices,
-                          BlockIoPpi,
-                          &NumberBlockDevices
-                          );
+    if (BlockIo2) {
+      Status = BlockIo2Ppi->GetNumberOfBlockDevices (
+                              PeiServices,
+                              BlockIo2Ppi,
+                              &NumberBlockDevices
+                              );
+    } else {
+      Status = BlockIoPpi->GetNumberOfBlockDevices (
+                            PeiServices,
+                            BlockIoPpi,
+                            &NumberBlockDevices
+                            );
+    }
     if (EFI_ERROR (Status) || (NumberBlockDevices == 0)) {
       continue;
     }
@@ -176,28 +210,51 @@
     // Just retrieve the first block, should emulate all blocks.
     //
     for (IndexBlockDevice = 1; IndexBlockDevice <= NumberBlockDevices && 
PrivateData->CapsuleCount < PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER; IndexBlockDevice 
++) {
-      Status = BlockIoPpi->GetBlockDeviceMediaInfo (
-                            PeiServices,
-                            BlockIoPpi,
-                            IndexBlockDevice,
-                            &Media
-                            );
-      if (EFI_ERROR (Status) ||
-          !Media.MediaPresent ||
-           ((Media.DeviceType != IdeCDROM) && (Media.DeviceType != 
UsbMassStorage)) ||
-          (Media.BlockSize != PEI_CD_BLOCK_SIZE)
-          ) {
-        continue;
+      if (BlockIo2) {
+        Status = BlockIo2Ppi->GetBlockDeviceMediaInfo (
+                                PeiServices,
+                                BlockIo2Ppi,
+                                IndexBlockDevice,
+                                &Media2
+                                );
+        if (EFI_ERROR (Status) ||
+            !Media2.MediaPresent ||
+             ((Media2.InterfaceType != MSG_ATAPI_DP) && (Media2.InterfaceType 
!= MSG_USB_DP)) ||
+            (Media2.BlockSize != PEI_CD_BLOCK_SIZE)
+            ) {
+          continue;
+        }
+        DEBUG ((EFI_D_INFO, "PeiCdExpress InterfaceType is %d\n", 
Media2.InterfaceType));
+        DEBUG ((EFI_D_INFO, "PeiCdExpress MediaPresent is %d\n", 
Media2.MediaPresent));
+        DEBUG ((EFI_D_INFO, "PeiCdExpress BlockSize is  0x%x\n", 
Media2.BlockSize));
+      } else {
+        Status = BlockIoPpi->GetBlockDeviceMediaInfo (
+                              PeiServices,
+                              BlockIoPpi,
+                              IndexBlockDevice,
+                              &Media
+                              );
+        if (EFI_ERROR (Status) ||
+            !Media.MediaPresent ||
+             ((Media.DeviceType != IdeCDROM) && (Media.DeviceType != 
UsbMassStorage)) ||
+            (Media.BlockSize != PEI_CD_BLOCK_SIZE)
+            ) {
+          continue;
+        }
+        DEBUG ((EFI_D_INFO, "PeiCdExpress DeviceType is %d\n", 
Media.DeviceType));
+        DEBUG ((EFI_D_INFO, "PeiCdExpress MediaPresent is %d\n", 
Media.MediaPresent));
+        DEBUG ((EFI_D_INFO, "PeiCdExpress BlockSize is  0x%x\n", 
Media.BlockSize));
       }
 
-      DEBUG ((EFI_D_INFO, "PeiCdExpress DeviceType is   %d\n", 
Media.DeviceType));
-      DEBUG ((EFI_D_INFO, "PeiCdExpress MediaPresent is %d\n", 
Media.MediaPresent));
-      DEBUG ((EFI_D_INFO, "PeiCdExpress BlockSize is  0x%x\n", 
Media.BlockSize));
       DEBUG ((EFI_D_INFO, "PeiCdExpress Status is %d\n", Status));
 
       DEBUG ((EFI_D_INFO, "IndexBlockDevice is %d\n", IndexBlockDevice));
-      PrivateData->CapsuleData[PrivateData->CapsuleCount].IndexBlock = 
IndexBlockDevice;  
-      PrivateData->CapsuleData[PrivateData->CapsuleCount].BlockIo    = 
BlockIoPpi;
+      PrivateData->CapsuleData[PrivateData->CapsuleCount].IndexBlock = 
IndexBlockDevice;
+      if (BlockIo2) {
+        PrivateData->CapsuleData[PrivateData->CapsuleCount].BlockIo2 = 
BlockIo2Ppi;
+      } else {
+        PrivateData->CapsuleData[PrivateData->CapsuleCount].BlockIo  = 
BlockIoPpi;
+      }
       Status = FindRecoveryCapsules (PrivateData);
       DEBUG ((EFI_D_INFO, "Status is %d\n", Status));
 
@@ -231,6 +288,7 @@
   EFI_STATUS                      Status;
   UINTN                           Lba;
   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIoPpi;
+  EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2Ppi;
   UINTN                           BufferSize;
   UINT8                           *Buffer;
   UINT8                           Type;
@@ -251,6 +309,7 @@
   //
   IndexBlockDevice = 
PrivateData->CapsuleData[PrivateData->CapsuleCount].IndexBlock;
   BlockIoPpi       = 
PrivateData->CapsuleData[PrivateData->CapsuleCount].BlockIo;
+  BlockIo2Ppi      = 
PrivateData->CapsuleData[PrivateData->CapsuleCount].BlockIo2;
 
   VolumeSpaceSize = 0;
   StartOfVolume   = TRUE;
@@ -258,14 +317,25 @@
 
   while (TRUE) {
     SetMem (Buffer, BufferSize, 0);
-    Status = BlockIoPpi->ReadBlocks (
-                          (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
-                          BlockIoPpi,
-                          IndexBlockDevice,
-                          Lba,
-                          BufferSize,
-                          Buffer
-                          );
+    if (BlockIo2Ppi != NULL) {
+      Status = BlockIo2Ppi->ReadBlocks (
+                            (EFI_PEI_SERVICES **) GetPeiServicesTablePointer 
(),
+                            BlockIo2Ppi,
+                            IndexBlockDevice,
+                            Lba,
+                            BufferSize,
+                            Buffer
+                            );
+    } else {
+      Status = BlockIoPpi->ReadBlocks (
+                            (EFI_PEI_SERVICES **) GetPeiServicesTablePointer 
(),
+                            BlockIoPpi,
+                            IndexBlockDevice,
+                            Lba,
+                            BufferSize,
+                            Buffer
+                            );
+    }
     if (EFI_ERROR (Status)) {
       return Status;
     }
@@ -302,7 +372,7 @@
     RoorDirRecord   = (PEI_CD_EXPRESS_DIR_FILE_RECORD *) (Buffer + 
PEI_CD_EXPRESS_ROOT_DIR_RECORD_OFFSET);
     RootDirLBA      = RoorDirRecord->LocationOfExtent[0];
 
-    Status          = RetrieveCapsuleFileFromRoot (PrivateData, BlockIoPpi, 
IndexBlockDevice, RootDirLBA);
+    Status          = RetrieveCapsuleFileFromRoot (PrivateData, BlockIoPpi, 
BlockIo2Ppi, IndexBlockDevice, RootDirLBA);
     if (!EFI_ERROR (Status)) {
       //
       // Just look for the first primary descriptor
@@ -321,6 +391,7 @@
 
   @param PrivateData                    The private data structure that 
contains recovery module information.
   @param BlockIoPpi                     The Block IO PPI used to access the 
volume.
+  @param BlockIo2Ppi                    The Block IO 2 PPI used to access the 
volume.
   @param IndexBlockDevice               The index of current block device.
   @param Lba                            The starting logic block address to 
retrieve capsule.
 
@@ -334,6 +405,7 @@
 RetrieveCapsuleFileFromRoot (
   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA        *PrivateData,
   IN EFI_PEI_RECOVERY_BLOCK_IO_PPI          *BlockIoPpi,
+  IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI         *BlockIo2Ppi,
   IN UINTN                                  IndexBlockDevice,
   IN UINT32                                 Lba
   )
@@ -349,14 +421,25 @@
 
   SetMem (Buffer, BufferSize, 0);
 
-  Status = BlockIoPpi->ReadBlocks (
-                        (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
-                        BlockIoPpi,
-                        IndexBlockDevice,
-                        Lba,
-                        BufferSize,
-                        Buffer
-                        );
+  if (BlockIo2Ppi != NULL) {
+    Status = BlockIo2Ppi->ReadBlocks (
+                          (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
+                          BlockIo2Ppi,
+                          IndexBlockDevice,
+                          Lba,
+                          BufferSize,
+                          Buffer
+                          );
+  } else {
+    Status = BlockIoPpi->ReadBlocks (
+                          (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
+                          BlockIoPpi,
+                          IndexBlockDevice,
+                          Lba,
+                          BufferSize,
+                          Buffer
+                          );
+  }
   if (EFI_ERROR (Status)) {
     return Status;
   }
@@ -440,7 +523,8 @@
   PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData;
 
   PrivateData = PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS (This);
-  UpdateBlocksAndVolumes (PrivateData);
+  UpdateBlocksAndVolumes (PrivateData, TRUE);
+  UpdateBlocksAndVolumes (PrivateData, FALSE);
   *NumberRecoveryCapsules = PrivateData->CapsuleCount;
 
   if (*NumberRecoveryCapsules == 0) {
@@ -546,6 +630,7 @@
   EFI_STATUS                      Status;
   PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData;
   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIoPpi;
+  EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2Ppi;
   UINTN                           NumberRecoveryCapsules;
 
   Status = GetNumberRecoveryCapsules (PeiServices, This, 
&NumberRecoveryCapsules);
@@ -564,15 +649,27 @@
 
   PrivateData = PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS (This);
   BlockIoPpi  = PrivateData->CapsuleData[CapsuleInstance - 1].BlockIo;
+  BlockIo2Ppi = PrivateData->CapsuleData[CapsuleInstance - 1].BlockIo2;
 
-  Status = BlockIoPpi->ReadBlocks (
-                        PeiServices,
-                        BlockIoPpi,
-                        PrivateData->CapsuleData[CapsuleInstance - 
1].IndexBlock,
-                        PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleStartLBA,
-                        PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleSize,
-                        Buffer
-                        );
+  if (BlockIo2Ppi != NULL) {
+    Status = BlockIo2Ppi->ReadBlocks (
+                          PeiServices,
+                          BlockIo2Ppi,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].IndexBlock,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleStartLBA,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleSize,
+                          Buffer
+                          );
+  } else {
+    Status = BlockIoPpi->ReadBlocks (
+                          PeiServices,
+                          BlockIoPpi,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].IndexBlock,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleStartLBA,
+                          PrivateData->CapsuleData[CapsuleInstance - 
1].CapsuleSize,
+                          Buffer
+                          );
+  }
   return Status;
 }
 

Modified: trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.h  
2015-05-20 06:31:28 UTC (rev 17480)
+++ trunk/edk2/MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.h  
2015-05-20 06:32:03 UTC (rev 17481)
@@ -1,7 +1,7 @@
 /** @file
   Header file for CD recovery PEIM
 
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 
 This program and the accompanying materials
 are licensed and made available under the terms and conditions
@@ -21,6 +21,7 @@
 #include <PiPei.h>
 
 #include <Ppi/BlockIo.h>
+#include <Ppi/BlockIo2.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/DeviceRecoveryModule.h>
 
@@ -67,6 +68,7 @@
   UINTN                           CapsuleSize;
   UINTN                           IndexBlock;
   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIo;
+  EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2;
 } PEI_CD_EXPRESS_CAPSULE_DATA;
 
 #define PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'c', 'd', 'e')
@@ -77,6 +79,7 @@
   EFI_PEI_DEVICE_RECOVERY_MODULE_PPI    DeviceRecoveryPpi;
   EFI_PEI_PPI_DESCRIPTOR                PpiDescriptor;
   EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor;
+  EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor2;
 
   UINT8                                 *BlockBuffer;
   UINTN                                 CapsuleCount;
@@ -130,13 +133,15 @@
   Finds out all the current Block IO PPIs in the system and add them into 
private data.
 
   @param PrivateData                    The private data structure that 
contains recovery module information.
+  @param BlockIo2                       Boolean to show whether using BlockIo2 
or BlockIo.
 
   @retval EFI_SUCCESS                   The blocks and volumes are updated 
successfully.
 
 **/
 EFI_STATUS
 UpdateBlocksAndVolumes (
-  IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData
+  IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData,
+  IN     BOOLEAN                         BlockIo2
   );
 
 /**
@@ -253,6 +258,7 @@
 
   @param PrivateData                    The private data structure that 
contains recovery module information.
   @param BlockIoPpi                     The Block IO PPI used to access the 
volume.
+  @param BlockIo2Ppi                    The Block IO 2 PPI used to access the 
volume.
   @param IndexBlockDevice               The index of current block device.
   @param Lba                            The starting logic block address to 
retrieve capsule.
 
@@ -266,6 +272,7 @@
 RetrieveCapsuleFileFromRoot (
   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA        *PrivateData,
   IN EFI_PEI_RECOVERY_BLOCK_IO_PPI          *BlockIoPpi,
+  IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI         *BlockIo2Ppi,
   IN UINTN                                  IndexBlockDevice,
   IN UINT32                                 Lba
   );


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to