2011-07-01 02:37:55 +02:00
|
|
|
/** @file
|
2018-06-27 15:06:14 +02:00
|
|
|
Routines supporting partition discovery and
|
2011-07-01 02:37:55 +02:00
|
|
|
logical device reading
|
|
|
|
|
2019-01-16 09:13:31 +01:00
|
|
|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
2011-07-01 02:37:55 +02:00
|
|
|
|
2019-04-04 01:03:46 +02:00
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
2011-07-01 02:37:55 +02:00
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include "FatLitePeim.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
This function finds Eltorito partitions. Main algorithm
|
|
|
|
is ported from DXE partition driver.
|
|
|
|
|
2019-01-16 09:13:31 +01:00
|
|
|
@param[in] PrivateData The global memory map
|
|
|
|
@param[in] ParentBlockDevNo The parent block device
|
2011-07-01 02:37:55 +02:00
|
|
|
|
2018-06-27 15:06:14 +02:00
|
|
|
@retval TRUE New partitions are detected and logical block devices
|
2019-01-16 09:13:31 +01:00
|
|
|
are added to block device array
|
|
|
|
@retval FALSE No new partitions are added
|
2011-07-01 02:37:55 +02:00
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
FatFindEltoritoPartitions (
|
|
|
|
IN PEI_FAT_PRIVATE_DATA *PrivateData,
|
|
|
|
IN UINTN ParentBlockDevNo
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
This function finds Mbr partitions. Main algorithm
|
|
|
|
is ported from DXE partition driver.
|
|
|
|
|
2019-01-16 09:13:31 +01:00
|
|
|
@param[in] PrivateData The global memory map
|
|
|
|
@param[in] ParentBlockDevNo The parent block device
|
2011-07-01 02:37:55 +02:00
|
|
|
|
2018-06-27 15:06:14 +02:00
|
|
|
@retval TRUE New partitions are detected and logical block devices
|
2019-01-16 09:13:31 +01:00
|
|
|
are added to block device array
|
|
|
|
@retval FALSE No new partitions are added
|
2011-07-01 02:37:55 +02:00
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
FatFindMbrPartitions (
|
|
|
|
IN PEI_FAT_PRIVATE_DATA *PrivateData,
|
|
|
|
IN UINTN ParentBlockDevNo
|
|
|
|
);
|
|
|
|
|
2019-01-16 07:59:57 +01:00
|
|
|
/**
|
|
|
|
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
|
|
|
|
);
|
|
|
|
|
2011-07-01 02:37:55 +02:00
|
|
|
/**
|
|
|
|
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) {
|
2019-01-16 07:59:57 +01:00
|
|
|
if (FatFindGptPartitions (PrivateData, Index)) {
|
|
|
|
Found = TRUE;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FatFindMbrPartitions (PrivateData, Index)) {
|
|
|
|
Found = TRUE;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FatFindEltoritoPartitions (PrivateData, Index)) {
|
|
|
|
Found = TRUE;
|
|
|
|
continue;
|
2011-07-01 02:37:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (Found && PrivateData->BlockDeviceCount <= PEI_FAT_MAX_BLOCK_DEVICE);
|
|
|
|
}
|