]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
111f2228 24extern EFI_GUID gFspPerformanceDataGuid;\r
cf1d4549 25\r
111f2228 26EFI_PEI_PPI_DESCRIPTOR mPeiPostPciEnumerationPpi = {\r
cf1d4549
JY
27 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
28 &gEfiPciEnumerationCompleteProtocolGuid,\r
29 NULL\r
30};\r
31\r
111f2228 32EFI_PEI_PPI_DESCRIPTOR mPeiReadyToBootPpi = {\r
cf1d4549
JY
33 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
34 &gEfiEventReadyToBootGuid,\r
35 NULL\r
36};\r
37\r
111f2228 38EFI_PEI_PPI_DESCRIPTOR mPeiEndOfFirmwarePpi = {\r
cf1d4549
JY
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
111f2228 62 IN UINT32 NotificationCode\r
cf1d4549
JY
63 )\r
64{\r
111f2228 65 EFI_STATUS Status;\r
cf1d4549 66\r
111f2228 67 Status = EFI_SUCCESS;\r
cf1d4549
JY
68\r
69 switch (NotificationCode) {\r
111f2228
MK
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
cf1d4549
JY
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 110FspSiliconInitDone2 (\r
111f2228 111 IN EFI_STATUS Status\r
cf1d4549
JY
112 )\r
113{\r
111f2228 114 volatile EFI_STATUS FspStatus;\r
a2e61f34
CC
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
111f2228 131\r
cf1d4549
JY
132 //\r
133 // This is the end of the FspSiliconInit API\r
134 // Give control back to the boot loader\r
135 //\r
136 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT);\r
f56ae7bf 137 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35 138 PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549 139 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
a2e61f34
CC
140 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
141 do {\r
142 SetFspApiReturnStatus (Status);\r
143 Pei2LoaderSwitchStack ();\r
144 if (Status != EFI_SUCCESS) {\r
145 DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
146 }\r
147 } while (FspStatus != EFI_SUCCESS);\r
148 }\r
cf1d4549
JY
149}\r
150\r
151/**\r
152 This function returns control to BootLoader after MemoryInitApi.\r
153\r
f56ae7bf
TRM
154 @param[in] Status return status for the MemoryInitApi.\r
155 @param[in,out] HobListPtr The address of HobList pointer, if NULL, will get value from GetFspApiParameter2 ()\r
cf1d4549
JY
156**/\r
157VOID\r
158EFIAPI\r
f56ae7bf 159FspMemoryInitDone2 (\r
111f2228
MK
160 IN EFI_STATUS Status,\r
161 IN OUT VOID **HobListPtr\r
cf1d4549
JY
162 )\r
163{\r
111f2228
MK
164 FSP_GLOBAL_DATA *FspData;\r
165 volatile EFI_STATUS FspStatus;\r
a2e61f34
CC
166\r
167 FspStatus = Status;\r
cf1d4549
JY
168 //\r
169 // Calling use FspMemoryInit API\r
170 // Update HOB and return the control directly\r
171 //\r
f56ae7bf
TRM
172 if (HobListPtr == NULL) {\r
173 HobListPtr = (VOID **)GetFspApiParameter2 ();\r
174 }\r
111f2228 175\r
cf1d4549 176 if (HobListPtr != NULL) {\r
111f2228 177 *HobListPtr = (VOID *)GetHobList ();\r
cf1d4549 178 }\r
111f2228 179\r
f56ae7bf
TRM
180 //\r
181 // Convert to FSP EAS defined API return codes\r
182 //\r
183 switch (Status) {\r
184 case EFI_SUCCESS:\r
185 case EFI_INVALID_PARAMETER:\r
186 case EFI_UNSUPPORTED:\r
187 case EFI_DEVICE_ERROR:\r
188 case EFI_OUT_OF_RESOURCES:\r
189 break;\r
190 default:\r
191 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() Invalid Error [Status: 0x%08X]\n", Status));\r
192 Status = EFI_DEVICE_ERROR; // Force to known error.\r
193 break;\r
194 }\r
111f2228 195\r
cf1d4549
JY
196 //\r
197 // This is the end of the FspMemoryInit API\r
198 // Give control back to the boot loader\r
199 //\r
f56ae7bf 200 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35
YS
201 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT);\r
202 FspData = GetFspGlobalDataPointer ();\r
111f2228
MK
203 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
204 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
205 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
206 PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
cf1d4549 207 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
a2e61f34
CC
208 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
209 do {\r
210 SetFspApiReturnStatus (Status);\r
211 Pei2LoaderSwitchStack ();\r
212 if (Status != EFI_SUCCESS) {\r
213 DEBUG ((DEBUG_ERROR, "!!!ERROR: FspMemoryInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
214 }\r
215 } while (FspStatus != EFI_SUCCESS);\r
216 }\r
cf1d4549
JY
217\r
218 //\r
219 // The TempRamExitApi is called\r
220 //\r
221 if (GetFspApiCallingIndex () == TempRamExitApiIndex) {\r
222 SetPhaseStatusCode (FSP_STATUS_CODE_TEMP_RAM_EXIT);\r
cf1d4549 223 SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY);\r
111f2228 224 PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
19d29d35 225 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
226 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - Begin\n"));\r
227 } else {\r
cf1d4549 228 SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
19d29d35 229 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
111f2228 230 PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549 231 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
19d29d35 232 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - Begin\n"));\r
cf1d4549
JY
233 }\r
234}\r
235\r
236/**\r
237 This function returns control to BootLoader after TempRamExitApi.\r
238\r
f56ae7bf
TRM
239 @param[in] Status return status for the TempRamExitApi.\r
240\r
cf1d4549
JY
241**/\r
242VOID\r
243EFIAPI\r
f56ae7bf 244FspTempRamExitDone2 (\r
111f2228 245 IN EFI_STATUS Status\r
cf1d4549
JY
246 )\r
247{\r
f56ae7bf 248 //\r
111f2228 249 volatile EFI_STATUS FspStatus;\r
a2e61f34
CC
250\r
251 FspStatus = Status;\r
f56ae7bf
TRM
252 // Convert to FSP EAS defined API return codes\r
253 //\r
254 switch (Status) {\r
255 case EFI_SUCCESS:\r
256 case EFI_INVALID_PARAMETER:\r
257 case EFI_UNSUPPORTED:\r
258 case EFI_DEVICE_ERROR:\r
259 break;\r
260 default:\r
261 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() Invalid Error - [Status: 0x%08X]\n", Status));\r
262 Status = EFI_DEVICE_ERROR; // Force to known error.\r
263 break;\r
264 }\r
111f2228 265\r
cf1d4549
JY
266 //\r
267 // This is the end of the TempRamExit API\r
268 // Give control back to the boot loader\r
269 //\r
f56ae7bf 270 DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - [Status: 0x%08X] - End\n", Status));\r
19d29d35 271 SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT);\r
111f2228 272 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 273 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
274 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
275 do {\r
276 SetFspApiReturnStatus (Status);\r
277 Pei2LoaderSwitchStack ();\r
278 if (Status != EFI_SUCCESS) {\r
279 DEBUG ((DEBUG_ERROR, "!!!ERROR: TempRamExitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
280 }\r
281 } while (FspStatus != EFI_SUCCESS);\r
282 }\r
111f2228 283\r
cf1d4549
JY
284 SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
285 SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
111f2228 286 PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
cf1d4549 287 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
19d29d35 288 DEBUG ((DEBUG_INFO | DEBUG_INIT, "SiliconInitApi() - Begin\n"));\r
cf1d4549
JY
289}\r
290\r
291/**\r
292 This function handle NotifyPhase API call from the BootLoader.\r
293 It gives control back to the BootLoader after it is handled. If the\r
294 Notification code is a ReadyToBoot event, this function will return\r
295 and FSP continues the remaining execution until it reaches the DxeIpl.\r
296\r
297**/\r
298VOID\r
299FspWaitForNotify (\r
300 VOID\r
301 )\r
302{\r
111f2228
MK
303 EFI_STATUS Status;\r
304 UINT32 NotificationValue;\r
305 UINT32 NotificationCount;\r
306 UINT8 Count;\r
307 volatile EFI_STATUS FspStatus;\r
cf1d4549
JY
308\r
309 NotificationCount = 0;\r
111f2228 310 while (NotificationCount < sizeof (mFspNotifySequence) / sizeof (UINT32)) {\r
cf1d4549
JY
311 Count = (UINT8)((NotificationCount << 1) & 0x07);\r
312 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY + Count);\r
313\r
314 if (NotificationCount == 0) {\r
315 SetPhaseStatusCode (FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION);\r
19d29d35 316 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
317 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
318 } else if (NotificationCount == 1) {\r
319 SetPhaseStatusCode (FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION);\r
111f2228 320 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
321 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
322 } else if (NotificationCount == 2) {\r
323 SetPhaseStatusCode (FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION);\r
19d29d35 324 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
325 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
326 }\r
327\r
328 NotificationValue = ((NOTIFY_PHASE_PARAMS *)(UINTN)GetFspApiParameter ())->Phase;\r
329 DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - Begin [Phase: %08X]\n", NotificationValue));\r
330 if (mFspNotifySequence[NotificationCount] != NotificationValue) {\r
331 //\r
332 // Notify code does not follow the predefined order\r
333 //\r
334 DEBUG ((DEBUG_INFO, "Unsupported FSP Notification Value\n"));\r
335 Status = EFI_UNSUPPORTED;\r
336 } else {\r
337 //\r
338 // Process Notification and Give control back to the boot loader framework caller\r
339 //\r
340 Status = FspNotificationHandler (NotificationValue);\r
111f2228 341 if (!EFI_ERROR (Status)) {\r
cf1d4549
JY
342 NotificationCount++;\r
343 }\r
344 }\r
345\r
cf1d4549 346 DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - End [Status: 0x%08X]\n", Status));\r
cf1d4549
JY
347 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count);\r
348\r
349 if ((NotificationCount - 1) == 0) {\r
111f2228 350 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
351 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
352 } else if ((NotificationCount - 1) == 1) {\r
111f2228 353 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
354 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
355 } else if ((NotificationCount - 1) == 2) {\r
111f2228 356 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
357 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
358 }\r
111f2228 359\r
a2e61f34
CC
360 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
361 FspStatus = Status;\r
362 do {\r
111f2228
MK
363 SetFspApiReturnStatus (Status);\r
364 Pei2LoaderSwitchStack ();\r
a2e61f34
CC
365 if (Status != EFI_SUCCESS) {\r
366 DEBUG ((DEBUG_ERROR, "!!!ERROR: NotifyPhaseApi() [Phase: %08X] - Failed - [Status: 0x%08X]\n", NotificationValue, Status));\r
367 }\r
368 } while (FspStatus != EFI_SUCCESS);\r
369 }\r
cf1d4549 370 }\r
111f2228 371\r
cf1d4549
JY
372 //\r
373 // Control goes back to the PEI Core and it dispatches further PEIMs.\r
374 // DXEIPL is the final one to transfer control back to the boot loader.\r
375 //\r
376}\r
377\r
f56ae7bf
TRM
378/**\r
379 This function transfer control back to BootLoader after FspSiliconInit.\r
380\r
381**/\r
382VOID\r
383EFIAPI\r
384FspSiliconInitDone (\r
385 VOID\r
386 )\r
387{\r
388 FspSiliconInitDone2 (EFI_SUCCESS);\r
389}\r
390\r
391/**\r
392 This function returns control to BootLoader after MemoryInitApi.\r
393\r
394 @param[in,out] HobListPtr The address of HobList pointer.\r
395**/\r
396VOID\r
397EFIAPI\r
398FspMemoryInitDone (\r
111f2228 399 IN OUT VOID **HobListPtr\r
f56ae7bf
TRM
400 )\r
401{\r
402 FspMemoryInitDone2 (EFI_SUCCESS, HobListPtr);\r
403}\r
404\r
405/**\r
406 This function returns control to BootLoader after TempRamExitApi.\r
407\r
408**/\r
409VOID\r
410EFIAPI\r
411FspTempRamExitDone (\r
412 VOID\r
413 )\r
414{\r
415 FspTempRamExitDone2 (EFI_SUCCESS);\r
416}\r