]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/Library/SblParseLib/SblParseLib.c
UefiPayloadPkg: Enhance UEFI payload for coreboot and Slim Bootloader
[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
4 Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
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
18\r
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
96 MEMROY_MAP_INFO *MemoryMapInfo;\r
97 UINTN Idx;\r
98\r
99 MemoryMapInfo = (MEMROY_MAP_INFO *) GetGuidHobDataFromSbl (&gLoaderMemoryMapInfoGuid);\r
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