From: "Hsueh, Hong-Chih (Neo) via groups.io" <hong-chih.hsueh=amd.com@groups.io>
To: <devel@edk2.groups.io>
Cc: <jiangang.he@amd.com>, <abner.chang@amd.com>, <ray.ni@intel.com>,
"Neo Hsueh" <Hong-Chih.Hsueh@amd.com>
Subject: [edk2-devel] [PATCH] FatPkg/FatPei: FatPei should use both BlockIo and BlockIo2 PPI while searching for recovery capsule
Date: Wed, 25 Oct 2023 14:23:00 -0500 [thread overview]
Message-ID: <c2db7f1b2d30f8d788c1a70e8120fbdc4c5c23a7.1698261036.git.Hong-Chih.Hsueh@amd.com> (raw)
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/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
reply other threads:[~2023-10-25 19:25 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c2db7f1b2d30f8d788c1a70e8120fbdc4c5c23a7.1698261036.git.Hong-Chih.Hsueh@amd.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox