/** @file
This file provides services for PEI policy default initialization
Copyright (c) 2019 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PeiSaPolicyLibrary.h"
#include
#include
#include "MrcInterface.h"
#include
#define DEFAULT_OPTION_ROM_TEMP_BAR 0x80000000
#define DEFAULT_OPTION_ROM_TEMP_MEM_LIMIT 0xC0000000
//
// Need minimum of 48MB during PEI phase for IAG and some buffer for boot.
//
#define PEI_MIN_MEMORY_SIZE (10 * 0x800000 + 0x10000000) // 80MB + 256MB
//
// Function call to Load defaults for Individial IP Blocks
//
VOID
LoadSaMiscPeiPreMemDefault (
IN VOID *ConfigBlockPointer
)
{
SA_MISC_PEI_PREMEM_CONFIG *MiscPeiPreMemConfig;
MiscPeiPreMemConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->Header.GuidHob.Name = %g\n", &MiscPeiPreMemConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", MiscPeiPreMemConfig->Header.GuidHob.Header.HobLength));
//
// Policy initialization commented out here is because it's the same with default 0 and no need to re-do again.
//
MiscPeiPreMemConfig->LockPTMregs = 1;
//
// Initialize the Platform Configuration
//
MiscPeiPreMemConfig->MchBar = 0xFED10000;
MiscPeiPreMemConfig->DmiBar = 0xFED18000;
MiscPeiPreMemConfig->EpBar = 0xFED19000;
MiscPeiPreMemConfig->EdramBar = 0xFED80000;
MiscPeiPreMemConfig->SmbusBar = 0xEFA0;
MiscPeiPreMemConfig->TsegSize = PcdGet32 (PcdTsegSize);
MiscPeiPreMemConfig->GdxcBar = 0xFED84000;
//
// Initialize the Switchable Graphics Default Configuration
//
MiscPeiPreMemConfig->SgDelayAfterHoldReset = 100; //100ms
MiscPeiPreMemConfig->SgDelayAfterPwrEn = 300; //300ms
///
/// Initialize the DataPtr for S3 resume
///
MiscPeiPreMemConfig->S3DataPtr = NULL;
MiscPeiPreMemConfig->OpRomScanTempMmioBar = DEFAULT_OPTION_ROM_TEMP_BAR;
MiscPeiPreMemConfig->OpRomScanTempMmioLimit = DEFAULT_OPTION_ROM_TEMP_MEM_LIMIT;
}
VOID
LoadSaMiscPeiDefault (
IN VOID *ConfigBlockPointer
)
{
SA_MISC_PEI_CONFIG *MiscPeiConfig;
MiscPeiConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "MiscPeiConfig->Header.GuidHob.Name = %g\n", &MiscPeiConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "MiscPeiConfig->Header.GuidHob.Header.HobLength = 0x%x\n", MiscPeiConfig->Header.GuidHob.Header.HobLength));
///
/// EDRAM H/W Mode by default (0- EDRAM SW Disable, 1- EDRAM SW Enable, 2- EDRAM HW Mode)
///
MiscPeiConfig->EdramTestMode = 2;
if (IsWhlCpu()) {
MiscPeiConfig->Device4Enable = 1;
}
}
VOID
LoadVtdDefault (
IN VOID *ConfigBlockPointer
)
{
VTD_CONFIG *Vtd;
Vtd = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "Vtd->Header.GuidHob.Name = %g\n", &Vtd->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "Vtd->Header.GuidHob.Header.HobLength = 0x%x\n", Vtd->Header.GuidHob.Header.HobLength));
//
// Initialize the Vtd Configuration
//
Vtd->VtdDisable = 0;
Vtd->BaseAddress[0] = 0xFED90000;
Vtd->BaseAddress[1] = 0xFED92000;
Vtd->BaseAddress[2] = 0xFED91000;
}
VOID
LoadIpuPreMemDefault (
IN VOID *ConfigBlockPointer
)
{
IPU_PREMEM_CONFIG *IpuPreMemPolicy;
IpuPreMemPolicy = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "IpuPreMemPolicy->Header.GuidHob.Name = %g\n", &IpuPreMemPolicy->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "IpuPreMemPolicy->Header.GuidHob.Header.HobLength = 0x%x\n", IpuPreMemPolicy->Header.GuidHob.Header.HobLength));
}
VOID
LoadPciePeiPreMemDefault (
IN VOID *ConfigBlockPointer
)
{
UINT8 Index;
PCIE_PEI_PREMEM_CONFIG *PciePeiPreMemConfig;
PciePeiPreMemConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "PciePeiPreMemConfig->Header.GuidHob.Name = %g\n", &PciePeiPreMemConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "PciePeiPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", PciePeiPreMemConfig->Header.GuidHob.Header.HobLength));
//
// Initialize the PciExpress Configuration
//
PciePeiPreMemConfig->DmiGen3EqPh2Enable = 2;
PciePeiPreMemConfig->DmiGen3ProgramStaticEq = 1;
PciePeiPreMemConfig->Peg0Enable = 2;
PciePeiPreMemConfig->Peg1Enable = 2;
PciePeiPreMemConfig->Peg2Enable = 2;
PciePeiPreMemConfig->Peg3Enable = 2;
PciePeiPreMemConfig->Peg0PowerDownUnusedLanes = 1;
PciePeiPreMemConfig->Peg1PowerDownUnusedLanes = 1;
PciePeiPreMemConfig->Peg2PowerDownUnusedLanes = 1;
PciePeiPreMemConfig->Peg3PowerDownUnusedLanes = 1;
PciePeiPreMemConfig->Peg0Gen3EqPh2Enable = 2;
PciePeiPreMemConfig->Peg1Gen3EqPh2Enable = 2;
PciePeiPreMemConfig->Peg2Gen3EqPh2Enable = 2;
PciePeiPreMemConfig->Peg3Gen3EqPh2Enable = 2;
PciePeiPreMemConfig->PegGen3ProgramStaticEq = 1;
PciePeiPreMemConfig->Gen3SwEqNumberOfPresets = 2;
PciePeiPreMemConfig->Gen3SwEqEnableVocTest = 2;
if (IsCnlPch() && IsPchH() && (PchStepping() == PCH_A0)) {
PciePeiPreMemConfig->DmiMaxLinkSpeed = 1;
}
for (Index = 0; Index < SA_DMI_MAX_LANE; Index++) {
PciePeiPreMemConfig->DmiGen3RootPortPreset[Index] = 4;
PciePeiPreMemConfig->DmiGen3EndPointPreset[Index] = 7;
PciePeiPreMemConfig->DmiGen3EndPointHint[Index] = 2;
}
for (Index = 0; Index < SA_DMI_MAX_BUNDLE; Index++) {
///
/// Gen3 RxCTLE peaking default is 0 for DMI
///
PciePeiPreMemConfig->DmiGen3RxCtlePeaking[Index] = 0;
}
for (Index = 0; Index < SA_PEG_MAX_LANE; Index++) {
PciePeiPreMemConfig->PegGen3RootPortPreset[Index] = 7;
PciePeiPreMemConfig->PegGen3EndPointPreset[Index] = 7;
PciePeiPreMemConfig->PegGen3EndPointHint[Index] = 2;
}
PciePeiPreMemConfig->DmiDeEmphasis = 1;
///
/// Gen3 Software Equalization Jitter Dwell Time: 1 msec
/// Gen3 Software Equalization Jitter Error Target: 1
/// Gen3 Software Equalization VOC Dwell Time: 10 msec
/// Gen3 Software Equalization VOC Error Target: 2
///
PciePeiPreMemConfig->Gen3SwEqJitterDwellTime = 3 * STALL_ONE_MILLI_SECOND;
PciePeiPreMemConfig->Gen3SwEqJitterErrorTarget = 2;
PciePeiPreMemConfig->Gen3SwEqVocDwellTime = 10 * STALL_ONE_MILLI_SECOND;
PciePeiPreMemConfig->Gen3SwEqVocErrorTarget = 2;
/**
Parameters for PCIe Gen3 device reset
@note Refer to the Platform Design Guide (PDG) for additional information about this GPIO.
**/
PciePeiPreMemConfig->PegGpioData.GpioSupport = FALSE;
PciePeiPreMemConfig->PegGpioData.SaPeg0ResetGpio.GpioPad = 0;
PciePeiPreMemConfig->PegGpioData.SaPeg0ResetGpio.Active = FALSE;
PciePeiPreMemConfig->PegGpioData.SaPeg3ResetGpio.GpioPad = 0;
PciePeiPreMemConfig->PegGpioData.SaPeg3ResetGpio.Active = FALSE;
}
VOID
LoadPciePeiDefault (
IN VOID *ConfigBlockPointer
)
{
UINT8 Index;
PCIE_PEI_CONFIG *PciePeiConfig;
PciePeiConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "PciePeiConfig->Header.GuidHob.Name = %g\n", &PciePeiConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "PciePeiConfig->Header.GuidHob.Header.HobLength = 0x%x\n", PciePeiConfig->Header.GuidHob.Header.HobLength));
//
// Initialize the PciExpress Configuration
//
for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
PciePeiConfig->PegDeEmphasis[Index] = 1;
PciePeiConfig->PegMaxPayload[Index] = 0xFF;
}
///
/// Slot Power Limit Value: 75 W
/// Slot Power Limit Scale: 1.0x
/// Physical Slot Number: Peg Index + 1 (1,2,3)
///
for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
PciePeiConfig->PegSlotPowerLimitValue[Index] = 75;
PciePeiConfig->PegPhysicalSlotNumber[Index] = Index + 1;
}
}
VOID
LoadGraphichsPeiPreMemDefault (
IN VOID *ConfigBlockPointer
)
{
GRAPHICS_PEI_PREMEM_CONFIG *GtPreMemConfig;
GtPreMemConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "GtPreMemConfig->Header.GuidHob.Name = %g\n", &GtPreMemConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "GtPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", GtPreMemConfig->Header.GuidHob.Header.HobLength));
///
/// Initialize Graphics Pre-Mem Configurations.
///
GtPreMemConfig->GmAdr = 0xD0000000;
GtPreMemConfig->GttMmAdr = 0xCF000000;
GtPreMemConfig->GttSize = 3;
GtPreMemConfig->IgdDvmt50PreAlloc = 1;
GtPreMemConfig->InternalGraphics = 2;
GtPreMemConfig->PrimaryDisplay = 3;
GtPreMemConfig->ApertureSize = SA_GT_APERTURE_SIZE_256MB;
GtPreMemConfig->PanelPowerEnable = 1;
}
VOID
LoadGraphichsPeiDefault (
IN VOID *ConfigBlockPointer
)
{
GRAPHICS_PEI_CONFIG *GtConfig;
GtConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "GtConfig->Header.GuidHob.Name = %g\n", &GtConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "GtConfig->Header.GuidHob.Header.HobLength = 0x%x\n", GtConfig->Header.GuidHob.Header.HobLength));
//
// Initialize the Graphics configuration
//
GtConfig->RenderStandby = 1;
GtConfig->PavpEnable = 1;
GtConfig->PmSupport = 1;
GtConfig->CdynmaxClampEnable = 1;
GtConfig->GtFreqMax = 0xFF;
//
// Initialize the default VBT settings
//
GtConfig->DdiConfiguration.DdiPortEdp = 1;
GtConfig->DdiConfiguration.DdiPortBHpd = 1;
GtConfig->DdiConfiguration.DdiPortCHpd = 1;
GtConfig->DdiConfiguration.DdiPortDHpd = 1;
GtConfig->DdiConfiguration.DdiPortFHpd = 0;
GtConfig->DdiConfiguration.DdiPortBDdc = 1;
GtConfig->DdiConfiguration.DdiPortCDdc = 1;
GtConfig->DdiConfiguration.DdiPortDDdc = 1;
GtConfig->DdiConfiguration.DdiPortFDdc = 0;
///
/// Initialize the CdClock to 675 Mhz
///
GtConfig->CdClock = 3;
}
VOID
LoadSwitchableGraphichsDefault (
IN VOID *ConfigBlockPointer
)
{
SWITCHABLE_GRAPHICS_CONFIG *SgConfig;
SgConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "SgConfig->Header.GuidHob.Name = %g\n", &SgConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "SgConfig->Header.GuidHob.Header.HobLength = 0x%x\n", SgConfig->Header.GuidHob.Header.HobLength));
SgConfig->SaRtd3Pcie0Gpio.GpioSupport = NotSupported;
SgConfig->SaRtd3Pcie1Gpio.GpioSupport = NotSupported;
SgConfig->SaRtd3Pcie2Gpio.GpioSupport = NotSupported;
}
VOID
LoadMemConfigNoCrcDefault (
IN VOID *ConfigBlockPointer
)
{
MEMORY_CONFIG_NO_CRC *MemConfigNoCrc;
MemConfigNoCrc = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "MemConfigNoCrc->Header.GuidHob.Name = %g\n", &MemConfigNoCrc->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "MemConfigNoCrc->Header.GuidHob.Header.HobLength = 0x%x\n", MemConfigNoCrc->Header.GuidHob.Header.HobLength));
//
// Allocating memory space for pointer structures inside MemConfigNoCrc
//
MemConfigNoCrc->SpdData = (SPD_DATA_BUFFER *) AllocateZeroPool (sizeof (SPD_DATA_BUFFER));
ASSERT (MemConfigNoCrc->SpdData != NULL);
if (MemConfigNoCrc->SpdData == NULL) {
return;
}
MemConfigNoCrc->DqByteMap = (SA_MEMORY_DQ_MAPPING *) AllocateZeroPool (sizeof (SA_MEMORY_DQ_MAPPING));
ASSERT (MemConfigNoCrc->DqByteMap != NULL);
if (MemConfigNoCrc->DqByteMap == NULL) {
return;
}
MemConfigNoCrc->DqsMap = (SA_MEMORY_DQS_MAPPING *) AllocateZeroPool (sizeof (SA_MEMORY_DQS_MAPPING));
ASSERT (MemConfigNoCrc->DqsMap != NULL);
if (MemConfigNoCrc->DqsMap == NULL) {
return;
}
MemConfigNoCrc->RcompData = (SA_MEMORY_RCOMP *) AllocateZeroPool (sizeof (SA_MEMORY_RCOMP));
ASSERT (MemConfigNoCrc->RcompData != NULL);
if (MemConfigNoCrc->RcompData == NULL) {
return;
}
//
// Set PlatformMemory Size
//
MemConfigNoCrc->PlatformMemorySize = PEI_MIN_MEMORY_SIZE;
MemConfigNoCrc->SerialDebugLevel = 3; //< Enable MRC debug message
MemConfigNoCrc->MemTestOnWarmBoot = 1; //< Enable to run BaseMemoryTest on warm boot by default
}
VOID
LoadGnaDefault (
IN VOID *ConfigBlockPointer
)
{
GNA_CONFIG *GnaConfig;
GnaConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "GnaConfig->Header.GuidHob.Name = %g\n", &GnaConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "GnaConfig->Header.GuidHob.Header.HobLength = 0x%x\n", GnaConfig->Header.GuidHob.Header.HobLength));
GnaConfig->GnaEnable = TRUE;
}
VOID
LoadMemConfigDefault (
IN VOID *ConfigBlockPointer
)
{
MEMORY_CONFIGURATION *MemConfig;
CPU_FAMILY CpuFamily;
UINT16 DeviceId;
CPU_SKU CpuSku;
CpuSku = GetCpuSku ();
CpuFamily = GetCpuFamily ();
DeviceId = PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, 0, 0, R_SA_MC_DEVICE_ID));
MemConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "MemConfig->Header.GuidHob.Name = %g\n", &MemConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "MemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", MemConfig->Header.GuidHob.Header.HobLength));
//
// Initialize the Memory Configuration
//
MemConfig->EnBER = 1;
MemConfig->EccSupport = 1;
MemConfig->ScramblerSupport = 1;
MemConfig->PowerDownMode = 0xFF;
MemConfig->RankInterleave = TRUE;
MemConfig->EnhancedInterleave = TRUE;
MemConfig->EnCmdRate = 3;
MemConfig->AutoSelfRefreshSupport = TRUE;
MemConfig->ExtTemperatureSupport = TRUE;
MemConfig->WeaklockEn = 1;
MemConfig->Ddr4MixedUDimm2DpcLimit = 1;
MemConfig->DualDimmPerChannelBoardType = (CpuFamily == EnumCpuCflDtHalo) ? TRUE : FALSE;
//
// Channel Hash Configuration
//
MemConfig->ChHashEnable = TRUE;
MemConfig->ChHashMask = 0;
MemConfig->ChHashInterleaveBit = 2;
MemConfig->PerBankRefresh = TRUE;
//
// Options for Thermal settings
//
MemConfig->EnablePwrDn = 1;
MemConfig->EnablePwrDnLpddr = 1;
MemConfig->DdrThermalSensor = 1;
MemConfig->EnergyScaleFact = 4;
MemConfig->IdleEnergyCh0Dimm0 = 0xA;
MemConfig->IdleEnergyCh0Dimm1 = 0xA;
MemConfig->IdleEnergyCh1Dimm0 = 0xA;
MemConfig->IdleEnergyCh1Dimm1 = 0xA;
MemConfig->PdEnergyCh0Dimm0 = 0x6;
MemConfig->PdEnergyCh0Dimm1 = 0x6;
MemConfig->PdEnergyCh1Dimm0 = 0x6;
MemConfig->PdEnergyCh1Dimm1 = 0x6;
MemConfig->ActEnergyCh0Dimm0 = 0xAC;
MemConfig->ActEnergyCh0Dimm1 = 0xAC;
MemConfig->ActEnergyCh1Dimm0 = 0xAC;
MemConfig->ActEnergyCh1Dimm1 = 0xAC;
MemConfig->RdEnergyCh0Dimm0 = 0xD4;
MemConfig->RdEnergyCh0Dimm1 = 0xD4;
MemConfig->RdEnergyCh1Dimm0 = 0xD4;
MemConfig->RdEnergyCh1Dimm1 = 0xD4;
MemConfig->WrEnergyCh0Dimm0 = 0xDD;
MemConfig->WrEnergyCh0Dimm1 = 0xDD;
MemConfig->WrEnergyCh1Dimm0 = 0xDD;
MemConfig->WrEnergyCh1Dimm1 = 0xDD;
MemConfig->WarmThresholdCh0Dimm0 = 0xFF;
MemConfig->WarmThresholdCh0Dimm1 = 0xFF;
MemConfig->WarmThresholdCh1Dimm0 = 0xFF;
MemConfig->WarmThresholdCh1Dimm1 = 0xFF;
MemConfig->HotThresholdCh0Dimm0 = 0xFF;
MemConfig->HotThresholdCh0Dimm1 = 0xFF;
MemConfig->HotThresholdCh1Dimm0 = 0xFF;
MemConfig->HotThresholdCh1Dimm1 = 0xFF;
MemConfig->WarmBudgetCh0Dimm0 = 0xFF;
MemConfig->WarmBudgetCh0Dimm1 = 0xFF;
MemConfig->WarmBudgetCh1Dimm0 = 0xFF;
MemConfig->WarmBudgetCh1Dimm1 = 0xFF;
MemConfig->HotBudgetCh0Dimm0 = 0xFF;
MemConfig->HotBudgetCh0Dimm1 = 0xFF;
MemConfig->HotBudgetCh1Dimm0 = 0xFF;
MemConfig->HotBudgetCh1Dimm1 = 0xFF;
MemConfig->SrefCfgEna = 1;
MemConfig->SrefCfgIdleTmr = 0x200;
MemConfig->ThrtCkeMinTmr = 0x30;
MemConfig->ThrtCkeMinDefeatLpddr = 1;
MemConfig->ThrtCkeMinTmrLpddr = 0x40;
MemConfig->RaplLim2WindX = 1;
MemConfig->RaplLim2WindY = 1;
MemConfig->RaplLim2Pwr = 0xDE;
//
// CA Vref routing: board-dependent
// 0 - VREF_CA goes to both CH_A and CH_B (LPDDR3/DDR3L)
// 1 - VREF_CA to CH_A, VREF_DQ_A to CH_B (should not be used)
// 2 - VREF_CA to CH_A, VREF_DQ_B to CH_B (DDR4)
//
//MemConfig->CaVrefConfig = 0;
MemConfig->VttTermination = ((CpuSku == EnumCpuUlx) || (CpuSku == EnumCpuUlt));
MemConfig->VttCompForVsshi = 0;
#ifdef UP_SERVER_FLAG
MemConfig->TsodTcritmax = 0x69;
MemConfig->TsodThigMax = 0x5D;
#endif
//
// MRC training steps
//
MemConfig->ECT = 1;
MemConfig->ERDMPRTC2D = 1;
MemConfig->SOT = 1;
MemConfig->RDMPRT = 1;
MemConfig->RCVET = 1;
MemConfig->JWRL = 1;
MemConfig->EWRTC2D = 1;
MemConfig->ERDTC2D = 1;
MemConfig->WRTC1D = 1;
MemConfig->WRVC1D = 1;
MemConfig->RDTC1D = 1;
MemConfig->DIMMODTT = 1;
MemConfig->DIMMRONT = 1;
MemConfig->WRSRT = 1;
MemConfig->RDODTT = 1;
MemConfig->RDAPT = 1;
MemConfig->WRTC2D = 1;
MemConfig->RDTC2D = 1;
MemConfig->CMDVC = 1;
MemConfig->WRVC2D = 1;
MemConfig->RDVC2D = 1;
MemConfig->LCT = 1;
MemConfig->RTL = 1;
MemConfig->TAT = 1;
MemConfig->ALIASCHK = 1;
MemConfig->RCVENC1D = 1;
MemConfig->RMC = 1;
MemConfig->CMDSR = 1;
MemConfig->CMDDSEQ = 1;
MemConfig->CMDNORM = 1;
MemConfig->EWRDSEQ = 1;
MemConfig->McLock = TRUE;
MemConfig->GdxcIotSize = 4;
MemConfig->GdxcMotSize = 12;
MemConfig->RDEQT = 1;
MemConfig->MrcFastBoot = TRUE;
MemConfig->MrcTrainOnWarm = FALSE;
MemConfig->RemapEnable = TRUE;
MemConfig->BClkFrequency = 100 * 1000 * 1000;
#ifdef EMBEDDED_FLAG
MemConfig->Force1Dpc = TRUE;
#endif
MemConfig->Vc1ReadMeter = TRUE;
MemConfig->Vc1ReadMeterTimeWindow = 0x320;
MemConfig->Vc1ReadMeterThreshold = 0x118;
MemConfig->StrongWkLeaker = 7;
MemConfig->MobilePlatform = (IS_SA_DEVICE_ID_MOBILE (DeviceId)) ? TRUE : FALSE;
MemConfig->PciIndex = 0xCF8;
MemConfig->PciData = 0xCFC;
MemConfig->CkeRankMapping = 0xAA;
// This only affects ULX/ULT; otherwise SA GV is disabled.
// CFL SA GV: 0 - Disabled, 1 - FixedLow, 2 - FixedHigh, 3 - Enabled
MemConfig->SaGv = 3;
MemConfig->SimicsFlag = 0;
MemConfig->Idd3n = 26;
MemConfig->Idd3p = 11;
MemConfig->RhPrevention = TRUE; // Row Hammer prevention.
MemConfig->RhSolution = HardwareRhp; // Type of solution to be used for RHP - 0/1 = HardwareRhp/Refresh2x
MemConfig->RhActProbability = OneIn2To11; // Activation probability for Hardware RHP
MemConfig->LpddrMemWriteLatencySet = 1; // Enable LPDDR3 WL Set B if supported by DRAM
MemConfig->DllBwEn1 = 1;
MemConfig->DllBwEn2 = 2;
MemConfig->DllBwEn3 = 2;
MemConfig->RetrainOnFastFail = 1; // Restart MRC in Cold mode if SW MemTest fails during Fast flow. 0 = Disabled, 1 = Enabled
MemConfig->Lp4DqsOscEn = 1;
MemConfig->IsvtIoPort = 0x99;
}
VOID
LoadOverClockConfigDefault (
IN VOID *ConfigBlockPointer
)
{
OVERCLOCKING_PREMEM_CONFIG *OcPreMemConfig;
OcPreMemConfig = (OVERCLOCKING_PREMEM_CONFIG *)ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "OcPreMemConfig->Header.GuidHob.Name = %g\n", &OcPreMemConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "OcPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", OcPreMemConfig->Header.GuidHob.Header.HobLength));
}
static COMPONENT_BLOCK_ENTRY mSaIpBlocksPreMem [] = {
{&gSaMiscPeiPreMemConfigGuid, sizeof (SA_MISC_PEI_PREMEM_CONFIG), SA_MISC_PEI_PREMEM_CONFIG_REVISION, LoadSaMiscPeiPreMemDefault},
{&gSaPciePeiPreMemConfigGuid, sizeof (PCIE_PEI_PREMEM_CONFIG), SA_PCIE_PEI_PREMEM_CONFIG_REVISION, LoadPciePeiPreMemDefault},
{&gGraphicsPeiPreMemConfigGuid, sizeof (GRAPHICS_PEI_PREMEM_CONFIG), GRAPHICS_PEI_PREMEM_CONFIG_REVISION, LoadGraphichsPeiPreMemDefault},
{&gSwitchableGraphicsConfigGuid, sizeof (SWITCHABLE_GRAPHICS_CONFIG), SWITCHABLE_GRAPHICS_CONFIG_REVISION, LoadSwitchableGraphichsDefault},
{&gMemoryConfigGuid, sizeof (MEMORY_CONFIGURATION), MEMORY_CONFIG_REVISION, LoadMemConfigDefault},
{&gMemoryConfigNoCrcGuid, sizeof (MEMORY_CONFIG_NO_CRC), MEMORY_CONFIG_REVISION, LoadMemConfigNoCrcDefault},
{&gSaOverclockingPreMemConfigGuid, sizeof (OVERCLOCKING_PREMEM_CONFIG), SA_OVERCLOCKING_CONFIG_REVISION, LoadOverClockConfigDefault},
{&gVtdConfigGuid, sizeof (VTD_CONFIG), VTD_CONFIG_REVISION, LoadVtdDefault},
{&gIpuPreMemConfigGuid, sizeof (IPU_PREMEM_CONFIG), IPU_PREMEM_CONFIG_REVISION, LoadIpuPreMemDefault}
};
static COMPONENT_BLOCK_ENTRY mSaIpBlocks [] = {
{&gSaMiscPeiConfigGuid, sizeof (SA_MISC_PEI_CONFIG), SA_MISC_PEI_CONFIG_REVISION, LoadSaMiscPeiDefault},
{&gSaPciePeiConfigGuid, sizeof (PCIE_PEI_CONFIG), SA_PCIE_PEI_CONFIG_REVISION, LoadPciePeiDefault},
{&gGraphicsPeiConfigGuid, sizeof (GRAPHICS_PEI_CONFIG), GRAPHICS_PEI_CONFIG_REVISION, LoadGraphichsPeiDefault},
{&gGnaConfigGuid, sizeof (GNA_CONFIG), GNA_CONFIG_REVISION, LoadGnaDefault}
};
/**
Get SA config block table total size.
@retval Size of SA config block table
**/
UINT16
EFIAPI
SaGetConfigBlockTotalSize (
VOID
)
{
return GetComponentConfigBlockTotalSize (&mSaIpBlocks[0], sizeof (mSaIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY));
}
/**
Get SA config block table total size.
@retval Size of SA config block table
**/
UINT16
EFIAPI
SaGetConfigBlockTotalSizePreMem (
VOID
)
{
return GetComponentConfigBlockTotalSize (&mSaIpBlocksPreMem[0], sizeof (mSaIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY));
}
/**
SaAddConfigBlocksPreMem add all SA config blocks.
@param[in] ConfigBlockTableAddress The pointer to add SA config blocks
@retval EFI_SUCCESS The policy default is initialized.
@retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
**/
EFI_STATUS
EFIAPI
SaAddConfigBlocksPreMem (
IN VOID *ConfigBlockTableAddress
)
{
EFI_STATUS Status;
DEBUG ((DEBUG_INFO, "SA AddConfigBlocks. TotalBlockCount = 0x%x\n", sizeof (mSaIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY)));
Status = AddComponentConfigBlocks (ConfigBlockTableAddress, &mSaIpBlocksPreMem[0], sizeof (mSaIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY));
if (Status == EFI_SUCCESS) {
SaLoadSamplePolicyPreMem (ConfigBlockTableAddress);
}
return Status;
}
/**
SaAddConfigBlocks add all SA config blocks.
@param[in] ConfigBlockTableAddress The pointer to add SA config blocks
@retval EFI_SUCCESS The policy default is initialized.
@retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
**/
EFI_STATUS
EFIAPI
SaAddConfigBlocks (
IN VOID *ConfigBlockTableAddress
)
{
DEBUG ((DEBUG_INFO, "SA AddConfigBlocks. TotalBlockCount = 0x%x\n", sizeof (mSaIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY)));
return AddComponentConfigBlocks (ConfigBlockTableAddress, &mSaIpBlocks[0], sizeof (mSaIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY));
}