]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/Library/SblParseLib/SblParseLib.c
UefiPayloadPkg: Replace MEMROY_ENTRY by MEMORY_ENTRY
[mirror_edk2.git] / UefiPayloadPkg / Library / SblParseLib / SblParseLib.c
CommitLineData
04af8bf2
DG
1/** @file\r
2 This library will parse the Slim Bootloader to get required information.\r
3\r
978d428e 4 Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>\r
04af8bf2
DG
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <PiDxe.h>\r
10#include <Library/BaseLib.h>\r
11#include <Library/BaseMemoryLib.h>\r
12#include <Library/DebugLib.h>\r
13#include <Library/PcdLib.h>\r
14#include <Library/IoLib.h>\r
15#include <Library/HobLib.h>\r
16#include <Library/BlParseLib.h>\r
17#include <IndustryStandard/Acpi.h>\r
978d428e 18#include <UniversalPayload/PciRootBridges.h>\r
04af8bf2
DG
19\r
20/**\r
21 This function retrieves the parameter base address from boot loader.\r
22\r
23 This function will get bootloader specific parameter address for UEFI payload.\r
24 e.g. HobList pointer for Slim Bootloader, and coreboot table header for Coreboot.\r
25\r
26 @retval NULL Failed to find the GUID HOB.\r
27 @retval others GUIDed HOB data pointer.\r
28\r
29**/\r
30VOID *\r
31EFIAPI\r
32GetParameterBase (\r
33 VOID\r
34 )\r
35{\r
36 EFI_HOB_HANDOFF_INFO_TABLE *HandoffTable;\r
37\r
38 HandoffTable = (EFI_HOB_HANDOFF_INFO_TABLE *)(UINTN) GET_BOOTLOADER_PARAMETER ();\r
39 if ((HandoffTable->Header.HobType == EFI_HOB_TYPE_HANDOFF) &&\r
40 (HandoffTable->Header.HobLength == sizeof (EFI_HOB_HANDOFF_INFO_TABLE)) &&\r
41 (HandoffTable->Header.Reserved == 0)) {\r
42 return (VOID *)HandoffTable;\r
43 }\r
44\r
45 return NULL;\r
46}\r
47\r
48\r
49/**\r
50 This function retrieves a GUIDed HOB data from Slim Bootloader.\r
51\r
52 This function will search SBL HOB list to find the first GUIDed HOB that\r
53 its GUID matches Guid.\r
54\r
55 @param[in] Guid A pointer to HOB GUID to search.\r
56\r
57 @retval NULL Failed to find the GUID HOB.\r
58 @retval others GUIDed HOB data pointer.\r
59\r
60**/\r
61VOID *\r
62GetGuidHobDataFromSbl (\r
63 IN EFI_GUID *Guid\r
64 )\r
65{\r
66 UINT8 *GuidHob;\r
67 CONST VOID *HobList;\r
68\r
69 HobList = GetParameterBase ();\r
70 ASSERT (HobList != NULL);\r
71 GuidHob = GetNextGuidHob (Guid, HobList);\r
72 if (GuidHob != NULL) {\r
73 return GET_GUID_HOB_DATA (GuidHob);\r
74 }\r
75\r
76 return NULL;\r
77}\r
78\r
79/**\r
80 Acquire the memory map information.\r
81\r
82 @param MemInfoCallback The callback routine\r
83 @param Params Pointer to the callback routine parameter\r
84\r
85 @retval RETURN_SUCCESS Successfully find out the memory information.\r
86 @retval RETURN_NOT_FOUND Failed to find the memory information.\r
87\r
88**/\r
89RETURN_STATUS\r
90EFIAPI\r
91ParseMemoryInfo (\r
92 IN BL_MEM_INFO_CALLBACK MemInfoCallback,\r
93 IN VOID *Params\r
94 )\r
95{\r
91a978ce 96 MEMORY_MAP_INFO *MemoryMapInfo;\r
04af8bf2
DG
97 UINTN Idx;\r
98\r
91a978ce 99 MemoryMapInfo = (MEMORY_MAP_INFO *) GetGuidHobDataFromSbl (&gLoaderMemoryMapInfoGuid);\r
04af8bf2
DG
100 if (MemoryMapInfo == NULL) {\r
101 ASSERT (FALSE);\r
102 return RETURN_NOT_FOUND;\r
103 }\r
104\r
105 for (Idx = 0; Idx < MemoryMapInfo->Count; Idx++) {\r
106 MemInfoCallback (&MemoryMapInfo->Entry[Idx], Params);\r
107 }\r
108\r
109 return RETURN_SUCCESS;\r
110}\r
111\r
112/**\r
113 Acquire acpi table and smbios table from slim bootloader\r
114\r
115 @param SystemTableInfo Pointer to the system table info\r
116\r
117 @retval RETURN_SUCCESS Successfully find out the tables.\r
118 @retval RETURN_NOT_FOUND Failed to find the tables.\r
119\r
120**/\r
121RETURN_STATUS\r
122EFIAPI\r
123ParseSystemTable (\r
124 OUT SYSTEM_TABLE_INFO *SystemTableInfo\r
125 )\r
126{\r
127 SYSTEM_TABLE_INFO *TableInfo;\r
128\r
129 TableInfo = (SYSTEM_TABLE_INFO *)GetGuidHobDataFromSbl (&gUefiSystemTableInfoGuid);\r
130 if (TableInfo == NULL) {\r
131 ASSERT (FALSE);\r
132 return RETURN_NOT_FOUND;\r
133 }\r
134\r
135 CopyMem (SystemTableInfo, TableInfo, sizeof (SYSTEM_TABLE_INFO));\r
136\r
137 return RETURN_SUCCESS;\r
138}\r
139\r
140\r
141/**\r
142 Find the serial port information\r
143\r
144 @param SERIAL_PORT_INFO Pointer to serial port info structure\r
145\r
146 @retval RETURN_SUCCESS Successfully find the serial port information.\r
147 @retval RETURN_NOT_FOUND Failed to find the serial port information .\r
148\r
149**/\r
150RETURN_STATUS\r
151EFIAPI\r
152ParseSerialInfo (\r
153 OUT SERIAL_PORT_INFO *SerialPortInfo\r
154 )\r
155{\r
156 SERIAL_PORT_INFO *BlSerialInfo;\r
157\r
158 BlSerialInfo = (SERIAL_PORT_INFO *) GetGuidHobDataFromSbl (&gUefiSerialPortInfoGuid);\r
159 if (BlSerialInfo == NULL) {\r
160 ASSERT (FALSE);\r
161 return RETURN_NOT_FOUND;\r
162 }\r
163\r
164 CopyMem (SerialPortInfo, BlSerialInfo, sizeof (SERIAL_PORT_INFO));\r
165\r
166 return RETURN_SUCCESS;\r
167}\r
168\r
169\r
170/**\r
171 Find the video frame buffer information\r
172\r
173 @param GfxInfo Pointer to the EFI_PEI_GRAPHICS_INFO_HOB structure\r
174\r
175 @retval RETURN_SUCCESS Successfully find the video frame buffer information.\r
176 @retval RETURN_NOT_FOUND Failed to find the video frame buffer information .\r
177\r
178**/\r
179RETURN_STATUS\r
180EFIAPI\r
181ParseGfxInfo (\r
182 OUT EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo\r
183 )\r
184{\r
185 EFI_PEI_GRAPHICS_INFO_HOB *BlGfxInfo;\r
186\r
187 BlGfxInfo = (EFI_PEI_GRAPHICS_INFO_HOB *) GetGuidHobDataFromSbl (&gEfiGraphicsInfoHobGuid);\r
188 if (BlGfxInfo == NULL) {\r
189 return RETURN_NOT_FOUND;\r
190 }\r
191\r
192 CopyMem (GfxInfo, BlGfxInfo, sizeof (EFI_PEI_GRAPHICS_INFO_HOB));\r
193\r
194 return RETURN_SUCCESS;\r
195}\r
196\r
197/**\r
198 Find the video frame buffer device information\r
199\r
200 @param GfxDeviceInfo Pointer to the EFI_PEI_GRAPHICS_DEVICE_INFO_HOB structure\r
201\r
202 @retval RETURN_SUCCESS Successfully find the video frame buffer information.\r
203 @retval RETURN_NOT_FOUND Failed to find the video frame buffer information.\r
204\r
205**/\r
206RETURN_STATUS\r
207EFIAPI\r
208ParseGfxDeviceInfo (\r
209 OUT EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *GfxDeviceInfo\r
210 )\r
211{\r
212 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *BlGfxDeviceInfo;\r
213\r
214 BlGfxDeviceInfo = (EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *) GetGuidHobDataFromSbl (&gEfiGraphicsDeviceInfoHobGuid);\r
215 if (BlGfxDeviceInfo == NULL) {\r
216 return RETURN_NOT_FOUND;\r
217 }\r
218\r
219 CopyMem (GfxDeviceInfo, BlGfxDeviceInfo, sizeof (EFI_PEI_GRAPHICS_DEVICE_INFO_HOB));\r
220\r
221 return RETURN_SUCCESS;\r
222}\r
223\r
978d428e
MM
224/**\r
225 Parse and handle the misc info provided by bootloader\r
226\r
227 @retval RETURN_SUCCESS The misc information was parsed successfully.\r
228 @retval RETURN_NOT_FOUND Could not find required misc info.\r
229 @retval RETURN_OUT_OF_RESOURCES Insufficant memory space.\r
230\r
231**/\r
232RETURN_STATUS\r
233EFIAPI\r
234ParseMiscInfo (\r
235 VOID\r
236 )\r
237{\r
238 RETURN_STATUS Status;\r
239 UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *BlRootBridgesHob;\r
240 UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PldRootBridgesHob;\r
241\r
242 Status = RETURN_NOT_FOUND;\r
243 BlRootBridgesHob = (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *) GetGuidHobDataFromSbl (\r
244 &gUniversalPayloadPciRootBridgeInfoGuid\r
245 );\r
246 if (BlRootBridgesHob != NULL) {\r
247 //\r
248 // Migrate bootloader root bridge info hob from bootloader to payload.\r
249 //\r
250 PldRootBridgesHob = BuildGuidHob (\r
251 &gUniversalPayloadPciRootBridgeInfoGuid,\r
252 BlRootBridgesHob->Header.Length\r
253 );\r
254 ASSERT (PldRootBridgesHob != NULL);\r
255 if (PldRootBridgesHob != NULL) {\r
256 CopyMem (PldRootBridgesHob, BlRootBridgesHob, BlRootBridgesHob->Header.Length);\r
257 DEBUG ((DEBUG_INFO, "Create PCI root bridge info guid hob\n"));\r
258 Status = RETURN_SUCCESS;\r
259 } else {\r
260 Status = RETURN_OUT_OF_RESOURCES;\r
261 }\r
262 }\r
263\r
264 return Status;\r
265}\r
266\r