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 PcdSet32 (PcdFlashNvStorageVariableBase
, (UINT32
) FlashHobData
.SubAreaData
.Base
);
220 PcdSet32 (PcdFlashNvStorageVariableSize
, (UINT32
) FlashHobData
.SubAreaData
.Length
);
223 if (FlashHobData
.AreaType
== EFI_FLASH_AREA_FTW_STATE
) {
224 PcdSet32 (PcdFlashNvStorageFtwWorkingBase
, (UINT32
) FlashHobData
.SubAreaData
.Base
);
225 PcdSet32 (PcdFlashNvStorageFtwWorkingSize
, (UINT32
) FlashHobData
.SubAreaData
.Length
);
228 if (FlashHobData
.AreaType
== EFI_FLASH_AREA_FTW_BACKUP
) {
229 PcdSet32 (PcdFlashNvStorageFtwSpareBase
, (UINT32
) FlashHobData
.SubAreaData
.Base
);
230 PcdSet32 (PcdFlashNvStorageFtwSpareSize
, (UINT32
) FlashHobData
.SubAreaData
.Length
);
233 switch (FlashHobData
.AreaType
) {
234 case EFI_FLASH_AREA_RECOVERY_BIOS
:
235 case EFI_FLASH_AREA_MAIN_BIOS
:
236 (*PeiServices
)->CopyMem (
237 &FlashHobData
.AreaTypeGuid
,
238 &gEfiFirmwareFileSystem2Guid
,
241 (*PeiServices
)->CopyMem (
242 &FlashHobData
.SubAreaData
.FileSystem
,
243 &gEfiFirmwareVolumeBlockProtocolGuid
,
248 case EFI_FLASH_AREA_GUID_DEFINED
:
249 (*PeiServices
)->CopyMem (
250 &FlashHobData
.AreaTypeGuid
,
251 &mFlashAreaData
[Index
].AreaTypeGuid
,
254 (*PeiServices
)->CopyMem (
255 &FlashHobData
.SubAreaData
.FileSystem
,
256 &gEfiFirmwareVolumeBlockProtocolGuid
,
266 // &gEfiFlashMapHobGuid,
268 // sizeof (EFI_FLASH_AREA_HOB_DATA)
278 IN EFI_PEI_SERVICES
**PeiServices
,
279 IN PEI_FLASH_MAP_PPI
*This
,
280 IN EFI_FLASH_AREA_TYPE AreaType
,
281 IN EFI_GUID
*AreaTypeGuid
,
282 OUT UINT32
*NumEntries
,
283 OUT EFI_FLASH_SUBAREA_ENTRY
**Entries
288 Implementation of Flash Map PPI
291 // TODO: function comment is missing 'Arguments:'
292 // TODO: function comment is missing 'Returns:'
293 // TODO: PeiServices - add argument and description to function comment
294 // TODO: This - add argument and description to function comment
295 // TODO: AreaType - add argument and description to function comment
296 // TODO: AreaTypeGuid - add argument and description to function comment
297 // TODO: NumEntries - add argument and description to function comment
298 // TODO: Entries - add argument and description to function comment
299 // TODO: EFI_SUCCESS - add return value to function comment
300 // TODO: EFI_NOT_FOUND - add return value to function comment
303 EFI_PEI_HOB_POINTERS Hob
;
304 EFI_HOB_FLASH_MAP_ENTRY_TYPE
*FlashMapEntry
;
306 Status
= PeiServicesGetHobList (&Hob
.Raw
);
307 while (!END_OF_HOB_LIST (Hob
)) {
308 if (Hob
.Header
->HobType
== EFI_HOB_TYPE_GUID_EXTENSION
&& CompareGuid (&Hob
.Guid
->Name
, &gEfiFlashMapHobGuid
)) {
309 FlashMapEntry
= (EFI_HOB_FLASH_MAP_ENTRY_TYPE
*) Hob
.Raw
;
310 if (AreaType
== FlashMapEntry
->AreaType
) {
311 if (AreaType
== EFI_FLASH_AREA_GUID_DEFINED
) {
312 if (!CompareGuid (AreaTypeGuid
, &FlashMapEntry
->AreaTypeGuid
)) {
317 *NumEntries
= FlashMapEntry
->NumEntries
;
318 *Entries
= FlashMapEntry
->Entries
;
323 Hob
.Raw
= GET_NEXT_HOB (Hob
);
326 return EFI_NOT_FOUND
;