]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
IntelFsp2Pkg: Support to return error status from FSP API done
[mirror_edk2.git] / IntelFsp2Pkg / Library / BaseFspPlatformLib / FspPlatformNotify.c
index 755e84f20cc05b69c4ea7d58b325758252730ed0..ac1fc1ac0b37cec6045d044cc132ff4d6a262a07 100644 (file)
@@ -108,35 +108,56 @@ FspNotificationHandler (
 /**\r
   This function transfer control back to BootLoader after FspSiliconInit.\r
 \r
+  @param[in] Status return status for the FspSiliconInit.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
-FspSiliconInitDone (\r
-  VOID\r
+FspSiliconInitDone2 (\r
+  IN EFI_STATUS Status\r
   )\r
 {\r
+  //\r
+  // Convert to FSP EAS defined API return codes\r
+  //\r
+  switch (Status) {\r
+    case EFI_SUCCESS:\r
+    case EFI_INVALID_PARAMETER:\r
+    case EFI_UNSUPPORTED:\r
+    case EFI_DEVICE_ERROR:\r
+      break;\r
+    default:\r
+      DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() Invalid Error - [Status: 0x%08X]\n", Status));\r
+      Status = EFI_DEVICE_ERROR;  // Force to known error.\r
+      break;\r
+  }\r
   //\r
   // This is the end of the FspSiliconInit API\r
   // Give control back to the boot loader\r
   //\r
   SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT);\r
-  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - End\n"));\r
+  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
-  SetFspApiReturnStatus (EFI_SUCCESS);\r
-\r
-  Pei2LoaderSwitchStack();\r
-\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
 }\r
 \r
 /**\r
   This function returns control to BootLoader after MemoryInitApi.\r
 \r
-  @param[in,out] HobListPtr The address of HobList pointer.\r
+  @param[in] Status return status for the MemoryInitApi.\r
+  @param[in,out] HobListPtr The address of HobList pointer, if NULL, will get value from GetFspApiParameter2 ()\r
 **/\r
 VOID\r
 EFIAPI\r
-FspMemoryInitDone (\r
+FspMemoryInitDone2 (\r
+  IN EFI_STATUS Status,\r
   IN OUT VOID   **HobListPtr\r
   )\r
 {\r
@@ -145,15 +166,32 @@ FspMemoryInitDone (
   // Calling use FspMemoryInit API\r
   // Update HOB and return the control directly\r
   //\r
+  if (HobListPtr == NULL) {\r
+    HobListPtr = (VOID **)GetFspApiParameter2 ();\r
+  }\r
   if (HobListPtr != NULL) {\r
     *HobListPtr = (VOID *) GetHobList ();\r
   }\r
-\r
+  //\r
+  // Convert to FSP EAS defined API return codes\r
+  //\r
+  switch (Status) {\r
+    case EFI_SUCCESS:\r
+    case EFI_INVALID_PARAMETER:\r
+    case EFI_UNSUPPORTED:\r
+    case EFI_DEVICE_ERROR:\r
+    case EFI_OUT_OF_RESOURCES:\r
+      break;\r
+    default:\r
+      DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() Invalid Error [Status: 0x%08X]\n", Status));\r
+      Status = EFI_DEVICE_ERROR;  // Force to known error.\r
+      break;\r
+  }\r
   //\r
   // This is the end of the FspMemoryInit API\r
   // Give control back to the boot loader\r
   //\r
-  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - End\n"));\r
+  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
@@ -161,8 +199,13 @@ FspMemoryInitDone (
   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
-  SetFspApiReturnStatus (EFI_SUCCESS);\r
-  Pei2LoaderSwitchStack ();\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
 \r
   //\r
   // The TempRamExitApi is called\r
@@ -185,25 +228,44 @@ FspMemoryInitDone (
 /**\r
   This function returns control to BootLoader after TempRamExitApi.\r
 \r
+  @param[in] Status return status for the TempRamExitApi.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
-FspTempRamExitDone (\r
-  VOID\r
+FspTempRamExitDone2 (\r
+  IN EFI_STATUS Status\r
   )\r
 {\r
-\r
+  //\r
+  // Convert to FSP EAS defined API return codes\r
+  //\r
+  switch (Status) {\r
+    case EFI_SUCCESS:\r
+    case EFI_INVALID_PARAMETER:\r
+    case EFI_UNSUPPORTED:\r
+    case EFI_DEVICE_ERROR:\r
+      break;\r
+    default:\r
+      DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() Invalid Error - [Status: 0x%08X]\n", Status));\r
+      Status = EFI_DEVICE_ERROR;  // Force to known error.\r
+      break;\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() - End\n"));\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
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
-  SetFspApiReturnStatus (EFI_SUCCESS);\r
-  Pei2LoaderSwitchStack ();\r
-\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
   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
@@ -266,9 +328,7 @@ FspWaitForNotify (
       }\r
     }\r
 \r
-    SetFspApiReturnStatus(Status);\r
     DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - End  [Status: 0x%08X]\n", Status));\r
-\r
     SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count);\r
 \r
     if ((NotificationCount - 1) == 0) {\r
@@ -281,7 +341,13 @@ FspWaitForNotify (
       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
-    Pei2LoaderSwitchStack();\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
 \r
   //\r
@@ -290,3 +356,42 @@ FspWaitForNotify (
   //\r
 }\r
 \r
+/**\r
+  This function transfer control back to BootLoader after FspSiliconInit.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspSiliconInitDone (\r
+  VOID\r
+  )\r
+{\r
+  FspSiliconInitDone2 (EFI_SUCCESS);\r
+}\r
+\r
+/**\r
+  This function returns control to BootLoader after MemoryInitApi.\r
+\r
+  @param[in,out] HobListPtr The address of HobList pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMemoryInitDone (\r
+  IN OUT VOID   **HobListPtr\r
+  )\r
+{\r
+  FspMemoryInitDone2 (EFI_SUCCESS, HobListPtr);\r
+}\r
+\r
+/**\r
+  This function returns control to BootLoader after TempRamExitApi.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspTempRamExitDone (\r
+  VOID\r
+  )\r
+{\r
+  FspTempRamExitDone2 (EFI_SUCCESS);\r
+}\r