| /** @file |
| Intel FSP API definition from Intel Firmware Support Package External |
| Architecture Specification v2.0. |
| |
| Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR> |
| This file and the accompanying materials are licensed and made available under |
| the terms and conditions of the BSD License. |
| The full text of the license may be found at |
| http://opensource.org/licenses/bsd-license.php. |
| |
| THIS FILE 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_ |
| |
| /// |
| /// FSP Reset Status code |
| /// These are defined in FSP EAS v2.0 section 11.2.2 - OEM Status Code |
| /// @{ |
| #define FSP_STATUS_RESET_REQUIRED_COLD 0x40000001 |
| #define FSP_STATUS_RESET_REQUIRED_WARM 0x40000002 |
| #define FSP_STATUS_RESET_REQUIRED_3 0x40000003 |
| #define FSP_STATUS_RESET_REQUIRED_4 0x40000004 |
| #define FSP_STATUS_RESET_REQUIRED_5 0x40000005 |
| #define FSP_STATUS_RESET_REQUIRED_6 0x40000006 |
| #define FSP_STATUS_RESET_REQUIRED_7 0x40000007 |
| #define FSP_STATUS_RESET_REQUIRED_8 0x40000008 |
| /// @} |
| |
| #pragma pack(1) |
| /// |
| /// FSP_UPD_HEADER Configuration. |
| /// |
| typedef struct { |
| /// |
| /// UPD Region Signature. This signature will be |
| /// "XXXXXX_T" for FSP-T |
| /// "XXXXXX_M" for FSP-M |
| /// "XXXXXX_S" for FSP-S |
| /// Where XXXXXX is an unique signature |
| /// |
| UINT64 Signature; |
| /// |
| /// Revision of the Data structure. For FSP v2.0 value is 1. |
| /// |
| UINT8 Revision; |
| UINT8 Reserved[23]; |
| } FSP_UPD_HEADER; |
| |
| #if CONFIG(PLATFORM_USES_FSP2_X86_32) |
| /// |
| /// FSPM_ARCH_UPD Configuration. |
| /// |
| typedef struct { |
| /// |
| /// Revision of the structure. For FSP v2.0 value is 1. |
| /// |
| UINT8 Revision; |
| UINT8 Reserved[3]; |
| /// |
| /// Pointer to the non-volatile storage (NVS) data buffer. |
| /// If it is NULL it indicates the NVS data is not available. |
| /// |
| /// Note: This ought to be VOID*, but that won't allow calling this binary on x86_64. |
| /// |
| UINT32 NvsBufferPtr; |
| /// |
| /// Pointer to the temporary stack base address to be |
| /// consumed inside FspMemoryInit() API. |
| /// |
| /// Note: This ought to be VOID*, but that won't allow calling this binary on x86_64. |
| /// |
| UINT32 StackBase; |
| /// |
| /// Temporary stack size to be consumed inside |
| /// FspMemoryInit() API. |
| /// |
| UINT32 StackSize; |
| /// |
| /// Size of memory to be reserved by FSP below "top |
| /// of low usable memory" for bootloader usage. |
| /// |
| UINT32 BootLoaderTolumSize; |
| /// |
| /// Current boot mode. |
| /// |
| UINT32 BootMode; |
| UINT8 Reserved1[8]; |
| } FSPM_ARCH_UPD; |
| #else |
| #error You need to implement this struct for x86_64 FSP |
| #endif |
| |
| /// |
| /// FSPT_UPD_COMMON Configuration. |
| /// |
| typedef struct { |
| /// |
| /// FSP_UPD_HEADER Configuration. |
| /// |
| FSP_UPD_HEADER FspUpdHeader; |
| } FSPT_UPD_COMMON; |
| |
| /// |
| /// FSPM_UPD_COMMON Configuration. |
| /// |
| typedef struct { |
| /// |
| /// FSP_UPD_HEADER Configuration. |
| /// |
| FSP_UPD_HEADER FspUpdHeader; |
| /// |
| /// FSPM_ARCH_UPD Configuration. |
| /// |
| FSPM_ARCH_UPD FspmArchUpd; |
| } FSPM_UPD_COMMON; |
| |
| /// |
| /// FSPS_UPD_COMMON Configuration. |
| /// |
| typedef struct { |
| /// |
| /// FSP_UPD_HEADER Configuration. |
| /// |
| FSP_UPD_HEADER FspUpdHeader; |
| } FSPS_UPD_COMMON; |
| |
| /// |
| /// Enumeration of FSP_INIT_PHASE for NOTIFY_PHASE. |
| /// |
| typedef enum { |
| /// |
| /// This stage is notified when the bootloader completes the |
| /// PCI enumeration and the resource allocation for the |
| /// PCI devices is complete. |
| /// |
| EnumInitPhaseAfterPciEnumeration = 0x20, |
| /// |
| /// This stage is notified just before the bootloader hand-off |
| /// to the OS loader. |
| /// |
| EnumInitPhaseReadyToBoot = 0x40, |
| /// |
| /// This stage is notified just before the firmware/Preboot |
| /// environment transfers management of all system resources |
| /// to the OS or next level execution environment. |
| /// |
| EnumInitPhaseEndOfFirmware = 0xF0 |
| } FSP_INIT_PHASE; |
| |
| /// |
| /// Definition of NOTIFY_PHASE_PARAMS. |
| /// |
| typedef struct { |
| /// |
| /// Notification phase used for NotifyPhase API |
| /// |
| FSP_INIT_PHASE Phase; |
| } NOTIFY_PHASE_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] FsptUpdDataPtr Pointer to the FSPT_UPD data structure. |
| |
| @retval EFI_SUCCESS Temporary RAM 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 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 VOID *FsptUpdDataPtr |
| ); |
| |
| /** |
| 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. |
| |
| @param[in] FspmUpdDataPtr Pointer to the FSPM_UPD data sructure. |
| @param[out] HobListPtr Pointer to receive the address of the HOB list. |
| |
| @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. |
| @retval EFI_OUT_OF_RESOURCES Stack range requested by FSP is not met. |
| @retval FSP_STATUS_RESET_REQUIREDx A reset is reuired. These status codes will not be returned during S3. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *FSP_MEMORY_INIT) ( |
| IN VOID *FspmUpdDataPtr, |
| OUT VOID **HobListPtr |
| ); |
| |
| |
| /** |
| 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. |
| |
| @param[in] 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 VOID *TempRamExitParamPtr |
| ); |
| |
| |
| /** |
| This FSP API is called after TempRamExit API. |
| FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to complete the |
| silicon initialization. |
| |
| @param[in] FspsUpdDataPtr Pointer to the FSPS_UPD data structure. |
| If NULL, FSP will use the default parameters. |
| |
| @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. |
| @retval FSP_STATUS_RESET_REQUIREDx A reset is reuired. These status codes will not be returned during S3. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *FSP_SILICON_INIT) ( |
| IN VOID *FspsUpdDataPtr |
| ); |
| |
| #endif |