/** @file
Sample to provide FSP wrapper related function.
@copyright
Copyright 2014 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
VOID *
GetFspNvsBuffer (
VOID
)
{
EFI_STATUS Status;
UINTN FspNvsBufferSize;
VOID *FspNvsBufferPtr;
FspNvsBufferPtr = NULL;
FspNvsBufferSize = 0;
Status = GetLargeVariable (L"FspNvsBuffer", &gFspNonVolatileStorageHobGuid, &FspNvsBufferSize, NULL);
if (Status == EFI_BUFFER_TOO_SMALL) {
DEBUG ((DEBUG_INFO, "FspNvsBuffer Size = %d\n", FspNvsBufferSize));
FspNvsBufferPtr = AllocateZeroPool (FspNvsBufferSize);
if (FspNvsBufferPtr == NULL) {
DEBUG ((DEBUG_ERROR, "Error: Cannot create FspNvsBuffer, out of memory!\n"));
ASSERT (FALSE);
return NULL;
}
Status = GetLargeVariable (L"FspNvsBuffer", &gFspNonVolatileStorageHobGuid, &FspNvsBufferSize, FspNvsBufferPtr);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Error: Unable to read FspNvsBuffer UEFI variable Status: %r\n", Status));
ASSERT_EFI_ERROR (Status);
return NULL;
}
return FspNvsBufferPtr;
} else if (Status == EFI_NOT_FOUND) {
DEBUG ((DEBUG_INFO, "Cannot create FSP NVS Buffer, UEFI variable does not exist (this is likely a first boot)\n"));
} else {
DEBUG ((DEBUG_ERROR, "Error: Unable to read FspNvsBuffer UEFI variable Status: %r\n", Status));
ASSERT_EFI_ERROR (Status);
}
return NULL;
}
VOID
EFIAPI
UpdateFspmUpdData (
IN OUT VOID *FspUpdRgnPtr
)
{
FSPM_UPD *FspmUpd;
EFI_STATUS Status;
UPI_POLICY_PPI *UpiPolicyPpi;
KTI_HOST_IN *Upi;
UINTN Index;
VOID *FSPTempMem;
EFI_HOB_GUID_TYPE *GuidHob;
EFI_PLATFORM_INFO *PlatformInfo;
GuidHob = GetFirstGuidHob (&gEfiPlatformInfoGuid);
ASSERT (GuidHob != NULL);
PlatformInfo = GET_GUID_HOB_DATA(GuidHob);
Status = PeiServicesLocatePpi (&gUpiSiPolicyPpiGuid, 0, NULL, &UpiPolicyPpi);
ASSERT_EFI_ERROR(Status);
Upi = &UpiPolicyPpi->Upi;
FspmUpd = (FSPM_UPD*)FspUpdRgnPtr;
FSPTempMem = (VOID *)(UINTN)(PcdGet32(PcdTemporaryRamBase) + PcdGet32(PcdPeiTemporaryRamRcHeapSize));;
if (FSPTempMem != NULL) {
FspmUpd->FspmArchUpd.StackBase = (VOID*)(((UINTN)FSPTempMem) & (~0xFFF));
FspmUpd->FspmArchUpd.StackSize = PcdGet32(PcdFspTemporaryRamSize);
}
for (Index = 0; Index < MAX_SOCKET; Index ++) {
FspmUpd->FspmConfig.BusRatio[Index] = Upi->BusRatio[Index];
FspmUpd->FspmConfig.KtiFpgaEnable[Index] = Upi->KtiFpgaEnable[Index];
}
FspmUpd->FspmConfig.D2KCreditConfig = Upi->D2KCreditConfig;
FspmUpd->FspmConfig.SnoopThrottleConfig = Upi->SnoopThrottleConfig;
FspmUpd->FspmConfig.LegacyVgaSoc = Upi->LegacyVgaSoc;
FspmUpd->FspmConfig.LegacyVgaStack = Upi->LegacyVgaStack;
FspmUpd->FspmConfig.P2pRelaxedOrdering = Upi->P2pRelaxedOrdering;
FspmUpd->FspmConfig.SncEn = Upi->SncEn;
FspmUpd->FspmConfig.UmaClustering = Upi->UmaClustering;
FspmUpd->FspmConfig.IoDcMode = Upi->IoDcMode;
FspmUpd->FspmConfig.DegradePrecedence = Upi->DegradePrecedence;
FspmUpd->FspmConfig.Degrade4SPreference = Upi->Degrade4SPreference;
FspmUpd->FspmConfig.DirectoryModeEn = Upi->DirectoryModeEn;
FspmUpd->FspmConfig.XptPrefetchEn = Upi->XptPrefetchEn;
FspmUpd->FspmConfig.KtiPrefetchEn = Upi->KtiPrefetchEn;
FspmUpd->FspmConfig.XptRemotePrefetchEn = Upi->XptRemotePrefetchEn;
FspmUpd->FspmConfig.DdrtQosMode = Upi->DdrtQosMode;
FspmUpd->FspmConfig.KtiLinkSpeedMode = Upi->KtiLinkSpeedMode;
FspmUpd->FspmConfig.KtiLinkSpeed = Upi->KtiLinkSpeed;
FspmUpd->FspmConfig.KtiLinkL0pEn = Upi->KtiLinkL0pEn;
FspmUpd->FspmConfig.KtiLinkL1En = Upi->KtiLinkL1En;
FspmUpd->FspmConfig.KtiFailoverEn = Upi->KtiFailoverEn;
FspmUpd->FspmConfig.KtiLbEn = Upi->KtiLbEn;
FspmUpd->FspmConfig.KtiCrcMode = Upi->KtiCrcMode;
FspmUpd->FspmConfig.KtiCpuSktHotPlugEn = Upi->KtiCpuSktHotPlugEn;
FspmUpd->FspmConfig.KtiCpuSktHotPlugTopology = Upi->KtiCpuSktHotPlugTopology;
FspmUpd->FspmConfig.KtiSkuMismatchCheck = Upi->KtiSkuMismatchCheck;
FspmUpd->FspmConfig.IrqThreshold = Upi->IrqThreshold;
FspmUpd->FspmConfig.TorThresLoctoremNorm = Upi->TorThresLoctoremNorm;
FspmUpd->FspmConfig.TorThresLoctoremEmpty = Upi->TorThresLoctoremEmpty;
FspmUpd->FspmConfig.MbeBwCal = Upi->MbeBwCal;
FspmUpd->FspmConfig.TscSyncEn = Upi->TscSyncEn;
FspmUpd->FspmConfig.StaleAtoSOptEn = Upi->StaleAtoSOptEn;
FspmUpd->FspmConfig.LLCDeadLineAlloc = Upi->LLCDeadLineAlloc;
FspmUpd->FspmConfig.SplitLock = Upi->SplitLock;
FspmUpd->FspmConfig.mmCfgBase = Upi->mmCfgBase;
FspmUpd->FspmConfig.mmCfgSize = Upi->mmCfgSize;
FspmUpd->FspmConfig.mmiohBase = Upi->mmiohBase;
FspmUpd->FspmConfig.CpuPaLimit = Upi->CpuPaLimit;
FspmUpd->FspmConfig.highGap = Upi->highGap;
FspmUpd->FspmConfig.mmiohSize = Upi->mmiohSize;
FspmUpd->FspmConfig.isocEn = Upi->isocEn;
FspmUpd->FspmConfig.dcaEn = Upi->dcaEn;
FspmUpd->FspmConfig.BoardTypeBitmask = Upi->BoardTypeBitmask;
FspmUpd->FspmConfig.AllLanesPtr = Upi->AllLanesPtr;
FspmUpd->FspmConfig.PerLanePtr = Upi->PerLanePtr;
FspmUpd->FspmConfig.AllLanesSizeOfTable = Upi->AllLanesSizeOfTable;
FspmUpd->FspmConfig.PerLaneSizeOfTable = Upi->PerLaneSizeOfTable;
FspmUpd->FspmConfig.WaitTimeForPSBP = Upi->WaitTimeForPSBP;
FspmUpd->FspmConfig.WaSerializationEn = Upi->WaSerializationEn;
FspmUpd->FspmConfig.KtiInEnableMktme = Upi->KtiInEnableMktme;
FspmUpd->FspmConfig.BoardId = PlatformInfo->BoardId;
FspmUpd->FspmArchUpd.NvsBufferPtr = GetFspNvsBuffer ();
}
/**
This function overrides the default configurations in the FSP-S UPD data region.
@param[in,out] FspUpdRgnPtr A pointer to the UPD data region data strcture.
**/
VOID
EFIAPI
UpdateFspsUpdData (
IN OUT VOID *FspUpdRgnPtr
)
{
}
/**
Update TempRamExit parameter.
@note At this point, memory is ready, PeiServices are available to use.
@return TempRamExit parameter.
**/
VOID *
EFIAPI
UpdateTempRamExitParam (
VOID
)
{
return NULL;
}
/**
Get S3 PEI memory information.
@note At this point, memory is ready, and PeiServices are available to use.
Platform can get some data from SMRAM directly.
@param[out] S3PeiMemSize PEI memory size to be installed in S3 phase.
@param[out] S3PeiMemBase PEI memory base to be installed in S3 phase.
@return If S3 PEI memory information is got successfully.
**/
EFI_STATUS
EFIAPI
GetS3MemoryInfo (
OUT UINT64 *S3PeiMemSize,
OUT EFI_PHYSICAL_ADDRESS *S3PeiMemBase
)
{
return EFI_UNSUPPORTED;
}
/**
Perform platform related reset in FSP wrapper.
This function will reset the system with requested ResetType.
@param[in] FspStatusResetType The type of reset the platform has to perform.
**/
VOID
EFIAPI
CallFspWrapperResetSystem (
IN UINT32 FspStatusResetType
)
{
//
// Perform reset according to the type.
//
CpuDeadLoop();
}