diff options
Diffstat (limited to 'IntelFsp2Pkg/FspNotifyPhase')
-rw-r--r-- | IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c | 59 | ||||
-rw-r--r-- | IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf | 3 |
2 files changed, 38 insertions, 24 deletions
diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c index 52435fa0b2..cbea3a7eaa 100644 --- a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c +++ b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c @@ -48,6 +48,12 @@ CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = { NULL
};
+CONST EFI_PEI_PPI_DESCRIPTOR gFspReadyForNotifyPhasePpi = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gFspReadyForNotifyPhasePpiGuid,
+ NULL
+};
+
/**
This function waits for FSP notify.
@@ -88,13 +94,15 @@ WaitForNotify ( //
FspWaitForNotify ();
- //
- // Should not come here
- //
- while (TRUE) {
- DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n"));
- SetFspApiReturnStatus (EFI_UNSUPPORTED);
- Pei2LoaderSwitchStack ();
+ if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {
+ //
+ // Should not come here
+ //
+ while (TRUE) {
+ DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n"));
+ SetFspApiReturnStatus (EFI_UNSUPPORTED);
+ Pei2LoaderSwitchStack ();
+ }
}
return EFI_SUCCESS;
@@ -121,22 +129,27 @@ FspNotifyPhasePeimEntryPoint ( DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n"));
- //
- // Locate old DXE IPL PPI
- //
- Status = PeiServicesLocatePpi (
- &gEfiDxeIplPpiGuid,
- 0,
- &OldDescriptor,
- &OldDxeIplPpi
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Re-install the DXE IPL PPI to wait for notify
- //
- Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi);
- ASSERT_EFI_ERROR (Status);
+ if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {
+ //
+ // Locate old DXE IPL PPI
+ //
+ Status = PeiServicesLocatePpi (
+ &gEfiDxeIplPpiGuid,
+ 0,
+ &OldDescriptor,
+ &OldDxeIplPpi
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Re-install the DXE IPL PPI to wait for notify
+ //
+ Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi);
+ ASSERT_EFI_ERROR (Status);
+ } else {
+ Status = PeiServicesInstallPpi (&gFspReadyForNotifyPhasePpi);
+ ASSERT_EFI_ERROR (Status);
+ }
return EFI_SUCCESS;
}
diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf index a0bc37580d..b0f6768cfa 100644 --- a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf +++ b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf @@ -1,7 +1,7 @@ ## @file
# Component information file for the FSP notify phase PEI module.
#
-# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
@@ -37,6 +37,7 @@ [Ppis]
gEfiDxeIplPpiGuid ## PRODUCES
gEfiEndOfPeiSignalPpiGuid ## PRODUCES
+ gFspReadyForNotifyPhasePpiGuid ## PRODUCES
[Protocols]
gEfiPciEnumerationCompleteProtocolGuid ## PRODUCES
|