]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / Library / BaseFspPlatformLib / FspPlatformNotify.c
index ac1fc1ac0b37cec6045d044cc132ff4d6a262a07..795bb28c0f71b34e2c14a4f441f9fb89c3aae5be 100644 (file)
@@ -1,13 +1,7 @@
 /** @file\r
 \r
-  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Protocol/PciEnumerationComplete.h>\r
 #include <Library/ReportStatusCodeLib.h>\r
 #include <Library/PerformanceLib.h>\r
-extern EFI_GUID gFspPerformanceDataGuid;\r
+extern EFI_GUID  gFspPerformanceDataGuid;\r
 \r
-EFI_PEI_PPI_DESCRIPTOR      mPeiPostPciEnumerationPpi = {\r
+EFI_PEI_PPI_DESCRIPTOR  mPeiPostPciEnumerationPpi = {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiPciEnumerationCompleteProtocolGuid,\r
   NULL\r
 };\r
 \r
-EFI_PEI_PPI_DESCRIPTOR      mPeiReadyToBootPpi = {\r
+EFI_PEI_PPI_DESCRIPTOR  mPeiReadyToBootPpi = {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiEventReadyToBootGuid,\r
   NULL\r
 };\r
 \r
-EFI_PEI_PPI_DESCRIPTOR      mPeiEndOfFirmwarePpi = {\r
+EFI_PEI_PPI_DESCRIPTOR  mPeiEndOfFirmwarePpi = {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gFspEventEndOfFirmwareGuid,\r
   NULL\r
@@ -65,41 +59,41 @@ UINT32  mFspNotifySequence[] = {
 EFI_STATUS\r
 EFIAPI\r
 FspNotificationHandler (\r
-  IN  UINT32     NotificationCode\r
+  IN  UINT32  NotificationCode\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
+  EFI_STATUS  Status;\r
 \r
-  Status   = EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
 \r
   switch (NotificationCode) {\r
-  case EnumInitPhaseAfterPciEnumeration:\r
-    //\r
-    // Do POST PCI initialization if needed\r
-    //\r
-    DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));\r
-    PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);\r
-    break;\r
-\r
-  case EnumInitPhaseReadyToBoot:\r
-    //\r
-    // Ready To Boot\r
-    //\r
-    DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));\r
-    PeiServicesInstallPpi (&mPeiReadyToBootPpi);\r
-    break;\r
-\r
-  case EnumInitPhaseEndOfFirmware:\r
-    //\r
-    // End of Firmware\r
-    //\r
-    DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP End of Firmware ...\n"));\r
-    PeiServicesInstallPpi (&mPeiEndOfFirmwarePpi);\r
-    break;\r
-\r
-  default:\r
-    Status = EFI_INVALID_PARAMETER;\r
-    break;\r
+    case EnumInitPhaseAfterPciEnumeration:\r
+      //\r
+      // Do POST PCI initialization if needed\r
+      //\r
+      DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));\r
+      PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);\r
+      break;\r
+\r
+    case EnumInitPhaseReadyToBoot:\r
+      //\r
+      // Ready To Boot\r
+      //\r
+      DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));\r
+      PeiServicesInstallPpi (&mPeiReadyToBootPpi);\r
+      break;\r
+\r
+    case EnumInitPhaseEndOfFirmware:\r
+      //\r
+      // End of Firmware\r
+      //\r
+      DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP End of Firmware ...\n"));\r
+      PeiServicesInstallPpi (&mPeiEndOfFirmwarePpi);\r
+      break;\r
+\r
+    default:\r
+      Status = EFI_INVALID_PARAMETER;\r
+      break;\r
   }\r
 \r
   return Status;\r
@@ -114,9 +108,12 @@ FspNotificationHandler (
 VOID\r
 EFIAPI\r
 FspSiliconInitDone2 (\r
-  IN EFI_STATUS Status\r
+  IN EFI_STATUS  Status\r
   )\r
 {\r
+  volatile EFI_STATUS  FspStatus;\r
+\r
+  FspStatus = Status;\r
   //\r
   // Convert to FSP EAS defined API return codes\r
   //\r
@@ -131,6 +128,7 @@ FspSiliconInitDone2 (
       Status = EFI_DEVICE_ERROR;  // Force to known error.\r
       break;\r
   }\r
+\r
   //\r
   // This is the end of the FspSiliconInit API\r
   // Give control back to the boot loader\r
@@ -139,13 +137,15 @@ FspSiliconInitDone2 (
   DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - [Status: 0x%08X] - End\n", Status));\r
   PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
-  do {\r
-    SetFspApiReturnStatus (Status);\r
-    Pei2LoaderSwitchStack ();\r
-    if (Status != EFI_SUCCESS) {\r
-      DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
-    }\r
-  } while (Status != EFI_SUCCESS);\r
+  if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
+    do {\r
+      SetFspApiReturnStatus (Status);\r
+      Pei2LoaderSwitchStack ();\r
+      if (Status != EFI_SUCCESS) {\r
+        DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
+      }\r
+    } while (FspStatus != EFI_SUCCESS);\r
+  }\r
 }\r
 \r
 /**\r
@@ -157,11 +157,14 @@ FspSiliconInitDone2 (
 VOID\r
 EFIAPI\r
 FspMemoryInitDone2 (\r
-  IN EFI_STATUS Status,\r
-  IN OUT VOID   **HobListPtr\r
+  IN EFI_STATUS  Status,\r
+  IN OUT VOID    **HobListPtr\r
   )\r
 {\r
-  FSP_GLOBAL_DATA   *FspData;\r
+  FSP_GLOBAL_DATA      *FspData;\r
+  volatile EFI_STATUS  FspStatus;\r
+\r
+  FspStatus = Status;\r
   //\r
   // Calling use FspMemoryInit API\r
   // Update HOB and return the control directly\r
@@ -169,9 +172,11 @@ FspMemoryInitDone2 (
   if (HobListPtr == NULL) {\r
     HobListPtr = (VOID **)GetFspApiParameter2 ();\r
   }\r
+\r
   if (HobListPtr != NULL) {\r
-    *HobListPtr = (VOID *) GetHobList ();\r
+    *HobListPtr = (VOID *)GetHobList ();\r
   }\r
+\r
   //\r
   // Convert to FSP EAS defined API return codes\r
   //\r
@@ -187,6 +192,7 @@ FspMemoryInitDone2 (
       Status = EFI_DEVICE_ERROR;  // Force to known error.\r
       break;\r
   }\r
+\r
   //\r
   // This is the end of the FspMemoryInit API\r
   // Give control back to the boot loader\r
@@ -194,18 +200,20 @@ FspMemoryInitDone2 (
   DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - [Status: 0x%08X] - End\n", Status));\r
   SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT);\r
   FspData = GetFspGlobalDataPointer ();\r
-  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
-  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
-  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
-  PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+  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
+  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
+  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
+  PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
-  do {\r
-    SetFspApiReturnStatus (Status);\r
-    Pei2LoaderSwitchStack ();\r
-    if (Status != EFI_SUCCESS) {\r
-      DEBUG ((DEBUG_ERROR, "!!!ERROR: FspMemoryInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
-    }\r
-  } while (Status != EFI_SUCCESS);\r
+  if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
+    do {\r
+      SetFspApiReturnStatus (Status);\r
+      Pei2LoaderSwitchStack ();\r
+      if (Status != EFI_SUCCESS) {\r
+        DEBUG ((DEBUG_ERROR, "!!!ERROR: FspMemoryInitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
+      }\r
+    } while (FspStatus != EFI_SUCCESS);\r
+  }\r
 \r
   //\r
   // The TempRamExitApi is called\r
@@ -213,13 +221,13 @@ FspMemoryInitDone2 (
   if (GetFspApiCallingIndex () == TempRamExitApiIndex) {\r
     SetPhaseStatusCode (FSP_STATUS_CODE_TEMP_RAM_EXIT);\r
     SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY);\r
-    PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - Begin\n"));\r
   } else {\r
     SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
     SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
-    PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - Begin\n"));\r
   }\r
@@ -234,10 +242,13 @@ FspMemoryInitDone2 (
 VOID\r
 EFIAPI\r
 FspTempRamExitDone2 (\r
-  IN EFI_STATUS Status\r
+  IN EFI_STATUS  Status\r
   )\r
 {\r
   //\r
+  volatile EFI_STATUS  FspStatus;\r
+\r
+  FspStatus = Status;\r
   // Convert to FSP EAS defined API return codes\r
   //\r
   switch (Status) {\r
@@ -251,24 +262,28 @@ FspTempRamExitDone2 (
       Status = EFI_DEVICE_ERROR;  // Force to known error.\r
       break;\r
   }\r
+\r
   //\r
   // This is the end of the TempRamExit API\r
   // Give control back to the boot loader\r
   //\r
   DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - [Status: 0x%08X] - End\n", Status));\r
   SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT);\r
-  PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+  PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
-  do {\r
-    SetFspApiReturnStatus (Status);\r
-    Pei2LoaderSwitchStack ();\r
-    if (Status != EFI_SUCCESS) {\r
-      DEBUG ((DEBUG_ERROR, "!!!ERROR: TempRamExitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
-    }\r
-  } while (Status != EFI_SUCCESS);\r
+  if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
+    do {\r
+      SetFspApiReturnStatus (Status);\r
+      Pei2LoaderSwitchStack ();\r
+      if (Status != EFI_SUCCESS) {\r
+        DEBUG ((DEBUG_ERROR, "!!!ERROR: TempRamExitApi() - [Status: 0x%08X] - Error encountered during previous API and cannot proceed further\n", Status));\r
+      }\r
+    } while (FspStatus != EFI_SUCCESS);\r
+  }\r
+\r
   SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
   SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
-  PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+  PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
   DEBUG ((DEBUG_INFO | DEBUG_INIT, "SiliconInitApi() - Begin\n"));\r
 }\r
@@ -285,14 +300,14 @@ FspWaitForNotify (
   VOID\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  UINT32                     NotificationValue;\r
-  UINT32                     NotificationCount;\r
-  UINT8                      Count;\r
+  EFI_STATUS           Status;\r
+  UINT32               NotificationValue;\r
+  UINT32               NotificationCount;\r
+  UINT8                Count;\r
+  volatile EFI_STATUS  FspStatus;\r
 \r
   NotificationCount = 0;\r
-  while (NotificationCount < sizeof(mFspNotifySequence) / sizeof(UINT32)) {\r
-\r
+  while (NotificationCount < sizeof (mFspNotifySequence) / sizeof (UINT32)) {\r
     Count = (UINT8)((NotificationCount << 1) & 0x07);\r
     SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY + Count);\r
 \r
@@ -302,7 +317,7 @@ FspWaitForNotify (
       REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     } else if (NotificationCount == 1) {\r
       SetPhaseStatusCode (FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION);\r
-      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
+      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
       REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
     } else if (NotificationCount == 2) {\r
       SetPhaseStatusCode (FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION);\r
@@ -323,7 +338,7 @@ FspWaitForNotify (
       // Process Notification and Give control back to the boot loader framework caller\r
       //\r
       Status = FspNotificationHandler (NotificationValue);\r
-      if (!EFI_ERROR(Status)) {\r
+      if (!EFI_ERROR (Status)) {\r
         NotificationCount++;\r
       }\r
     }\r
@@ -332,22 +347,26 @@ FspWaitForNotify (
     SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count);\r
 \r
     if ((NotificationCount - 1) == 0) {\r
-      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
+      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
       REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
     } else if ((NotificationCount - 1) == 1) {\r
-      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
+      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
       REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
     } else if ((NotificationCount - 1) == 2) {\r
-      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
+      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
       REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
     }\r
-    do {\r
-      SetFspApiReturnStatus(Status);\r
-      Pei2LoaderSwitchStack();\r
-      if (Status != EFI_SUCCESS) {\r
-        DEBUG ((DEBUG_ERROR, "!!!ERROR: NotifyPhaseApi() [Phase: %08X] - Failed - [Status: 0x%08X]\n", NotificationValue, Status));\r
-      }\r
-    } while (Status != EFI_SUCCESS);\r
+\r
+    if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
+      FspStatus = Status;\r
+      do {\r
+        SetFspApiReturnStatus (Status);\r
+        Pei2LoaderSwitchStack ();\r
+        if (Status != EFI_SUCCESS) {\r
+          DEBUG ((DEBUG_ERROR, "!!!ERROR: NotifyPhaseApi() [Phase: %08X] - Failed - [Status: 0x%08X]\n", NotificationValue, Status));\r
+        }\r
+      } while (FspStatus != EFI_SUCCESS);\r
+    }\r
   }\r
 \r
   //\r
@@ -377,7 +396,7 @@ FspSiliconInitDone (
 VOID\r
 EFIAPI\r
 FspMemoryInitDone (\r
-  IN OUT VOID   **HobListPtr\r
+  IN OUT VOID  **HobListPtr\r
   )\r
 {\r
   FspMemoryInitDone2 (EFI_SUCCESS, HobListPtr);\r