]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Dxe/Hob/hob.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / Hob / hob.c
CommitLineData
3eb9473e 1/*++\r
2\r
3Copyright (c) 2004 - 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 hob.c\r
15\r
16Abstract:\r
17\r
18 Support for hob operation\r
19\r
20--*/\r
21\r
22#include "Tiano.h"\r
23#include "EfiDriverLib.h"\r
24#include "PeiHob.h"\r
25#include EFI_GUID_DEFINITION (IoBaseHob)\r
26#include EFI_GUID_DEFINITION (MemoryAllocationHob)\r
27\r
28VOID *\r
29GetHob (\r
30 IN UINT16 Type,\r
31 IN VOID *HobStart\r
32 )\r
33/*++\r
34\r
35Routine Description:\r
36\r
37 This function returns the first instance of a HOB type in a HOB list.\r
38 \r
39Arguments:\r
40\r
41 Type The HOB type to return.\r
42 HobStart The first HOB in the HOB list.\r
43 \r
44Returns:\r
45\r
46 HobStart There were no HOBs found with the requested type.\r
47 else Returns the first HOB with the matching type.\r
48\r
49--*/\r
50{\r
51 EFI_PEI_HOB_POINTERS Hob;\r
52\r
53 Hob.Raw = HobStart;\r
54 //\r
55 // Return input if not found\r
56 //\r
57 if (HobStart == NULL) {\r
58 return HobStart;\r
59 }\r
60\r
61 //\r
62 // Parse the HOB list, stop if end of list or matching type found.\r
63 //\r
64 while (!END_OF_HOB_LIST (Hob)) {\r
65\r
66 if (Hob.Header->HobType == Type) {\r
67 break;\r
68 }\r
69\r
70 Hob.Raw = GET_NEXT_HOB (Hob);\r
71 }\r
72 \r
73 //\r
74 // Return input if not found\r
75 //\r
76 if (END_OF_HOB_LIST (Hob)) {\r
77 return HobStart;\r
78 }\r
79\r
80 return (VOID *) (Hob.Raw);\r
81}\r
82\r
83UINTN\r
84GetHobListSize (\r
85 IN VOID *HobStart\r
86 )\r
87/*++\r
88\r
89Routine Description:\r
90\r
91 Get size of hob list.\r
92\r
93Arguments:\r
94\r
95 HobStart - Start pointer of hob list\r
96\r
97Returns:\r
98\r
99 Size of hob list.\r
100\r
101--*/\r
102{\r
103 EFI_PEI_HOB_POINTERS Hob;\r
104 UINTN Size;\r
105\r
106 Hob.Raw = HobStart;\r
107 Size = 0;\r
108\r
109 while (Hob.Header->HobType != EFI_HOB_TYPE_END_OF_HOB_LIST) {\r
110 Size += Hob.Header->HobLength;\r
111 Hob.Raw += Hob.Header->HobLength;\r
112 }\r
113\r
114 Size += Hob.Header->HobLength;\r
115\r
116 return Size;\r
117}\r
118\r
119UINT32\r
120GetHobVersion (\r
121 IN VOID *HobStart\r
122 )\r
123/*++\r
124\r
125Routine Description:\r
126\r
127 Get hob version.\r
128\r
129Arguments:\r
130\r
131 HobStart - Start pointer of hob list\r
132\r
133Returns:\r
134\r
135 Hob version.\r
136\r
137--*/\r
138{\r
139 EFI_PEI_HOB_POINTERS Hob;\r
140\r
141 Hob.Raw = HobStart;\r
142 return Hob.HandoffInformationTable->Version;\r
143}\r
144\r
145EFI_STATUS\r
146GetHobBootMode (\r
147 IN VOID *HobStart,\r
148 OUT EFI_BOOT_MODE *BootMode\r
149 )\r
150/*++\r
151\r
152Routine Description:\r
153\r
154 Get current boot mode.\r
155\r
156Arguments:\r
157\r
158 HobStart - Start pointer of hob list\r
159 \r
160 BootMode - Current boot mode recorded in PHIT hob\r
161\r
162Returns:\r
163\r
164 EFI_NOT_FOUND - Invalid hob header\r
165 \r
166 EFI_SUCCESS - Boot mode found\r
167\r
168--*/\r
169{\r
170 EFI_PEI_HOB_POINTERS Hob;\r
171\r
172 Hob.Raw = HobStart;\r
173 if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) {\r
174 return EFI_NOT_FOUND;\r
175 }\r
176\r
177 *BootMode = Hob.HandoffInformationTable->BootMode;\r
178 return EFI_SUCCESS;\r
179}\r
180\r
181EFI_STATUS\r
182GetCpuHobInfo (\r
183 IN VOID *HobStart,\r
184 OUT UINT8 *SizeOfMemorySpace,\r
185 OUT UINT8 *SizeOfIoSpace\r
186 )\r
187/*++\r
188\r
189Routine Description:\r
190\r
191 Get information recorded in CPU hob (Memory space size, Io space size)\r
192\r
193Arguments:\r
194\r
195 HobStart - Start pointer of hob list\r
196 \r
197 SizeOfMemorySpace - Size of memory size\r
198 \r
199 SizeOfIoSpace - Size of IO size\r
200\r
201Returns:\r
202\r
203 EFI_NOT_FOUND - CPU hob not found\r
204 \r
205 EFI_SUCCESS - CPU hob found and information got.\r
206\r
207--*/\r
208{\r
209 EFI_PEI_HOB_POINTERS CpuHob;\r
210\r
211 CpuHob.Raw = HobStart;\r
212 CpuHob.Raw = GetHob (EFI_HOB_TYPE_CPU, CpuHob.Raw);\r
213 if (CpuHob.Header->HobType != EFI_HOB_TYPE_CPU) {\r
214 return EFI_NOT_FOUND;\r
215 }\r
216\r
217 *SizeOfMemorySpace = CpuHob.Cpu->SizeOfMemorySpace;\r
218 *SizeOfIoSpace = CpuHob.Cpu->SizeOfIoSpace;\r
219 return EFI_SUCCESS;\r
220}\r
221\r
222EFI_STATUS\r
223GetDxeCoreHobInfo (\r
224 IN VOID *HobStart,\r
225 OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
226 OUT UINT64 *Length,\r
227 OUT VOID **EntryPoint,\r
228 OUT EFI_GUID **FileName\r
229 )\r
230/*++\r
231\r
232Routine Description:\r
233\r
234 Get memory allocation hob created for DXE core and extract its information\r
235\r
236Arguments:\r
237\r
238 HobStart - Start pointer of the hob list\r
239 BaseAddress - Start address of memory allocated for DXE core\r
240 Length - Length of memory allocated for DXE core\r
241 EntryPoint - DXE core file name\r
242 FileName - File Name\r
243\r
244Returns:\r
245\r
246 EFI_NOT_FOUND - DxeCoreHob not found \r
247 EFI_SUCCESS - DxeCoreHob found and information got\r
248\r
249--*/\r
250{\r
251 EFI_PEI_HOB_POINTERS DxeCoreHob;\r
252 \r
253 \r
254 DxeCoreHob.Raw = HobStart;\r
255 DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw);\r
256 while (DxeCoreHob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION && \r
257 !EfiCompareGuid (&DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.Name, \r
258 &gEfiHobMemeryAllocModuleGuid)) {\r
259\r
260 DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob);\r
261 DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw);\r
262\r
263 }\r
264\r
265 if (DxeCoreHob.Header->HobType != EFI_HOB_TYPE_MEMORY_ALLOCATION) {\r
266 return EFI_NOT_FOUND;\r
267 }\r
268\r
269 *BaseAddress = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryBaseAddress;\r
270 *Length = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryLength;\r
271 *EntryPoint = (VOID *) (UINTN) DxeCoreHob.MemoryAllocationModule->EntryPoint;\r
272 *FileName = &DxeCoreHob.MemoryAllocationModule->ModuleName;\r
273\r
274 return EFI_SUCCESS;\r
275}\r
276\r
277EFI_STATUS\r
278GetNextFirmwareVolumeHob (\r
279 IN OUT VOID **HobStart,\r
280 OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
281 OUT UINT64 *Length\r
282 )\r
283/*++\r
284\r
285Routine Description:\r
286\r
287 Get next firmware volume hob from HobStart\r
288\r
289Arguments:\r
290\r
291 HobStart - Start pointer of hob list\r
292 \r
293 BaseAddress - Start address of next firmware volume\r
294 \r
295 Length - Length of next firmware volume\r
296\r
297Returns:\r
298\r
299 EFI_NOT_FOUND - Next firmware volume not found\r
300 \r
301 EFI_SUCCESS - Next firmware volume found with address information\r
302\r
303--*/\r
304{\r
305 EFI_PEI_HOB_POINTERS FirmwareVolumeHob;\r
306\r
307 FirmwareVolumeHob.Raw = *HobStart;\r
308 if (END_OF_HOB_LIST (FirmwareVolumeHob)) {\r
309 return EFI_NOT_FOUND;\r
310 }\r
311\r
312 FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV, *HobStart);\r
313 if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV) {\r
314 return EFI_NOT_FOUND;\r
315 }\r
316\r
317 *BaseAddress = FirmwareVolumeHob.FirmwareVolume->BaseAddress;\r
318 *Length = FirmwareVolumeHob.FirmwareVolume->Length;\r
319\r
320 *HobStart = GET_NEXT_HOB (FirmwareVolumeHob);\r
321\r
322 return EFI_SUCCESS;\r
323}\r
324\r
325#if (PI_SPECIFICATION_VERSION >= 0x00010000)\r
326EFI_STATUS\r
327GetNextFirmwareVolume2Hob (\r
328 IN OUT VOID **HobStart,\r
329 OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
330 OUT UINT64 *Length,\r
331 OUT EFI_GUID *FileName\r
332 )\r
333/*++\r
334\r
335Routine Description:\r
336\r
337 Get next firmware volume2 hob from HobStart\r
338\r
339Arguments:\r
340\r
341 HobStart - Start pointer of hob list\r
342 \r
343 BaseAddress - Start address of next firmware volume\r
344 \r
345 Length - Length of next firmware volume\r
346\r
347Returns:\r
348\r
349 EFI_NOT_FOUND - Next firmware volume not found\r
350 \r
351 EFI_SUCCESS - Next firmware volume found with address information\r
352\r
353--*/\r
354{\r
355 EFI_PEI_HOB_POINTERS FirmwareVolumeHob;\r
356\r
357 FirmwareVolumeHob.Raw = *HobStart;\r
358 if (END_OF_HOB_LIST (FirmwareVolumeHob)) {\r
359 return EFI_NOT_FOUND;\r
360 }\r
361\r
362 FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV2, *HobStart);\r
363 if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV2) {\r
364 return EFI_NOT_FOUND;\r
365 }\r
366\r
367 *BaseAddress = FirmwareVolumeHob.FirmwareVolume2->BaseAddress;\r
368 *Length = FirmwareVolumeHob.FirmwareVolume2->Length;\r
369 EfiCommonLibCopyMem(FileName,&FirmwareVolumeHob.FirmwareVolume2->FileName,sizeof(EFI_GUID));\r
370\r
371 *HobStart = GET_NEXT_HOB (FirmwareVolumeHob);\r
372\r
373 return EFI_SUCCESS;\r
374}\r
375#endif\r
376\r
377EFI_STATUS\r
378GetNextGuidHob (\r
379 IN OUT VOID **HobStart,\r
380 IN EFI_GUID * Guid,\r
381 OUT VOID **Buffer,\r
382 OUT UINTN *BufferSize OPTIONAL\r
383 )\r
384/*++\r
385\r
386Routine Description:\r
387 Get the next guid hob.\r
388 \r
389Arguments:\r
390 HobStart A pointer to the start hob.\r
391 Guid A pointer to a guid.\r
392 Buffer A pointer to the buffer.\r
393 BufferSize Buffer size.\r
394 \r
395Returns:\r
396 Status code.\r
397\r
398 EFI_NOT_FOUND - Next Guid hob not found\r
399 \r
400 EFI_SUCCESS - Next Guid hob found and data for this Guid got\r
401 \r
402 EFI_INVALID_PARAMETER - invalid parameter\r
403\r
404--*/\r
405{\r
406 EFI_STATUS Status;\r
407 EFI_PEI_HOB_POINTERS GuidHob;\r
408\r
409 if (Buffer == NULL) {\r
410 return EFI_INVALID_PARAMETER;\r
411 }\r
412\r
413 for (Status = EFI_NOT_FOUND; EFI_ERROR (Status);) {\r
414\r
415 GuidHob.Raw = *HobStart;\r
416 if (END_OF_HOB_LIST (GuidHob)) {\r
417 return EFI_NOT_FOUND;\r
418 }\r
419\r
420 GuidHob.Raw = GetHob (EFI_HOB_TYPE_GUID_EXTENSION, *HobStart);\r
421 if (GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {\r
422 if (EfiCompareGuid (Guid, &GuidHob.Guid->Name)) {\r
423 Status = EFI_SUCCESS;\r
424 *Buffer = (VOID *) ((UINT8 *) (&GuidHob.Guid->Name) + sizeof (EFI_GUID));\r
425 if (BufferSize != NULL) {\r
426 *BufferSize = GuidHob.Header->HobLength - sizeof (EFI_HOB_GUID_TYPE);\r
427 }\r
428 }\r
429 }\r
430\r
431 *HobStart = GET_NEXT_HOB (GuidHob);\r
432 }\r
433\r
434 return Status;\r
435}\r
436\r
437\r
438#define PAL_ENTRY_HOB {0xe53cb8cc, 0xd62c, 0x4f74, 0xbd, 0xda, 0x31, 0xe5, 0x8d, 0xe5, 0x3e, 0x2}\r
439EFI_GUID gPalEntryHob = PAL_ENTRY_HOB;\r
440\r
441EFI_STATUS\r
442GetPalEntryHobInfo (\r
443 IN VOID *HobStart,\r
444 OUT EFI_PHYSICAL_ADDRESS *PalEntry\r
445 )\r
446/*++\r
447\r
448Routine Description:\r
449\r
450 Get PAL entry from PalEntryHob\r
451\r
452Arguments:\r
453\r
454 HobStart - Start pointer of hob list\r
455 \r
456 PalEntry - Pointer to PAL entry\r
457\r
458Returns:\r
459\r
460 Status code.\r
461\r
462--*/\r
463{\r
464 VOID *Buffer;\r
465 UINTN BufferSize;\r
466 EFI_STATUS Status;\r
467 VOID *HobStart2;\r
468\r
469 HobStart2 = HobStart;\r
470 Status = GetNextGuidHob (\r
471 &HobStart2,\r
472 &gPalEntryHob,\r
473 &Buffer,\r
474 &BufferSize\r
475 );\r
476\r
477 *PalEntry = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
478 return Status;\r
479}\r
480\r
481\r
482EFI_STATUS\r
483GetIoPortSpaceAddressHobInfo (\r
484 IN VOID *HobStart,\r
485 OUT EFI_PHYSICAL_ADDRESS *IoPortSpaceAddress\r
486 )\r
487/*++\r
488\r
489Routine Description:\r
490\r
491 Get IO port space address from IoBaseHob.\r
492\r
493Arguments:\r
494\r
495 HobStart - Start pointer of hob list\r
496 \r
497 IoPortSpaceAddress - IO port space address\r
498\r
499Returns:\r
500\r
501 Status code\r
502\r
503--*/\r
504{\r
505\r
506 VOID *Buffer;\r
507 UINTN BufferSize;\r
508 EFI_STATUS Status;\r
509 VOID *HobStart2;\r
510\r
511 HobStart2 = HobStart;\r
512 Status = GetNextGuidHob (\r
513 &HobStart2,\r
514 &gEfiIoBaseHobGuid,\r
515 &Buffer,\r
516 &BufferSize\r
517 );\r
518\r
519 *IoPortSpaceAddress = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
520 return Status;\r
521}\r