| /** @file | |
| Routines supporting partition discovery and | |
| logical device reading | |
| Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include "FatLitePeim.h" | |
| /** | |
| This function finds Eltorito partitions. Main algorithm | |
| is ported from DXE partition driver. | |
| @param[in] PrivateData The global memory map | |
| @param[in] ParentBlockDevNo The parent block device | |
| @retval TRUE New partitions are detected and logical block devices | |
| are added to block device array | |
| @retval FALSE No new partitions are added | |
| **/ | |
| BOOLEAN | |
| FatFindEltoritoPartitions ( | |
| IN PEI_FAT_PRIVATE_DATA *PrivateData, | |
| IN UINTN ParentBlockDevNo | |
| ); | |
| /** | |
| This function finds Mbr partitions. Main algorithm | |
| is ported from DXE partition driver. | |
| @param[in] PrivateData The global memory map | |
| @param[in] ParentBlockDevNo The parent block device | |
| @retval TRUE New partitions are detected and logical block devices | |
| are added to block device array | |
| @retval FALSE No new partitions are added | |
| **/ | |
| BOOLEAN | |
| FatFindMbrPartitions ( | |
| IN PEI_FAT_PRIVATE_DATA *PrivateData, | |
| IN UINTN ParentBlockDevNo | |
| ); | |
| /** | |
| This function is used for finding GPT partition on block device. | |
| As follow UEFI spec we should check protective MBR first and then | |
| try to check both primary/backup GPT structures. | |
| @param[in] PrivateData The global memory map | |
| @param[in] ParentBlockDevNo The parent block device | |
| @retval TRUE New partitions are detected and logical block devices | |
| are added to block device array | |
| @retval FALSE No new partitions are added | |
| **/ | |
| BOOLEAN | |
| FatFindGptPartitions ( | |
| IN PEI_FAT_PRIVATE_DATA *PrivateData, | |
| IN UINTN ParentBlockDevNo | |
| ); | |
| /** | |
| This function finds partitions (logical devices) in physical block devices. | |
| @param PrivateData Global memory map for accessing global variables. | |
| **/ | |
| VOID | |
| FatFindPartitions ( | |
| IN PEI_FAT_PRIVATE_DATA *PrivateData | |
| ) | |
| { | |
| BOOLEAN Found; | |
| UINTN Index; | |
| do { | |
| Found = FALSE; | |
| for (Index = 0; Index < PrivateData->BlockDeviceCount; Index++) { | |
| if (!PrivateData->BlockDevice[Index].PartitionChecked) { | |
| if (FatFindGptPartitions (PrivateData, Index)) { | |
| Found = TRUE; | |
| continue; | |
| } | |
| if (FatFindMbrPartitions (PrivateData, Index)) { | |
| Found = TRUE; | |
| continue; | |
| } | |
| if (FatFindEltoritoPartitions (PrivateData, Index)) { | |
| Found = TRUE; | |
| continue; | |
| } | |
| } | |
| } | |
| } while (Found && PrivateData->BlockDeviceCount <= PEI_FAT_MAX_BLOCK_DEVICE); | |
| } |