diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
commit | 16f504a9dca3fe3b70568f67b7d41241ae485288 (patch) | |
tree | c60f36ada0496ba928b7161059ba5ab1ab224f9d /src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase | |
parent | Initial commit. (diff) | |
download | virtualbox-upstream.tar.xz virtualbox-upstream.zip |
Adding upstream version 7.0.6-dfsg.upstream/7.0.6-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase')
3 files changed, 209 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c new file mode 100644 index 00000000..cf27e462 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c @@ -0,0 +1,149 @@ +/** @file + Source file for FSP notify phase PEI module + + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "FspNotifyPhasePeim.h" + +/** + + This function waits for FSP notify. + + @param This Entry point for DXE IPL PPI. + @param PeiServices General purpose services available to every PEIM. + @param HobList Address to the Pei HOB list. + + @return EFI_SUCCESS This function never returns. + +**/ +EFI_STATUS +EFIAPI +WaitForNotify ( + IN CONST EFI_DXE_IPL_PPI *This, + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_HOB_POINTERS HobList + ); + +CONST EFI_DXE_IPL_PPI mDxeIplPpi = { + WaitForNotify +}; + +CONST EFI_PEI_PPI_DESCRIPTOR mInstallDxeIplPpi = { + EFI_PEI_PPI_DESCRIPTOR_PPI, + &gEfiDxeIplPpiGuid, + (VOID *) &mDxeIplPpi +}; + +CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiEndOfPeiSignalPpiGuid, + 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. + + @param This Entry point for DXE IPL PPI. + @param PeiServices General purpose services available to every PEIM. + @param HobList Address to the Pei HOB list. + + @return EFI_SUCCESS This function never returns. + +**/ +EFI_STATUS +EFIAPI +WaitForNotify ( + IN CONST EFI_DXE_IPL_PPI *This, + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_HOB_POINTERS HobList + ) +{ + EFI_STATUS Status; + + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP HOB is located at 0x%08X\n", HobList)); + + // + // End of PEI phase signal + // + Status = PeiServicesInstallPpi (&gEndOfPeiSignalPpi); + ASSERT_EFI_ERROR (Status); + + // + // Give control back to BootLoader after FspSiliconInit + // + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP is waiting for NOTIFY\n")); + FspSiliconInitDone2 (EFI_SUCCESS); + + // + // BootLoader called FSP again through NotifyPhase + // + FspWaitForNotify (); + + 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; +} + +/** + FSP notify phase PEI module entry point + + @param[in] FileHandle Not used. + @param[in] PeiServices General purpose services available to every PEIM. + + @retval EFI_SUCCESS The function completes successfully + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create database +**/ +EFI_STATUS +FspNotifyPhasePeimEntryPoint ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + VOID *OldDxeIplPpi; + EFI_PEI_PPI_DESCRIPTOR *OldDescriptor; + + DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n")); + + 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/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h new file mode 100644 index 00000000..a33c9b60 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h @@ -0,0 +1,17 @@ +/** @file + Header file for FSP notify phase PEI module + + Copyright (c) 2016 Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _FSP_NOTIFY_PHASE_PEIM_H_ +#define _FSP_NOTIFY_PHASE_PEIM_H_ + +#include <Library/PeiServicesLib.h> +#include <Ppi/DxeIpl.h> +#include <Library/DebugLib.h> +#include <Library/FspPlatformLib.h> +#include <Library/FspCommonLib.h> +#include <Library/FspSwitchStackLib.h> +#endif diff --git a/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf new file mode 100644 index 00000000..5db41318 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf @@ -0,0 +1,43 @@ +## @file +# Component information file for the FSP notify phase PEI module. +# +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = FspNotifyPhasePeim + FILE_GUID = 29CBB005-C972-49F3-960F-292E2202CECD + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = FspNotifyPhasePeimEntryPoint + +[Sources] + FspNotifyPhasePeim.h + FspNotifyPhasePeim.c + +[Packages] + MdePkg/MdePkg.dec + IntelFsp2Pkg/IntelFsp2Pkg.dec + +[LibraryClasses] + PeimEntryPoint + DebugLib + FspPlatformLib + FspCommonLib + FspSwitchStackLib + +[Ppis] + gEfiDxeIplPpiGuid ## PRODUCES + gEfiEndOfPeiSignalPpiGuid ## PRODUCES + gFspReadyForNotifyPhasePpiGuid ## PRODUCES + +[Protocols] + gEfiPciEnumerationCompleteProtocolGuid ## PRODUCES + +[Guids] + gEfiEventReadyToBootGuid ## PRODUCES ## Event + +[Depex] + gEfiDxeIplPpiGuid |