]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
IntelFsp2Pkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / IntelFsp2Pkg / Library / BaseFspPlatformLib / FspPlatformNotify.c
CommitLineData
cf1d4549
JY
1/** @file\r
2\r
a2e61f34 3 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
9672cd30 4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
cf1d4549
JY
5\r
6**/\r
7\r
8#include <PiPei.h>\r
9#include <Library/PeiServicesLib.h>\r
10#include <Library/PeiServicesTablePointerLib.h>\r
11#include <Library/BaseLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/PcdLib.h>\r
14#include <Library/DebugLib.h>\r
15#include <Library/HobLib.h>\r
16#include <Library/FspSwitchStackLib.h>\r
17#include <Library/FspCommonLib.h>\r
18#include <Guid/EventGroup.h>\r
19#include <FspEas.h>\r
20#include <FspStatusCode.h>\r
21#include <Protocol/PciEnumerationComplete.h>\r
22#include <Library/ReportStatusCodeLib.h>\r
23#include <Library/PerformanceLib.h>\r
24extern EFI_GUID gFspPerformanceDataGuid;\r
25\r
26EFI_PEI_PPI_DESCRIPTOR mPeiPostPciEnumerationPpi = {\r
27 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
28 &gEfiPciEnumerationCompleteProtocolGuid,\r
29 NULL\r
30};\r
31\r
32EFI_PEI_PPI_DESCRIPTOR mPeiReadyToBootPpi = {\r
33 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
34 &gEfiEventReadyToBootGuid,\r
35 NULL\r
36};\r
37\r
38EFI_PEI_PPI_DESCRIPTOR mPeiEndOfFirmwarePpi = {\r
39 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
40 &gFspEventEndOfFirmwareGuid,\r
41 NULL\r
42};\r
43\r
44UINT32 mFspNotifySequence[] = {\r
45 EnumInitPhaseAfterPciEnumeration,\r
46 EnumInitPhaseReadyToBoot,\r
47 EnumInitPhaseEndOfFirmware\r
48};\r
49\r
50/**\r
51 Install FSP notification.\r
52\r
53 @param[in] NotificationCode FSP notification code\r
54\r
55 @retval EFI_SUCCESS Notify FSP successfully\r
56 @retval EFI_INVALID_PARAMETER NotificationCode is invalid\r
57\r
58**/\r
59EFI_STATUS\r
60EFIAPI\r
61FspNotificationHandler (\r
62 IN UINT32 NotificationCode\r
63 )\r
64{\r
65 EFI_STATUS Status;\r
66\r
67 Status = EFI_SUCCESS;\r
68\r
69 switch (NotificationCode) {\r
70 case EnumInitPhaseAfterPciEnumeration:\r
71 //\r
72 // Do POST PCI initialization if needed\r
73 //\r
74 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));\r
75 PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);\r
76 break;\r
77\r
78 case EnumInitPhaseReadyToBoot:\r
79 //\r
80 // Ready To Boot\r
81 //\r
82 DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));\r
83 PeiServicesInstallPpi (&mPeiReadyToBootPpi);\r
84 break;\r
85\r
86 case EnumInitPhaseEndOfFirmware:\r
87 //\r
88 // End of Firmware\r
89 //\r
90 DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP End of Firmware ...\n"));\r
91 PeiServicesInstallPpi (&mPeiEndOfFirmwarePpi);\r
92 break;\r
93\r
94 default:\r
95 Status = EFI_INVALID_PARAMETER;\r
96 break;\r
97 }\r
98\r
99 return Status;\r
100}\r
101\r
102/**\r
103 This function transfer control back to BootLoader after FspSiliconInit.\r
104\r
f56ae7bf
TRM
105 @param[in] Status return status for the FspSiliconInit.\r
106\r
cf1d4549
JY
107**/\r
108VOID\r
109EFIAPI\r
f56ae7bf
TRM
110FspSiliconInitDone2 (\r
111 IN EFI_STATUS Status\r
cf1d4549
JY
112 )\r
113{\r
a2e61f34
CC
114 volatile EFI_STATUS FspStatus;\r
115\r
116 FspStatus = Status;\r
f56ae7bf
TRM
117 //\r
118 // Convert to FSP EAS defined API return codes\r
119 //\r
120 switch (Status) {\r
121 case EFI_SUCCESS:\r
122 case EFI_INVALID_PARAMETER:\r
123 case EFI_UNSUPPORTED:\r
124 case EFI_DEVICE_ERROR:\r
125 break;\r
126 default:\r
127 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() Invalid Error - [Status: 0x%08X]\n", Status));\r
128 Status = EFI_DEVICE_ERROR; // Force to known error.\r
129 break;\r
130 }\r
cf1d4549
JY
131 //\r
132 // This is the end of the FspSiliconInit API\r
133 // Give control back to the boot loader\r
134 //\r
135 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT);\r
f56ae7bf 136 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35 137 PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549 138 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
a2e61f34
CC
139 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
140 do {\r
141 SetFspApiReturnStatus (Status);\r
142 Pei2LoaderSwitchStack ();\r
143 if (Status != EFI_SUCCESS) {\r
144 DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
145 }\r
146 } while (FspStatus != EFI_SUCCESS);\r
147 }\r
cf1d4549
JY
148}\r
149\r
150/**\r
151 This function returns control to BootLoader after MemoryInitApi.\r
152\r
f56ae7bf
TRM
153 @param[in] Status return status for the MemoryInitApi.\r
154 @param[in,out] HobListPtr The address of HobList pointer, if NULL, will get value from GetFspApiParameter2 ()\r
cf1d4549
JY
155**/\r
156VOID\r
157EFIAPI\r
f56ae7bf
TRM
158FspMemoryInitDone2 (\r
159 IN EFI_STATUS Status,\r
cf1d4549
JY
160 IN OUT VOID **HobListPtr\r
161 )\r
162{\r
19d29d35 163 FSP_GLOBAL_DATA *FspData;\r
a2e61f34
CC
164 volatile EFI_STATUS FspStatus;\r
165\r
166 FspStatus = Status;\r
cf1d4549
JY
167 //\r
168 // Calling use FspMemoryInit API\r
169 // Update HOB and return the control directly\r
170 //\r
f56ae7bf
TRM
171 if (HobListPtr == NULL) {\r
172 HobListPtr = (VOID **)GetFspApiParameter2 ();\r
173 }\r
cf1d4549
JY
174 if (HobListPtr != NULL) {\r
175 *HobListPtr = (VOID *) GetHobList ();\r
176 }\r
f56ae7bf
TRM
177 //\r
178 // Convert to FSP EAS defined API return codes\r
179 //\r
180 switch (Status) {\r
181 case EFI_SUCCESS:\r
182 case EFI_INVALID_PARAMETER:\r
183 case EFI_UNSUPPORTED:\r
184 case EFI_DEVICE_ERROR:\r
185 case EFI_OUT_OF_RESOURCES:\r
186 break;\r
187 default:\r
188 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() Invalid Error [Status: 0x%08X]\n", Status));\r
189 Status = EFI_DEVICE_ERROR; // Force to known error.\r
190 break;\r
191 }\r
cf1d4549
JY
192 //\r
193 // This is the end of the FspMemoryInit API\r
194 // Give control back to the boot loader\r
195 //\r
f56ae7bf 196 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35
YS
197 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT);\r
198 FspData = GetFspGlobalDataPointer ();\r
199 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, (FspData->PerfData[0] & FSP_PERFORMANCE_DATA_TIMER_MASK), FSP_STATUS_CODE_TEMP_RAM_INIT | FSP_STATUS_CODE_COMMON_CODE| FSP_STATUS_CODE_API_ENTRY);\r
200 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, (FspData->PerfData[1] & FSP_PERFORMANCE_DATA_TIMER_MASK), FSP_STATUS_CODE_TEMP_RAM_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
201 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, (FspData->PerfData[2] & FSP_PERFORMANCE_DATA_TIMER_MASK), FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
202 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549 203 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
a2e61f34
CC
204 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
205 do {\r
206 SetFspApiReturnStatus (Status);\r
207 Pei2LoaderSwitchStack ();\r
208 if (Status != EFI_SUCCESS) {\r
209 DEBUG ((DEBUG_ERROR, "!!!ERROR: FspMemoryInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
210 }\r
211 } while (FspStatus != EFI_SUCCESS);\r
212 }\r
cf1d4549
JY
213\r
214 //\r
215 // The TempRamExitApi is called\r
216 //\r
217 if (GetFspApiCallingIndex () == TempRamExitApiIndex) {\r
218 SetPhaseStatusCode (FSP_STATUS_CODE_TEMP_RAM_EXIT);\r
cf1d4549 219 SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY);\r
19d29d35
YS
220 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
221 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549
JY
222 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - Begin\n"));\r
223 } else {\r
cf1d4549 224 SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
19d29d35
YS
225 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
226 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549 227 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
19d29d35 228 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - Begin\n"));\r
cf1d4549
JY
229 }\r
230}\r
231\r
232/**\r
233 This function returns control to BootLoader after TempRamExitApi.\r
234\r
f56ae7bf
TRM
235 @param[in] Status return status for the TempRamExitApi.\r
236\r
cf1d4549
JY
237**/\r
238VOID\r
239EFIAPI\r
f56ae7bf
TRM
240FspTempRamExitDone2 (\r
241 IN EFI_STATUS Status\r
cf1d4549
JY
242 )\r
243{\r
f56ae7bf 244 //\r
a2e61f34
CC
245 volatile EFI_STATUS FspStatus;\r
246\r
247 FspStatus = Status;\r
f56ae7bf
TRM
248 // Convert to FSP EAS defined API return codes\r
249 //\r
250 switch (Status) {\r
251 case EFI_SUCCESS:\r
252 case EFI_INVALID_PARAMETER:\r
253 case EFI_UNSUPPORTED:\r
254 case EFI_DEVICE_ERROR:\r
255 break;\r
256 default:\r
257 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() Invalid Error - [Status: 0x%08X]\n", Status));\r
258 Status = EFI_DEVICE_ERROR; // Force to known error.\r
259 break;\r
260 }\r
cf1d4549
JY
261 //\r
262 // This is the end of the TempRamExit API\r
263 // Give control back to the boot loader\r
264 //\r
f56ae7bf 265 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35
YS
266 SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT);\r
267 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549 268 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
a2e61f34
CC
269 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
270 do {\r
271 SetFspApiReturnStatus (Status);\r
272 Pei2LoaderSwitchStack ();\r
273 if (Status != EFI_SUCCESS) {\r
274 DEBUG ((DEBUG_ERROR, "!!!ERROR: TempRamExitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
275 }\r
276 } while (FspStatus != EFI_SUCCESS);\r
277 }\r
cf1d4549
JY
278 SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
279 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
19d29d35 280 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549 281 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
19d29d35 282 DEBUG ((DEBUG_INFO | DEBUG_INIT, "SiliconInitApi() - Begin\n"));\r
cf1d4549
JY
283}\r
284\r
285/**\r
286 This function handle NotifyPhase API call from the BootLoader.\r
287 It gives control back to the BootLoader after it is handled. If the\r
288 Notification code is a ReadyToBoot event, this function will return\r
289 and FSP continues the remaining execution until it reaches the DxeIpl.\r
290\r
291**/\r
292VOID\r
293FspWaitForNotify (\r
294 VOID\r
295 )\r
296{\r
297 EFI_STATUS Status;\r
298 UINT32 NotificationValue;\r
299 UINT32 NotificationCount;\r
300 UINT8 Count;\r
a2e61f34 301 volatile EFI_STATUS FspStatus;\r
cf1d4549
JY
302\r
303 NotificationCount = 0;\r
304 while (NotificationCount < sizeof(mFspNotifySequence) / sizeof(UINT32)) {\r
305\r
306 Count = (UINT8)((NotificationCount << 1) & 0x07);\r
307 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY + Count);\r
308\r
309 if (NotificationCount == 0) {\r
310 SetPhaseStatusCode (FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION);\r
19d29d35 311 PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549
JY
312 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
313 } else if (NotificationCount == 1) {\r
314 SetPhaseStatusCode (FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION);\r
19d29d35 315 PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549
JY
316 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
317 } else if (NotificationCount == 2) {\r
318 SetPhaseStatusCode (FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION);\r
19d29d35 319 PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549
JY
320 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
321 }\r
322\r
323 NotificationValue = ((NOTIFY_PHASE_PARAMS *)(UINTN)GetFspApiParameter ())->Phase;\r
324 DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - Begin [Phase: %08X]\n", NotificationValue));\r
325 if (mFspNotifySequence[NotificationCount] != NotificationValue) {\r
326 //\r
327 // Notify code does not follow the predefined order\r
328 //\r
329 DEBUG ((DEBUG_INFO, "Unsupported FSP Notification Value\n"));\r
330 Status = EFI_UNSUPPORTED;\r
331 } else {\r
332 //\r
333 // Process Notification and Give control back to the boot loader framework caller\r
334 //\r
335 Status = FspNotificationHandler (NotificationValue);\r
336 if (!EFI_ERROR(Status)) {\r
337 NotificationCount++;\r
338 }\r
339 }\r
340\r
cf1d4549 341 DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - End [Status: 0x%08X]\n", Status));\r
cf1d4549
JY
342 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count);\r
343\r
344 if ((NotificationCount - 1) == 0) {\r
19d29d35 345 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549
JY
346 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
347 } else if ((NotificationCount - 1) == 1) {\r
19d29d35 348 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549
JY
349 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
350 } else if ((NotificationCount - 1) == 2) {\r
19d29d35 351 PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549
JY
352 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
353 }\r
a2e61f34
CC
354 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
355 FspStatus = Status;\r
356 do {\r
357 SetFspApiReturnStatus(Status);\r
358 Pei2LoaderSwitchStack();\r
359 if (Status != EFI_SUCCESS) {\r
360 DEBUG ((DEBUG_ERROR, "!!!ERROR: NotifyPhaseApi() [Phase: %08X] - Failed - [Status: 0x%08X]\n", NotificationValue, Status));\r
361 }\r
362 } while (FspStatus != EFI_SUCCESS);\r
363 }\r
cf1d4549 364 }\r
cf1d4549
JY
365 //\r
366 // Control goes back to the PEI Core and it dispatches further PEIMs.\r
367 // DXEIPL is the final one to transfer control back to the boot loader.\r
368 //\r
369}\r
370\r
f56ae7bf
TRM
371/**\r
372 This function transfer control back to BootLoader after FspSiliconInit.\r
373\r
374**/\r
375VOID\r
376EFIAPI\r
377FspSiliconInitDone (\r
378 VOID\r
379 )\r
380{\r
381 FspSiliconInitDone2 (EFI_SUCCESS);\r
382}\r
383\r
384/**\r
385 This function returns control to BootLoader after MemoryInitApi.\r
386\r
387 @param[in,out] HobListPtr The address of HobList pointer.\r
388**/\r
389VOID\r
390EFIAPI\r
391FspMemoryInitDone (\r
392 IN OUT VOID **HobListPtr\r
393 )\r
394{\r
395 FspMemoryInitDone2 (EFI_SUCCESS, HobListPtr);\r
396}\r
397\r
398/**\r
399 This function returns control to BootLoader after TempRamExitApi.\r
400\r
401**/\r
402VOID\r
403EFIAPI\r
404FspTempRamExitDone (\r
405 VOID\r
406 )\r
407{\r
408 FspTempRamExitDone2 (EFI_SUCCESS);\r
409}\r