3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 PEIM to build GUIDed HOBs for platform specific flash map
24 // The package level header files this module uses
27 #include <WinNtPeim.h>
29 // The protocols, PPI and GUID defintions for this module
31 #include <Ppi/NtFwh.h>
32 #include <Guid/FirmwareFileSystem2.h>
33 #include <Ppi/FlashMap.h>
34 #include <Guid/FlashMapHob.h>
35 #include <Guid/SystemNvDataGuid.h>
36 #include <Protocol/FirmwareVolumeBlock.h>
38 // The Library classes this module consumes
40 #include <Library/DebugLib.h>
41 #include <Library/PeimEntryPoint.h>
42 #include <Library/HobLib.h>
43 #include <Library/PeiServicesLib.h>
44 #include <Library/BaseMemoryLib.h>
45 #include <Library/PcdLib.h>
48 #include <FlashLayout.h>
53 IN EFI_PEI_SERVICES
**PeiServices
,
54 IN PEI_FLASH_MAP_PPI
*This
,
55 IN EFI_FLASH_AREA_TYPE AreaType
,
56 IN EFI_GUID
*AreaTypeGuid
,
57 OUT UINT32
*NumEntries
,
58 OUT EFI_FLASH_SUBAREA_ENTRY
**Entries
63 MemoryDiscoveredPpiNotifyCallback (
64 IN EFI_PEI_SERVICES
**PeiServices
,
65 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDescriptor
,
72 static PEI_FLASH_MAP_PPI mFlashMapPpi
= { GetAreaInfo
};
74 static EFI_PEI_PPI_DESCRIPTOR mPpiListFlashMap
= {
75 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
80 static EFI_FLASH_AREA_DATA mFlashAreaData
[] = {
85 EFI_VARIABLE_STORE_OFFSET
,
86 EFI_VARIABLE_STORE_LENGTH
,
87 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
,
88 EFI_FLASH_AREA_EFI_VARIABLES
,
90 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
93 // FTW spare (backup) block
96 EFI_WINNT_FTW_SPARE_BLOCK_OFFSET
,
97 EFI_WINNT_FTW_SPARE_BLOCK_LENGTH
,
98 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
,
99 EFI_FLASH_AREA_FTW_BACKUP
,
101 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
104 // FTW private working (state) area
107 EFI_FTW_WORKING_OFFSET
,
108 EFI_FTW_WORKING_LENGTH
,
109 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
,
110 EFI_FLASH_AREA_FTW_STATE
,
112 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
118 EFI_WINNT_FIRMWARE_OFFSET
,
119 EFI_WINNT_FIRMWARE_LENGTH
,
120 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
,
121 EFI_FLASH_AREA_RECOVERY_BIOS
,
123 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
126 // System Non-Volatile Storage FV
129 EFI_WINNT_RUNTIME_UPDATABLE_OFFSET
,
130 EFI_WINNT_RUNTIME_UPDATABLE_LENGTH
+ EFI_WINNT_FTW_SPARE_BLOCK_LENGTH
,
131 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
,
132 EFI_FLASH_AREA_GUID_DEFINED
,
134 EFI_SYSTEM_NV_DATA_HOB_GUID
141 PeimInitializeFlashMap (
142 IN EFI_FFS_FILE_HEADER
*FfsHeader
,
143 IN EFI_PEI_SERVICES
**PeiServices
148 Build GUIDed HOBs for platform specific flash map
151 FfsHeader - A pointer to the EFI_FFS_FILE_HEADER structure.
152 PeiServices - General purpose services available to every PEIM.
158 // TODO: EFI_SUCCESS - add return value to function comment
161 NT_FWH_PPI
*NtFwhPpi
;
162 EFI_PEI_PPI_DESCRIPTOR
*PpiDescriptor
;
163 EFI_PHYSICAL_ADDRESS FdBase
;
167 EFI_FLASH_AREA_HOB_DATA FlashHobData
;
169 DEBUG ((EFI_D_ERROR
, "NT 32 Flash Map PEIM Loaded\n"));
172 // Install FlashMap PPI
174 Status
= PeiServicesInstallPpi (&mPpiListFlashMap
);
175 ASSERT_EFI_ERROR (Status
);
179 // Get the Fwh Information PPI
181 Status
= PeiServicesLocatePpi (
182 &gNtFwhPpiGuid
, // GUID
184 &PpiDescriptor
, // EFI_PEI_PPI_DESCRIPTOR
187 ASSERT_EFI_ERROR (Status
);
190 // Assume that FD0 contains the Flash map.
192 Status
= NtFwhPpi
->NtFwh (0, &FdBase
, &FdSize
);
193 if (EFI_ERROR (Status
)) {
198 // Get number of types
200 NumOfHobData
= sizeof (mFlashAreaData
) / sizeof (EFI_FLASH_AREA_DATA
);
203 // Build flash area entries as GUIDed HOBs.
205 for (Index
= 0; Index
< NumOfHobData
; Index
++) {
206 (*PeiServices
)->SetMem (&FlashHobData
, sizeof (EFI_FLASH_AREA_HOB_DATA
), 0);
208 FlashHobData
.AreaType
= mFlashAreaData
[Index
].AreaType
;
209 FlashHobData
.NumberOfEntries
= 1;
210 FlashHobData
.SubAreaData
.Attributes
= mFlashAreaData
[Index
].Attributes
;
211 FlashHobData
.SubAreaData
.Base
= FdBase
+ (EFI_PHYSICAL_ADDRESS
) (UINTN
) mFlashAreaData
[Index
].Base
;
212 FlashHobData
.SubAreaData
.Length
= (EFI_PHYSICAL_ADDRESS
) (UINTN
) mFlashAreaData
[Index
].Length
;
215 // We also update a PCD entry so that any driver that depend on
216 // PCD entry will get the information.
218 if (FlashHobData
.AreaType
== EFI_FLASH_AREA_EFI_VARIABLES
) {
219 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code
220 //PcdSet32 (PcdFlashNvStorageVariableBase, (UINT32) FlashHobData.SubAreaData.Base);
221 //PcdSet32 (PcdFlashNvStorageVariableSize, (UINT32) FlashHobData.SubAreaData.Length);
224 if (FlashHobData
.AreaType
== EFI_FLASH_AREA_FTW_STATE
) {
225 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code
226 //PcdSet32 (PcdFlashNvStorageFtwWorkingBase, (UINT32) FlashHobData.SubAreaData.Base);
227 //PcdSet32 (PcdFlashNvStorageFtwWorkingSize, (UINT32) FlashHobData.SubAreaData.Length);
230 if (FlashHobData
.AreaType
== EFI_FLASH_AREA_FTW_BACKUP
) {
231 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code
232 //PcdSet32 (PcdFlashNvStorageFtwSpareBase, (UINT32) FlashHobData.SubAreaData.Base);
233 //PcdSet32 (PcdFlashNvStorageFtwSpareSize, (UINT32) FlashHobData.SubAreaData.Length);
236 switch (FlashHobData
.AreaType
) {
237 case EFI_FLASH_AREA_RECOVERY_BIOS
:
238 case EFI_FLASH_AREA_MAIN_BIOS
:
239 (*PeiServices
)->CopyMem (
240 &FlashHobData
.AreaTypeGuid
,
241 &gEfiFirmwareFileSystem2Guid
,
244 (*PeiServices
)->CopyMem (
245 &FlashHobData
.SubAreaData
.FileSystem
,
246 &gEfiFirmwareVolumeBlockProtocolGuid
,
251 case EFI_FLASH_AREA_GUID_DEFINED
:
252 (*PeiServices
)->CopyMem (
253 &FlashHobData
.AreaTypeGuid
,
254 &mFlashAreaData
[Index
].AreaTypeGuid
,
257 (*PeiServices
)->CopyMem (
258 &FlashHobData
.SubAreaData
.FileSystem
,
259 &gEfiFirmwareVolumeBlockProtocolGuid
,
269 &gEfiFlashMapHobGuid
,
271 sizeof (EFI_FLASH_AREA_HOB_DATA
)
281 IN EFI_PEI_SERVICES
**PeiServices
,
282 IN PEI_FLASH_MAP_PPI
*This
,
283 IN EFI_FLASH_AREA_TYPE AreaType
,
284 IN EFI_GUID
*AreaTypeGuid
,
285 OUT UINT32
*NumEntries
,
286 OUT EFI_FLASH_SUBAREA_ENTRY
**Entries
291 Implementation of Flash Map PPI
294 // TODO: function comment is missing 'Arguments:'
295 // TODO: function comment is missing 'Returns:'
296 // TODO: PeiServices - add argument and description to function comment
297 // TODO: This - add argument and description to function comment
298 // TODO: AreaType - add argument and description to function comment
299 // TODO: AreaTypeGuid - add argument and description to function comment
300 // TODO: NumEntries - add argument and description to function comment
301 // TODO: Entries - add argument and description to function comment
302 // TODO: EFI_SUCCESS - add return value to function comment
303 // TODO: EFI_NOT_FOUND - add return value to function comment
306 EFI_PEI_HOB_POINTERS Hob
;
307 EFI_HOB_FLASH_MAP_ENTRY_TYPE
*FlashMapEntry
;
309 Status
= PeiServicesGetHobList (&Hob
.Raw
);
310 while (!END_OF_HOB_LIST (Hob
)) {
311 if (Hob
.Header
->HobType
== EFI_HOB_TYPE_GUID_EXTENSION
&& CompareGuid (&Hob
.Guid
->Name
, &gEfiFlashMapHobGuid
)) {
312 FlashMapEntry
= (EFI_HOB_FLASH_MAP_ENTRY_TYPE
*) Hob
.Raw
;
313 if (AreaType
== FlashMapEntry
->AreaType
) {
314 if (AreaType
== EFI_FLASH_AREA_GUID_DEFINED
) {
315 if (!CompareGuid (AreaTypeGuid
, &FlashMapEntry
->AreaTypeGuid
)) {
320 *NumEntries
= FlashMapEntry
->NumEntries
;
321 *Entries
= FlashMapEntry
->Entries
;
326 Hob
.Raw
= GET_NEXT_HOB (Hob
);
329 return EFI_NOT_FOUND
;