hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/** @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);
}