/** @file

  Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <FspEas.h>

#define FSP_IN_API_MODE          0
#define FSP_IN_DISPATCH_MODE     1
#define FSP_GLOBAL_DATA_VERSION  0x3

#pragma pack(1)

typedef enum {
  TempRamInitApiIndex,
  FspInitApiIndex,
  NotifyPhaseApiIndex,
  FspMemoryInitApiIndex,
  TempRamExitApiIndex,
  FspSiliconInitApiIndex,
  FspMultiPhaseSiInitApiIndex,
  FspSmmInitApiIndex,
  FspMultiPhaseMemInitApiIndex,
  FspApiIndexMax
} FSP_API_INDEX;

typedef struct  {
  VOID     *DataPtr;
  UINTN    MicrocodeRegionBase;
  UINTN    MicrocodeRegionSize;
  UINTN    CodeRegionBase;
  UINTN    CodeRegionSize;
  UINTN    Reserved;
} FSP_PLAT_DATA;

#define FSP_GLOBAL_DATA_SIGNATURE        SIGNATURE_32 ('F', 'S', 'P', 'D')
#define FSP_PERFORMANCE_DATA_SIGNATURE   SIGNATURE_32 ('P', 'E', 'R', 'F')
#define FSP_PERFORMANCE_DATA_TIMER_MASK  0xFFFFFFFFFFFFFF

typedef struct  {
  UINT32             Signature;
  UINT8              Version;
  UINT8              Reserved1[3];
  ///
  /// Offset 0x08
  ///
  UINTN              CoreStack;
  VOID               *SmmInitUpdPtr;
  ///
  /// IA32: Offset 0x10; X64: Offset 0x18
  ///
  UINT32             StatusCode;
  UINT8              ApiIdx;
  ///
  /// 0: FSP in API mode; 1: FSP in DISPATCH mode
  ///
  UINT8              FspMode;
  UINT8              OnSeparateStack;
  UINT8              Reserved2;
  UINT32             NumberOfPhases;
  UINT32             PhasesExecuted;
  UINT32             Reserved3[8];
  ///
  /// IA32: Offset 0x40; X64: Offset 0x48
  /// Start of UINTN and pointer section
  /// All UINTN and pointer members are put in this section
  /// for maintaining natural alignment for both IA32 and X64 builds.
  ///
  FSP_PLAT_DATA      PlatformData;
  VOID               *TempRamInitUpdPtr;
  VOID               *MemoryInitUpdPtr;
  VOID               *SiliconInitUpdPtr;
  ///
  /// IA32: Offset 0x64; X64: Offset 0x90
  /// To store function parameters pointer
  /// so it can be retrieved after stack switched.
  ///
  VOID               *FunctionParameterPtr;
  FSP_INFO_HEADER    *FspInfoHeader;
  VOID               *UpdDataPtr;
  VOID               *FspHobListPtr;
  VOID               *VariableRequestParameterPtr;
  ///
  /// End of UINTN and pointer section
  /// At this point, next field offset must be either *0h or *8h to
  /// meet natural alignment requirement.
  ///
  UINT8              Reserved4[16];
  UINT32             PerfSig;
  UINT16             PerfLen;
  UINT16             Reserved5;
  UINT32             PerfIdx;
  UINT32             Reserved6;
  UINT64             PerfData[32];
} FSP_GLOBAL_DATA;

#pragma pack()
