]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtFlashMapPei/FlashMap.c
Porting WinNtFwhPei and WinNtFlashMapPei to produce FvHob.
[mirror_edk2.git] / Nt32Pkg / WinNtFlashMapPei / FlashMap.c
CommitLineData
56a71b55 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 FlashMap.c\r
15 \r
16Abstract:\r
17\r
18 PEIM to build GUIDed HOBs for platform specific flash map\r
19\r
20--*/\r
21\r
22\r
23//\r
24// The package level header files this module uses\r
25//\r
26#include <PiPei.h>\r
27#include <WinNtPeim.h>\r
28//\r
29// The protocols, PPI and GUID defintions for this module\r
30//\r
31#include <Ppi/NtFwh.h>\r
32#include <Guid/FirmwareFileSystem2.h>\r
33#include <Ppi/FlashMap.h>\r
34#include <Guid/FlashMapHob.h>\r
35#include <Guid/SystemNvDataGuid.h>\r
36#include <Protocol/FirmwareVolumeBlock.h>\r
37//\r
38// The Library classes this module consumes\r
39//\r
40#include <Library/DebugLib.h>\r
41#include <Library/PeimEntryPoint.h>\r
42#include <Library/HobLib.h>\r
43#include <Library/PeiServicesLib.h>\r
44#include <Library/BaseMemoryLib.h>\r
45#include <Library/PcdLib.h>\r
46\r
47\r
48#include <FlashLayout.h>\r
49\r
50EFI_STATUS\r
51EFIAPI\r
52GetAreaInfo (\r
53 IN EFI_PEI_SERVICES **PeiServices,\r
54 IN PEI_FLASH_MAP_PPI *This,\r
55 IN EFI_FLASH_AREA_TYPE AreaType,\r
56 IN EFI_GUID *AreaTypeGuid,\r
57 OUT UINT32 *NumEntries,\r
58 OUT EFI_FLASH_SUBAREA_ENTRY **Entries\r
59 );\r
60\r
61EFI_STATUS\r
62EFIAPI\r
63MemoryDiscoveredPpiNotifyCallback (\r
64 IN EFI_PEI_SERVICES **PeiServices,\r
65 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,\r
66 IN VOID *Ppi\r
67 );\r
68\r
69//\r
70// Module globals\r
71//\r
72static PEI_FLASH_MAP_PPI mFlashMapPpi = { GetAreaInfo };\r
73\r
74static EFI_PEI_PPI_DESCRIPTOR mPpiListFlashMap = {\r
75 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
76 &gPeiFlashMapPpiGuid,\r
77 &mFlashMapPpi\r
78};\r
79\r
80static EFI_FLASH_AREA_DATA mFlashAreaData[] = {\r
81 //\r
82 // Variable area\r
83 //\r
84 {\r
85 EFI_VARIABLE_STORE_OFFSET,\r
86 EFI_VARIABLE_STORE_LENGTH,\r
87 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV,\r
88 EFI_FLASH_AREA_EFI_VARIABLES,\r
89 0, 0, 0,\r
90 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
91 },\r
92 //\r
93 // FTW spare (backup) block\r
94 //\r
95 {\r
96 EFI_WINNT_FTW_SPARE_BLOCK_OFFSET,\r
97 EFI_WINNT_FTW_SPARE_BLOCK_LENGTH,\r
98 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV,\r
99 EFI_FLASH_AREA_FTW_BACKUP,\r
100 0, 0, 0,\r
101 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
102 },\r
103 //\r
104 // FTW private working (state) area\r
105 //\r
106 {\r
107 EFI_FTW_WORKING_OFFSET,\r
108 EFI_FTW_WORKING_LENGTH,\r
109 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV,\r
110 EFI_FLASH_AREA_FTW_STATE,\r
111 0, 0, 0,\r
112 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
113 },\r
114 //\r
115 // Recovery FV\r
116 //\r
117 {\r
118 EFI_WINNT_FIRMWARE_OFFSET,\r
119 EFI_WINNT_FIRMWARE_LENGTH,\r
120 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV,\r
121 EFI_FLASH_AREA_RECOVERY_BIOS,\r
122 0, 0, 0,\r
123 { 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
124 },\r
125 //\r
126 // System Non-Volatile Storage FV\r
127 //\r
128 {\r
129 EFI_WINNT_RUNTIME_UPDATABLE_OFFSET,\r
130 EFI_WINNT_RUNTIME_UPDATABLE_LENGTH + EFI_WINNT_FTW_SPARE_BLOCK_LENGTH,\r
131 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV,\r
132 EFI_FLASH_AREA_GUID_DEFINED,\r
133 0, 0, 0,\r
134 EFI_SYSTEM_NV_DATA_HOB_GUID\r
135 },\r
136};\r
137\r
138\r
139EFI_STATUS\r
140EFIAPI\r
141PeimInitializeFlashMap (\r
142 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
143 IN EFI_PEI_SERVICES **PeiServices\r
144 )\r
145/*++\r
146\r
147Routine Description:\r
148 Build GUIDed HOBs for platform specific flash map\r
149 \r
150Arguments:\r
151 FfsHeader - A pointer to the EFI_FFS_FILE_HEADER structure.\r
152 PeiServices - General purpose services available to every PEIM.\r
153 \r
154Returns:\r
155 EFI_STATUS\r
156\r
157--*/\r
158// TODO: EFI_SUCCESS - add return value to function comment\r
159{\r
160 EFI_STATUS Status;\r
161 NT_FWH_PPI *NtFwhPpi;\r
162 EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
163 EFI_PHYSICAL_ADDRESS FdBase;\r
164 UINT64 FdSize;\r
165 UINTN NumOfHobData;\r
166 UINTN Index;\r
167 EFI_FLASH_AREA_HOB_DATA FlashHobData;\r
168\r
169 DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));\r
170\r
171 //\r
172 // Install FlashMap PPI\r
173 //\r
174 Status = PeiServicesInstallPpi (&mPpiListFlashMap);\r
175 ASSERT_EFI_ERROR (Status);\r
176\r
177\r
178 //\r
179 // Get the Fwh Information PPI\r
180 //\r
181 Status = PeiServicesLocatePpi (\r
182 &gNtFwhPpiGuid, // GUID\r
183 0, // INSTANCE\r
184 &PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR\r
185 &NtFwhPpi // PPI\r
186 );\r
187 ASSERT_EFI_ERROR (Status);\r
188\r
189 //\r
190 // Assume that FD0 contains the Flash map.\r
191 //\r
192 Status = NtFwhPpi->NtFwh (0, &FdBase, &FdSize);\r
193 if (EFI_ERROR (Status)) {\r
194 return Status;\r
195 }\r
196\r
197 //\r
198 // Get number of types\r
199 //\r
200 NumOfHobData = sizeof (mFlashAreaData) / sizeof (EFI_FLASH_AREA_DATA);\r
201\r
202 //\r
203 // Build flash area entries as GUIDed HOBs.\r
204 //\r
205 for (Index = 0; Index < NumOfHobData; Index++) {\r
206 (*PeiServices)->SetMem (&FlashHobData, sizeof (EFI_FLASH_AREA_HOB_DATA), 0);\r
207\r
208 FlashHobData.AreaType = mFlashAreaData[Index].AreaType;\r
209 FlashHobData.NumberOfEntries = 1;\r
210 FlashHobData.SubAreaData.Attributes = mFlashAreaData[Index].Attributes;\r
211 FlashHobData.SubAreaData.Base = FdBase + (EFI_PHYSICAL_ADDRESS) (UINTN) mFlashAreaData[Index].Base;\r
212 FlashHobData.SubAreaData.Length = (EFI_PHYSICAL_ADDRESS) (UINTN) mFlashAreaData[Index].Length;\r
213\r
214 //\r
215 // We also update a PCD entry so that any driver that depend on\r
216 // PCD entry will get the information.\r
217 //\r
218 if (FlashHobData.AreaType == EFI_FLASH_AREA_EFI_VARIABLES) {\r
219 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code\r
220 //PcdSet32 (PcdFlashNvStorageVariableBase, (UINT32) FlashHobData.SubAreaData.Base);\r
221 //PcdSet32 (PcdFlashNvStorageVariableSize, (UINT32) FlashHobData.SubAreaData.Length);\r
222 }\r
223\r
224 if (FlashHobData.AreaType == EFI_FLASH_AREA_FTW_STATE) {\r
225 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code\r
226 //PcdSet32 (PcdFlashNvStorageFtwWorkingBase, (UINT32) FlashHobData.SubAreaData.Base);\r
227 //PcdSet32 (PcdFlashNvStorageFtwWorkingSize, (UINT32) FlashHobData.SubAreaData.Length);\r
228 }\r
229\r
230 if (FlashHobData.AreaType == EFI_FLASH_AREA_FTW_BACKUP) {\r
231 // BUGBUG: Tool team does not enable dynamic PCD so comment out following code\r
232 //PcdSet32 (PcdFlashNvStorageFtwSpareBase, (UINT32) FlashHobData.SubAreaData.Base);\r
233 //PcdSet32 (PcdFlashNvStorageFtwSpareSize, (UINT32) FlashHobData.SubAreaData.Length);\r
234 }\r
235\r
236 switch (FlashHobData.AreaType) {\r
237 case EFI_FLASH_AREA_RECOVERY_BIOS:\r
238 case EFI_FLASH_AREA_MAIN_BIOS:\r
239 (*PeiServices)->CopyMem (\r
240 &FlashHobData.AreaTypeGuid,\r
241 &gEfiFirmwareFileSystem2Guid,\r
242 sizeof (EFI_GUID)\r
243 );\r
244 (*PeiServices)->CopyMem (\r
245 &FlashHobData.SubAreaData.FileSystem,\r
246 &gEfiFirmwareVolumeBlockProtocolGuid,\r
247 sizeof (EFI_GUID)\r
248 );\r
249 break;\r
250\r
251 case EFI_FLASH_AREA_GUID_DEFINED:\r
252 (*PeiServices)->CopyMem (\r
253 &FlashHobData.AreaTypeGuid,\r
254 &mFlashAreaData[Index].AreaTypeGuid,\r
255 sizeof (EFI_GUID)\r
256 );\r
257 (*PeiServices)->CopyMem (\r
258 &FlashHobData.SubAreaData.FileSystem,\r
259 &gEfiFirmwareVolumeBlockProtocolGuid,\r
260 sizeof (EFI_GUID)\r
261 );\r
262 break;\r
263\r
264 default:\r
265 break;\r
266 }\r
267\r
268 BuildGuidDataHob (\r
269 &gEfiFlashMapHobGuid,\r
270 &FlashHobData,\r
271 sizeof (EFI_FLASH_AREA_HOB_DATA)\r
272 );\r
273 }\r
274\r
275 return EFI_SUCCESS;\r
276}\r
277\r
278EFI_STATUS\r
279EFIAPI\r
280GetAreaInfo (\r
281 IN EFI_PEI_SERVICES **PeiServices,\r
282 IN PEI_FLASH_MAP_PPI *This,\r
283 IN EFI_FLASH_AREA_TYPE AreaType,\r
284 IN EFI_GUID *AreaTypeGuid,\r
285 OUT UINT32 *NumEntries,\r
286 OUT EFI_FLASH_SUBAREA_ENTRY **Entries\r
287 )\r
288/*++\r
289\r
290 Routine Description: \r
291 Implementation of Flash Map PPI\r
292 \r
293--*/\r
294// TODO: function comment is missing 'Arguments:'\r
295// TODO: function comment is missing 'Returns:'\r
296// TODO: PeiServices - add argument and description to function comment\r
297// TODO: This - add argument and description to function comment\r
298// TODO: AreaType - add argument and description to function comment\r
299// TODO: AreaTypeGuid - add argument and description to function comment\r
300// TODO: NumEntries - add argument and description to function comment\r
301// TODO: Entries - add argument and description to function comment\r
302// TODO: EFI_SUCCESS - add return value to function comment\r
303// TODO: EFI_NOT_FOUND - add return value to function comment\r
304{\r
305 EFI_STATUS Status;\r
306 EFI_PEI_HOB_POINTERS Hob;\r
307 EFI_HOB_FLASH_MAP_ENTRY_TYPE *FlashMapEntry;\r
308\r
309 Status = PeiServicesGetHobList (&Hob.Raw);\r
310 while (!END_OF_HOB_LIST (Hob)) {\r
311 if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION && CompareGuid (&Hob.Guid->Name, &gEfiFlashMapHobGuid)) {\r
312 FlashMapEntry = (EFI_HOB_FLASH_MAP_ENTRY_TYPE *) Hob.Raw;\r
313 if (AreaType == FlashMapEntry->AreaType) {\r
314 if (AreaType == EFI_FLASH_AREA_GUID_DEFINED) {\r
315 if (!CompareGuid (AreaTypeGuid, &FlashMapEntry->AreaTypeGuid)) {\r
316 goto NextHob;\r
317 }\r
318 }\r
319\r
320 *NumEntries = FlashMapEntry->NumEntries;\r
321 *Entries = FlashMapEntry->Entries;\r
322 return EFI_SUCCESS;\r
323 }\r
324 }\r
325 NextHob:\r
326 Hob.Raw = GET_NEXT_HOB (Hob);\r
327 }\r
328\r
329 return EFI_NOT_FOUND;\r
330}\r