]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtFlashMapPei/FlashMap.c
1) Use Dynamic Pcd for hold the base address and length of Flash-related block.
[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
276be2de 219 PcdSet32 (PcdFlashNvStorageVariableBase, (UINT32) FlashHobData.SubAreaData.Base);\r
220 PcdSet32 (PcdFlashNvStorageVariableSize, (UINT32) FlashHobData.SubAreaData.Length);\r
56a71b55 221 }\r
222\r
223 if (FlashHobData.AreaType == EFI_FLASH_AREA_FTW_STATE) {\r
276be2de 224 PcdSet32 (PcdFlashNvStorageFtwWorkingBase, (UINT32) FlashHobData.SubAreaData.Base);\r
225 PcdSet32 (PcdFlashNvStorageFtwWorkingSize, (UINT32) FlashHobData.SubAreaData.Length);\r
56a71b55 226 }\r
227\r
228 if (FlashHobData.AreaType == EFI_FLASH_AREA_FTW_BACKUP) {\r
276be2de 229 PcdSet32 (PcdFlashNvStorageFtwSpareBase, (UINT32) FlashHobData.SubAreaData.Base);\r
230 PcdSet32 (PcdFlashNvStorageFtwSpareSize, (UINT32) FlashHobData.SubAreaData.Length);\r
56a71b55 231 }\r
232\r
233 switch (FlashHobData.AreaType) {\r
234 case EFI_FLASH_AREA_RECOVERY_BIOS:\r
235 case EFI_FLASH_AREA_MAIN_BIOS:\r
236 (*PeiServices)->CopyMem (\r
237 &FlashHobData.AreaTypeGuid,\r
238 &gEfiFirmwareFileSystem2Guid,\r
239 sizeof (EFI_GUID)\r
240 );\r
241 (*PeiServices)->CopyMem (\r
242 &FlashHobData.SubAreaData.FileSystem,\r
243 &gEfiFirmwareVolumeBlockProtocolGuid,\r
244 sizeof (EFI_GUID)\r
245 );\r
246 break;\r
247\r
248 case EFI_FLASH_AREA_GUID_DEFINED:\r
249 (*PeiServices)->CopyMem (\r
250 &FlashHobData.AreaTypeGuid,\r
251 &mFlashAreaData[Index].AreaTypeGuid,\r
252 sizeof (EFI_GUID)\r
253 );\r
254 (*PeiServices)->CopyMem (\r
255 &FlashHobData.SubAreaData.FileSystem,\r
256 &gEfiFirmwareVolumeBlockProtocolGuid,\r
257 sizeof (EFI_GUID)\r
258 );\r
259 break;\r
260\r
261 default:\r
262 break;\r
263 }\r
264\r
276be2de 265 //BuildGuidDataHob (\r
266 // &gEfiFlashMapHobGuid,\r
267 // &FlashHobData,\r
268 // sizeof (EFI_FLASH_AREA_HOB_DATA)\r
269 // );\r
56a71b55 270 }\r
271\r
272 return EFI_SUCCESS;\r
273}\r
274\r
275EFI_STATUS\r
276EFIAPI\r
277GetAreaInfo (\r
278 IN EFI_PEI_SERVICES **PeiServices,\r
279 IN PEI_FLASH_MAP_PPI *This,\r
280 IN EFI_FLASH_AREA_TYPE AreaType,\r
281 IN EFI_GUID *AreaTypeGuid,\r
282 OUT UINT32 *NumEntries,\r
283 OUT EFI_FLASH_SUBAREA_ENTRY **Entries\r
284 )\r
285/*++\r
286\r
287 Routine Description: \r
288 Implementation of Flash Map PPI\r
289 \r
290--*/\r
291// TODO: function comment is missing 'Arguments:'\r
292// TODO: function comment is missing 'Returns:'\r
293// TODO: PeiServices - add argument and description to function comment\r
294// TODO: This - add argument and description to function comment\r
295// TODO: AreaType - add argument and description to function comment\r
296// TODO: AreaTypeGuid - add argument and description to function comment\r
297// TODO: NumEntries - add argument and description to function comment\r
298// TODO: Entries - add argument and description to function comment\r
299// TODO: EFI_SUCCESS - add return value to function comment\r
300// TODO: EFI_NOT_FOUND - add return value to function comment\r
301{\r
302 EFI_STATUS Status;\r
303 EFI_PEI_HOB_POINTERS Hob;\r
304 EFI_HOB_FLASH_MAP_ENTRY_TYPE *FlashMapEntry;\r
305\r
306 Status = PeiServicesGetHobList (&Hob.Raw);\r
307 while (!END_OF_HOB_LIST (Hob)) {\r
308 if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION && CompareGuid (&Hob.Guid->Name, &gEfiFlashMapHobGuid)) {\r
309 FlashMapEntry = (EFI_HOB_FLASH_MAP_ENTRY_TYPE *) Hob.Raw;\r
310 if (AreaType == FlashMapEntry->AreaType) {\r
311 if (AreaType == EFI_FLASH_AREA_GUID_DEFINED) {\r
312 if (!CompareGuid (AreaTypeGuid, &FlashMapEntry->AreaTypeGuid)) {\r
313 goto NextHob;\r
314 }\r
315 }\r
316\r
317 *NumEntries = FlashMapEntry->NumEntries;\r
318 *Entries = FlashMapEntry->Entries;\r
319 return EFI_SUCCESS;\r
320 }\r
321 }\r
322 NextHob:\r
323 Hob.Raw = GET_NEXT_HOB (Hob);\r
324 }\r
325\r
326 return EFI_NOT_FOUND;\r
327}\r