There are two FSP images at different locations in a flash (one factory version is read only and other in updatable version) TempRamInit, FspMemoryInit and TempRamExit are executed from factory version and FspSiliconInit/NotifyPhase will be executed from updatable version. Also update FSP specification version to v1.1. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Ma, Maurice" <maurice.ma@intel.com> Reviewed-by: "Yao, Jiewen" <Jiewen.Yao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17248 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			312 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Intel FSP API definition from Intel Firmware Support Package External
 | 
						|
  Architecture Specification v1.1, April 2015, revision 001.
 | 
						|
 | 
						|
  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
 | 
						|
  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
 | 
						|
  http://opensource.org/licenses/bsd-license.php.
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _FSP_API_H_
 | 
						|
#define _FSP_API_H_
 | 
						|
 | 
						|
#define FSP_STATUS EFI_STATUS
 | 
						|
#define FSPAPI EFIAPI
 | 
						|
 | 
						|
/**
 | 
						|
  FSP Init continuation function prototype.
 | 
						|
  Control will be returned to this callback function after FspInit API call.
 | 
						|
 | 
						|
  @param[in] Status Status of the FSP INIT API.
 | 
						|
  @param[in] HobBufferPtr Pointer to the HOB data structure defined in the PI specification.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
VOID
 | 
						|
(* CONTINUATION_PROC) (
 | 
						|
  IN EFI_STATUS Status,
 | 
						|
  IN VOID       *HobListPtr
 | 
						|
  );
 | 
						|
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  ///
 | 
						|
  /// Base address of the microcode region.
 | 
						|
  ///
 | 
						|
  UINT32              MicrocodeRegionBase;
 | 
						|
  ///
 | 
						|
  /// Length of the microcode region.
 | 
						|
  ///
 | 
						|
  UINT32              MicrocodeRegionLength;
 | 
						|
  ///
 | 
						|
  /// Base address of the cacheable flash region.
 | 
						|
  ///
 | 
						|
  UINT32              CodeRegionBase;
 | 
						|
  ///
 | 
						|
  /// Length of the cacheable flash region.
 | 
						|
  ///
 | 
						|
  UINT32              CodeRegionLength;
 | 
						|
} FSP_TEMP_RAM_INIT_PARAMS;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  ///
 | 
						|
  /// Non-volatile storage buffer pointer.
 | 
						|
  ///
 | 
						|
  VOID               *NvsBufferPtr;
 | 
						|
  ///
 | 
						|
  /// Runtime buffer pointer
 | 
						|
  ///
 | 
						|
  VOID               *RtBufferPtr;
 | 
						|
  ///
 | 
						|
  /// Continuation function address
 | 
						|
  ///
 | 
						|
  CONTINUATION_PROC   ContinuationFunc;
 | 
						|
} FSP_INIT_PARAMS;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  ///
 | 
						|
  /// Stack top pointer used by the bootloader.
 | 
						|
  /// The new stack frame will be set up at this location after FspInit API call.
 | 
						|
  ///
 | 
						|
  UINT32             *StackTop;
 | 
						|
  ///
 | 
						|
  /// Current system boot mode.
 | 
						|
  ///
 | 
						|
  UINT32              BootMode;
 | 
						|
  ///
 | 
						|
  /// User platform configuraiton data region pointer.
 | 
						|
  ///
 | 
						|
  VOID               *UpdDataRgnPtr;
 | 
						|
  //
 | 
						|
  // Below field is added in FSP EAS v1.1
 | 
						|
  //
 | 
						|
  ///
 | 
						|
  /// The size of memory to be reserved below the top of low usable memory (TOLUM)
 | 
						|
  /// for BootLoader usage. This is optional and value can be zero. If non-zero, the
 | 
						|
  /// size must be a multiple of 4KB.
 | 
						|
  ///
 | 
						|
  UINT32              BootLoaderTolumSize;
 | 
						|
  ///
 | 
						|
  /// Reserved
 | 
						|
  ///
 | 
						|
  UINT32              Reserved[6];
 | 
						|
} FSP_INIT_RT_COMMON_BUFFER;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  ///
 | 
						|
  /// Notification code for post PCI enuermation
 | 
						|
  ///
 | 
						|
  EnumInitPhaseAfterPciEnumeration = 0x20,
 | 
						|
  ///
 | 
						|
  /// Notification code before transfering control to the payload
 | 
						|
  ///
 | 
						|
  EnumInitPhaseReadyToBoot         = 0x40
 | 
						|
} FSP_INIT_PHASE;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  ///
 | 
						|
  /// Notification phase used for NotifyPhase API
 | 
						|
  ///
 | 
						|
  FSP_INIT_PHASE     Phase;
 | 
						|
} NOTIFY_PHASE_PARAMS;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  ///
 | 
						|
  /// Non-volatile storage buffer pointer.
 | 
						|
  ///
 | 
						|
  VOID               *NvsBufferPtr;
 | 
						|
  ///
 | 
						|
  /// Runtime buffer pointer
 | 
						|
  ///
 | 
						|
  VOID               *RtBufferPtr;
 | 
						|
  ///
 | 
						|
  /// Pointer to the HOB data structure defined in the PI specification
 | 
						|
  ///
 | 
						|
  VOID               **HobListPtr;
 | 
						|
} FSP_MEMORY_INIT_PARAMS;
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is called soon after coming out of reset and before memory and stack is
 | 
						|
  available. This FSP API will load the microcode update, enable code caching for the
 | 
						|
  region specified by the boot loader and also setup a temporary stack to be used until
 | 
						|
  main memory is initialized.
 | 
						|
 | 
						|
  A hardcoded stack can be set up with the following values, and the "esp" register
 | 
						|
  initialized to point to this hardcoded stack.
 | 
						|
  1. The return address where the FSP will return control after setting up a temporary
 | 
						|
     stack.
 | 
						|
  2. A pointer to the input parameter structure
 | 
						|
 | 
						|
  However, since the stack is in ROM and not writeable, this FSP API cannot be called
 | 
						|
  using the "call" instruction, but needs to be jumped to.
 | 
						|
 | 
						|
  @param[in] TempRaminitParamPtr Address pointer to the FSP_TEMP_RAM_INIT_PARAMS structure.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           Temp RAM was initialized successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER Input parameters are invalid..
 | 
						|
  @retval EFI_NOT_FOUND         No valid microcode was found in the microcode region.
 | 
						|
  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.
 | 
						|
  @retval EFI_DEVICE_ERROR      Temp RAM initialization failed.
 | 
						|
 | 
						|
  If this function is successful, the FSP initializes the ECX and EDX registers to point to
 | 
						|
  a temporary but writeable memory range available to the boot loader and returns with
 | 
						|
  FSP_SUCCESS in register EAX. Register ECX points to the start of this temporary
 | 
						|
  memory range and EDX points to the end of the range. Boot loader is free to use the
 | 
						|
  whole range described. Typically the boot loader can reload the ESP register to point
 | 
						|
  to the end of this returned range so that it can be used as a standard stack.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_TEMP_RAM_INIT) (
 | 
						|
  IN FSP_TEMP_RAM_INIT_PARAMS *FspTempRamInitPtr
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is called after TempRamInitEntry. This FSP API initializes the memory,
 | 
						|
  the CPU and the chipset to enable normal operation of these devices. This FSP API
 | 
						|
  accepts a pointer to a data structure that will be platform dependent and defined for
 | 
						|
  each FSP binary. This will be documented in the Integration Guide for each FSP
 | 
						|
  release.
 | 
						|
  The boot loader provides a continuation function as a parameter when calling FspInit.
 | 
						|
  After FspInit completes its execution, it does not return to the boot loader from where
 | 
						|
  it was called but instead returns control to the boot loader by calling the continuation
 | 
						|
  function which is passed to FspInit as an argument.
 | 
						|
 | 
						|
  @param[in] FspInitParamPtr Address pointer to the FSP_INIT_PARAMS structure.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           FSP execution environment was initialized successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER Input parameters are invalid.
 | 
						|
  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.
 | 
						|
  @retval EFI_DEVICE_ERROR      FSP initialization failed.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_INIT) (
 | 
						|
  IN OUT FSP_INIT_PARAMS *FspInitParamPtr
 | 
						|
  );
 | 
						|
 | 
						|
#define FSP_FSP_INIT FSP_INIT
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is used to notify the FSP about the different phases in the boot process.
 | 
						|
  This allows the FSP to take appropriate actions as needed during different initialization
 | 
						|
  phases. The phases will be platform dependent and will be documented with the FSP
 | 
						|
  release. The current FSP supports two notify phases:
 | 
						|
    Post PCI enumeration
 | 
						|
    Ready To Boot
 | 
						|
 | 
						|
  @param[in] NotifyPhaseParamPtr Address pointer to the NOTIFY_PHASE_PRAMS
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The notification was handled successfully.
 | 
						|
  @retval EFI_UNSUPPORTED       The notification was not called in the proper order.
 | 
						|
  @retval EFI_INVALID_PARAMETER The notification code is invalid.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_NOTIFY_PHASE) (
 | 
						|
  IN NOTIFY_PHASE_PARAMS *NotifyPhaseParamPtr
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is called after TempRamInit and initializes the memory.
 | 
						|
  This FSP API accepts a pointer to a data structure that will be platform dependent
 | 
						|
  and defined for each FSP binary. This will be documented in Integration guide with
 | 
						|
  each FSP release.
 | 
						|
  After FspMemInit completes its execution, it passes the pointer to the HobList and
 | 
						|
  returns to the boot loader from where it was called. BootLoader is responsible to 
 | 
						|
  migrate it's stack and data to Memory.
 | 
						|
  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to
 | 
						|
  complete the silicon initialization and provides bootloader an opportunity to get
 | 
						|
  control after system memory is available and before the temporary RAM is torn down.
 | 
						|
  These APIs are mutually exclusive to the FspInit API.
 | 
						|
 | 
						|
  @param[in][out] FspMemoryInitParamPtr Address pointer to the FSP_MEMORY_INIT_PARAMS
 | 
						|
                                        structure.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           FSP execution environment was initialized successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER Input parameters are invalid.
 | 
						|
  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.
 | 
						|
  @retval EFI_DEVICE_ERROR      FSP initialization failed.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_MEMORY_INIT) (
 | 
						|
  IN OUT FSP_MEMORY_INIT_PARAMS *FspMemoryInitParamPtr
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is called after FspMemoryInit API. This FSP API tears down the temporary
 | 
						|
  memory setup by TempRamInit API. This FSP API accepts a pointer to a data structure
 | 
						|
  that will be platform dependent and defined for each FSP binary. This will be
 | 
						|
  documented in Integration Guide.
 | 
						|
  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to
 | 
						|
  complete the silicon initialization and provides bootloader an opportunity to get
 | 
						|
  control after system memory is available and before the temporary RAM is torn down.
 | 
						|
  These APIs are mutually exclusive to the FspInit API.
 | 
						|
 | 
						|
  @param[in][out] TempRamExitParamPtr Pointer to the Temp Ram Exit parameters structure.
 | 
						|
                                      This structure is normally defined in the Integration Guide.
 | 
						|
                                      And if it is not defined in the Integration Guide, pass NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           FSP execution environment was initialized successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER Input parameters are invalid.
 | 
						|
  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.
 | 
						|
  @retval EFI_DEVICE_ERROR      FSP initialization failed.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_TEMP_RAM_EXIT) (
 | 
						|
  IN OUT VOID *TempRamExitParamPtr
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This FSP API is called after TempRamExit API.
 | 
						|
  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to complete the
 | 
						|
  silicon initialization.
 | 
						|
  These APIs are mutually exclusive to the FspInit API.
 | 
						|
 | 
						|
  @param[in][out] FspSiliconInitParamPtr Pointer to the Silicon Init parameters structure.
 | 
						|
                                         This structure is normally defined in the Integration Guide.
 | 
						|
                                         And if it is not defined in the Integration Guide, pass NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           FSP execution environment was initialized successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER Input parameters are invalid.
 | 
						|
  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.
 | 
						|
  @retval EFI_DEVICE_ERROR      FSP initialization failed.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *FSP_SILICON_INIT) (
 | 
						|
  IN OUT VOID *FspSiliconInitParamPtr
 | 
						|
  );
 | 
						|
 | 
						|
///
 | 
						|
/// FSP API Return Status Code for backward compatibility with v1.0
 | 
						|
///@{
 | 
						|
#define FSP_SUCCESS              EFI_SUCCESS
 | 
						|
#define FSP_INVALID_PARAMETER    EFI_INVALID_PARAMETER
 | 
						|
#define FSP_UNSUPPORTED          EFI_UNSUPPORTED
 | 
						|
#define FSP_NOT_READY            EFI_NOT_READY
 | 
						|
#define FSP_DEVICE_ERROR         EFI_DEVICE_ERROR
 | 
						|
#define FSP_OUT_OF_RESOURCES     EFI_OUT_OF_RESOURCES
 | 
						|
#define FSP_VOLUME_CORRUPTED     EFI_VOLUME_CORRUPTED
 | 
						|
#define FSP_NOT_FOUND            EFI_NOT_FOUND
 | 
						|
#define FSP_TIMEOUT              EFI_TIMEOUT
 | 
						|
#define FSP_ABORTED              EFI_ABORTED
 | 
						|
#define FSP_INCOMPATIBLE_VERSION EFI_INCOMPATIBLE_VERSION
 | 
						|
#define FSP_SECURITY_VIOLATION   EFI_SECURITY_VIOLATION
 | 
						|
#define FSP_CRC_ERROR            EFI_CRC_ERROR
 | 
						|
///@}
 | 
						|
 | 
						|
#endif
 |