1 /*++ @file
2 Defines data structure that is the volume header found.These data is intent
3 to decouple FVB driver with FV header.
4
5 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
6 Portions copyright (c) 2011, Apple Inc. All rights reserved.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
8
9
10 **/
11
12 #include <PiDxe.h>
13
14 #include <Guid/EventGroup.h>
15 #include <Guid/FirmwareFileSystem2.h>
16 #include <Guid/SystemNvDataGuid.h>
17
18 #include <Protocol/FirmwareVolumeBlock.h>
19 #include <Protocol/DevicePath.h>
20
21 #include <Library/UefiLib.h>
22 #include <Library/UefiDriverEntryPoint.h>
23 #include <Library/BaseLib.h>
24 #include <Library/DxeServicesTableLib.h>
25 #include <Library/UefiRuntimeLib.h>
26 #include <Library/DebugLib.h>
27 #include <Library/HobLib.h>
28 #include <Library/BaseMemoryLib.h>
29 #include <Library/MemoryAllocationLib.h>
30 #include <Library/UefiBootServicesTableLib.h>
31 #include <Library/PcdLib.h>
32 #include <Library/DevicePathLib.h>
33
34
35 typedef struct {
36 UINT64 FvLength;
37 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
38 //
39 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
40 //
41 EFI_FV_BLOCK_MAP_ENTRY End[1];
42 } EFI_FVB_MEDIA_INFO;
43
44 EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
45 //
46 // Recovery BOIS FVB
47 //
48 {
49 FixedPcdGet32 (PcdEmuFlashFvRecoverySize),
50 {
51 {
52 0,
53 }, // ZeroVector[16]
54 EFI_FIRMWARE_FILE_SYSTEM2_GUID,
55 FixedPcdGet32 (PcdEmuFlashFvRecoverySize),
56 EFI_FVH_SIGNATURE,
57 EFI_FVB2_READ_ENABLED_CAP |
58 EFI_FVB2_READ_STATUS |
59 EFI_FVB2_WRITE_ENABLED_CAP |
60 EFI_FVB2_WRITE_STATUS |
61 EFI_FVB2_ERASE_POLARITY,
62 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
63 0, // CheckSum
64 0, // ExtHeaderOffset
65 {
66 0,
67 }, // Reserved[1]
68 2, // Revision
69 {
70 {
71 FixedPcdGet32 (PcdEmuFlashFvRecoverySize)/FixedPcdGet32 (PcdEmuFirmwareBlockSize),
72 FixedPcdGet32 (PcdEmuFirmwareBlockSize),
73 }
74 }
75 },
76 {
77 {
78 0,
79 0
80 }
81 }
82 },
83 //
84 // Systen NvStorage FVB
85 //
86 {
87 FixedPcdGet32 (PcdFlashNvStorageVariableSize) + \
88 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) + \
89 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) + \
90 FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize),
91 {
92 {
93 0,
94 }, // ZeroVector[16]
95 EFI_SYSTEM_NV_DATA_FV_GUID,
96 FixedPcdGet32 (PcdFlashNvStorageVariableSize) + \
97 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) + \
98 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) + \
99 FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize),
100 EFI_FVH_SIGNATURE,
101 EFI_FVB2_READ_ENABLED_CAP |
102 EFI_FVB2_READ_STATUS |
103 EFI_FVB2_WRITE_ENABLED_CAP |
104 EFI_FVB2_WRITE_STATUS |
105 EFI_FVB2_ERASE_POLARITY,
106 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
107 0, // CheckSum
108 0, // ExtHeaderOffset
109 {
110 0,
111 }, // Reserved[1]
112 2, // Revision
113 {
114 {
115 (FixedPcdGet32 (PcdFlashNvStorageVariableSize) + \
116 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) + \
117 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) + \
118 FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize)) / FixedPcdGet32 (PcdEmuFirmwareBlockSize),
119 FixedPcdGet32 (PcdEmuFirmwareBlockSize),
120 }
121 }
122 },
123 {
124 {
125 0,
126 0
127 }
128 }
129 }
130 };
131
132 EFI_STATUS
GetFvbInfo(IN UINT64 FvLength,OUT EFI_FIRMWARE_VOLUME_HEADER ** FvbInfo)133 GetFvbInfo (
134 IN UINT64 FvLength,
135 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
136 )
137 {
138 UINTN Index;
139
140 for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO); Index += 1) {
141 if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {
142 *FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;
143 return EFI_SUCCESS;
144 }
145 }
146
147 return EFI_NOT_FOUND;
148 }
149