/** @file This file is PeiCpuPolicyLibPreMem library. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "PeiCpuPolicyLibrary.h" #include #include #include /** Load Config block default @param[in] ConfigBlockPointer Pointer to config block **/ VOID LoadCpuSecurityPreMemConfigDefault ( IN VOID *ConfigBlockPointer ) { } /** Load Config block default @param[in] ConfigBlockPointer Pointer to config block **/ VOID LoadCpuConfigLibPreMemConfigDefault ( IN VOID *ConfigBlockPointer ) { CPU_GENERATION CpuGeneration; CPU_CONFIG_LIB_PREMEM_CONFIG *CpuConfigLibPreMemConfig; CPU_FAMILY CpuFamily; CPU_SKU CpuSku; BOOLEAN PegDisabled; UINT64 MchBar; UINT64 SaPciBase; CpuConfigLibPreMemConfig = ConfigBlockPointer; CpuFamily = GetCpuFamily(); CpuSku = GetCpuSku(); DEBUG ((DEBUG_INFO, "CpuConfigLibPreMemConfig->Header.GuidHob.Name = %g\n", &CpuConfigLibPreMemConfig->Header.GuidHob.Name)); DEBUG ((DEBUG_INFO, "CpuConfigLibPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuConfigLibPreMemConfig->Header.GuidHob.Header.HobLength)); /******************************** CPU Config Lib PreMem configuration ********************************/ CpuConfigLibPreMemConfig->HyperThreading = CPU_FEATURE_ENABLE; CpuConfigLibPreMemConfig->BootFrequency = 1; // Maximum non-turbo Performance CpuConfigLibPreMemConfig->ActiveCoreCount = 0; // All cores active CpuConfigLibPreMemConfig->JtagC10PowerGateDisable = CPU_FEATURE_DISABLE; CpuConfigLibPreMemConfig->BistOnReset = CPU_FEATURE_DISABLE; CpuConfigLibPreMemConfig->VmxEnable = CPU_FEATURE_ENABLE; CpuConfigLibPreMemConfig->CpuRatio = (RShiftU64 (AsmReadMsr64 (MSR_PLATFORM_INFO), N_PLATFORM_INFO_MAX_RATIO) & B_PLATFORM_INFO_RATIO_MASK); CpuGeneration = GetCpuGeneration(); if(CpuGeneration == EnumCflCpu){ /// /// FCLK Frequency /// SaPciBase = PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, 0); PciSegmentReadBuffer (SaPciBase + R_SA_MCHBAR, sizeof (MchBar), &MchBar); MchBar &= ((UINT64) ~BIT0); if (IsPchLinkDmi (CpuFamily) && (PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_PEG_BUS_NUM, SA_PEG_DEV_NUM, SA_PEG0_FUN_NUM, PCI_VENDOR_ID_OFFSET)) != 0xFFFF)) { PegDisabled = MmioRead32 ((UINTN) MchBar + R_SA_MCHBAR_BIOS_RESET_CPL_OFFSET) & BIT3; } else { PegDisabled = 1; } /// /// DT/Halo FCLK = 1GHz /// Ulx/Ult FCLK = 800MHz /// if (((CpuSku == EnumCpuHalo) && (!PegDisabled)) || (CpuSku == EnumCpuTrad)) { CpuConfigLibPreMemConfig->FClkFrequency = 1; // 1Ghz } else { CpuConfigLibPreMemConfig->FClkFrequency = 0; // 800MHz } /// /// Disable Peci Reset on C10 exit on CFL based CPU's /// Setting to 1 will activate the message that disables peci reset. /// CpuConfigLibPreMemConfig->PeciC10Reset = 1; } } /** Load Overclocking pre-mem Config block default @param[in] ConfigBlockPointer Pointer to config block **/ VOID LoadCpuOverclockingPreMemConfigDefault ( IN VOID *ConfigBlockPointer ) { CPU_OVERCLOCKING_PREMEM_CONFIG *CpuOverclockingPreMemConfig; CpuOverclockingPreMemConfig = ConfigBlockPointer; /******************************** CPU Overclocking PreMem configuration ********************************/ DEBUG ((DEBUG_INFO, "CpuOverclockingPreMemConfig->Header.GuidHob.Name = %g\n", &CpuOverclockingPreMemConfig->Header.GuidHob.Name)); DEBUG ((DEBUG_INFO, "CpuOverclockingPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuOverclockingPreMemConfig->Header.GuidHob.Header.HobLength)); } static COMPONENT_BLOCK_ENTRY mCpuIpBlocksPreMem [] = { {&gCpuConfigLibPreMemConfigGuid, sizeof (CPU_CONFIG_LIB_PREMEM_CONFIG), CPU_CONFIG_LIB_PREMEM_CONFIG_REVISION, LoadCpuConfigLibPreMemConfigDefault}, {&gCpuOverclockingPreMemConfigGuid, sizeof (CPU_OVERCLOCKING_PREMEM_CONFIG), CPU_OVERCLOCKING_CONFIG_REVISION, LoadCpuOverclockingPreMemConfigDefault}, }; /** Get CPU PREMEM config block table total size. @retval Size of CPU PREMEM config block table **/ UINT16 EFIAPI CpuGetPreMemConfigBlockTotalSize ( VOID ) { return GetComponentConfigBlockTotalSize (&mCpuIpBlocksPreMem[0], sizeof (mCpuIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY)); } /** CpuAddPreMemConfigBlocks add all CPU PREMEM config blocks. @param[in] ConfigBlockTableAddress The pointer to add CPU PREMEM config blocks @retval EFI_SUCCESS The policy default is initialized. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer **/ EFI_STATUS EFIAPI CpuAddPreMemConfigBlocks ( IN VOID *ConfigBlockTableAddress ) { EFI_STATUS Status; DEBUG((DEBUG_INFO, "CPU Pre-Mem Entry \n")); PostCode (0xC00); Status = AddComponentConfigBlocks (ConfigBlockTableAddress, &mCpuIpBlocksPreMem[0], sizeof (mCpuIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY)); DEBUG((DEBUG_INFO, "CpuAddPreMemConfigBlocks Done \n")); PostCode (0xC0F); return Status; }