/** @file EFI 2.0 PEIM to initialize the cache and program for unlock processor Revision History @copyright Copyright (c) 1999 - 2013 Intel Corporation. All rights reserved This software and associated documentation (if any) is furnished under a license and may only be used or copied in accordance with the terms of the license. Except as permitted by such license, no part of this software or documentation may be reproduced, stored in a retrieval system, or transmitted in any form or by any means without the express written consent of Intel Corporation. This file contains an 'Intel Pre-EFI Module' and is licensed for Intel CPUs and Chipsets under the terms of your license agreement with Intel or your vendor. This file may be modified by the user, subject to additional terms of the license agreement **/ /// /// External include files do NOT need to be explicitly specified in real EDKII /// environment /// #if !defined(EDK_RELEASE_VERSION) || (EDK_RELEASE_VERSION < 0x00020000) #include "EdkIIGluePeim.h" #include "CpuAccess.h" #include "CpuInitPeim.h" #include "PchAccess.h" #include "SaAccess.h" #include "PfatInit.h" #include "CpuOcInit.h" #include "CpuPlatformLib.h" #include EFI_PPI_DEFINITION (BootMode) #include EFI_PPI_DEFINITION (PchInit) #include EFI_PPI_CONSUMER (PchReset) #endif #include EFI_PPI_CONSUMER (SecPlatformInformation) #include EFI_GUID_DEFINITION (HtBistHob) /** This fuction compare Setup Options of ActiveCores & HyperThreading against the CPU Strap and in case of mismatch requests reset @param[in] PeiServices - For printouts @param[in] CpuStrapSet - Strap current setting @param[in] CpuPlatformPolicyPpi - Platform Policy PPI @retval CPU_RESET_TYPE @retval CPU_ONLY_RESET - if reset is needed @retval NO_RESET - otherwise **/ CPU_RESET_TYPE SetActiveCoresAndSmtEnableDisable ( IN EFI_PEI_SERVICES **PeiServices, IN CPU_STRAP_SET *CpuStrapSet, IN PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { CPU_RESET_TYPE ResetType; UINT16 TotalThreadsPerCore; UINT32 Data32; UINT32 NumberOfActiveCores; UINT32 NumberOfActiveThreads; EFI_CPUID_REGISTER Cpuid0B = { 0, 0, 0, 0 }; ResetType = NO_RESET; /// /// Read CPUID(0xB) with ECX=0 for number of logical processors per Core. /// This value does NOT change based on Intel HT Technology disable and core disables. /// Cpuid0B.RegEcx = 0; AsmCpuidEx (CPUID_PROCESSOR_TOPOLOGY, 0, NULL, &Cpuid0B.RegEbx, NULL, NULL); TotalThreadsPerCore = (UINT16) Cpuid0B.RegEbx; /// /// CORE_THREAD_COUNT - msr 0x35 /// Symbol Name MSB:LSB Description /// CoreCount CoreCount 31:16 The Core Count reflects the enabled cores based /// on the above thread count and the value of threads_ /// available (to determine if HT is on) at reset time. /// /// ThreadCount ThreadCount 15:0 The Thread Count reflects the enabled threads based /// on the factory-configured thread count and the value /// of the CSR_DESIRED_CORES register at reset time. /// /// /// Read MSR for Active Core and Thread Count. /// Data32 = (UINT32) AsmReadMsr64 (MSR_CORE_THREAD_COUNT); NumberOfActiveCores = (UINT32) ((Data32 >> 16) & 0xFFFF); NumberOfActiveThreads = (UINT32) (Data32 & 0xFFFF); DEBUG ((EFI_D_INFO, "Number of Active Cores / Threads = %x / %x\n", NumberOfActiveCores, NumberOfActiveThreads)); if (TotalThreadsPerCore > 1) { /// /// SMT is supported /// DEBUG ((EFI_D_INFO, "SMT is supported\n")); /// /// Check if the configuration of SMT matches the BIOS Setup option. /// if (CpuStrapSet->HtDisabled == CpuPlatformPolicyPpi->CpuConfig->HyperThreading) { /// /// SMT configuration doesn't match BIOS Setup option; update the Strap Set Data and Issue a Warm reset /// DEBUG ((EFI_D_INFO, "SMT configuration doesn't match the setup value\n")); CpuStrapSet->HtDisabled = !CpuPlatformPolicyPpi->CpuConfig->HyperThreading; ResetType |= WARM_RESET; } } else { /// /// SMT is not supported by default fusing. /// DEBUG ((EFI_D_WARN, "SMT is NOT supported\n")); CpuStrapSet->HtDisabled = 1; CpuPlatformPolicyPpi->CpuConfig->HyperThreading = CPU_FEATURE_DISABLE; } /// /// Check if the configuration of "Active Core" matches the BIOS Setup option. /// if (CpuStrapSet->NumberOfActiveCores != CpuPlatformPolicyPpi->CpuConfig->ActiveCoreCount) { DEBUG ( (EFI_D_INFO, "NumberOfActiveCores doesn't match the value from Setup = %x / %x\n", CpuStrapSet->NumberOfActiveCores, CpuPlatformPolicyPpi->CpuConfig->ActiveCoreCount) ); CpuStrapSet->NumberOfActiveCores = CpuPlatformPolicyPpi->CpuConfig->ActiveCoreCount; /// /// Haswell CPU doesnt require COLD reset to set number of active cores /// ResetType |= WARM_RESET; } return ResetType; } /** This fuction compare Setup Options of BIST against the CPU Strap and in case of mismatch requests reset @param[in] PeiServices - For printouts @param[in] CpuStrapSet - Strap current setting @param[in] CpuPlatformPolicyPpi - Platform Policy PPI @retval CPU_RESET_TYPE @retval CPU_ONLY_RESET - if reset is needed @retval NO_RESET - otherwise **/ CPU_RESET_TYPE BistEnableDisable ( IN EFI_PEI_SERVICES **PeiServices, IN CPU_STRAP_SET *CpuStrapSet, IN PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { if (CpuStrapSet->Bist == CpuPlatformPolicyPpi->CpuConfig->BistOnReset) { return NO_RESET; } else { CpuStrapSet->Bist = CpuPlatformPolicyPpi->CpuConfig->BistOnReset; DEBUG ((EFI_D_INFO, "BIST configuration doesn't match the setup value\n")); return WARM_RESET; } } /** This fuction compare Setup Options of Processor Flex Multiplier against the CPU Strap and in case of mismatch requests reset @param[in] PeiServices - For printouts @param[in] CpuStrapSet - Strap current setting @param[in] CpuPlatformPolicyPpi - Platform Policy PPI @retval CPU_RESET_TYPE @retval CPU_ONLY_RESET - if reset is needed @retval NO_RESET - otherwise **/ CPU_RESET_TYPE ProgramProcessorFlexMultiplier ( IN EFI_PEI_SERVICES **PeiServices, IN CPU_STRAP_SET *CpuStrapSet, IN PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { UINT64 FlexRatioData; UINT64 CurrentClockFlexRatio; UINT64 MsrData; CPU_RESET_TYPE ResetType; ResetType = NO_RESET; /// /// Perform Flex Ratio if enabled by user in Setup screen /// if (CpuPlatformPolicyPpi->CpuConfig->CpuRatioOverride) { FlexRatioData = (UINT64) (CpuPlatformPolicyPpi->CpuConfig->CpuRatio); } else { /// /// Flex Ratio was set to disable. Reset to Max Non-Turbo Ratio /// FlexRatioData = 0x0; } DEBUG ((EFI_D_INFO, "Setup Ratio is 0x%X\n", FlexRatioData)); /// /// Read and save current Flex Ratio data; disregard enable bit (MSR 194h [15:8]) /// MsrData = AsmReadMsr64 (MSR_FLEX_RATIO); CurrentClockFlexRatio = ((RShiftU64 (MsrData, N_FLEX_RATIO)) & 0xFF); DEBUG ((EFI_D_INFO, "Current Flex Ratio from MSR is 0x%X\n", CurrentClockFlexRatio)); DEBUG ((EFI_D_INFO, "Current Flex Ratio from CPU Strap: 0x%X\n", CpuStrapSet->FlexRatio)); /// /// Check and set Flex Ratio to requested ratio if possible /// if (FlexRatioData == CpuStrapSet->FlexRatio) { /// /// Do nothing, ratio is already set to requested value and enabled /// DEBUG ((EFI_D_INFO, "No need to set Flex Ratio.\n")); } else { /// /// Set Flex Ratio to user selected value /// /// Write new data to Flex Ratio register /// First clear MSR of any previous value /// MsrData &= RATIO_FLEX_CLEAR_MASK; /// /// Enter the new data /// MsrData |= (LShiftU64 ((FlexRatioData & 0xFF), N_FLEX_RATIO)); MsrData |= B_FLEX_EN; AsmWriteMsr64 (MSR_FLEX_RATIO, MsrData); /// /// Set Soft Reset Data for Flex Ratio /// CpuStrapSet->FlexRatio = (UINT32) FlexRatioData; /// /// Set RESET flag /// DEBUG ((EFI_D_INFO, "Setting Flex Ratio to 0x%X\n", CpuStrapSet->FlexRatio)); ResetType |= WARM_RESET; } return ResetType; } static EFI_PEI_NOTIFY_DESCRIPTOR mNotifyList[] = { { EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, &gPchInitPpiGuid, SetCpuStrap }, { (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), &gEfiPeiMasterBootModePpiGuid, BuildBistHob } }; /** Check if VT is fused and disabled by Setup Option so reset is needed @param[in] CpuPlatformPolicyPpi - Platform Policy PPI @retval CPU_RESET_TYPE @retval NO_RESET - If no reset is needed @retval COLDRESET - otherwise **/ CPU_RESET_TYPE CheckVmxIfNeedReset ( IN PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { UINT64 MsrIa32FeatureControl; BOOLEAN CurrentVmxState; EFI_CPUID_REGISTER Cpuid01 = { 0, 0, 0, 0 }; AsmCpuid (CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx); /// /// Check if VMX is supported /// if ((Cpuid01.RegEcx & B_CPUID_VERSION_INFO_ECX_VME) == 0) { return NO_RESET; } MsrIa32FeatureControl = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL); /// /// If unlocked, no reset needed. /// if ((MsrIa32FeatureControl & B_MSR_IA32_FEATURE_CONTROL_LOCK) == 0) { return NO_RESET; } CurrentVmxState = (BOOLEAN) ((MsrIa32FeatureControl & B_MSR_IA32_FEATURE_CONTROL_EVT) != 0); /// /// Need to reset only if locked and VMX state has to be changed. /// if ((CurrentVmxState == (CpuPlatformPolicyPpi->CpuConfig->VmxEnable)) == CPU_FEATURE_ENABLE) { return NO_RESET; } /// /// We need a power good reset to unlock MSR_IA32_FEATURE_CONTROL. /// return COLDRESET; } /** Set CPU strap setting for feature change @param[in] PeiServices - Indirect reference to the PEI Services Table. @param[in] NotifyDescriptor - Address of the notification descriptor data structure. Type EFI_PEI_NOTIFY_DESCRIPTOR is defined above. @param[in] Ppi - Address of the PPI that was installed. @retval EFI_SUCCESS - Function completed successfully **/ EFI_STATUS EFIAPI SetCpuStrap ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; CPU_STRAP_SET CpuStrapSet = { 0 }; UINT16 CpuStrapSetData; volatile CPU_RESET_TYPE ResetType; PCH_INIT_PPI *PchInitPpi; PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi; UINT8 Data; ResetType = NO_RESET; CpuStrapSetData = 0; Data = 0; Status = PeiServicesLocatePpi ( &gPeiCpuPlatformPolicyPpiGuid, 0, NULL, (VOID **) &CpuPlatformPolicyPpi ); ASSERT_EFI_ERROR (Status); /// /// Locate PchInit Ppi /// Status = PeiServicesLocatePpi ( &gPchInitPpiGuid, 0, NULL, (VOID **) &PchInitPpi ); if (Status == EFI_SUCCESS) { /// /// Get Cpu Strap Set Data /// DEBUG ((EFI_D_INFO, "Set PCH CPU Straps \n")); Status = PchInitPpi->CpuStrapSet (PeiServices, GetCpuStrapSetData, &CpuStrapSetData); *((UINT16 *) (&CpuStrapSet)) = CpuStrapSetData; DEBUG ((EFI_D_INFO, "Current CPU Strap Data = 0x%04X\n", CpuStrapSetData)); if (Status == EFI_SUCCESS) { ResetType |= SetActiveCoresAndSmtEnableDisable (PeiServices, &CpuStrapSet, CpuPlatformPolicyPpi); ResetType |= BistEnableDisable (PeiServices, &CpuStrapSet, CpuPlatformPolicyPpi); /// /// Perform Flex Ratio if processor is fused to perform Flex Ratio /// if ((AsmReadMsr64 (MSR_FLEX_RATIO) & B_FLEX_EN) == B_FLEX_EN) { ResetType |= ProgramProcessorFlexMultiplier (PeiServices, &CpuStrapSet, CpuPlatformPolicyPpi); } if (ResetType != NO_RESET) { CpuStrapSetData = *((UINT16 *) (&CpuStrapSet)); DEBUG ((EFI_D_INFO, "New CPU Strap Data = 0x%04X\n", CpuStrapSetData)); Status = PchInitPpi->CpuStrapSet ( PeiServices, SetCpuStrapSetData, &CpuStrapSetData ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_INFO, "NO Reset\n")); ResetType = NO_RESET; } } } } ResetType |= CheckVmxIfNeedReset (CpuPlatformPolicyPpi); if (ResetType != NO_RESET) { /// /// Perform Warm or Cold Reset /// DEBUG ( (EFI_D_INFO, "Reset Required. Performing Cold/Warm Reset to read the new strap values - ResetType = %x\n", ResetType) ); PerformWarmORColdReset (PeiServices, ResetType); } Status = PchInitPpi->CpuStrapSet ( PeiServices, LockCpuStrapSetData, &CpuStrapSetData ); DEBUG ((EFI_D_INFO, "No Reset Required\n")); return EFI_SUCCESS; } /** Initialize prefetcher settings @param[in] MlcStreamerprefecterEnabled - Enable/Disable MLC streamer prefetcher @param[in] MlcSpatialPrefetcherEnabled - Enable/Disable MLC spatial prefetcher **/ VOID ProcessorsPrefetcherInitialization ( IN UINTN MlcStreamerprefecterEnabled, IN UINTN MlcSpatialPrefetcherEnabled ) { UINT64 MsrValue; MsrValue = AsmReadMsr64 (MISC_FEATURE_CONTROL); if (MlcStreamerprefecterEnabled == CPU_FEATURE_DISABLE) { MsrValue |= B_MISC_FEATURE_CONTROL_MLC_STRP; } if (MlcSpatialPrefetcherEnabled == CPU_FEATURE_DISABLE) { MsrValue |= B_MISC_FEATURE_CONTROL_MLC_SPAP; } if ((MsrValue & (B_MISC_FEATURE_CONTROL_MLC_STRP | B_MISC_FEATURE_CONTROL_MLC_SPAP)) != 0) { AsmWriteMsr64 (MISC_FEATURE_CONTROL, MsrValue); } return; } /** Based on ResetType, perform warm or cold reset using PCH Reset PPI @param[in] PeiServices - Indirect reference to the PEI Services Table. @param[in] ResetType - CPU_RESET_TYPE to indicate which reset shoudl be performed. @exception EFI_UNSUPPORTED - Reset type unsupported @retval EFI_SUCCESS - function successfully (system should already reset) **/ EFI_STATUS PerformWarmORColdReset ( IN EFI_PEI_SERVICES **PeiServices, IN CPU_RESET_TYPE ResetType ) { PCH_RESET_PPI *PchResetPpi; EFI_STATUS Status; /// /// Loccate Reset PPI /// Status = (*PeiServices)->LocatePpi ( PeiServices, &gPchResetPpiGuid, 0, NULL, (VOID **) &PchResetPpi ); ASSERT_EFI_ERROR (Status); /// /// Perfrom the requested reset using PCH reset PPI /// Status = EFI_SUCCESS; switch (ResetType) { case WARM_RESET: PchResetPpi->Reset (PchResetPpi, RESET_PPI_WARM_RESET); break; case COLDRESET: PchResetPpi->Reset (PchResetPpi, RESET_PPI_COLD_RESET); break; default: DEBUG ((EFI_D_ERROR, "CpuInitPeim: PerformWarmORColdReset - ResetType %d not supported: \n", ResetType)); Status = EFI_UNSUPPORTED; ASSERT_EFI_ERROR (Status); } return Status; } /** Initializes XE OR Overclocking support in the processor. @param[in] PowerMgmtConfig Pointer to Policy protocol instance @retval EFI_SUCCESS **/ EFI_STATUS XeInit ( IN OUT POWER_MGMT_CONFIG_PPI *PowerMgmtConfig, IN OUT OVERCLOCKING_CONFIG_PPI *OcConfig ) { MSR_REGISTER TurboRatioLimit; MSR_REGISTER FlexRatioMsr; MSR_REGISTER TempMsr; MSR_REGISTER RingRatioMsr; UINT8 CoreCount; UINT8 OverclockingBins; UINT8 OneCoreRatioLimit; UINT8 TwoCoreRatioLimit; UINT8 ThreeCoreRatioLimit; UINT8 FourCoreRatioLimit; UINT8 RatioLimitProgrammble; UINT16 MaxBusRatio; if ((PowerMgmtConfig->Xe == 0)) { /// /// XE is disabled /// return EFI_SUCCESS; } TurboRatioLimit.Qword = AsmReadMsr64 (MSR_TURBO_RATIO_LIMIT); OneCoreRatioLimit = (UINT8) (TurboRatioLimit.Dwords.Low & B_MSR_TURBO_RATIO_LIMIT_1C); TwoCoreRatioLimit = (UINT8) RShiftU64 ( (TurboRatioLimit.Dwords.Low & B_MSR_TURBO_RATIO_LIMIT_2C), N_MSR_TURBO_RATIO_LIMIT_2C ); ThreeCoreRatioLimit = (UINT8) RShiftU64 ( (TurboRatioLimit.Dwords.Low & B_MSR_TURBO_RATIO_LIMIT_3C), N_MSR_TURBO_RATIO_LIMIT_3C ); FourCoreRatioLimit = (UINT8) RShiftU64 ( (TurboRatioLimit.Dwords.Low & B_MSR_TURBO_RATIO_LIMIT_4C), N_MSR_TURBO_RATIO_LIMIT_4C ); /// /// Check if XE capable /// FlexRatioMsr.Qword = AsmReadMsr64 (MSR_FLEX_RATIO); /// /// Overclocking availablity /// OverclockingBins = (UINT8) RShiftU64 ((FlexRatioMsr.Dwords.Low & B_OVERCLOCKING_BINS), N_OVERCLOCKING_BINS); /// /// Check if Turbo Ratio Limit is programmable /// Platform Info MSR (0xCE) [28] /// TempMsr.Qword = AsmReadMsr64 (MSR_PLATFORM_INFO); RatioLimitProgrammble = (UINT8) RShiftU64 ( (TempMsr.Qword & B_PLATFORM_INFO_RATIO_LIMIT), N_PLATFORM_INFO_RATIO_LIMIT ); /// /// Get Maximum Non-Turbo bus ratio (HFM) from Platform Info MSR Bits[15:8] /// MaxBusRatio = TempMsr.Bytes.SecondByte; /// /// Check if processor turbo-ratio can be overriden: /// BWG Section 14.14.2 /// If PLATFORM INFO MSR [28] == 1 and FLEX_RATIO MSR [19:17] != 0 /// Processor with capability to override turbo-ratio detected (either XE or Overclocking part detected) /// if ((RatioLimitProgrammble == 0) || (OverclockingBins == 0)) { /// /// Neither XE nor Overclocking Capable processor. /// DEBUG ((EFI_D_WARN, "WARNING: Trying to configure XE params on a non-XE processor\n")); return EFI_SUCCESS; } /// /// For Overclocking parts, verify ratio overide is within the allowable limits /// if ((RatioLimitProgrammble) && (OverclockingBins < MAX_OVERCLOCKING_BINS)) { if (PowerMgmtConfig->RatioLimit[0] > (OneCoreRatioLimit + OverclockingBins)) { PowerMgmtConfig->RatioLimit[0] = OneCoreRatioLimit + OverclockingBins; } if (PowerMgmtConfig->RatioLimit[1] > (TwoCoreRatioLimit + OverclockingBins)) { PowerMgmtConfig->RatioLimit[1] = TwoCoreRatioLimit + OverclockingBins; } if (PowerMgmtConfig->RatioLimit[2] > (ThreeCoreRatioLimit + OverclockingBins)) { PowerMgmtConfig->RatioLimit[2] = ThreeCoreRatioLimit + OverclockingBins; } if (PowerMgmtConfig->RatioLimit[3] > (FourCoreRatioLimit + OverclockingBins)) { PowerMgmtConfig->RatioLimit[3] = FourCoreRatioLimit + OverclockingBins; } } if ((RatioLimitProgrammble)) { /// /// Now initialize turbo ratio limit MSR /// Find the number of active cores and initialize the ratio limits only if they are available. /// Also program the VID value for the new max Turbo ratio by programming Flex Ratio MSR. /// TempMsr.Qword = AsmReadMsr64 (MSR_CORE_THREAD_COUNT); CoreCount = (UINT8) RShiftU64 (TempMsr.Dwords.Low, N_CORE_COUNT_OFFSET); if (PowerMgmtConfig->RatioLimit[0] >= PowerMgmtConfig->RatioLimit[1] && PowerMgmtConfig->RatioLimit[0] >= PowerMgmtConfig->RatioLimit[2] && PowerMgmtConfig->RatioLimit[0] >= PowerMgmtConfig->RatioLimit[3] && PowerMgmtConfig->RatioLimit[1] >= MaxBusRatio && PowerMgmtConfig->RatioLimit[2] >= MaxBusRatio && PowerMgmtConfig->RatioLimit[3] >= MaxBusRatio ) { if (CoreCount >= 1) { TurboRatioLimit.Dwords.Low &= ~B_MSR_TURBO_RATIO_LIMIT_1C; TurboRatioLimit.Dwords.Low |= PowerMgmtConfig->RatioLimit[0]; } if (CoreCount >= 2) { TurboRatioLimit.Dwords.Low &= ~B_MSR_TURBO_RATIO_LIMIT_2C; TurboRatioLimit.Dwords.Low |= LShiftU64 (PowerMgmtConfig->RatioLimit[1], 8); } if (CoreCount >= 3) { TurboRatioLimit.Dwords.Low &= ~B_MSR_TURBO_RATIO_LIMIT_3C; TurboRatioLimit.Dwords.Low |= LShiftU64 (PowerMgmtConfig->RatioLimit[2], 16); } if (CoreCount >= 4) { TurboRatioLimit.Dwords.Low &= ~B_MSR_TURBO_RATIO_LIMIT_4C; TurboRatioLimit.Dwords.Low |= LShiftU64 (PowerMgmtConfig->RatioLimit[3], 24); } AsmWriteMsr64 (MSR_TURBO_RATIO_LIMIT, TurboRatioLimit.Qword); } } /// /// For Overclocking parts, if a non-default ring ratio is specificed, we need to /// update the ring ratio limit MSR's max limit /// if ((OverclockingBins != 0) && (OcConfig->ClrMaxOcTurboRatio != 0)) { RingRatioMsr.Qword = AsmReadMsr64 (MSR_RING_RATIO_LIMIT); RingRatioMsr.Bytes.FirstByte &= ~MSR_MAX_RING_RATIO_LIMIT_MASK; RingRatioMsr.Bytes.FirstByte |= OcConfig->ClrMaxOcTurboRatio & MSR_MAX_RING_RATIO_LIMIT_MASK; AsmWriteMsr64 (MSR_RING_RATIO_LIMIT, RingRatioMsr.Qword); } return EFI_SUCCESS; } /** Initialize performance and power management features @param[in] CpuPlatformPolicyPpi - The CPU Platform Policy PPI instance **/ VOID ProcessorsPerfPowerInit ( IN OUT PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { EFI_CPUID_REGISTER Cpuid = { 0, 0, 0, 0 }; MSR_REGISTER TempMsr; UINT8 TccActivationOffsetProgrammable; UINT16 MaxBusRatio; UINT16 MinBusRatio; UINT32 Remainder; POWER_MGMT_CONFIG_PPI *PowerMgmtConfig; MSR_REGISTER TurboRatioLimit; UINT8 OneCoreRatioLimit; MSR_REGISTER Ia32MiscEnable; CPU_FAMILY CpuFamilyId; CPU_STEPPING CpuStepping; UINT8 TccActivationOffsetMask; UINT32 WriteFivrSpreadCmd; UINT32 ReadFivrSpreadCmd; UINT32 ReadFivrSpreadData; UINT32 WriteFivrSpreadData; UINT32 MailboxStatus; PowerMgmtConfig = CpuPlatformPolicyPpi->PowerMgmtConfig; CpuFamilyId = GetCpuFamily(); CpuStepping = GetCpuStepping(); /// /// Initializes Processor Prefetcher /// ProcessorsPrefetcherInitialization ( CpuPlatformPolicyPpi->CpuConfig->MlcStreamerPrefetcher, CpuPlatformPolicyPpi->CpuConfig->MlcSpatialPrefetcher ); TempMsr.Qword = AsmReadMsr64 (MSR_PLATFORM_INFO); /// /// Get Tcc Activation Offset Programmable Setting from Platform Info MSR Bits[30] /// TccActivationOffsetProgrammable = (UINT8) RShiftU64 ( (TempMsr.Qword & B_PLATFORM_INFO_PROG_TCC_ACTIVATION_OFFSET), N_PLATFORM_INFO_PROG_TCC_ACTIVATION_OFFSET ); /// /// Get Maximum Non-Turbo bus ratio (HFM) from Platform Info MSR Bits[15:8] /// MaxBusRatio = TempMsr.Bytes.SecondByte; /// /// Get Maximum Efficiency bus ratio (LFM) from Platform Info MSR Bits[47:40] /// MinBusRatio = TempMsr.Bytes.SixthByte; /// /// Tcc activation offset in temperature target MSR changes from 4 bits [27:24] to 6 bits [29:24] on ULT C step onwards /// if ((CpuFamilyId == EnumCpuHswUlt) && (CpuStepping >= EnumHswUltC0)) { TccActivationOffsetMask = 0x3F; } else { TccActivationOffsetMask = 0xF; } /// /// If User slects TccActivationOffset greater than supported progam max supported. /// if(PowerMgmtConfig->TccActivationOffset > TccActivationOffsetMask){ PowerMgmtConfig->TccActivationOffset = TccActivationOffsetMask; } /// /// First check if TCC Activation Offset is programmable PLATFORM INFO MSR [30] /// If TCC Activation Offset is programable, program the TCC Activation offset value /// from Policy, and the Tcc activation offset programming should be dependency on RESET_CPL done. /// if (TccActivationOffsetProgrammable) { TempMsr.Qword = AsmReadMsr64 (MSR_TEMPERATURE_TARGET); TempMsr.Dwords.Low &= ~(TccActivationOffsetMask << N_MSR_TEMPERATURE_TARGET_TCC_OFFSET_LIMIT); PowerMgmtConfig->TccActivationOffset &= TccActivationOffsetMask; TempMsr.Dwords.Low |= LShiftU64 (PowerMgmtConfig->TccActivationOffset, N_MSR_TEMPERATURE_TARGET_TCC_OFFSET_LIMIT); AsmWriteMsr64 (MSR_TEMPERATURE_TARGET, TempMsr.Qword); } /// /// Program Voltage regulator Current Limit's /// TempMsr.Qword = AsmReadMsr64 (MSR_VR_CURRENT_CONFIG); TempMsr.Dwords.High &= ~PSIX_THRESHOLD_MASK; if (CpuPlatformPolicyPpi->Revision >= PEI_CPU_PLATFORM_POLICY_PPI_REVISION_5) { TempMsr.Dwords.High |= ((PowerMgmtConfig->Psi3Threshold << 20) | (PowerMgmtConfig->Psi2Threshold << 10) | PowerMgmtConfig->Psi1Threshold ); if ((CpuFamilyId == EnumCpuHswUlt) && (PowerMgmtConfig->VrPSI4enable)) { TempMsr.Dwords.High |= (0x1 << 30); } } if (PowerMgmtConfig->VrCurrentLimit != 0) { /// /// Check the VR_CURRENT_LOCK bit /// if ((TempMsr.Dwords.Low & B_CURRENT_LIMIT_LOCK) == 0) { TempMsr.Dwords.Low &= ~B_CURRENT_LIMIT_MASK; TempMsr.Dwords.Low |= PowerMgmtConfig->VrCurrentLimit; } else { DEBUG ((EFI_D_INFO, "PPM:: VR Current Limit in MSR_VR_CURRENT_CONFIG is locked\n")); } } /// /// Set CURRENT_LIMIT_LOCK bit in VR_Config_MSR /// if (PowerMgmtConfig->VrCurrentLimitLock) { TempMsr.Dwords.Low |= B_CURRENT_LIMIT_LOCK; } AsmWriteMsr64 (MSR_VR_CURRENT_CONFIG, TempMsr.Qword); if (CpuPlatformPolicyPpi->Revision >= PEI_CPU_PLATFORM_POLICY_PPI_REVISION_4) { TempMsr.Qword = AsmReadMsr64 (MSR_VR_MISC_CONFIG); TempMsr.Dwords.High = RRotU32 (TempMsr.Dwords.High, 8); if (PowerMgmtConfig->VrMiscIoutSlope <= 1023) { /// /// Update IOUT_SLOPE [49:40] /// Must be 0 to 0x3FF (1023 decimal) /// TempMsr.Dwords.High &= ~0x3FF; TempMsr.Dwords.High |= PowerMgmtConfig->VrMiscIoutSlope; } TempMsr.Dwords.High = LRotU32 (TempMsr.Dwords.High, 8); if ((PowerMgmtConfig->VrMiscIoutOffset != 0) && (PowerMgmtConfig->VrMiscIoutOffset <= 625)) { /// /// Update IOUT_OFFSET[39:32] /// MSR encoding = int(value*2^8+0.0625) for positive offsets /// inv(int(value*2^8+0.0625))+1 for negative offsets /// +0.0625 could be ignored /// PowerMgmtConfig->VrMiscIoutOffset = (UINT16) DivU64x32Remainder ( (UINT64) MultU64x32 (PowerMgmtConfig->VrMiscIoutOffset, (UINT32) LShiftU64 (1, 8)), 10000, &Remainder ); if (Remainder >= 5000) { PowerMgmtConfig->VrMiscIoutOffset += 1; } if (PowerMgmtConfig->VrMiscIoutOffsetSign == 1) { /// /// This is negative offset /// PowerMgmtConfig->VrMiscIoutOffset = (UINT8) (~PowerMgmtConfig->VrMiscIoutOffset + 1); } TempMsr.Dwords.High &= ~0xFF; TempMsr.Dwords.High |= PowerMgmtConfig->VrMiscIoutOffset; } AsmWriteMsr64 (MSR_VR_MISC_CONFIG, TempMsr.Qword); } if (CpuPlatformPolicyPpi->Revision >= PEI_CPU_PLATFORM_POLICY_PPI_REVISION_3) { TempMsr.Qword = AsmReadMsr64 (MSR_VR_MISC_CONFIG); TempMsr.Dwords.Low = RRotU32 (TempMsr.Dwords.Low, N_MSR_VR_MISC_CONFIG_MIN_VID_OFFSET); /// /// Update MIN_VID [31:24] /// Must be 0 to 0xFF (255 decimal) resolution 10mV /// 0 equal to 0mV; 0xFF (255 decimal) equal to 2550mV /// TempMsr.Dwords.Low &= ~B_MSR_VR_MISC_CONFIG_MIN_VID_MASK; TempMsr.Dwords.Low |= PowerMgmtConfig->VrMiscMinVid; TempMsr.Dwords.Low = LRotU32 (TempMsr.Dwords.Low, N_MSR_VR_MISC_CONFIG_MIN_VID_OFFSET); /// /// Update IDLE_EXIT_RAMP_RATE[50] /// TempMsr.Qword &= ~B_MSR_VR_MISC_CONFIG_IDLE_EXIT_RAMP_RATE; if (PowerMgmtConfig->VrMiscIdleExitRampRate) { TempMsr.Qword |= B_MSR_VR_MISC_CONFIG_IDLE_EXIT_RAMP_RATE; } /// /// Update IDLE_ENTRY_RAMP_RATE[51] /// TempMsr.Qword &= ~B_MSR_VR_MISC_CONFIG_IDLE_ENTRY_RAMP_RATE; if (PowerMgmtConfig->VrMiscIdleEntryRampRate) { TempMsr.Qword |= B_MSR_VR_MISC_CONFIG_IDLE_ENTRY_RAMP_RATE; } /// /// Update IDLE_ENTRY_DECAY_ENABLE[52] /// TempMsr.Qword &= ~B_MSR_VR_MISC_CONFIG_IDLE_ENTRY_DECAY_ENABLE; if (PowerMgmtConfig->VrMiscIdleEntryDecayEnable) { TempMsr.Qword |= B_MSR_VR_MISC_CONFIG_IDLE_ENTRY_DECAY_ENABLE; } if (CpuFamilyId == EnumCpuHswUlt) { /// /// Update IDLE_ENTRY_DECAY_ENABLE[52] /// TempMsr.Qword &= ~B_MSR_VR_MISC_CONFIG_SLOW_SLEW_RATE_CONFIG_MASK; switch (PowerMgmtConfig->VrMiscSlowSlewRateConfig) { case 1: TempMsr.Qword |= V_MSR_VR_MISC_CONFIG_SLOW_SLEW_RATE_CONFIG_FAST_4; break; case 2: TempMsr.Qword |= V_MSR_VR_MISC_CONFIG_SLOW_SLEW_RATE_CONFIG_FAST_8; break; case 3: TempMsr.Qword |= V_MSR_VR_MISC_CONFIG_SLOW_SLEW_RATE_CONFIG_FAST_16; break; case 0: default: TempMsr.Qword |= V_MSR_VR_MISC_CONFIG_SLOW_SLEW_RATE_CONFIG_FAST_2; break; } } AsmWriteMsr64 (MSR_VR_MISC_CONFIG, TempMsr.Qword); if (CpuFamilyId == EnumCpuHswUlt) { TempMsr.Qword = AsmReadMsr64 (MSR_VR_MISC_CONFIG2); /// /// Update FAST_RAMP_VOLTAGE [7:0] /// Must be 0 to 0xFF (255 decimal) resolution 10mV /// 0 equal to 0mV; 0xFF (255 decimal) equal to 2550mV /// TempMsr.Bytes.FirstByte &= ~B_MSR_VR_MISC_CONFIG2_FAST_RAMP_VOLTAGE_MASK; TempMsr.Bytes.FirstByte |= PowerMgmtConfig->VrMisc2FastRampVoltage; /// /// Update MIN_C8_VOLTAGE [15:8] /// Must be 0 to 0xFF (255 decimal) resolution 10mV /// 0 equal to 0mV; 0xFF (255 decimal) equal to 2550mV /// TempMsr.Bytes.SecondByte &= ~B_MSR_VR_MISC_CONFIG2_MIN_C8_VOLTAGE_MASK; TempMsr.Bytes.SecondByte |= PowerMgmtConfig->VrMisc2MinC8Voltage; AsmWriteMsr64 (MSR_VR_MISC_CONFIG2, TempMsr.Qword); } } /// /// Initializes XE OR Overclocking support /// XeInit (CpuPlatformPolicyPpi->PowerMgmtConfig, CpuPlatformPolicyPpi->OverclockingConfig); /// /// Set processor P state to HFM, LFM or TURBO /// AsmCpuid (CPUID_VERSION_INFO, &Cpuid.RegEax, &Cpuid.RegEbx, &Cpuid.RegEcx, &Cpuid.RegEdx); /// /// Check to see if CPU is GV3 capable - GV3 is fused Enabled /// if ((Cpuid.RegEcx & B_CPUID_VERSION_INFO_ECX_EIST) == B_CPUID_VERSION_INFO_ECX_EIST) { Ia32MiscEnable.Qword = AsmReadMsr64 (MSR_IA32_MISC_ENABLE); Ia32MiscEnable.Qword |= B_MSR_IA32_MISC_ENABLE_EIST; AsmWriteMsr64 (MSR_IA32_MISC_ENABLE, Ia32MiscEnable.Qword); TempMsr.Qword = AsmReadMsr64 (MSR_IA32_PERF_CTRL); TempMsr.Qword &= ~B_IA32_PERF_CTRLP_STATE_TARGET; if ((CpuPlatformPolicyPpi->Revision >= PEI_CPU_PLATFORM_POLICY_PPI_REVISION_3) && (PowerMgmtConfig->BootInLfm == 2)) { /// /// Set processor P state as TURBO_RATIO_LIMIT_1C if available /// AsmCpuid (CPUID_POWER_MANAGEMENT_PARAMS, &Cpuid.RegEax, &Cpuid.RegEbx, &Cpuid.RegEcx, &Cpuid.RegEdx); if (((Cpuid.RegEax & B_CPUID_POWER_MANAGEMENT_EAX_TURBO) == B_CPUID_POWER_MANAGEMENT_EAX_TURBO) || ((Ia32MiscEnable.Qword & B_MSR_IA32_MISC_DISABLE_TURBO) == B_MSR_IA32_MISC_DISABLE_TURBO)) { /// /// Temporarily enable Turbo and it will be reset in DXE phase /// Ia32MiscEnable.Qword &= ~B_MSR_IA32_MISC_DISABLE_TURBO; AsmWriteMsr64 (MSR_IA32_MISC_ENABLE, Ia32MiscEnable.Qword); /// /// Set processor P state as TURBO_RATIO_LIMIT_1C /// TurboRatioLimit.Qword = AsmReadMsr64 (MSR_TURBO_RATIO_LIMIT); OneCoreRatioLimit = (UINT8) (TurboRatioLimit.Dwords.Low & B_MSR_TURBO_RATIO_LIMIT_1C); TempMsr.Qword |= LShiftU64 (OneCoreRatioLimit, N_IA32_PERF_CTRLP_STATE_TARGET); } else { /// /// Turbo is not available, down to HFM /// DEBUG ((EFI_D_INFO, "CPU: Turbo mode is not available, down to HFM mode.\n")); TempMsr.Qword |= LShiftU64 (MaxBusRatio, N_IA32_PERF_CTRLP_STATE_TARGET); } } else if (PowerMgmtConfig->BootInLfm == CPU_FEATURE_DISABLE) { /// /// Set processor P state as HFM /// TempMsr.Qword |= LShiftU64 (MaxBusRatio, N_IA32_PERF_CTRLP_STATE_TARGET); } else { /// /// Set processor P state as LFM /// TempMsr.Qword |= LShiftU64 (MinBusRatio, N_IA32_PERF_CTRLP_STATE_TARGET); } AsmWriteMsr64 (MSR_IA32_PERF_CTRL, TempMsr.Qword); } /// /// FIVR Spread Spectrum control is available on C0 steppings onward for all CPU families /// if ((CpuFamilyId == EnumCpuHswUlt && CpuStepping >= EnumHswUltC0) || (CpuFamilyId == EnumCpuHsw && CpuStepping >= EnumHswC0) || (CpuFamilyId == EnumCpuCrw && CpuStepping >= EnumCrwC0)){ /// /// FivrSscPercent is specified in 1/10th percent increments. Range is 0-249. /// if (PowerMgmtConfig->FivrSscPercent > MAX_FIVR_SSC_PERCENT) { PowerMgmtConfig->FivrSscPercent = MAX_FIVR_SSC_PERCENT; } /// /// Read current FIVR SSC Spread percentage /// ReadFivrSpreadCmd = 0x8000000E; ReadFivrSpreadData = 0; MailboxRead(MAILBOX_TYPE_PCODE, ReadFivrSpreadCmd, &ReadFivrSpreadData, &MailboxStatus); //(AMI_CHG)> { UINT32 i = 0; while (MailboxStatus == PCODE_MAILBOX_CC_VR_INTERFACE_LOCKED) { MailboxRead(MAILBOX_TYPE_PCODE, ReadFivrSpreadCmd, &ReadFivrSpreadData, &MailboxStatus); i++; if (i == 100) break; } } //<(AMI_CHG) if (PowerMgmtConfig->FivrSscEnable) { WriteFivrSpreadData = ( ((PowerMgmtConfig->FivrSscPercent)*1024)/NUM_TENTHS_TO_PERCENTAGE) | FIVR_SSC_LOCK_BIT; } else { /// /// If disabling FIVR SSC, send 0% spread and lock interface /// WriteFivrSpreadData = FIVR_SSC_LOCK_BIT; } DEBUG ((EFI_D_INFO, "FIVR: Read FIVR Spread = %X, Write FIVR Spread = %X\n", ReadFivrSpreadData, WriteFivrSpreadData)); /// /// Only update SSC percentage if needed /// if (ReadFivrSpreadData != WriteFivrSpreadData) { DEBUG ((EFI_D_INFO, "FIVR: Update FIVR Spread = %X\n", WriteFivrSpreadData)); WriteFivrSpreadCmd = 0x8000000F; MailboxWrite(MAILBOX_TYPE_PCODE, WriteFivrSpreadCmd, WriteFivrSpreadData, &MailboxStatus); //(AMI_CHG)> { UINT32 i = 0; while (MailboxStatus == PCODE_MAILBOX_CC_VR_INTERFACE_LOCKED) { MailboxWrite(MAILBOX_TYPE_PCODE, WriteFivrSpreadCmd, WriteFivrSpreadData, &MailboxStatus); i++; if (i == 100) break; } } //<(AMI_CHG) if (MailboxStatus != PCODE_MAILBOX_CC_SUCCESS) { DEBUG ((EFI_D_ERROR, "FIVR: Error updating FIVR Spread. Mailbox Status = %X\n", MailboxStatus)); } } } else { DEBUG ((EFI_D_ERROR, "FIVR: FIVR Spread adjustment requires C0 stepping or greater. Bypassing FIVR Spread flow.\n")); } return; } /** Loads the Processor Microcode & Install the Cache PPI @param[in] FfsHeader - Pointer to an alleged FFS file. @param[in] PeiServices - General purpose services available to every PEIM. @retval EFI_STATUS - the status code returned from any sub-routine **/ EFI_STATUS PeimInitializeCpu ( IN EFI_FFS_FILE_HEADER *FfsHeader, IN EFI_PEI_SERVICES **PeiServices ) { EFI_STATUS Status; PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi; Status = PeiServicesLocatePpi ( &gPeiCpuPlatformPolicyPpiGuid, 0, NULL, (VOID **) &CpuPlatformPolicyPpi ); if (EFI_ERROR (Status)) { return Status; } // // Dump Cpu Platform Policy // CpuPeiPolicyDump(CpuPlatformPolicyPpi); /// /// Install Cache PPI /// Status = CacheInitPpiInit (); ASSERT_EFI_ERROR (Status); /// /// Install Notify /// Status = PeiServicesNotifyPpi (&mNotifyList[0]); ASSERT_EFI_ERROR (Status); /// /// Initializes Overclocking support /// CpuOcInit(PeiServices, CpuPlatformPolicyPpi); /// /// Initializes Performance and Power Settings /// ProcessorsPerfPowerInit (CpuPlatformPolicyPpi); /// /// Init XMM support /// XmmInit (); /// /// Pfat Initialization /// PfatInit (PeiServices, CpuPlatformPolicyPpi); /// /// Boot Guard Initializatoin /// BootGuardInit (PeiServices, CpuPlatformPolicyPpi); return Status; } /** Build BIST HOB @param[in] PeiServices - Indirect reference to the PEI Services Table. @param[in] NotifyDescriptor - Address of the notification descriptor data structure. Type EFI_PEI_NOTIFY_DESCRIPTOR is defined above. @param[in] Ppi - Address of the PPI that was installed. @retval EFI_SUCCESS - Hob built or not necessary **/ EFI_STATUS EFIAPI BuildBistHob ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; EFI_BOOT_MODE BootMode; EFI_SEC_PLATFORM_INFORMATION_PPI *SecPlatformInformationPpi; UINT64 InformationSize; SEC_PLATFORM_INFORMATION_RECORD *SecPlatformInformation; VOID *Hob; Status = (**PeiServices).GetBootMode (PeiServices, &BootMode); if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) { return EFI_SUCCESS; } Status = PeiServicesLocatePpi ( &gEfiSecPlatformInformationPpiGuid, ///< GUID 0, ///< INSTANCE NULL, ///< EFI_PEI_PPI_DESCRIPTOR (VOID ** ) &SecPlatformInformationPpi ///< PPI ); if (Status == EFI_NOT_FOUND) { return EFI_SUCCESS; } if (EFI_ERROR (Status)) { return Status; } InformationSize = 0; SecPlatformInformation = NULL; Status = SecPlatformInformationPpi->PlatformInformation ( PeiServices, &InformationSize, SecPlatformInformation ); if (Status == EFI_BUFFER_TOO_SMALL) { Status = PeiServicesAllocatePool ( (UINTN) InformationSize, (VOID **) &SecPlatformInformation ); if (EFI_ERROR (Status)) { return Status; } Status = SecPlatformInformationPpi->PlatformInformation ( PeiServices, &InformationSize, SecPlatformInformation ); } if (EFI_ERROR (Status)) { return Status; } Hob = BuildGuidDataHob ( &gEfiHtBistHobGuid, SecPlatformInformation, (UINTN) InformationSize ); ASSERT (Hob != NULL); return Status; } /** Dump RC CPU and PPM platform policies @param[in] CpuPlatformPolicyPpi - Address of the cpu platform policy ppi. **/ VOID CpuPeiPolicyDump ( IN PEI_CPU_PLATFORM_POLICY_PPI *CpuPlatformPolicyPpi ) { #ifdef EFI_DEBUG UINTN Index; CPU_CONFIG_PPI *CpuConfig; POWER_MGMT_CONFIG_PPI *PowerMgmtConfig; SECURITY_CONFIG_PPI *SecurityConfig; OVERCLOCKING_CONFIG_PPI *OverclockingConfig; CpuConfig = CpuPlatformPolicyPpi->CpuConfig; PowerMgmtConfig = CpuPlatformPolicyPpi->PowerMgmtConfig; SecurityConfig = CpuPlatformPolicyPpi->SecurityConfig; OverclockingConfig = CpuPlatformPolicyPpi->OverclockingConfig; DEBUG ((EFI_D_INFO, "\n------------------------ CpuPlatformPolicyPpi Dump Begin -----------------\n")); // // CPU_CONFIG // DEBUG ((EFI_D_INFO, " CPU:: BistOnReset : 0x%X\n", CpuConfig->BistOnReset)); DEBUG ((EFI_D_INFO, " CPU:: HyperThreading : 0x%X\n", CpuConfig->HyperThreading)); DEBUG ((EFI_D_INFO, " CPU:: CpuRatioOverride : 0x%X\n", CpuConfig->CpuRatioOverride)); DEBUG ((EFI_D_INFO, " CPU:: VmxEnable : 0x%X\n", CpuConfig->VmxEnable)); DEBUG ((EFI_D_INFO, " CPU:: Pfat Feature: 0x%X\n", CpuConfig->Pfat)); DEBUG ((EFI_D_INFO, " CPU:: MlcStreamerPrefetcher : 0x%X\n", CpuConfig->MlcStreamerPrefetcher)); DEBUG ((EFI_D_INFO, " CPU:: MlcSpatialPrefetcher : 0x%X\n", CpuConfig->MlcSpatialPrefetcher)); DEBUG ((EFI_D_INFO, " CPU:: ActiveCoreCount : 0x%X\n", CpuConfig->ActiveCoreCount)); DEBUG ((EFI_D_INFO, " CPU:: CpuRatio : 0x%X\n", CpuConfig->CpuRatio)); DEBUG ((EFI_D_INFO, " CPU:: MaxNonTurboRatio : 0x%X\n", CpuConfig->CpuMaxNonTurboRatio)); // // POWER_MGMT_CONFIG // DEBUG ((EFI_D_INFO, " PPM:: BootInLfm : 0x%X\n", PowerMgmtConfig->BootInLfm)); DEBUG ((EFI_D_INFO, " PPM:: TccActivationOffset : 0x%X\n", PowerMgmtConfig->TccActivationOffset)); DEBUG ((EFI_D_INFO, " PPM:: VrCurrentLimit : 0x%X\n", PowerMgmtConfig->VrCurrentLimit)); DEBUG ((EFI_D_INFO, " PPM:: VrCurrentLimitLock : 0x%X\n", PowerMgmtConfig->VrCurrentLimitLock)); DEBUG ((EFI_D_INFO, " PPM:: Xe : 0x%X\n", PowerMgmtConfig->Xe)); DEBUG ((EFI_D_INFO, " PPM:: RatioLimit[4] : 0x%X , 0x%X , 0x%X , 0x%X \n", PowerMgmtConfig->RatioLimit[0], \ PowerMgmtConfig->RatioLimit[1], \ PowerMgmtConfig->RatioLimit[2], \ PowerMgmtConfig->RatioLimit[3])); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIoutSlope : 0x%X\n", PowerMgmtConfig->VrMiscIoutSlope)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIoutOffsetSign : 0x%X\n", PowerMgmtConfig->VrMiscIoutOffsetSign)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIoutOffset : 0x%X\n", PowerMgmtConfig->VrMiscIoutOffset)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscMinVid : 0x%X\n", PowerMgmtConfig->VrMiscMinVid)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIdleExitRampRate : 0x%X\n", PowerMgmtConfig->VrMiscIdleExitRampRate)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIdleEntryRampRate : 0x%X\n", PowerMgmtConfig->VrMiscIdleEntryRampRate)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscIdleEntryDecayEnable : 0x%X\n", PowerMgmtConfig->VrMiscIdleEntryDecayEnable)); DEBUG ((EFI_D_INFO, " PPM:: VrMiscSlowSlewRateConfig : 0x%X\n", PowerMgmtConfig->VrMiscSlowSlewRateConfig)); DEBUG ((EFI_D_INFO, " PPM:: VrMisc2FastRampVoltage : 0x%X\n", PowerMgmtConfig->VrMisc2FastRampVoltage)); DEBUG ((EFI_D_INFO, " PPM:: VrMisc2MinC8Voltage : 0x%X\n", PowerMgmtConfig->VrMisc2MinC8Voltage)); DEBUG ((EFI_D_INFO, " PPM:: FivrSscEnable : 0x%X\n", PowerMgmtConfig->FivrSscEnable)); DEBUG ((EFI_D_INFO, " PPM:: FivrSscPercent : 0x%X\n", PowerMgmtConfig->FivrSscPercent)); // // SECURITY_CONFIG : PFAT_CONFIG // DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : Version : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.Version)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : PlatId[16] :\n")); for (Index = 0; Index < 16; Index++) { if (Index == 15) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PlatId[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.PlatId[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : PkgAttributes : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.PkgAttributes)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : PslMajorVer : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.PslMajorVer)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : PslMinorVer : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.PslMinorVer)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : ScriptSectionSize : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.ScriptSectionSize)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : DataSectionSize : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.DataSectionSize)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : BiosSvn : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.BiosSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : EcSvn : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.EcSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PUP_HEADER : VendorSpecific : 0x%X\n", SecurityConfig->PfatConfig->PupHeader.VendorSpecific)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PpdtSize : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PpdtSize)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PpdtMajVer : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PpdtMajVer)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PpdtMinVer : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PpdtMinVer)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PlatId[16] :\n")); for (Index = 0; Index < 16; Index++) { if (Index == 15) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PlatId[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.PlatId[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PkeySlot0[32] :\n")); for (Index = 0; Index < 32; Index++) { if ((Index == 15) || (Index == 31)) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PkeySlot0[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.PkeySlot0[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PkeySlot1[32] :\n")); for (Index = 0; Index < 32; Index++) { if ((Index == 15) || (Index == 31)) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PkeySlot1[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.PkeySlot1[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PkeySlot2[32] :\n")); for (Index = 0; Index < 32; Index++) { if ((Index == 15)|| (Index == 31)) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PkeySlot2[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.PkeySlot2[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PfatModSvn : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PfatModSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : BiosSvn : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.BiosSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : ExecLim : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.ExecLim)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : PlatAttr : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.PlatAttr)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcCmd : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcCmd)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcData : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcData)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcCmdGetSvn : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcCmdGetSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcCmdOpen : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcCmdOpen)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcCmdClose : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcCmdClose)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : EcCmdPortTest : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.EcCmdPortTest)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : LastSfam : 0x%X\n", SecurityConfig->PfatConfig->Ppdt.LastSfam)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : SfamData[64] :\n")); // // Change the array size according to MAX_SFAM_COUNT // for (Index = 0; Index < 64; Index++) { if ((Index == 15) || (Index == 31) || (Index == 47) || (Index == 63) ) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->Ppdt.SfamData[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->Ppdt.SfamData[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PpdtHash[4] : 0x%lX , 0x%lX , 0x%lX , 0x%lX \n", SecurityConfig->PfatConfig->PpdtHash[0], \ SecurityConfig->PfatConfig->PpdtHash[1], \ SecurityConfig->PfatConfig->PpdtHash[2], \ SecurityConfig->PfatConfig->PpdtHash[3])); DEBUG ((EFI_D_INFO, " PFAT:: NumSpiComponents : 0x%x\n", SecurityConfig->PfatConfig->NumSpiComponents)); DEBUG ((EFI_D_INFO, " PFAT:: PPDT : ComponentSize[8] :\n")); for (Index = 0; Index < SecurityConfig->PfatConfig->NumSpiComponents; Index++) { if (Index == 7) { DEBUG ((EFI_D_INFO, " 0x%X\n", SecurityConfig->PfatConfig->ComponentSize[Index])); } else { DEBUG ((EFI_D_INFO, " 0x%X ,", SecurityConfig->PfatConfig->ComponentSize[Index])); } } DEBUG ((EFI_D_INFO, " \n")); DEBUG ((EFI_D_INFO, " PFAT:: PfatMemSize : 0x%X\n", SecurityConfig->PfatConfig->PfatMemSize)); DEBUG ((EFI_D_INFO, " PFAT:: EcCmdDiscovery : 0x%X\n", SecurityConfig->PfatConfig->EcCmdDiscovery)); DEBUG ((EFI_D_INFO, " PFAT:: EcCmdProvisionEav : 0x%X\n", SecurityConfig->PfatConfig->EcCmdProvisionEav)); DEBUG ((EFI_D_INFO, " PFAT:: EcCmdLock : 0x%X\n", SecurityConfig->PfatConfig->EcCmdLock)); DEBUG ((EFI_D_INFO, " PFAT:: PFATLOG:: Version : 0x%X\n", SecurityConfig->PfatConfig->PfatLog.Version)); DEBUG ((EFI_D_INFO, " PFAT:: PFATLOG:: LastPage : 0x%X\n", SecurityConfig->PfatConfig->PfatLog.LastPage)); DEBUG ((EFI_D_INFO, " PFAT:: PFATLOG:: LoggingOptions : 0x%X\n", SecurityConfig->PfatConfig->PfatLog.LoggingOptions)); DEBUG ((EFI_D_INFO, " PFAT:: PFATLOG:: PfatModSvn : 0x%X\n", SecurityConfig->PfatConfig->PfatLog.PfatModSvn)); DEBUG ((EFI_D_INFO, " PFAT:: PFATLOG:: NumOfEntriesInLog : 0x%X\n", SecurityConfig->PfatConfig->PfatLog.NumOfEntriesInLog)); // // SECURITY_CONFIG : TXT_CONFIG // #if defined(TXT_SUPPORT_FLAG) && (TXT_SUPPORT_FLAG == 1) DEBUG ((EFI_D_INFO, " TXT:: SinitMemorySize : 0x%lX\n", SecurityConfig->TxtConfig->SinitMemorySize)); DEBUG ((EFI_D_INFO, " TXT:: TxtHeapMemorySize : 0x%lX\n", SecurityConfig->TxtConfig->TxtHeapMemorySize)); DEBUG ((EFI_D_INFO, " TXT:: TxtDprMemoryBase : 0x%lX\n", SecurityConfig->TxtConfig->TxtDprMemoryBase)); DEBUG ((EFI_D_INFO, " TXT:: TxtDprMemorySize : 0x%lX\n", SecurityConfig->TxtConfig->TxtDprMemorySize)); DEBUG ((EFI_D_INFO, " TXT:: BiosAcmBase : 0x%lX\n", SecurityConfig->TxtConfig->BiosAcmBase)); DEBUG ((EFI_D_INFO, " TXT:: BiosAcmSize : 0x%lX\n", SecurityConfig->TxtConfig->BiosAcmSize)); DEBUG ((EFI_D_INFO, " TXT:: McuUpdateDataAddr : 0x%lX\n", SecurityConfig->TxtConfig->McuUpdateDataAddr)); DEBUG ((EFI_D_INFO, " TXT:: TgaSize : 0x%lX\n", SecurityConfig->TxtConfig->TgaSize)); DEBUG ((EFI_D_INFO, " TXT:: TxtLcpPdBase : 0x%lX\n", SecurityConfig->TxtConfig->TxtLcpPdBase)); DEBUG ((EFI_D_INFO, " TXT:: TxtLcpPdSize : 0x%lX\n", SecurityConfig->TxtConfig->TxtLcpPdSize)); #else DEBUG ((EFI_D_INFO, " TXT CONFIG:: UNSUPPORTED \n")); #endif // // OVERCLOCKING_CONFIG // DEBUG ((EFI_D_INFO, " OC:: CoreVoltageOffset : 0x%X\n", OverclockingConfig->CoreVoltageOffset)); DEBUG ((EFI_D_INFO, " OC:: CoreVoltageOverride : 0x%X\n", OverclockingConfig->CoreVoltageOverride)); DEBUG ((EFI_D_INFO, " OC:: CoreExtraTurboVoltage : 0x%X\n", OverclockingConfig->CoreExtraTurboVoltage)); DEBUG ((EFI_D_INFO, " OC:: CoreMaxOcTurboRatio : 0x%X\n", OverclockingConfig->CoreMaxOcTurboRatio)); DEBUG ((EFI_D_INFO, " OC:: ClrVoltageOffset : 0x%X\n", OverclockingConfig->ClrVoltageOffset)); DEBUG ((EFI_D_INFO, " OC:: ClrVoltageOverride : 0x%X\n", OverclockingConfig->ClrVoltageOverride)); DEBUG ((EFI_D_INFO, " OC:: ClrExtraTurboVoltage : 0x%X\n", OverclockingConfig->ClrExtraTurboVoltage)); DEBUG ((EFI_D_INFO, " OC:: ClrMaxOcTurboRatio : 0x%X\n", OverclockingConfig->ClrMaxOcTurboRatio)); DEBUG ((EFI_D_INFO, " OC:: SvidVoltageOverride : 0x%X\n", OverclockingConfig->SvidVoltageOverride)); DEBUG ((EFI_D_INFO, " OC:: SvidEnable : 0x%X\n", OverclockingConfig->SvidEnable)); DEBUG ((EFI_D_INFO, " OC:: FivrFaultsEnable : 0x%X\n", OverclockingConfig->FivrFaultsEnable)); DEBUG ((EFI_D_INFO, " OC:: FivrEfficiencyEnable : 0x%X\n", OverclockingConfig->FivrEfficiencyEnable)); DEBUG ((EFI_D_INFO, " OC:: CoreVoltageMode : 0x%X\n", OverclockingConfig->CoreVoltageMode)); DEBUG ((EFI_D_INFO, " OC:: ClrVoltageMode : 0x%X\n", OverclockingConfig->ClrVoltageMode)); DEBUG ((EFI_D_INFO, " OC:: OcSupport : 0x%X\n", OverclockingConfig->OcSupport)); DEBUG ((EFI_D_INFO, "\n------------------------ CpuPlatformPolicyPpi Dump End -----------------\n\n")); #endif }