https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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;
 | |
| }
 |