/** @file | |
Intel FSP API definition from Intel Firmware Support Package External | |
Architecture Specification, April 2014, 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; | |
/// | |
/// Reserved | |
/// | |
UINT32 Reserved[7]; | |
} 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 |