[edk2-devel] [PATCH] FatPkg/FatPei: FatPei should use both BlockIo and BlockIo2 PPI while searching for recovery capsule

Hsueh, Hong-Chih (Neo) via groups.io posted 1 patch 6 months ago
Failed in applying to current master (apply log)
FatPkg/FatPei/FatLiteApi.c | 141 ++++++++++++++++++++-----------------
1 file changed, 78 insertions(+), 63 deletions(-)
[edk2-devel] [PATCH] FatPkg/FatPei: FatPei should use both BlockIo and BlockIo2 PPI while searching for recovery capsule
Posted by Hsueh, Hong-Chih (Neo) via groups.io 6 months ago
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4571

Utilize both PeiVirtualBlockIo and PeiVirtualBlockIo2 PPI while searching for recovery capsule from storage devices

Cc: Jiangang He <jiangang.he@amd.com>
Cc: Abner Chang <abner.chang@amd.com>
Signed-off-by: Neo Hsueh <Hong-Chih.Hsueh@amd.com>
---
 FatPkg/FatPei/FatLiteApi.c | 141 ++++++++++++++++++++-----------------
 1 file changed, 78 insertions(+), 63 deletions(-)

diff --git a/FatPkg/FatPei/FatLiteApi.c b/FatPkg/FatPei/FatLiteApi.c
index cc48c4c66b..19fcd6f56b 100644
--- a/FatPkg/FatPei/FatLiteApi.c
+++ b/FatPkg/FatPei/FatLiteApi.c
@@ -2,6 +2,7 @@
   FAT recovery PEIM entry point, Ppi Functions and FAT Api functions.
 
 Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
+Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
 
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
@@ -45,13 +46,13 @@ BlockIoNotifyEntry (
 **/
 EFI_STATUS
 UpdateBlocksAndVolumes (
-  IN OUT PEI_FAT_PRIVATE_DATA  *PrivateData,
-  IN     BOOLEAN               BlockIo2
+  IN OUT PEI_FAT_PRIVATE_DATA  *PrivateData
   )
 {
   EFI_STATUS                      Status;
   EFI_PEI_PPI_DESCRIPTOR          *TempPpiDescriptor;
   UINTN                           BlockIoPpiInstance;
+  UINTN                           BlockIo2PpiInstance;
   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIoPpi;
   EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2Ppi;
   UINTN                           NumberBlockDevices;
@@ -78,21 +79,12 @@ UpdateBlocksAndVolumes (
   // Assuming all device Block Io Peims are dispatched already
   //
   for (BlockIoPpiInstance = 0; BlockIoPpiInstance < PEI_FAT_MAX_BLOCK_IO_PPI; BlockIoPpiInstance++) {
-    if (BlockIo2) {
-      Status = PeiServicesLocatePpi (
-                 &gEfiPeiVirtualBlockIo2PpiGuid,
-                 BlockIoPpiInstance,
-                 &TempPpiDescriptor,
-                 (VOID **)&BlockIo2Ppi
-                 );
-    } else {
-      Status = PeiServicesLocatePpi (
-                 &gEfiPeiVirtualBlockIoPpiGuid,
-                 BlockIoPpiInstance,
-                 &TempPpiDescriptor,
-                 (VOID **)&BlockIoPpi
-                 );
-    }
+    Status = PeiServicesLocatePpi (
+               &gEfiPeiVirtualBlockIoPpiGuid,
+               BlockIoPpiInstance,
+               &TempPpiDescriptor,
+               (VOID **)&BlockIoPpi
+               );
 
     if (EFI_ERROR (Status)) {
       //
@@ -101,57 +93,85 @@ UpdateBlocksAndVolumes (
       break;
     }
 
-    if (BlockIo2) {
-      Status = BlockIo2Ppi->GetNumberOfBlockDevices (
-                              PeiServices,
-                              BlockIo2Ppi,
-                              &NumberBlockDevices
-                              );
-    } else {
-      Status = BlockIoPpi->GetNumberOfBlockDevices (
+    Status = BlockIoPpi->GetNumberOfBlockDevices (
+                           PeiServices,
+                           BlockIoPpi,
+                           &NumberBlockDevices
+                           );
+
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+
+    for (Index = 1; Index <= NumberBlockDevices && PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE; Index++) {
+      Status = BlockIoPpi->GetBlockDeviceMediaInfo (
                              PeiServices,
                              BlockIoPpi,
-                             &NumberBlockDevices
+                             Index,
+                             &Media
                              );
+      if (EFI_ERROR (Status) || !Media.MediaPresent) {
+        continue;
+      }
+
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo   = BlockIoPpi;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].DevType   = Media.DeviceType;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media.LastBlock;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = (UINT32)Media.BlockSize;
+
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].IoAlign = 0;
+      //
+      // Not used here
+      //
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].Logical          = FALSE;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PartitionChecked = FALSE;
+
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PhysicalDevNo = (UINT8)Index;
+      PrivateData->BlockDeviceCount++;
     }
+  }
+
+  for (BlockIo2PpiInstance = 0; BlockIo2PpiInstance + BlockIoPpiInstance < PEI_FAT_MAX_BLOCK_IO_PPI; BlockIo2PpiInstance++) {
+    Status = PeiServicesLocatePpi (
+               &gEfiPeiVirtualBlockIo2PpiGuid,
+               BlockIo2PpiInstance,
+               &TempPpiDescriptor,
+               (VOID **)&BlockIo2Ppi
+               );
 
     if (EFI_ERROR (Status)) {
-      continue;
+      //
+      // Done with all Block Io Ppis
+      //
+      break;
     }
 
-    for (Index = 1; Index <= NumberBlockDevices && PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE; Index++) {
-      if (BlockIo2) {
-        Status = BlockIo2Ppi->GetBlockDeviceMediaInfo (
-                                PeiServices,
-                                BlockIo2Ppi,
-                                Index,
-                                &Media2
-                                );
-        if (EFI_ERROR (Status) || !Media2.MediaPresent) {
-          continue;
-        }
+    Status = BlockIo2Ppi->GetNumberOfBlockDevices (
+                            PeiServices,
+                            BlockIo2Ppi,
+                            &NumberBlockDevices
+                            );
 
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo2      = BlockIo2Ppi;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].InterfaceType = Media2.InterfaceType;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock     = Media2.LastBlock;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize     = Media2.BlockSize;
-      } else {
-        Status = BlockIoPpi->GetBlockDeviceMediaInfo (
-                               PeiServices,
-                               BlockIoPpi,
-                               Index,
-                               &Media
-                               );
-        if (EFI_ERROR (Status) || !Media.MediaPresent) {
-          continue;
-        }
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
 
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo   = BlockIoPpi;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].DevType   = Media.DeviceType;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media.LastBlock;
-        PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = (UINT32)Media.BlockSize;
+    for (Index = 1; Index <= NumberBlockDevices && PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE; Index++) {
+      Status = BlockIo2Ppi->GetBlockDeviceMediaInfo (
+                              PeiServices,
+                              BlockIo2Ppi,
+                              Index,
+                              &Media2
+                              );
+      if (EFI_ERROR (Status) || !Media2.MediaPresent) {
+        continue;
       }
 
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo2      = BlockIo2Ppi;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].InterfaceType = Media2.InterfaceType;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock     = Media2.LastBlock;
+      PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize     = Media2.BlockSize;
+
       PrivateData->BlockDevice[PrivateData->BlockDeviceCount].IoAlign = 0;
       //
       // Not used here
@@ -217,11 +237,7 @@ BlockIoNotifyEntry (
   IN VOID                       *Ppi
   )
 {
-  if (CompareGuid (NotifyDescriptor->Guid, &gEfiPeiVirtualBlockIo2PpiGuid)) {
-    UpdateBlocksAndVolumes (mPrivateData, TRUE);
-  } else {
-    UpdateBlocksAndVolumes (mPrivateData, FALSE);
-  }
+  UpdateBlocksAndVolumes (mPrivateData);
 
   return EFI_SUCCESS;
 }
@@ -295,8 +311,7 @@ FatPeimEntry (
   //
   PrivateData->BlockDeviceCount = 0;
 
-  UpdateBlocksAndVolumes (PrivateData, TRUE);
-  UpdateBlocksAndVolumes (PrivateData, FALSE);
+  UpdateBlocksAndVolumes (PrivateData);
 
   //
   // PrivateData is allocated now, set it to the module variable
-- 
2.40.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#110064): https://edk2.groups.io/g/devel/message/110064
Mute This Topic: https://groups.io/mt/102185681/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-