summaryrefslogtreecommitdiffstats
path: root/IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c
diff options
context:
space:
mode:
Diffstat (limited to 'IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c')
-rw-r--r--IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c b/IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c
new file mode 100644
index 0000000000..1854e8c99c
--- /dev/null
+++ b/IntelFsp2Pkg/Library/BaseFspCommonLib/ReturnStatus.c
@@ -0,0 +1,42 @@
+/** @file
+ Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/FspCommonLib.h>
+#include <FspEas.h>
+#include <Library/FspSwitchStackLib.h>
+
+/**
+ This function updates the return status of the FSP API with requested reset type and returns to Boot Loader.
+
+ @param[in] FspResetType Reset type that needs to returned as API return status
+
+**/
+VOID
+EFIAPI
+FspApiReturnStatusReset (
+ IN EFI_STATUS FspResetType
+ )
+{
+ volatile BOOLEAN LoopUntilReset;
+
+ LoopUntilReset = TRUE;
+ DEBUG ((DEBUG_INFO, "FSP returning control to Bootloader with reset required return status %x\n", FspResetType));
+ if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {
+ ///
+ /// Below code is not an infinite loop.The control will go back to API calling function in BootLoader each time BootLoader
+ /// calls the FSP API without honoring the reset request by FSP
+ ///
+ do {
+ SetFspApiReturnStatus (FspResetType);
+ Pei2LoaderSwitchStack ();
+ DEBUG ((DEBUG_ERROR, "!!!ERROR: FSP has requested BootLoader for reset. But BootLoader has not honored the reset\n"));
+ DEBUG ((DEBUG_ERROR, "!!!ERROR: Please add support in BootLoader to honor the reset request from FSP\n"));
+ } while (LoopUntilReset);
+ }
+}