- tempory -> temporary - immediatly -> immediately - permenent -> permanent - paramter -> parameter - funciton -> function Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
		
			
				
	
	
		
			484 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			484 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <PiPei.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/PcdLib.h>
 | 
						|
#include <FspGlobalData.h>
 | 
						|
#include <FspApi.h>
 | 
						|
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
//
 | 
						|
//   Cont Func Parameter 2        +0x3C
 | 
						|
//   Cont Func Parameter 1        +0x38
 | 
						|
//
 | 
						|
//   API Parameter                +0x34
 | 
						|
//   API return address           +0x30
 | 
						|
//
 | 
						|
//   push    FspInfoHeader        +0x2C
 | 
						|
//   pushfd                       +0x28
 | 
						|
//   cli
 | 
						|
//   pushad                       +0x24
 | 
						|
//   sub     esp, 8               +0x00
 | 
						|
//   sidt    fword ptr [esp]
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT16    IdtrLimit;
 | 
						|
  UINT32    IdtrBase;
 | 
						|
  UINT16    Reserved;
 | 
						|
  UINT32    Edi;
 | 
						|
  UINT32    Esi;
 | 
						|
  UINT32    Ebp;
 | 
						|
  UINT32    Esp;
 | 
						|
  UINT32    Ebx;
 | 
						|
  UINT32    Edx;
 | 
						|
  UINT32    Ecx;
 | 
						|
  UINT32    Eax;
 | 
						|
  UINT16    Flags[2];
 | 
						|
  UINT32    FspInfoHeader;
 | 
						|
  UINT32    ApiRet;
 | 
						|
  UINT32    ApiParam;
 | 
						|
} CONTEXT_STACK;
 | 
						|
 | 
						|
#define CONTEXT_STACK_OFFSET(x)  (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the FSP global data pointer.
 | 
						|
 | 
						|
  @param[in] FspData       Fsp global data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspGlobalDataPointer (
 | 
						|
  IN FSP_GLOBAL_DATA   *FspData
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (FspData != NULL);
 | 
						|
  *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the FSP global data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
FSP_GLOBAL_DATA *
 | 
						|
EFIAPI
 | 
						|
GetFspGlobalDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA   *FspData;
 | 
						|
 | 
						|
  FspData = *(FSP_GLOBAL_DATA  **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);
 | 
						|
  return FspData;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets back the FSP API parameter passed by the bootlaoder.
 | 
						|
 | 
						|
  @retval ApiParameter FSP API parameter passed by the bootlaoder.
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
GetFspApiParameter (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the FSP API parameter in the stack.
 | 
						|
 | 
						|
   @param[in] Value       New parameter value.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspApiParameter (
 | 
						|
  IN UINT32      Value
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the FSP continuation function parameters in the stack.
 | 
						|
 | 
						|
  @param[in] Value             New parameter value to set.
 | 
						|
  @param[in] Index             Parameter index.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspContinuationFuncParameter (
 | 
						|
  IN UINT32      Value,
 | 
						|
  IN UINT32      Index
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function changes the BootLoader return address in stack.
 | 
						|
 | 
						|
  @param[in] ReturnAddress       Address to return.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspApiReturnAddress (
 | 
						|
  IN UINT32  ReturnAddress
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function set the API status code returned to the BootLoader.
 | 
						|
 | 
						|
  @param[in] ReturnStatus       Status code to return.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspApiReturnStatus (
 | 
						|
  IN UINT32  ReturnStatus
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the context switching stack to a new stack frame.
 | 
						|
 | 
						|
  @param[in] NewStackTop       New core stack to be set.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspCoreStackPointer (
 | 
						|
  IN VOID   *NewStackTop
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
  UINT32           *OldStack;
 | 
						|
  UINT32           *NewStack;
 | 
						|
  UINT32           StackContextLen;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);
 | 
						|
 | 
						|
  //
 | 
						|
  // Reserve space for the ContinuationFunc two parameters
 | 
						|
  //
 | 
						|
  OldStack = (UINT32 *)FspData->CoreStack;
 | 
						|
  NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;
 | 
						|
  FspData->CoreStack = (UINT32)NewStack;
 | 
						|
  while (StackContextLen-- != 0) {
 | 
						|
    *NewStack++ = *OldStack++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the platform specific data pointer.
 | 
						|
 | 
						|
  @param[in] PlatformData       Fsp platform specific data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspPlatformDataPointer (
 | 
						|
  IN VOID   *PlatformData
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  FspData->PlatformData.DataPtr = PlatformData;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the platform specific data pointer.
 | 
						|
 | 
						|
   @param[in] PlatformData       Fsp platform specific data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetFspPlatformDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return FspData->PlatformData.DataPtr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the UPD data pointer.
 | 
						|
 | 
						|
  @param[in] UpdDataRgnPtr   UPD data pointer.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspUpdDataPointer (
 | 
						|
  IN VOID    *UpdDataRgnPtr
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get the Fsp Global Data Pointer
 | 
						|
  //
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Set the UPD pointer.
 | 
						|
  //
 | 
						|
  FspData->UpdDataRgnPtr = UpdDataRgnPtr;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the UPD data pointer.
 | 
						|
 | 
						|
  @return UpdDataRgnPtr   UPD data pointer.
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetFspUpdDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return FspData->UpdDataRgnPtr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the memory init UPD data pointer.
 | 
						|
 | 
						|
  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspMemoryInitUpdDataPointer (
 | 
						|
  IN VOID    *MemoryInitUpdPtr
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get the Fsp Global Data Pointer
 | 
						|
  //
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Set the memory init UPD pointer.
 | 
						|
  //
 | 
						|
  FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the memory init UPD data pointer.
 | 
						|
 | 
						|
  @return memory init UPD data pointer.
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetFspMemoryInitUpdDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return FspData->MemoryInitUpdPtr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets the silicon init UPD data pointer.
 | 
						|
 | 
						|
  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspSiliconInitUpdDataPointer (
 | 
						|
  IN VOID    *SiliconInitUpdPtr
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get the Fsp Global Data Pointer
 | 
						|
  //
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Set the silicon init UPD data pointer.
 | 
						|
  //
 | 
						|
  FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the silicon init UPD data pointer.
 | 
						|
 | 
						|
  @return silicon init UPD data pointer.
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetFspSiliconInitUpdDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return FspData->SiliconInitUpdPtr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Set FSP measurement point timestamp.
 | 
						|
 | 
						|
  @param[in] Id       Measurement point ID.
 | 
						|
 | 
						|
  @return performance timestamp.
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
SetFspMeasurePoint (
 | 
						|
  IN UINT8  Id
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Bit [55: 0]  will be the timestamp
 | 
						|
  // Bit [63:56]  will be the ID
 | 
						|
  //
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {
 | 
						|
    FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();
 | 
						|
    ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;
 | 
						|
  }
 | 
						|
 | 
						|
  return FspData->PerfData[(FspData->PerfIdx)++];
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the FSP info header pointer.
 | 
						|
 | 
						|
  @retval FspInfoHeader   FSP info header pointer
 | 
						|
**/
 | 
						|
FSP_INFO_HEADER *
 | 
						|
EFIAPI
 | 
						|
GetFspInfoHeader (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  return  GetFspGlobalDataPointer()->FspInfoHeader;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the FSP info header pointer using the API stack context.
 | 
						|
 | 
						|
  @retval FspInfoHeader   FSP info header pointer using the API stack context
 | 
						|
**/
 | 
						|
FSP_INFO_HEADER *
 | 
						|
EFIAPI
 | 
						|
GetFspInfoHeaderFromApiContext (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  return  (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets the VPD data pointer.
 | 
						|
 | 
						|
  @return VpdDataRgnPtr   VPD data pointer.
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetFspVpdDataPointer (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_INFO_HEADER   *FspInfoHeader;
 | 
						|
 | 
						|
  FspInfoHeader = GetFspInfoHeader ();
 | 
						|
  return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function gets FSP API calling mode.
 | 
						|
 | 
						|
  @retval API calling mode
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
EFIAPI
 | 
						|
GetFspApiCallingMode (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  return  GetFspGlobalDataPointer()->ApiMode;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets FSP API calling mode.
 | 
						|
 | 
						|
  @param[in] Mode     API calling mode
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetFspApiCallingMode (
 | 
						|
  UINT8  Mode
 | 
						|
  )
 | 
						|
{
 | 
						|
  FSP_GLOBAL_DATA  *FspData;
 | 
						|
 | 
						|
  FspData  = GetFspGlobalDataPointer ();
 | 
						|
  FspData->ApiMode = Mode;
 | 
						|
}
 | 
						|
 |