diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Chipset/NB/NBPEI.c | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'Chipset/NB/NBPEI.c')
-rw-r--r-- | Chipset/NB/NBPEI.c | 3039 |
1 files changed, 3039 insertions, 0 deletions
diff --git a/Chipset/NB/NBPEI.c b/Chipset/NB/NBPEI.c new file mode 100644 index 0000000..52f61f4 --- /dev/null +++ b/Chipset/NB/NBPEI.c @@ -0,0 +1,3039 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/BIN/Chipset/Intel/NorthBridge/Haswell/Intel SystemAgent NB Chipset/NBPEI.c 57 5/28/14 3:03a Dennisliu $ +// +// $Revision: 57 $ +// +// $Date: 5/28/14 3:03a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/Chipset/Intel/NorthBridge/Haswell/Intel SystemAgent NB Chipset/NBPEI.c $ +// +// 57 5/28/14 3:03a Dennisliu +// [TAG] EIP161790 +// [Category] Improvement +// [Description] DRAM Init BIT should be set after saving MRC S3 data to +// NVRAM in DXE Phase as Intel suggested. +// [Files] NBPei.c; NBDxe.c; +// +// 56 8/14/13 6:44a Ireneyang +// [TAG] EIP129631 +// [Category] BrugFix +// [Symptom] RBU function is not working +// [Description] 1. The current make file doesnˇ¦t build *.hdr file, +// we can use that file to verify RBU function under DOS. +// 2. We could build *.hdr file manually, and also verified +// the RBU function under DOS. But the RBU function is +// not working. +// [Files] MemoryInit.sdl; MemoryInit.c; NBPEI.c; +// +// 55 6/26/13 4:35a Ireneyang +// [TAG] None +// [Category] Improvement +// [Description] Add new related items into structure. +// [Files] NBPEI.c; +// +// 53 6/03/13 2:04a Ireneyang +// [TAG] None +// [Category] Improvement +// [Description] Fix some PEG cards can't be detected. +// [Files] NBPEI.c; +// +// 52 5/22/13 6:41a Ireneyang +// [TAG] None +// [Category] Improvement +// [Description] Add Token SG_GPIO_SUPPORT for GpioSupport. +// [Files] NB.sdl; NBPEI.c; +// +// 51 5/13/13 6:26a Ireneyang +// [TAG] None +// [Category] Improvement +// [Description] Add PanelPowerEnable for enabling/disabling VDD force +// bit. +// (Required only for early enabling of eDP panel) +// [Files] NBSetup.c; GetSetupData.c; NbSetupData.h; NBPEI.c; +// +// 50 5/09/13 7:20a Ireneyang +// [TAG] EIP119332 +// [Category] BrugFix +// [Symptom] Some PEG Lan Cards on NorthBridge would cause hanging +// issue when waking through them. +// [RootCause] These Lan cards on NorthBridge do not clear PME for Nb's +// slots. Therefore, this causes hanging issue. +// [Solution] Checking if this PEG card is Lan card. If it's, then +// clear PME status. +// [Files] NBPEI.c; +// +// 48 5/09/13 7:08a Ireneyang +// [TAG] EIP118377 +// [Category] BugFix +// [Symptom] System became resuming from S5 when system is resuming +// from S4. +// [Description] Reproducing steps (UEFI OS) +// 1. Boot into USB key, run afudos.exe +// 2. Remove USB key. +// 3. Warm reset and don't press any key. +// 4. Screen will show "Reboot and select proper Boot +// device... +// No boot option" +// 5. Warm reset and press DEL to enter BIOS setup. +// 6. Change "Launch Video OpROM policy" to "UEFI only". +// 7. Save and reset. +// 8. Press DEL key to enter BIOS setup. +// 9. Change "Launch CSM" to "Disable" +// 10. Save and reset,enter OS(UEFI WIN8) +// 11. Open any file and do "Hibernate" to enter inot S4. +// 12. Power on, resuming back from S4 to desktop, the file +// would be disappeared. It looks like it doesn't resume +// back from S4 but S5. +// [RootCause] It's out of variable type for S4 resume. +// [Solution] The variable type should be +// "PreviousMemoryTypeInformation" +// but MemoryTypeInformation. +// [Files] NBPEI.c +// +// 47 4/01/13 11:48p Ireneyang +// [TAG] None +// [Severity] Improvement +// [Description] Reduce boot time through PEG. +// [Files] NB.mak; NBDxe.c; NBPEI.c; NBPPI.h; Sa.asl; +// PcieComplex.c; GraphicsInit.c; PciExpressInit.c; +// +// 46 3/14/13 1:37a Ireneyang +// [TAG] None +// [Severity] Improvement +// [Description] Fix some PEG card with no VGA can't work normally under +// SG mode. +// [Files] NBPEI.c; +// +// 45 3/07/13 6:14a Ireneyang +// [TAG] None +// [Severity] Improvement +// [Description] Make some default SaPlatformPolicy items flexible. +// Define some SaPlatformPolicy items into NB_SETUP_DATA +// structure. +// [Files] NbSetupData.h; GetSetupData.c; NBPEI.c; +// +// 44 3/07/13 3:53a Ireneyang +// [TAG] None +// [Severity] Improvement +// [Description] Add "Hot only" option for Memory Refresh 2x support to +// meet Intel Spec. +// [Files] NBPEI.c; NB.uni; NB.sd; NbSetupData.h; GetSetupData.c; +// +// 43 3/04/13 3:16a Ireneyang +// [TAG] EIP115090 +// [Category] Improvement +// [Description] Memory data hasn't been cleared after running MRC base +// memory test. +// [Files] NB.sdl; NBPEI.c; +// +// 41 2/09/13 10:23a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Update SA RC 1.1.0 +// [Files] NBPei.c; GetSetupData.c; NbSetupData.h; NBDXE.c; +// +// 40 1/28/13 5:54a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Update SA RC 1.0. +// [Files] NBPei.c; GetSetupData.c; NbSetupData.h; NBDXE.c; +// NB.sd; NB.uni; NBDxeBoard.c +// +// 39 1/21/13 3:55a Jeffch +// [TAG] None +// [Severity] Bug Fix +// [Description] Fixed RMT memory type error issue for ULT. +// [Files] NBPei.c; +// +// 38 1/15/13 4:07a Jeffch +// [TAG] None +// [Severity] Bug Fix +// [Description] Changed MRC error report status for SA RC 0.90. +// [Files] NBPei.c; MemoryInit.c; +// +// 37 1/14/13 6:06a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Create setup item for SA RC 0.90. +// [Files] NBPei.c; GetNbSetupData.c NB.sd; NB.uni; +// +// 36 1/10/13 5:57a Jeffch +// +// [TAG] None +// [Severity] Important +// [Description] Create DDR PowerDown and idle counter for setup item. +// [Files] NBPei.c; NB.sd; NB.uni; GetSetupData.c; NbSetupData.h +// +// 35 1/03/13 7:27a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Follow MRC error report status. +// [Files] NBPei.c +// [TAG] None +// [Severity] Improvement +// [Description] Use SG GPIO ULT by token. +// [Files] NBPei.c +// +// 34 12/24/12 2:55a Jeffch +// [TAG] None +// [Category] Improvement +// [Description] added ULT SKU auto disable PEG. +// [Files] NBPei.c; NBDxe.c; NbPlatform.h; NB.sd; +// [TAG] None +// [Category] Bug Fix +// [Description] Remove tRPab and fixed XTU build fail issue. +// [Files] NBPei.c; NBDxe.c; NB.sd; +// +// 33 12/22/12 2:26a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Create setup item for SA RC 0.81. +// [Files] NBPei.c; GetNbSetupData.c NB.sd; NB.uni; +// [TAG] None +// [Severity] Bug Fix +// [Description] Fxied XTU MRC Timing bug. +// [Files] NBPei.c; +// +// 32 12/18/12 5:14a Jeffch +// [TAG] None +// [Severity] Spec update +// [Description] Update SA RC 0.81. +// [Files] NBDxe.c; NBPei.c +// +// 31 12/03/12 5:56a Jeffch +// [TAG] None +// [Category] Improvement +// [Description] optimize DetectNonComplaint function. +// [Description] NBPEI.c, NBPPI.h, NBDxe.c +// [TAG] None +// [Category] Improvement +// [Description] Change for mxm SgDgpuPwrEnable->Active = +// ACTIVE_dGPU_PWR_EN. +// [Description] NBPEI.c, NBPPI.h, NBDxe.c +// +// 30 11/28/12 9:52p Jeffch +// [TAG] DetectNonComplaint +// [Category] Improvement +// [Description] added peg DetectNonComplaint function. +// +// 29 11/20/12 2:41a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Update SA RC 0.80. +// [Files] NBDxe.c; NBPei.c +// +// 28 11/14/12 5:37a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Update XTU4.x function +// [Files] NBPei.c; GetSetupData.c; NbSetupData.h; NBDXE.c; NB.sd; +// NB.uni +// +// 27 11/12/12 12:11a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Change name SMRAMC to R_SA_SMRAMC for build error. +// [Files] NBPei.c; +// +// 26 11/07/12 6:19a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Support ULT one BIOS +// [Files] NBPei.c; GetSetupData.c; NbSetupData.h +// +// 25 10/30/12 7:05a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Update SA RC 0.72. +// [Files] NBDxe.c; NBPei.c +// +// 2 10/22/12 6:38a Jeffch +// +// 24 10/18/12 11:04p Jeffch +// [TAG] None +// [Severity] Important +// [Description] Support Disable AB SEG. +// [Files] NBPei.c; +// +// 23 10/16/12 9:38a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Remove invalid code. +// [Files] NBPei.c; +// +// 22 10/14/12 5:17a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Follow SA RC 0.71. +// [Files] NBPei.c, NBDxe.c; NBGeneric.c; NBCspLib.h; NBSetup.c; +// Nb.sd; GetSetupData.c +// +// 21 10/14/12 12:21a Jeffch +// [TAG] None +// [Severity] Important +// [Description] Update by XTU4.0. +// [Files] NBPei.c, NBDxe.c, NBCspLib.h, NBGeneric.c +// [TAG] None +// [Severity] Important +// [Description] Follow Update by Mahobay. +// [Files] NBPei.c, NBDxe.c; +// +// 20 9/28/12 4:12a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] BDAT function support. +// [Files] NB.sd, NBDxe.c, NBPEI.c, SystemAgent.sdl, +// BdatAccessHandler.sdl +// +// 19 9/26/12 9:20a Yurenlai +// [TAG] None +// [Category] Update +// [Severity] Important +// [Description] Changed for Shark Bay SA Framework Reference Code Beta +// Version 0.7.0. +// [Files] NBPEI.c +// +// [TAG] EIP101495 +// [Category] Improvement +// [Severity] Important +// [Description] Initialize SSID of B0:D3:F0 and B0:D2:F0/F1. +// [Files] NB.h, NB.sdl, NBPEI.c +// +// 18 9/12/12 6:15a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Add RxCEM Loop back setup item. +// [Files] GetSetupData.c, NB.sd, NB.uni, NBPEI.c, NbSetupData.h, +// NBPEI.c, +// +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Modified for Switchable Graphics support. +// [Files] NBPEI.c, SwitchableGraphicsInit.c, SystemAgent.sdl +// +// 17 8/24/12 8:15a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Corrected GTT reference define. +// [Files] NBDxe.c, NBPEI.c +// +// 16 7/27/12 8:34a Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] IGfx Fource Disable Support. +// [Files] GetSetupData.c, NB.sdl, NB.sd, NB.uni, NbSetupData.h, +// NBDxe.c, NBPEI.c +// +// 15 7/03/12 11:25p Yurenlai +// [TAG] None +// [Severity] Important +// [Description] Fix building error. +// [Files] NBPEI.c +// +// 14 7/03/12 6:44a Yurenlai +// [TAG] None +// [Severity] Important +// [Description] Change for SystemAgent RefCode Revision: 0.6.0. +// [Files] NBPEI.DXS, NB.sd, NBDxe.c, NBPEI.c +// +// 13 6/14/12 4:49a Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Add Notify BeforeMrc and AfterMrc. +// [Description] NBPEI.c, NBPPI.h, MemoryInit. +// +// 12 6/14/12 4:47a Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Fixed S4 resume fail. +// [Description] NBPEI.c +// +// 11 4/26/12 2:52a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Adjust Intel System Agent module the Setup item and +// Policy. +// [Description] GetSetupData.c, NB.sdl, NB.sd, NB.uni, NBDxe.c, +// NBPEI.c, +// NBSetup.c, NBSetupReset.c, NbSetupData.h +// +// 10 4/26/12 2:39a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Fixed PeiRamBootSupport = 1 warm boot system is hang. +// [Description] NBPEI.c, NBCspLib.h +// +// 9 4/26/12 2:35a Yurenlai +// [TAG] None +// [Category] Improvement +// [Severity] Important +// [Description] Support Locate MRC error Report. +// [Description] NBPEI.c, MemoryInit.c +// +// 8 4/05/12 4:46a Yurenlai +// +// [TAG] None +// [Category] New Feature +// [Severity] Normal +// [Description] Enabled GDXC feature. +// [Files] NBPEI.c +// +// 7 4/05/12 2:43a Yurenlai +// [TAG] EIP87103 +// [Category] Spec Update +// [Severity] Important +// [Description] Add routine RetrieveGdxcMemorySize to support GDXC +// feature and SA RC rev. 0.5.5. +// [Files] NBPEI.c +// +// 6 4/05/12 2:39a Yurenlai +// [TAG] EIP87103 +// [Category] Spec Update +// [Severity] Important +// [Description] Change for SystemAgent RefCode Revision: 0.5.5 . +// [Files] NBDxe.c, NBPEI.c, NBSMI.C, NBGeneric.c, NB.sd, NBSetup.c, +// GetSetupData.c, NbSetupData.h +// +// 5 3/23/12 3:32a Yurenlai +// Fixed the build error of Help Builder. +// +// 4 3/22/12 11:08p Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Fixed MRC_DEBUG_PRINT = 0 for not send MRC debug message. +// [Files] NBPEI.c, MemoryInit.sdl, MrcOemDebugPrint.h +// +// 3 3/08/12 10:30p Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Support MRC debug message print information and RMT +// message. +// [Files] NBPEI.c +// +// 2 2/23/12 6:45a Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Adjusted North Bridge the policy configuration. +// +// 1 2/08/12 4:34a Yurenlai +// Intel Haswell/NB eChipset initially releases. +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: NBPEI.C +// +// Description: This file contains code for North Bridge initialization +// in the PEI stage +// +//<AMI_FHDR_END> +//************************************************************************* + +//---------------------------------------------------------------------------- +// Include(s) +//---------------------------------------------------------------------------- + +#include <Efi.h> +#include <Pei.h> +#include <token.h> +#include <HOB.h> +#include <StatusCodes.h> +#include <AmiLib.h> +#include <AmiPeiLib.h> +#include <AmiCspLib.h> + +#include <ppi\PciCfg2.h> +#include <ppi\CpuIo.h> +#include <ppi\NBPPI.h> +#include <ppi\CspLibPpi.h> +#include <ppi\smbus.h> +#include <ppi\ReadOnlyVariable2.h> +#include <Setup.h> +#include <CpuHobs.h> + +#include <Core\EM\ACPI\AcpiS3.h> + +#include <Protocol\NBMemInfo.h> + +#include <Core\GUID\MemoryTypeInformation.h> + +// Produced PPIs +#include <ppi\BaseMemorytest.h> + +#if SystemAgent_SUPPORT +#include <PchAccess.h> +#include <MemInfoHob.h> +#include <SaDataHob\SaDataHob.h> +#define _SA_COMMON_DEFINITIONS_H_ +#include <Ppi\SaPlatformPolicy\SaPlatformPolicy.h> +#include <SampleCode\Ppi\PlatformMemorySize\PlatformMemorySize.h> +#include <SampleCode\Ppi\PlatformMemoryRange\PlatformMemoryRange.h> +#endif + +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 1 +#if defined IXTU_LABLE_VERSION && IXTU_LABLE_VERSION >= 0x00C +#include <PPI\PerfTunePpi.h> +#endif +#endif + +#if SB_STALL_PPI_SUPPORT +#include <Ppi\Stall.h> +#endif + +#include <Ppi\Wdt\Wdt.h> + +#ifdef SSA_FLAG +#define __EDKII_GLUE_PEIM_H__ +#include "SsaCallbackPeim.h" +#include "MrcOem.h" +#endif // SSA_FLAG + +//---------------------------------------------------------------------------- +// Constant, Macro and Type Definition(s) +//---------------------------------------------------------------------------- +// Constant Definition(s) + +// Macro Definition(s) + +// Type Definition(s) + +// Function Prototype(s) + +VOID NBResetCpuOnly ( // Do CPU Only Reset + IN EFI_PEI_SERVICES **PeiServices +); + +VOID ProgramNBSubId ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_PCI_CFG2_PPI *PciCfg +); + +EFI_STATUS BaseMemoryTest ( + IN EFI_PEI_SERVICES **PeiServices, + IN struct _PEI_BASE_MEMORY_TEST_PPI *This, + IN EFI_PHYSICAL_ADDRESS BeginAddress, + IN UINT64 MemoryLength, + IN PEI_MEMORY_TEST_OP Operation, + OUT EFI_PHYSICAL_ADDRESS *ErrorAddress +); + +EFI_STATUS +EFIAPI +ChooseRanges ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_PLATFORM_MEMORY_RANGE_PPI *This, + IN OUT PEI_MEMORY_RANGE_OPTION_ROM *OptionRomMask, + IN OUT PEI_MEMORY_RANGE_SMRAM *SmramMask, + IN OUT PEI_MEMORY_RANGE_GRAPHICS_MEMORY *GraphicsMemoryMask, + IN OUT PEI_MEMORY_RANGE_PCI_MEMORY *PciMemoryMask +); + +EFI_STATUS +EFIAPI +GetPlatformMemorySize ( + IN EFI_PEI_SERVICES **PeiServices, + IN struct _PEI_PLATFORM_MEMORY_SIZE_PPI *This, + IN OUT UINT64 *MemorySize +); + +EFI_STATUS NBPeiBeforeMrcPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi +); + +EFI_STATUS NBPeiEndOfMrcPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi +); + +EFI_STATUS ProgramNBRegBeforeEndofPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi +); + +EFI_STATUS CreateCPUHob( + IN EFI_PEI_SERVICES **PeiServices +); + +VOID +GtOcInit ( + IN EFI_PEI_SERVICES **PeiServices, + IN NB_SETUP_DATA *NbSetupData +); + +EFI_STATUS +InstallSaPlatformPolicyPpi ( + IN EFI_PEI_SERVICES **PeiServices, + IN NB_SETUP_DATA *NbSetupData +); + +#ifdef SSA_FLAG +MrcStatus +AmiSsaCallbackPpi ( + EFI_PEI_SERVICES **PeiServices, + struct _SSA_BIOS_CALLBACKS_PPI *SsaBiosCallBacksPpi, + MRC_OEM_STATUS_COMMAND StatusCommand, + VOID *CheckpointData +); +#endif // SSA_FLAG + +EFI_STATUS +MemoryErrorRead ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_MEMORY_ERROR_REPORT_PPI *This, + IN OUT UINT32 MemErrData +); + + +//---------------------------------------------------------------------------- +// Variable and External Declaration(s) +//---------------------------------------------------------------------------- +// Variable Declaration(s) + +// GUID Definition(s) +EFI_GUID gAmiNbPegInfoGuid = AMI_NB_PEG_INFO_GUID; +EFI_GUID gAmiPEINbInitPolicyGuid = AMI_PEI_NBINIT_POLICY_PPI_GUID; +EFI_GUID gBaseMemoryTestGuid = PEI_BASE_MEMORY_TEST_GUID; +EFI_GUID gEfiPeiEndOfPeiPhasePpiGuid = EFI_PEI_END_OF_PEI_PHASE_PPI_GUID; +EFI_GUID gAmiNbInfoHobGuid = AMI_NB_INFO_HOB_GUID; +EFI_GUID gMrcInfoHobGuid = AMI_MRC_INFO_HOB_GUID; +//EFI_GUID gEfiNBMemoryInfoGuid = EFI_NB_MEMORY_INFO_GUID; +EFI_GUID gEfiNbMrcS3DataGuid = EFI_NB_MRC_S3_DATA_GUID; +EFI_GUID gSetupGuid = SETUP_GUID; +EFI_GUID gAmiMemoryErrorReportPpiGuid = AMI_MEMORY_ERROR_REPORT_PPI_GUID; +EFI_GUID gWdtPpiGuid = WDT_PPI_GUID; +#if SB_STALL_PPI_SUPPORT +EFI_GUID gStallPpiGuid = EFI_PEI_STALL_PPI_GUID; +#endif +#if SystemAgent_SUPPORT +EFI_GUID gSaPlatformPolicyPpiGuid = SA_PLATFORM_POLICY_PPI_GUID; +EFI_GUID gMemRestoreDataGuid = EFI_MEMORY_RESTORE_DATA_GUID; +EFI_GUID gAmiNbPegGen3PresetSearchGuid = AMI_NB_PEG_GEN3_PRESET_SEARCH_GUID; +EFI_GUID gPlatformMemorySizeGuid = PEI_PLATFORM_MEMORY_SIZE_PPI_GUID; +EFI_GUID gPlatformMemoryRangeGuid = PEI_PLATFORM_MEMORY_RANGE_PPI_GUID; +EFI_GUID gEfiMemoryTypeInformationGuid = EFI_MEMORY_TYPE_INFORMATION_GUID; +#endif +EFI_GUID gEfiGlobalVariableGuid = EFI_GLOBAL_VARIABLE; + +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 1 +#if defined IXTU_LABLE_VERSION && IXTU_LABLE_VERSION >= 0x00C +static EFI_GUID gPerfTunePpiGuid = PERF_TUNE_PPI_GUID; +EFI_GUID gAmiDddtPreFlagHobGuid = AMI_DDDT_PRESENT_FLAG_HOB_GUID; +#endif +#endif + +// PPI Definition(s) + +// PPI that are installed +static AMI_PEI_NBINIT_POLICY_PPI gAMIPEINBInitPolicyPpi = { + TRUE +}; + +static PEI_PLATFORM_MEMORY_SIZE_PPI mMemorySize = { + GetPlatformMemorySize +}; + +static PEI_PLATFORM_MEMORY_RANGE_PPI mPlatformMemoryRange = { + ChooseRanges +}; + + +static PEI_BASE_MEMORY_TEST_PPI gBaseMemoryTest = { + BaseMemoryTest +}; + +static EFI_PEI_NB_CPU_ONLY_RESET_PPI gNBCpuOnlyResetPpi = { + NBResetCpuOnly +}; + + +#ifdef SSA_FLAG +static SSA_BIOS_CALLBACKS_PPI gAmiSsaCallbackPpi = { + 0, + AmiSsaCallbackPpi, + NULL +}; +#endif // SSA_FLAG +static PEI_MEMORY_ERROR_REPORT_PPI gPeiMemoryErrorReportPpi = { + MemoryErrorRead +}; + + +// Include any additional PPI needed for memory detection in this +// list and define the functions in this file + +static EFI_PEI_PPI_DESCRIPTOR mPpiList[] = { +#ifdef SSA_FLAG + { EFI_PEI_PPI_DESCRIPTOR_PPI, + &gSsaBiosCallBacksPpiGuid, + &gAmiSsaCallbackPpi}, +#endif // SSA_FLAG + { EFI_PEI_PPI_DESCRIPTOR_PPI, + &gAmiMemoryErrorReportPpiGuid, + &gPeiMemoryErrorReportPpi }, + + { EFI_PEI_PPI_DESCRIPTOR_PPI, \ + &gPlatformMemorySizeGuid, \ + &mMemorySize }, + { EFI_PEI_PPI_DESCRIPTOR_PPI, \ + &gPlatformMemoryRangeGuid, \ + &mPlatformMemoryRange }, + { EFI_PEI_PPI_DESCRIPTOR_PPI, \ + &gBaseMemoryTestGuid, \ + &gBaseMemoryTest }, + { EFI_PEI_PPI_DESCRIPTOR_PPI, \ + &gAmiPeiNBCpuOnlyResetPpiGuid, \ + &gNBCpuOnlyResetPpi }, + { (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), \ + &gAmiPEINbInitPolicyGuid, \ + &gAMIPEINBInitPolicyPpi } +}; + +// PPI that are notified + +static EFI_PEI_NOTIFY_DESCRIPTOR mNotifyList[] = { + { EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, \ + &gAmiPeiBeforeMrcGuid, NBPeiBeforeMrcPei }, + { EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, \ + &gAmiPeiEndOfMemDetectGuid, NBPeiEndOfMrcPei }, + { EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | \ + EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, \ + &gEfiPeiEndOfPeiPhasePpiGuid, ProgramNBRegBeforeEndofPei }, +}; + +// External Declaration(s) + +// Function Definition(s) + +UINT32 NBPcieBridge[] = +{ + {(UINT32)NB_PCIE_CFG_ADDRESS(PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN, PCI_VID)}, + {(UINT32)NB_PCIE_CFG_ADDRESS(PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN1, PCI_VID)}, + {(UINT32)NB_PCIE_CFG_ADDRESS(PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN2, PCI_VID)}, + {0xFFFFFFFF} +}; +// << (EIP69780) + +//(EIP96114) +// Type Definition(s) +typedef struct { + UINT8 Bus; + UINT8 Dev; + UINT8 Fun; + UINT16 PegBitOffset; +} DEVICES_AFTER_PCIIO; + +DEVICES_AFTER_PCIIO gDevicesTable[] = { + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN2, B_SA_DEVEN_D1F2EN_MASK }, + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN1, B_SA_DEVEN_D1F1EN_MASK }, + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN, B_SA_DEVEN_D1F0EN_MASK }, + { 0xFF, 0xFF, 0xFF, 0, }, +}; + +UINTN gDevicesTableCount = sizeof(gDevicesTable) / sizeof(DEVICES_AFTER_PCIIO); +//(EIP96114) + +#ifdef RC_PEG_0 +DEVICES_AFTER_PCIIO gDisablePegDevicesTable[] = { +#if RC_PEG_0 == 0 + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN, NULL }, +#endif +#if !(defined RC_PEG_1) || RC_PEG_1 == 0 + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN1, NULL }, +#endif +#if !(defined RC_PEG_2) || RC_PEG_2 == 0 + { PCIEBRN_BUS, PCIEBRN_DEV, PCIEBRN_FUN2, NULL }, +#endif + { 0xFF, 0xFF, 0xFF, NULL } +}; + +UINTN gDisablePegCount = sizeof(gDisablePegDevicesTable) / sizeof(DEVICES_AFTER_PCIIO); +#endif + +//---------------------------------------------------------------------------- + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NBPEI_Init +// +// Description: This function is the entry point for this PEI. +// it must be ported to do NB specific programming needed +// at power-on, both in wakeup path as well as power-on path. +// +// Input: FfsHeader Pointer to the FFS file header +// PeiServices Pointer to the PEI services table +// +// Output: Return Status based on errors that occurred while waiting for +// time to expire. +// +// Notes: This function should initialize North Bridge before memory +// detection. +// Install AMI_PEI_NBINIT_POLICY_PPI to indicate that NB Init +// PEIM is installed +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS EFIAPI NBPEI_Init ( + IN EFI_FFS_FILE_HEADER *FfsHeader, + IN EFI_PEI_SERVICES **PeiServices ) +{ + + EFI_STATUS Status; + EFI_PEI_PCI_CFG2_PPI *PciCfg; + EFI_PEI_CPU_IO_PPI *CpuIo; + NB_SETUP_DATA *NbSetupData = NULL; +#if defined SIO_SUPPORT && SIO_SUPPORT == 1// For SIO off. Without this compiler fails +#if defined SIO_Smsc1007 && SIO_Smsc1007 == 1 + UINT8 GpioDataReg3; +#endif +#endif + + // Get pointer to the PCI config PPI + PciCfg = (*PeiServices)->PciCfg; + CpuIo = (*PeiServices)->CpuIo; + + PEI_PROGRESS_CODE (PeiServices, PEI_CAR_NB_INIT); + + //Create CPU HOB + CreateCPUHob(PeiServices); + + // + // Allocate buffer for setup data variable. + // + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (NB_SETUP_DATA), &NbSetupData); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) NbSetupData, sizeof (NB_SETUP_DATA), 0); + + GetNbSetupData( PeiServices, NbSetupData, TRUE ); + + // Disable IGFX for UpSever +#if defined NB_IGFX_FORCE_DISABLE_SUPPORT && NB_IGFX_FORCE_DISABLE_SUPPORT == 1 + if(NbSetupData->IGfxForceDisable == 1) + { + NbSetupData->InternalGraphics = 0; // disable IGFX + NbSetupData->PrimaryDisplay = 1; // PEG Only + } +#endif // NB_IGFX_FORCE_DISABLE_SUPPORT + +#if defined SMM_THUNK_IN_CSM && SMM_THUNK_IN_CSM == 0 + // Enable Global SMRAM + SET_PCI8_NB(R_SA_SMRAMC, 8); // 0x88 +#else +#if defined SMM_THUNK_NO_AB_SEG && SMM_THUNK_NO_AB_SEG == 1 + // Enable Global SMRAM + SET_PCI8_NB(R_SA_SMRAMC, 8); // 0x88 +#endif +#endif + + // Install the NB Init Policy PPI + Status = (*PeiServices)->InstallPpi(PeiServices, &mPpiList[0]); + ASSERT_PEI_ERROR (PeiServices, Status); + + // Set up necessary PPI notifications + Status = (*PeiServices)->NotifyPpi( PeiServices, &mNotifyList[0] ); + ASSERT_PEI_ERROR ( PeiServices, Status ); + + // Program SSID + ProgramNBSubId( PeiServices, PciCfg ); + + // Install SaPlatformPolicyPpi + InstallSaPlatformPolicyPpi (PeiServices, NbSetupData); + +#if defined SIO_SUPPORT && SIO_SUPPORT == 1// For SIO off. Without this compiler fails +#if defined SIO_Smsc1007 && SIO_Smsc1007 == 1 + // Set up PWM or GMBus(I2C) panel backlight inverter. + // General Purpose I/O Data Register 3, this is not a config reg, so no need to enter config mode. + // From CRB schematic BIOS Note: Disable both BKLTSEL lines before enabling one. + GpioDataReg3 = READ_IO8(Smsc1007_PME_BASE_ADDRESS + 0x0E); + GpioDataReg3 |= (BIT07 | BIT01); + WRITE_IO8(Smsc1007_PME_BASE_ADDRESS + 0x0E, GpioDataReg3); + + // Program SIO to switch inverter + if ((NbSetupData->IgdLcdBlc == 0) || (NbSetupData->IgdLcdBlc == 2)) { + + // PWM backlight control + // Choose L_BKLTSEL0# via GPIO37 to enable PWM backlight control + GpioDataReg3 &= ~BIT07; // L_BKLTSEL0# + } else { + + // GMBus backlight control(also known as I2C) + // Choose L_BKLTSEL1# via GPIO31 to enable GMBus to support backlight control + GpioDataReg3 &= ~BIT01; // L_BKLTSEL1# + } + + WRITE_IO8(Smsc1007_PME_BASE_ADDRESS + 0x0E, GpioDataReg3); +#endif +#endif + + return EFI_SUCCESS; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NBResetCpuOnly +// +// Description: This function issues a CPU only reset. +// +// Input: PeiServices - Pointer to the PEI services table +// +// Output: None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID NBResetCpuOnly ( // Do CPU Only Reset + IN EFI_PEI_SERVICES **PeiServices ) +{ + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: ProgramNBSubId +// +// Description: This function programs NB PCI devices sub-vendor ID and +// sub-system ID. +// +// Input: PeiServices - Pointer to the PEI services table +// PciCfg - Pointer to the PCI Configuration PPI +// +// Output: VOID +// +// Notes: 1. This routine only programs the PCI device in NB, hence, we +// have to check the bus/device/function numbers whether they +// are a NB PCI device or not. +// 2. This routine is invoked by PEI phase.(After PEI permantent +// memory be installed) +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID ProgramNBSubId ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_PCI_CFG2_PPI *PciCfg ) +{ + EFI_STATUS Status = EFI_SUCCESS; + AMI_PEI_NB_CUSTOM_PPI *NBPeiOemPpi; + UINTN i = 0; + UINT8 SsidReg = 0; + UINT32 PciSid = 0xffffffff; + AMI_NB_PCI_SSID_TABLE_STRUCT DefaultSIdTbl[] = {NB_PCI_DEVICES_SSID_TABLE}; + AMI_NB_PCI_SSID_TABLE_STRUCT *SsidTblPtr = DefaultSIdTbl; + + Status = (*PeiServices)->LocatePpi( PeiServices, \ + &gAmiPeiNBCustomPpiGuid, \ + 0, \ + NULL, \ + &NBPeiOemPpi ); + + if (Status == EFI_SUCCESS) { + if (NBPeiOemPpi->SsidTable != NULL) + SsidTblPtr = NBPeiOemPpi->SsidTable; + } + + while (SsidTblPtr[i].PciAddr != 0xffffffffffffffff) { + if ((SsidTblPtr[i].PciAddr == NB_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_IGD_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_IGD_BUS_DEV_FUN1) || \ + (SsidTblPtr[i].PciAddr == NB_HDA_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRNx16_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRNx8_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRNx4_BUS_DEV_FUN)) \ + { + if (SsidTblPtr[i].Sid == 0xffffffff) { + Status = PciCfg->Read( PeiServices, + PciCfg, + EfiPeiPciCfgWidthUint32, + SsidTblPtr[i].PciAddr, + &PciSid); + } else { + PciSid = SsidTblPtr[i].Sid; + } + + SsidReg = PCI_SVID; + + if((SsidTblPtr[i].PciAddr == NB_PCIEBRNx16_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRNx8_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRNx4_BUS_DEV_FUN) || \ + (SsidTblPtr[i].PciAddr == NB_PCIEBRN_BUS_DEV6_FUN)) + { + SsidReg = R_SA_PEG_SS_OFFSET; + } + + Status = PciCfg->Write( PeiServices, + PciCfg, + EfiPeiPciCfgWidthUint32, + SsidTblPtr[i].PciAddr | SsidReg, + &PciSid); + + } + + i++; + } + + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NBPeiBeforeMrcPei +// +// Description: This function can be Call NB PEI before Mrc. +// +// Input: PeiServices - Pointer to the PEI services table +// NotifyDescriptor - Pointer to the descriptor for the +// notification event. +// InvokePpi - Pointer to the PPI that was installed +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS NBPeiBeforeMrcPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi ) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_PEI_CPU_IO_PPI *CpuIo; + EFI_PEI_PCI_CFG2_PPI *PciCfg; + + CpuIo = (*PeiServices)->CpuIo; + PciCfg = (*PeiServices)->PciCfg; + + PEI_TRACE((TRACE_ALWAYS, PeiServices, "NBPeiBeforeMrc Start.\n")); + + PEI_TRACE((TRACE_ALWAYS, PeiServices, "NBPeiBeforeMrc end.\n")); + + return Status; +} + +//(EIP96114) +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NbPegDetectNonComplaint +// +// Description: This function is Detect peg NonComplaint devices. +// +// Input: PeiServices - Pointer to the PEI services table +// NB_SETUP_DATA - NbSetupData - NB Setup data stored in NVRAM +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID NbPegDetectNonComplaint ( + IN EFI_PEI_SERVICES **PeiServices, + IN NB_SETUP_DATA *NbSetupData +) +{ +// UINT16 DetectCount; +// UINT16 Count; + UINT16 i; + UINT8 PegBus; + UINT8 PegDev; + UINT8 PegFun; + UINT16 PegBitMap = 0; + EFI_STATUS Status = EFI_SUCCESS; + NB_PEG_INFO_HOB *NbPegInfoHob; + BOOLEAN CardDetect[sizeof(gDevicesTable) / sizeof(DEVICES_AFTER_PCIIO)] = {FALSE}; + + Status = (*PeiServices)->CreateHob (PeiServices, EFI_HOB_TYPE_GUID_EXTENSION, sizeof (NB_PEG_INFO_HOB), (VOID **) &NbPegInfoHob); + if (EFI_ERROR (Status)) return ; + + NbPegInfoHob->Header.Name = gAmiNbPegInfoGuid; + + for ( i = 0; i < gDevicesTableCount; i++) + { + PegBus = gDevicesTable[i].Bus; + PegDev = gDevicesTable[i].Dev; + PegFun = gDevicesTable[i].Fun; + NbPegInfoHob->PegDeOverride[PegFun] = NbSetupData->PegDeEmphasis[PegFun]; + + if (READ_PCI32(PegBus, PegDev, PegFun, 0) == 0xffffffff) continue; + + WRITE_PCI32 (PegBus, PegDev, PegFun, PCI_PBUS, 0x00010100); + WRITE_PCI16 (1, 0, 0, PCI_VID, 0); + CountTime(4000, PM_BASE_ADDRESS); // 1ms + if(READ_PCI8 (PegBus, PegDev, PegFun, R_SA_PEG_SLOTSTS_OFFSET) & BIT06) { + if(READ_PCI16 (1, 0, 0, PCI_VID) != 0xffff) { + WRITE_PCI32 (PegBus, PegDev, PegFun, PCI_PBUS, 0x00000000); + CardDetect[i] = TRUE; + continue; + } + } + + RW_PCI8(PegBus, PegDev, PegFun, 0xD0, 0x01, 0xff); // Gen 1 + CountTime(4000, PM_BASE_ADDRESS); // 1ms + if(READ_PCI8 (PegBus, PegDev, PegFun, R_SA_PEG_SLOTSTS_OFFSET) & BIT06) { + if(READ_PCI16 (1, 0, 0, PCI_VID) != 0xffff) { + NbPegInfoHob->PegDeOverride[PegFun] = 0; // Set 6DB. + CardDetect[i] = TRUE; + } + } + + WRITE_PCI32 (PegBus, PegDev, PegFun, PCI_PBUS, 0x00000000); + } + if (NbSetupData->AlwaysEnablePeg != 1) { + + for ( i = 0; i < gDevicesTableCount; i++) { + + PegBus = gDevicesTable[i].Bus; + PegDev = gDevicesTable[i].Dev; + PegFun = gDevicesTable[i].Fun; + + if (READ_PCI32(PegBus, PegDev, PegFun, 0) == 0xffffffff) continue; + + if (CardDetect[i]) { + continue; + } else { + + // if devices insert D1 F1 or F2, do not disable F0. + if(PegFun == 0 && (CardDetect[0] || CardDetect[1])) break; + PegBitMap |= gDevicesTable[i].PegBitOffset; + SET_MEM8 (NB_PCIE_CFG_ADDRESS(PegBus, PegDev, PegFun, R_SA_PEG_LCTL_OFFSET), BIT4); + SET_MEM8 (NB_PCIE_CFG_ADDRESS(PegBus, PegDev, PegFun, R_SA_PEG_DEBUP2_OFFSET), BIT0); + } + } + + // Disable Peg + RESET_PCI16_NB(R_SA_DEVEN, PegBitMap); // 0x54 + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NbClearPegCtrlRegVgaEnable +// +// Description: This function is Clear PEG 0x3E bit3 for 3D card. +// +// Input: PeiServices - Pointer to the PEI services table +// NB_SETUP_DATA - NbSetupData - NB Setup data stored in NVRAM +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID NbClearPegCtrlRegVgaEnable ( + IN EFI_PEI_SERVICES **PeiServices, + IN NB_SETUP_DATA *NbSetupData +) +{ + UINT16 i; + UINT8 PegBus; + UINT8 PegDev; + UINT8 PegFun; + + for ( i = 0; i < gDevicesTableCount; i++) + { + PegBus = gDevicesTable[i].Bus; + PegDev = gDevicesTable[i].Dev; + PegFun = gDevicesTable[i].Fun; + if (READ_PCI32(PegBus, PegDev, PegFun, 0) == 0xffffffff) continue; + if ((READ_PCI8 (PegBus, PegDev, PegFun, R_SA_PEG_SLOTSTS_OFFSET) & BIT06) == 0) continue; // 0xBA + + WRITE_PCI32 (PegBus, PegDev, PegFun, PCI_PBUS, 0x00010100); + WRITE_PCI16 (1, 0, 0, PCI_VID, 0); + + // Clear Peg VgaEnable + RESET_PCI8(PegBus, PegDev, PegFun, PCI_BRIDGE_CNTL, BIT03); + WRITE_PCI32 (PegBus, PegDev, PegFun, PCI_PBUS, 0x00000000); + } +} +//(EIP73801) +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NBPeiEndOfMrcPei +// +// Description: This function can be Call NB PEI after Mrc. +// +// Input: PeiServices - Pointer to the PEI services table +// NotifyDescriptor - Pointer to the descriptor for the +// notification event. +// InvokePpi - Pointer to the PPI that was installed +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS NBPeiEndOfMrcPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi ) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_PEI_CPU_IO_PPI *CpuIo; + EFI_PEI_PCI_CFG2_PPI *PciCfg; + NB_SETUP_DATA *NbSetupData = NULL; +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 0 + WDT_PPI *WdtPpi = NULL; +#endif + EFI_BOOT_MODE BootMode; // [ EIP161790 ] + + + CpuIo = (*PeiServices)->CpuIo; + PciCfg = (*PeiServices)->PciCfg; + + PEI_TRACE((TRACE_ALWAYS, PeiServices, "NBPeiAfterMrc Start.\n")); + + // + // Allocate buffer for setup data variable. + // + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (NB_SETUP_DATA), &NbSetupData); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) NbSetupData, sizeof (NB_SETUP_DATA), 0); + + GetNbSetupData( PeiServices, NbSetupData, TRUE ); + + + // Set DRAM Initialization Bit. + //if ((READ_PCI8_SB(SB_REG_GEN_PMCON_2) & BIT07) == 0) // [ EIP161790 ] + //{ + // SET_PCI8_SB(SB_REG_GEN_PMCON_2, BIT07); // 0xA2 + //} + Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode); + if ((!EFI_ERROR (Status)) && (BootMode == BOOT_ON_S3_RESUME)) + { + if ((READ_PCI8_SB(SB_REG_GEN_PMCON_2) & BIT07) == 0) + { + SET_PCI8_SB(SB_REG_GEN_PMCON_2, BIT07); // 0xA2 + } + } + +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 0 + // + // Locate WDT PPI for access to Wdt->Disable() + // + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gWdtPpiGuid, + 0, + NULL, + &WdtPpi + ); + if (!EFI_ERROR (Status)) { + WdtPpi->Disable(); + } +#endif + +//(EIP96114) + +#if (defined RC_PEG_0) && RC_PEG_0 == 1 + if (NbSetupData->DetectNonComplaint && NbSetupData->AlwaysEnablePeg != 2) + { + // Peg Detect NonComplaint devices. + NbPegDetectNonComplaint(PeiServices, NbSetupData); + } +#endif + + // if SG and have pGPU + if (READ_PCI32(0, 2, 0, 0) != 0xffffffff && NbSetupData->PrimaryDisplay == 4) { + // Clear PEG 0x3E bit3 for SG mode. + NbClearPegCtrlRegVgaEnable(PeiServices, NbSetupData); + } + + PEI_TRACE((TRACE_ALWAYS, PeiServices, "NBPeiAfterMrc end.\n")); + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: ProgramNBRegBeforeEndofPei +// +// Description: This function can be used to program any NB regisater before +// end of PEI phase. +// +// Input: PeiServices - Pointer to the PEI services table +// NotifyDescriptor - Pointer to the descriptor for the +// notification event. +// InvokePpi - Pointer to the PPI that was installed +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS ProgramNBRegBeforeEndofPei ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *InvokePpi ) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_PEI_CPU_IO_PPI *CpuIo; + EFI_PEI_PCI_CFG2_PPI *PciCfg; + EFI_BOOT_MODE BootMode; + UINTN PegAddress; + UINT8 CapPtr = 0; + UINT8 i = 0; + UINT8 PrimaryBus, SecondaryBus; + CpuIo = (*PeiServices)->CpuIo; + PciCfg = (*PeiServices)->PciCfg; + + Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode); + + if (BootMode == BOOT_ON_S3_RESUME) { + // Porting if needed. + + for (i = 0; NBPcieBridge[i] != 0xFFFFFFFF; i++) + { + if (READ_MEM32(NBPcieBridge[i]) == 0xFFFFFFFF) continue; + if (!(READ_MEM8(NBPcieBridge[i] + R_SA_PEG_SLOTSTS_OFFSET) & BIT06)) continue; + + PrimaryBus = READ_MEM8 (NBPcieBridge[i] + PCI_PBUS + 1); + SecondaryBus = READ_MEM8 (NBPcieBridge[i] + PCI_PBUS + 2); + + for (; PrimaryBus <= SecondaryBus; PrimaryBus++) { + PegAddress = NB_PCIE_CFG_ADDRESS(PrimaryBus, 0, 0, 0); + + // Network Card. + if (READ_MEM8(PegAddress + 0x0B) == 0x02) { + // Find Cap ID 0x01 + CapPtr = NbFindCapPtr(PegAddress, 0x01); + if(CapPtr != 0) { + // Clear PME status + SET_MEM16((PegAddress + CapPtr + 0x04), BIT15); + } + } + } + + // Clear root port PME status + SET_MEM8((NBPcieBridge[i] + 0xC2), BIT01); + } + + } + + return EFI_SUCCESS; +} + +//---------------------------------------------------------------------------- +// BaseMemoryTest +//---------------------------------------------------------------------------- + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: BaseMemoryTest +// +// Description: This function performs the base memory test. +// +// Input: PeiServices - Pointer to the PEI services table +// This - Pointer to the Base Memory Test PPI +// BeginAddress - The begin address for test. +// MemoryLength - The length in byte for test. +// Operation - The memort test operated policy. +// ErrorAddress - The error address when test is failed. +// +// Output: EFI_STATUS +// EFI_DEVICE_ERROR - Tge base memory test is failure. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS BaseMemoryTest ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_BASE_MEMORY_TEST_PPI *This, + IN EFI_PHYSICAL_ADDRESS BeginAddress, + IN UINT64 MemoryLength, + IN PEI_MEMORY_TEST_OP Operation, + OUT EFI_PHYSICAL_ADDRESS *ErrorAddress ) +{ + +#if defined PEI_MRC_BASE_MEMORY_TEST_ENABLE && PEI_MRC_BASE_MEMORY_TEST_ENABLE == 1 + UINT32 TestPattern; + UINT32 TestMask; + UINT32 SpanSize; + EFI_PHYSICAL_ADDRESS TempAddress; + +#if defined PeiRamBootSupport && PeiRamBootSupport == 1 + if(!CheckPeiFvCopyToRam(PeiServices)) return EFI_SUCCESS; +#endif + + (*PeiServices)->ReportStatusCode ( + PeiServices, + EFI_PROGRESS_CODE, + EFI_COMPUTING_UNIT_MEMORY + EFI_CU_MEMORY_PC_TEST, + 0, + NULL, + NULL + ); + + TestPattern = 0x5A5A5A5A; + TestMask = 0; + SpanSize = 0; + + // + // Make sure we don't try and test anything above the max physical address range + // + ASSERT_PEI_ERROR (PeiServices, BeginAddress + MemoryLength < 0xFFFFFFFFFFFFFFFF); + + switch (Operation) { + case Extensive: + SpanSize = 0x4; + break; + case Sparse: + case Quick: + SpanSize = 0x40000; + break; + case Ignore: + return EFI_SUCCESS; + } + + // + // Write the test pattern into memory range + // + TempAddress = BeginAddress; + while (TempAddress < BeginAddress + MemoryLength) { + (*(UINT32*)(UINTN)TempAddress) = TestPattern; + TempAddress += SpanSize; + } + + // + // Read pattern from memory and compare it + // + TempAddress = BeginAddress; + while (TempAddress < BeginAddress + MemoryLength) { + if ((*(UINT32*)(UINTN)TempAddress) != TestPattern) { + *ErrorAddress = TempAddress; + (*PeiServices)->ReportStatusCode ( + PeiServices, + EFI_ERROR_CODE + EFI_ERROR_UNRECOVERED, + EFI_COMPUTING_UNIT_MEMORY + EFI_CU_MEMORY_EC_UNCORRECTABLE, + 0, + NULL, + NULL + ); + return EFI_DEVICE_ERROR; + } else { + (*(UINT32*)(UINTN)TempAddress) = 0; + } + TempAddress += SpanSize; + } +#endif + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: ChooseRanges +// +// Description: Find out which memory ranges to reserve on this platform +// +// Input: PeiServices - Pointer to the PEI services table. +// This - Pointer to the Pei platform memory range ppi. +// OptionRomMask - The reserve for option ROM usage. +// SmramMask - The reserve for smram usage. +// GraphicsMemoryMask - The reserve for graphics memory usage. +// PciMemoryMask - The reserve for Pei Memory usage. +// +// Output: +// EFI_STATUS - EFI_SUCCESS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS +ChooseRanges ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_PLATFORM_MEMORY_RANGE_PPI *This, + IN OUT PEI_MEMORY_RANGE_OPTION_ROM *OptionRomMask, + IN OUT PEI_MEMORY_RANGE_SMRAM *SmramMask, + IN OUT PEI_MEMORY_RANGE_GRAPHICS_MEMORY *GraphicsMemoryMask, + IN OUT PEI_MEMORY_RANGE_PCI_MEMORY *PciMemoryMask + ) +{ + UINT16 GraphicsControlRegister; + UINT32 IgdSize; + UINT32 GttSize; + EFI_STATUS Status; + SA_PLATFORM_POLICY_PPI *SaPlatformPolicyPpi; +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 1 +#if defined IXTU_LABLE_VERSION && IXTU_LABLE_VERSION >= 0x00C + VOID *FirstHob; + DDDT_PRESENT_FLAG_HOB *DddtPreFlagHob; + UINT8 NumOcBins = (UINT8)(ReadMsr(0x194) >> 17) & 0x7; + Status = (*PeiServices)->GetHobList(PeiServices, &FirstHob); + ASSERT_PEI_ERROR(PeiServices, Status); + + // Get XTU devices Present HOB + DddtPreFlagHob = (DDDT_PRESENT_FLAG_HOB*) FirstHob; + while (!EFI_ERROR(Status = FindNextHobByType(EFI_HOB_TYPE_GUID_EXTENSION, &DddtPreFlagHob))) { + if (guidcmp(&((EFI_HOB_GUID_TYPE*)DddtPreFlagHob)->Name, &gAmiDddtPreFlagHobGuid) == 0) { + break; + } + } + + // default XTU graphics Present is disable + DddtPreFlagHob->PresentFlag[BIOS_GRAPHICS_TURBO_RATIO_LIMIT_IMPLEMENTATION] = 0; + DddtPreFlagHob->PresentFlag[BIOS_GRAPHICS_CORE_VOLTAGE_IMPLEMENTATION] = 0; + + //If cpu is lock version then clear runtime turbo DDD table flag. + if(NumOcBins == 0) + DddtPreFlagHob->PresentFlag[BIOS_RUNTIME_TURBO_OVERRIDE_IMPLEMENTATION] = 0; +#endif +#endif + + // + // Get platform policy settings through the SaPlatformPolicy PPI + // + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gSaPlatformPolicyPpiGuid, + 0, + NULL, + &SaPlatformPolicyPpi + ); + if (EFI_ERROR (Status))SaPlatformPolicyPpi->GtConfig->InternalGraphics = 2; + // + // Choose regions to reserve for Option ROM usage. + // + *OptionRomMask = PEI_MR_OPTION_ROM_NONE; + + // + // Choose regions to reserve for SMM usage. + // Each block is 128KB which is defined in PlatformRange PPI. + // Needs to convert the value of TSEG_SIZE from bytes to blocks. + // + *SmramMask = (TSEG_SIZE >> 17) | PEI_MR_SMRAM_CACHEABLE_MASK | +#if defined SMM_THUNK_IN_CSM && SMM_THUNK_IN_CSM == 0 + PEI_MR_SMRAM_ABSEG_MASK | +#else +#if defined SMM_THUNK_NO_AB_SEG && SMM_THUNK_NO_AB_SEG == 1 + PEI_MR_SMRAM_ABSEG_MASK | +#endif +#endif + PEI_MR_SMRAM_TSEG_MASK; + + // + // Choose regions to reserve for Graphics Memory usage. + // + *GraphicsMemoryMask = PEI_MR_GRAPHICS_MEMORY_NONE; + + GraphicsControlRegister = READ_PCI16_NB (R_SA_GGC); + if (((GraphicsControlRegister & B_SA_GGC_IVD_MASK) == 0) || (SaPlatformPolicyPpi->GtConfig->InternalGraphics == 1)) { + // + // IGD is enabled, fill the IGD and GTT stolen memory sizes. + // + IgdSize = (GraphicsControlRegister & B_SA_GGC_GMS_MASK) >> N_SA_GGC_GMS_OFFSET; + + // + // Add a w/a to handle 1G Stolen Memory - As per SNB ConfigDB definition, + // Max No of bits to support this encoding is '5' 0/0/0/GGC[7:3] which can + // hold a value of '1Fh'. + // For 1G, suggested encoding is '11h'. Set the GraphicsMemoryMask as '2048' + // to reserve 1G stolen memory. + // + // *GraphicsMemoryMask = IgdSize * PEI_MR_GRAPHICS_MEMORY_32M_NOCACHE; + // *GraphicsMemoryMask = 32 * 64 + // *GraphicsMemoryMask = 2048 + + if (IgdSize == 0x11) { + IgdSize = 0x20; + } + + *GraphicsMemoryMask = IgdSize * PEI_MR_GRAPHICS_MEMORY_32M_NOCACHE; + + // + // Add GTT memory to reserved graphics memory + // + GttSize = (GraphicsControlRegister & B_SA_GGC_GGMS_MASK) >> N_SA_GGC_GGMS_OFFSET; + + switch (GttSize) { + case 1: + *GraphicsMemoryMask += PEI_MR_GRAPHICS_MEMORY_1M_NOCACHE; + break; + + case 2: + *GraphicsMemoryMask += PEI_MR_GRAPHICS_MEMORY_2M_NOCACHE; + break; + } + +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 1 +#if defined IXTU_LABLE_VERSION && IXTU_LABLE_VERSION >= 0x00C + // if IGD is enabled ,XTU graphics Present is enable + DddtPreFlagHob->PresentFlag[BIOS_GRAPHICS_TURBO_RATIO_LIMIT_IMPLEMENTATION] = 1; + DddtPreFlagHob->PresentFlag[BIOS_GRAPHICS_CORE_VOLTAGE_IMPLEMENTATION] = 1; +#endif +#endif + } + + *PciMemoryMask = 0; + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: RetrieveGdxcMemorySize +// +// Description: Determine the memory size desired by GDXC +// +// Input: PeiServices - Pointer to the PEI services table. +// MotSize - Gdxc Mot memory size to return. +// GdxcSize - Gdxc Required memory size to return. +// +// Output: +// VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID +RetrieveGdxcMemorySize ( + IN EFI_PEI_SERVICES **PeiServices, + IN OUT UINT64 *MotSize, + IN OUT UINT64 *GdxcSize) +{ + UINT32 MchBar; + UINT32 GdxcBar; + UINT32 TempMotSize; + UINT32 TempOclaSize; + + // + // Get MchBAR + // + MchBar = MmPci32(0, 0, 0, R_SA_MCHBAR) & B_SA_MCHBAR_MCHBAR_MASK; + // + // Get GdxcBar + // + GdxcBar = MmioRead32(MchBar+NCDECS_CR_GDXCBAR_NCU_REG); + GdxcBar &= NCDECS_CR_GDXCBAR_NCU_MAX; + // + // Determine Gdxc size: Includes MOT\PSMI\IOT (OCLA) + // + TempMotSize = MmioRead32(GdxcBar+0x18); + *GdxcSize = (((TempMotSize & 0xFFFF0000) >> 16) - (TempMotSize & 0x0000FFFF) + 1) << 23; + *MotSize = *GdxcSize; + + TempOclaSize = MmioRead32(GdxcBar+0x28); + *GdxcSize += (((TempOclaSize & 0xFFFF0000) >> 16) - (TempOclaSize & 0x0000FFFF)) << 23; + + // Add 16MB if some allocated to MOT and/or IOT + if (*GdxcSize != 0) + *GdxcSize += (16 << 20); +} + +EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = { + { EfiACPIReclaimMemory, 0x5 }, + { EfiACPIMemoryNVS, 0x280 }, + { EfiReservedMemoryType, 0x500}, + { EfiRuntimeServicesData, 0x2A}, +#ifdef EFI_DEBUG + { EfiRuntimeServicesCode, 0x80 }, + { EfiBootServicesCode, 0x1000}, +#else + { EfiRuntimeServicesCode, 0x3A}, + { EfiBootServicesCode, 0x1000}, +#endif + { EfiMaxMemoryType, 0 } +}; + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPlatformMemorySize +// +// Description: Get the platform for the minimum memory size +// +// Input: PeiServices - Pointer to the PEI services table. +// This - Pointer to the Pei platform memory range ppi. +// MemorySize - Platform for the minimum memory size. +// +// Output: +// EFI_STATUS - Status +// EFI_ERROR - Create hob fail +// EFI_SUCCESS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS +GetPlatformMemorySize ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_PLATFORM_MEMORY_SIZE_PPI *This, + IN OUT UINT64 *MemorySize + ) +{ + EFI_STATUS Status; + EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable; + UINTN DataSize; + EFI_MEMORY_TYPE_INFORMATION MemoryData [EfiMaxMemoryType + 1]; + UINTN Index; + EFI_BOOT_MODE BootMode; + EFI_HOB_GUID_TYPE *Hob; +// UINT64 GdxcRequiredMemSize; +// UINT64 GdxcMotMemSize; + + // RetrieveGdxcMemorySize(PeiServices, &GdxcMotMemSize, &GdxcRequiredMemSize); + + // Accumulate maximum amount of memory needed + // *MemorySize = (READ_PCI32_NB (R_SA_TSEGMB) & B_SA_TSEGMB_TSEGMB_MASK) - 0x1000000; + // *MemorySize -= GdxcRequiredMemSize; + + *MemorySize = PEI_MIN_MEMORY_SIZE; + + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gEfiPeiReadOnlyVariable2PpiGuid, + 0, + NULL, + &Variable + ); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode); + ASSERT_PEI_ERROR (PeiServices, Status); + + DataSize = sizeof (MemoryData); + + Status = Variable->GetVariable ( + Variable, + (BootMode == BOOT_ON_S4_RESUME) + ? L"PreviousMemoryTypeInformation" + : EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME, + &gEfiMemoryTypeInformationGuid, + NULL, + &DataSize, + &MemoryData + ); + + if (EFI_ERROR (Status) || ( BootMode == BOOT_ON_FLASH_UPDATE )) { + if ( BootMode == BOOT_IN_RECOVERY_MODE ) { + return EFI_SUCCESS; + } + + // Use default value to avoid memory fragment. OS boot/installation fails + // if there is not enough continuous memory available + DataSize = sizeof (mDefaultMemoryTypeInformation); + (*PeiServices)->CopyMem (MemoryData, mDefaultMemoryTypeInformation, DataSize); + } + + for (Index = 0; Index < DataSize / sizeof (EFI_MEMORY_TYPE_INFORMATION); Index++) { + *MemorySize += MemoryData[Index].NumberOfPages * EFI_PAGE_SIZE; + } + + // Build the GUID'd HOB for DXE + Status = (*PeiServices)->CreateHob ( + PeiServices, + EFI_HOB_TYPE_GUID_EXTENSION, + (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataSize), + &Hob + ); + if (EFI_ERROR (Status))return Status; + + ((EFI_HOB_GUID_TYPE *)(Hob))->Name = gEfiMemoryTypeInformationGuid; + + Hob++; + + // Copy memory data to Hob + (*PeiServices)->CopyMem (Hob, MemoryData, DataSize); + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CreateCPUHob +// +// Description: Create Cpu Hob and initialize it. +// +// Input: +// IN EFI_PEI_SERVICES **PeiServices +// +// Output: +// EFI_STATUS - EFI_SUCCESS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS CreateCPUHob( + IN EFI_PEI_SERVICES **PeiServices +) +{ + EFI_HOB_CPU *pCpu = NULL; + EFI_STATUS Status; + + Status = (*PeiServices)->CreateHob( PeiServices, \ + EFI_HOB_TYPE_CPU, \ + sizeof(EFI_HOB_CPU), \ + &pCpu ); + if (Status == EFI_SUCCESS) { + pCpu->SizeOfMemorySpace = 36; + pCpu->SizeOfIoSpace = 16; + MemSet(pCpu->Reserved, 6, 0); + } + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: DisablePegDevices +// +// Description: Check Disable Peg Devices. +// +// Input: +// +// Output: +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DisablePegDevices() +{ + UINT16 PegDisFun; + UINT16 i; +#ifdef RC_PEG_0 + for ( i = 0; gDisablePegDevicesTable[i].Bus != 0xff; i++) + { + UINTN PegAddress; + UINT8 PegBus; + UINT8 PegDev; + UINT8 PegFun; + + PegBus = gDisablePegDevicesTable[i].Bus; + PegDev = gDisablePegDevicesTable[i].Dev; + PegFun = gDisablePegDevicesTable[i].Fun; + + PegAddress = NB_PCIE_CFG_ADDRESS(PegBus, PegDev, PegFun, 0); + + if (READ_MEM32(PegAddress) == 0xFFFFFFFF) continue; + + // Disable Link +// CapPtr = NbFindCapPtr(PegAddress, 0x10); +// SET_MEM8((PegAddress + CapPtr + 0x10), BIT04); + SET_MEM8 ((PegAddress + R_SA_PEG_LCTL_OFFSET), BIT4); + SET_MEM8 ((PegAddress + R_SA_PEG_DEBUP2_OFFSET), BIT0); + SET_MEM32 ((PegAddress + R_SA_PEG_PEGCOMLCGCTRL_OFFSET), BIT30); + } + + PegDisFun = 0 +#if RC_PEG_0 == 0 + | B_SA_DEVEN_D1F0EN_MASK +#endif +#if !(defined RC_PEG_1) || RC_PEG_1 == 0 + | B_SA_DEVEN_D1F1EN_MASK +#endif +#if !(defined RC_PEG_2) || RC_PEG_2 == 0 + | B_SA_DEVEN_D1F2EN_MASK +#endif + ; + + // Disable PEG + if(PegDisFun != 0) + RESET_PCI16_NB(R_SA_DEVEN, PegDisFun); // 0x54 + +#endif //#ifdef RC_PEG_0 +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: InstallSaPlatformPolicyPpi +// +// Description: InstallSaPlatformPolicyPpi: This Function installs the SNB SA POLICY PPI +// +// Parameters: +// PeiServices - General purpose services available to every PEIM +// NbSetupData - NB Setup data stored in NVRAM +// +// Returns: +// Status: Return Status +// Notes: +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS +InstallSaPlatformPolicyPpi ( + IN EFI_PEI_SERVICES **PeiServices, + IN NB_SETUP_DATA *NbSetupData +) +{ + EFI_STATUS Status; + EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices = NULL; + UINTN VariableSize; + VOID *MrcS3ResumeData; + VOID *PegGen3Data; + EFI_PEI_CPU_IO_PPI *CpuIo; + EFI_PEI_PPI_DESCRIPTOR *SaPlatformPolicyPpiDesc; + SA_PLATFORM_POLICY_PPI *SaPlatformPolicyPpi; + SA_PLATFORM_DATA *PlatformData; + GT_CONFIGURATION *GtConfig; + MEMORY_CONFIGURATION *MemConfig; + PCIE_CONFIGURATION *PcieConfig; + OVERCLOCKING_CONFIGURATION *OcConfig; + PEG_GPIO_DATA *PegGpioData; + SA_GPIO_INFO *SaPegReset; +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + SG_GPIO_DATA *SgGpioData; + SA_GPIO_INFO *SgDgpuPwrOK; + SA_GPIO_INFO *SgDgpuHoldRst; + SA_GPIO_INFO *SgDgpuPwrEnable; + SA_GPIO_INFO *SgDgpuPrsnt; +#endif + UINTN MemoryCeiling = 0; + UINT16 LpcDeviceId; + UINT16 McDeviceId; + UINTN i = 0; + UINT16 CapPtr = 0; + + CpuIo = (*PeiServices)->CpuIo; + + // Locate Variable Ppi + Status = (*PeiServices)->LocatePpi (PeiServices, &gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, &VariableServices); + ASSERT_PEI_ERROR (PeiServices, Status); + + // Allocate descriptor and PPI structures + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_PLATFORM_POLICY_PPI), &SaPlatformPolicyPpi); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (EFI_PEI_PPI_DESCRIPTOR), &SaPlatformPolicyPpiDesc); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_PLATFORM_DATA), &PlatformData); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (GT_CONFIGURATION), &GtConfig); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (MEMORY_CONFIGURATION), &MemConfig); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (PCIE_CONFIGURATION), &PcieConfig); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (PEG_GPIO_DATA), &PegGpioData); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (OVERCLOCKING_CONFIGURATION), &OcConfig); + ASSERT_PEI_ERROR (PeiServices, Status); + +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SG_GPIO_DATA), &SgGpioData); + ASSERT_PEI_ERROR (PeiServices, Status); +#endif + + // Set Default to Variable not found + (*PeiServices)->SetMem ((VOID*) PlatformData, sizeof (SA_PLATFORM_DATA), 0); + (*PeiServices)->SetMem ((VOID*) SaPlatformPolicyPpiDesc, sizeof (EFI_PEI_PPI_DESCRIPTOR), 0); + (*PeiServices)->SetMem ((VOID*) GtConfig, sizeof (GT_CONFIGURATION), 0); + (*PeiServices)->SetMem ((VOID*) MemConfig, sizeof (MEMORY_CONFIGURATION), 0); + (*PeiServices)->SetMem ((VOID*) PcieConfig, sizeof (PCIE_CONFIGURATION), 0); + (*PeiServices)->SetMem ((VOID*) SaPlatformPolicyPpi, sizeof (SA_PLATFORM_POLICY_PPI), 0); + (*PeiServices)->SetMem ((VOID*) PegGpioData, sizeof (PEG_GPIO_DATA), 0); + (*PeiServices)->SetMem ((VOID*) OcConfig, sizeof (OVERCLOCKING_CONFIGURATION), 0); +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + (*PeiServices)->SetMem ((VOID*) SgGpioData, sizeof (SG_GPIO_DATA), 0); +#endif + + SaPlatformPolicyPpi->PlatformData = PlatformData; + SaPlatformPolicyPpi->GtConfig = GtConfig; + SaPlatformPolicyPpi->MemConfig = MemConfig; + SaPlatformPolicyPpi->PcieConfig = PcieConfig; + SaPlatformPolicyPpi->PcieConfig->PegGpioData = PegGpioData; + SaPlatformPolicyPpi->OcConfig = OcConfig; +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + SaPlatformPolicyPpi->SgGpioData = SgGpioData; +#endif + SaPlatformPolicyPpi->S3DataPtr = NULL; + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_GPIO_INFO), &SaPegReset); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) SaPegReset, sizeof (SA_GPIO_INFO), 0); + SaPlatformPolicyPpi->PcieConfig->PegGpioData->SaPegReset = SaPegReset; + +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_GPIO_INFO), &SgDgpuPwrOK); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) SgDgpuPwrOK, sizeof (SA_GPIO_INFO), 0); + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrOK = SgDgpuPwrOK; + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_GPIO_INFO), &SgDgpuPwrEnable); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) SgDgpuPwrEnable, sizeof (SA_GPIO_INFO), 0); + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrEnable = SgDgpuPwrEnable; + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_GPIO_INFO), &SgDgpuHoldRst); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) SgDgpuHoldRst, sizeof (SA_GPIO_INFO), 0);; + SaPlatformPolicyPpi->SgGpioData->SgDgpuHoldRst = SgDgpuHoldRst; + + Status = (*PeiServices)->AllocatePool (PeiServices, sizeof (SA_GPIO_INFO), &SgDgpuPrsnt); + ASSERT_PEI_ERROR (PeiServices, Status); + (*PeiServices)->SetMem ((VOID*) SgDgpuPrsnt, sizeof (SA_GPIO_INFO), 0); + SaPlatformPolicyPpi->SgGpioData->SgDgpuPrsnt = SgDgpuPrsnt; +#endif + + // + // Initialize the PPI + // + SaPlatformPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; + SaPlatformPolicyPpiDesc->Guid = &gSaPlatformPolicyPpiGuid; + SaPlatformPolicyPpiDesc->Ppi = SaPlatformPolicyPpi; + + // Read MC device ID + McDeviceId = READ_PCI16_NB(R_SA_MC_DEVICE_ID); + + // Read PCH device ID + LpcDeviceId = READ_PCI16_SB(R_PCH_LPC_DEVICE_ID); + + // Update the REVISION number + SaPlatformPolicyPpi->Revision = SA_PLATFORM_POLICY_PPI_REVISION_15; + + // Get the Platform Configuration from NbSetupData + SaPlatformPolicyPpi->PlatformData->SpdAddressTable[0] = DIMM1_SMBUS_ADDRESS; + SaPlatformPolicyPpi->PlatformData->SpdAddressTable[1] = DIMM2_SMBUS_ADDRESS; + SaPlatformPolicyPpi->PlatformData->SpdAddressTable[2] = DIMM3_SMBUS_ADDRESS; + SaPlatformPolicyPpi->PlatformData->SpdAddressTable[3] = DIMM4_SMBUS_ADDRESS; + SaPlatformPolicyPpi->PlatformData->MchBar = (UINT32)NB_MCH_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->DmiBar = (UINT32)NB_DMI_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->EpBar = (UINT32)NB_EP_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->PciExpressBar = (UINT32)PCIEX_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->SmbusBar = (UINT32)SMBUS_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->EdramBar = (UINT32)NB_DERAM_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->GdxcBar = (UINT32)NB_GDXC_BASE_ADDRESS; + SaPlatformPolicyPpi->PlatformData->TsegSize = (UINT32)TSEG_SIZE; + SaPlatformPolicyPpi->PlatformData->IedSize = (UINT32)IED_SIZE; + SaPlatformPolicyPpi->PlatformData->FastBoot = NbSetupData->MrcFastBoot; + + if(NbSetupData->IsRunMemoryDown) { + SaPlatformPolicyPpi->PlatformData->BoardId = 0; + } else { + SaPlatformPolicyPpi->PlatformData->BoardId = 0xff; + } + + SaPlatformPolicyPpi->MemConfig->MrcFastBoot = NbSetupData->MrcFastBoot; + + SaPlatformPolicyPpi->MemConfig->BClkFrequency = 100 * 1000 * 1000; + SaPlatformPolicyPpi->MemConfig->MaxRttWr = NbSetupData->MaxRttWr; + SaPlatformPolicyPpi->MemConfig->PowerDownMode = NbSetupData->PowerDownMode0; + SaPlatformPolicyPpi->MemConfig->PwdwnIdleCounter = NbSetupData->PwdwnIdleCounter; + SaPlatformPolicyPpi->MemConfig->RankInterleave = NbSetupData->RankInterleave; + SaPlatformPolicyPpi->MemConfig->EnhancedInterleave = NbSetupData->EnhancedInterleave; + SaPlatformPolicyPpi->MemConfig->WeaklockEn = NbSetupData->WeaklockEn; + SaPlatformPolicyPpi->MemConfig->EnCmdRate = 7; + SaPlatformPolicyPpi->MemConfig->CmdTriStateDis = FALSE; + SaPlatformPolicyPpi->MemConfig->RefreshRate2x = NbSetupData->Refresh2X; + + SaPlatformPolicyPpi->MemConfig->McLock = NbSetupData->McLock; + + SaPlatformPolicyPpi->MemConfig->GdxcEnable = NbSetupData->GdxcEnable; + SaPlatformPolicyPpi->MemConfig->GdxcIotSize = NbSetupData->GdxcIotSize; + SaPlatformPolicyPpi->MemConfig->GdxcMotSize = NbSetupData->GdxcMotSize; + SaPlatformPolicyPpi->MemConfig->MemoryTrace = NbSetupData->MemoryTrace; + + SaPlatformPolicyPpi->MemConfig->ECT = NbSetupData->ECT; + SaPlatformPolicyPpi->MemConfig->SOT = NbSetupData->SOT; + SaPlatformPolicyPpi->MemConfig->RDMPRT = NbSetupData->RDMPRT; + SaPlatformPolicyPpi->MemConfig->RCVET = NbSetupData->RCVET; + SaPlatformPolicyPpi->MemConfig->JWRL = NbSetupData->JWRL; + SaPlatformPolicyPpi->MemConfig->FWRL = NbSetupData->FWRL; + SaPlatformPolicyPpi->MemConfig->WRTC1D = NbSetupData->WRTC1D; + SaPlatformPolicyPpi->MemConfig->RDTC1D = NbSetupData->RDTC1D; + SaPlatformPolicyPpi->MemConfig->DIMMODTT = NbSetupData->DIMMODTT; + SaPlatformPolicyPpi->MemConfig->WRDST = NbSetupData->WRDST; + SaPlatformPolicyPpi->MemConfig->WREQT = NbSetupData->WREQT; + + SaPlatformPolicyPpi->MemConfig->RDODTT = NbSetupData->RDODTT; + SaPlatformPolicyPpi->MemConfig->RDEQT = NbSetupData->RDEQT; + SaPlatformPolicyPpi->MemConfig->RDAPT = NbSetupData->RDAPT; + SaPlatformPolicyPpi->MemConfig->WRTC2D = NbSetupData->WRTC2D; + SaPlatformPolicyPpi->MemConfig->RDTC2D = NbSetupData->RDTC2D; + SaPlatformPolicyPpi->MemConfig->CMDVC = NbSetupData->CMDVC; + SaPlatformPolicyPpi->MemConfig->WRVC2D = NbSetupData->WRVC2D; + SaPlatformPolicyPpi->MemConfig->RDVC2D = NbSetupData->RDVC2D; + SaPlatformPolicyPpi->MemConfig->LCT = NbSetupData->LCT; + SaPlatformPolicyPpi->MemConfig->RTL = NbSetupData->RTL; + SaPlatformPolicyPpi->MemConfig->TAT = NbSetupData->TAT; + SaPlatformPolicyPpi->MemConfig->MEMTST = NbSetupData->MEMTST; + SaPlatformPolicyPpi->MemConfig->DIMMODTT1D = NbSetupData->DIMMODTT1D; + SaPlatformPolicyPpi->MemConfig->WRSRT = NbSetupData->WRSRT; + SaPlatformPolicyPpi->MemConfig->DIMMRONT = NbSetupData->DIMMRONT; + SaPlatformPolicyPpi->MemConfig->ALIASCHK = NbSetupData->ALIASCHK; + SaPlatformPolicyPpi->MemConfig->RCVENC1D = NbSetupData->RCVENC1D; + SaPlatformPolicyPpi->MemConfig->RMC = NbSetupData->RMC; + + /// + /// Channel Hash Configuration + /// + SaPlatformPolicyPpi->MemConfig->ChHashEnable = NbSetupData->ChHashEnable; + SaPlatformPolicyPpi->MemConfig->ChHashMask = NbSetupData->ChHashMask; + SaPlatformPolicyPpi->MemConfig->ChHashInterleaveBit = NbSetupData->ChHashInterleaveBit; + + /// + /// MrcUltPoSafeConfig + /// 1 to enable, 0 to disable + /// +// SaPlatformPolicyPpi->MemConfig->MrcUltPoSafeConfig = 0; + + if (GetPchSeries() == PchLp) { + /// + /// Interleaving mode of DQ/DQS pins - depends on board routing + /// + SaPlatformPolicyPpi->MemConfig->DqPinsInterleaved = NbSetupData->DqPinsInterleaved; + } + + // Get the Graphics configuration from the NbSetupData + SaPlatformPolicyPpi->GtConfig->IgdDvmt50PreAlloc = NbSetupData->IgdDvmt50PreAlloc; + + if (GetPchSeries() == PchLp) { + NbSetupData->AlwaysEnablePeg = 2; + } + + if (NbSetupData->AlwaysEnablePeg != 0) DisablePegDevices(); + + //if AlwaysEnablePeg Auto and Enable send to Policy , disable device + switch (NbSetupData->AlwaysEnablePeg) { + case 0: + case 1: + SaPlatformPolicyPpi->PcieConfig->AlwaysEnablePeg = NbSetupData->AlwaysEnablePeg; + break; + case 2: + // Disable Link + for (i = 0; NBPcieBridge[i] != 0xFFFFFFFF; i++) + { + if (READ_MEM32(NBPcieBridge[i]) == 0xFFFFFFFF) continue; + SET_MEM8((NBPcieBridge[i] + R_SA_PEG_LCTL_OFFSET), BIT04); + SET_MEM8 ((NBPcieBridge[i] + R_SA_PEG_DEBUP2_OFFSET), BIT0); + SET_MEM32 ((NBPcieBridge[i] + R_SA_PEG_PEGCOMLCGCTRL_OFFSET), BIT30); + + } + // Disable PEG + RESET_PCI16_NB(R_SA_DEVEN, (B_SA_DEVEN_D1F0EN_MASK | B_SA_DEVEN_D1F1EN_MASK | B_SA_DEVEN_D1F2EN_MASK)); // 0x54 + break; + } + + SaPlatformPolicyPpi->GtConfig->InternalGraphics = NbSetupData->InternalGraphics; + SaPlatformPolicyPpi->GtConfig->PrimaryDisplay = NbSetupData->PrimaryDisplay; + SaPlatformPolicyPpi->GtConfig->ApertureSize = NbSetupData->ApertureSize; + + // Control for enabling/disabling VDD force bit (Required only for early enabling of eDP panel) + SaPlatformPolicyPpi->GtConfig->PanelPowerEnable = NbSetupData->PanelPowerEnable; + + SaPlatformPolicyPpi->GtConfig->GttSize = NbSetupData->GTTSize; + SaPlatformPolicyPpi->GtConfig->GttMmAdr = NB_TEMP_MMIO_BASE; + + // Get the PciExpress Configuration from the NbSetupData + SaPlatformPolicyPpi->PcieConfig->DmiVc1 = NbSetupData->DmiVc1; + SaPlatformPolicyPpi->PcieConfig->DmiVcp = NbSetupData->DmiVcp; + SaPlatformPolicyPpi->PcieConfig->DmiVcm = NbSetupData->DmiVcm; + SaPlatformPolicyPpi->PcieConfig->DmiGen2 = NbSetupData->DmiGen2; + + SaPlatformPolicyPpi->PcieConfig->PegGenx[0] = NbSetupData->PegGenx0; + SaPlatformPolicyPpi->PcieConfig->PegGenx[1] = NbSetupData->PegGenx1; + SaPlatformPolicyPpi->PcieConfig->PegGenx[2] = NbSetupData->PegGenx2; + + for (i = 0; i < SA_PEG_MAX_FUN; i++) { + SaPlatformPolicyPpi->PcieConfig->PowerDownUnusedBundles[i] = NbSetupData->PowerDownUnusedBundles[i]; + } + + + // UserBd = Mobile - 0; Desktop/UpServer - 1; ULT - 5; + if(IS_SA_DEVICE_ID_MOBILE (McDeviceId)) { + SaPlatformPolicyPpi->PlatformData->UserBd = btCRBMB; + } else { + if (GetPchSeries() == PchLp) { + SaPlatformPolicyPpi->PlatformData->UserBd = btUser4; + } else { + SaPlatformPolicyPpi->PlatformData->UserBd = btCRBDT; + } + } + + SaPlatformPolicyPpi->MemConfig->SpdProfileSelected = NbSetupData->SpdProfileSelected; + SaPlatformPolicyPpi->MemConfig->NModeSupport = NbSetupData->NModeSupport; + SaPlatformPolicyPpi->MemConfig->RMT = NbSetupData->RmtCrosserEnable; + +#ifdef EFI_DEBUG +#if MRC_DEBUG_PRINT_SUPPORT + SaPlatformPolicyPpi->MemConfig->MrcTimeMeasure = FALSE; + SaPlatformPolicyPpi->MemConfig->SerialDebug = MSG_LEVEL_NOTE; +#else // #if MRC_DEBUG_PRINT_SUPPORT + SaPlatformPolicyPpi->MemConfig->MrcTimeMeasure = FALSE; + SaPlatformPolicyPpi->MemConfig->SerialDebug = MSG_LEVEL_WARNING; +#endif // #if MRC_DEBUG_PRINT_SUPPORT +#else // EFI_DEBUG + SaPlatformPolicyPpi->MemConfig->MrcTimeMeasure = FALSE; + SaPlatformPolicyPpi->MemConfig->SerialDebug = MSG_LEVEL_NEVER; +#endif // EFI_DEBUG + + SaPlatformPolicyPpi->MemConfig->DDR3Voltage = 0; + SaPlatformPolicyPpi->MemConfig->DDR3VoltageWaitTime = NbSetupData->DDRVoltageWaitTime; + SaPlatformPolicyPpi->MemConfig->RefClk = 0; + SaPlatformPolicyPpi->MemConfig->Ratio = 0; + + // + // Thermal Management Configuration + // + SaPlatformPolicyPpi->MemConfig->ThermalManagement = NbSetupData->MemoryThermalManagement; + SaPlatformPolicyPpi->MemConfig->PeciInjectedTemp = NbSetupData->PeciInjectedTemp; + SaPlatformPolicyPpi->MemConfig->ExttsViaTsOnBoard = NbSetupData->ExttsViaTsOnBoard; + SaPlatformPolicyPpi->MemConfig->ExttsViaTsOnDimm = NbSetupData->ExttsViaTsOnBoard; + SaPlatformPolicyPpi->MemConfig->VirtualTempSensor = NbSetupData->VirtualTempSensor; + /// + /// Options for Thermal settings + /// + SaPlatformPolicyPpi->MemConfig->EnableExtts = NbSetupData->EnableExtts; + SaPlatformPolicyPpi->MemConfig->EnableCltm = NbSetupData->EnableCltm; + SaPlatformPolicyPpi->MemConfig->EnableOltm = NbSetupData->EnableOltm; + SaPlatformPolicyPpi->MemConfig->EnablePwrDn = NbSetupData->EnablePwrDn; + SaPlatformPolicyPpi->MemConfig->Refresh2X = NbSetupData->Refresh2XMode; + SaPlatformPolicyPpi->MemConfig->LpddrThermalSensor = NbSetupData->LpddrThermalSensor; + SaPlatformPolicyPpi->MemConfig->LockPTMregs = NbSetupData->LockPTMregs; + SaPlatformPolicyPpi->MemConfig->UserPowerWeightsEn = NbSetupData->UserPowerWeightsEn; + + SaPlatformPolicyPpi->MemConfig->EnergyScaleFact = NbSetupData->EnergyScaleFact; + SaPlatformPolicyPpi->MemConfig->RaplPwrFlCh1 = NbSetupData->RaplPwrFlCh1; + SaPlatformPolicyPpi->MemConfig->RaplPwrFlCh0 = NbSetupData->RaplPwrFlCh0; + + SaPlatformPolicyPpi->MemConfig->RaplLim2Lock = NbSetupData->RaplLim2Lock; + SaPlatformPolicyPpi->MemConfig->RaplLim2WindX = NbSetupData->RaplLim2WindX; + SaPlatformPolicyPpi->MemConfig->RaplLim2WindY = NbSetupData->RaplLim2WindY; + SaPlatformPolicyPpi->MemConfig->RaplLim2Ena = NbSetupData->RaplLim2Ena; + SaPlatformPolicyPpi->MemConfig->RaplLim2Pwr = NbSetupData->RaplLim2Pwr; + SaPlatformPolicyPpi->MemConfig->RaplLim1WindX = NbSetupData->RaplLim1WindX; + SaPlatformPolicyPpi->MemConfig->RaplLim1WindY = NbSetupData->RaplLim1WindY; + SaPlatformPolicyPpi->MemConfig->RaplLim1Ena = NbSetupData->RaplLim1Ena; + SaPlatformPolicyPpi->MemConfig->RaplLim1Pwr = NbSetupData->RaplLim1Pwr; + + SaPlatformPolicyPpi->MemConfig->WarmThresholdCh0Dimm0 = NbSetupData->WarmThresholdCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->WarmThresholdCh0Dimm1 = NbSetupData->WarmThresholdCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->WarmThresholdCh1Dimm0 = NbSetupData->WarmThresholdCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->WarmThresholdCh1Dimm1 = NbSetupData->WarmThresholdCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->HotThresholdCh0Dimm0 = NbSetupData->HotThresholdCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->HotThresholdCh0Dimm1 = NbSetupData->HotThresholdCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->HotThresholdCh1Dimm0 = NbSetupData->HotThresholdCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->HotThresholdCh1Dimm1 = NbSetupData->HotThresholdCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->WarmBudgetCh0Dimm0 = NbSetupData->WarmBudgetCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->WarmBudgetCh0Dimm1 = NbSetupData->WarmBudgetCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->WarmBudgetCh1Dimm0 = NbSetupData->WarmBudgetCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->WarmBudgetCh1Dimm1 = NbSetupData->WarmBudgetCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->HotBudgetCh0Dimm0 = NbSetupData->HotBudgetCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->HotBudgetCh0Dimm1 = NbSetupData->HotBudgetCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->HotBudgetCh1Dimm0 = NbSetupData->HotBudgetCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->HotBudgetCh1Dimm1 = NbSetupData->HotBudgetCh1Dimm1; + + SaPlatformPolicyPpi->MemConfig->IdleEnergyCh0Dimm1 = NbSetupData->IdleEnergyCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->IdleEnergyCh0Dimm0 = NbSetupData->IdleEnergyCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->PdEnergyCh0Dimm1 = NbSetupData->PdEnergyCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->PdEnergyCh0Dimm0 = NbSetupData->PdEnergyCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->ActEnergyCh0Dimm1 = NbSetupData->ActEnergyCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->ActEnergyCh0Dimm0 = NbSetupData->ActEnergyCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->RdEnergyCh0Dimm1 = NbSetupData->RdEnergyCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->RdEnergyCh0Dimm0 = NbSetupData->RdEnergyCh0Dimm0; + SaPlatformPolicyPpi->MemConfig->WrEnergyCh0Dimm1 = NbSetupData->WrEnergyCh0Dimm1; + SaPlatformPolicyPpi->MemConfig->WrEnergyCh0Dimm0 = NbSetupData->WrEnergyCh0Dimm0; + + SaPlatformPolicyPpi->MemConfig->IdleEnergyCh1Dimm1 = NbSetupData->IdleEnergyCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->IdleEnergyCh1Dimm0 = NbSetupData->IdleEnergyCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->PdEnergyCh1Dimm1 = NbSetupData->PdEnergyCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->PdEnergyCh1Dimm0 = NbSetupData->PdEnergyCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->ActEnergyCh1Dimm1 = NbSetupData->ActEnergyCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->ActEnergyCh1Dimm0 = NbSetupData->ActEnergyCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->RdEnergyCh1Dimm1 = NbSetupData->RdEnergyCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->RdEnergyCh1Dimm0 = NbSetupData->RdEnergyCh1Dimm0; + SaPlatformPolicyPpi->MemConfig->WrEnergyCh1Dimm1 = NbSetupData->WrEnergyCh1Dimm1; + SaPlatformPolicyPpi->MemConfig->WrEnergyCh1Dimm0 = NbSetupData->WrEnergyCh1Dimm0; + + SaPlatformPolicyPpi->MemConfig->SrefCfgEna = NbSetupData->SrefCfgEna; + SaPlatformPolicyPpi->MemConfig->SrefCfgIdleTmr = NbSetupData->SrefCfgIdleTmr; + SaPlatformPolicyPpi->MemConfig->ThrtCkeMinDefeat = NbSetupData->ThrtCkeMinDefeat; + SaPlatformPolicyPpi->MemConfig->ThrtCkeMinTmr = NbSetupData->ThrtCkeMinTmr; + + if (GetPchSeries() == PchLp) { + SaPlatformPolicyPpi->MemConfig->ThrtCkeMinDefeatLpddr = NbSetupData->ThrtCkeMinDefeatLpddr; + SaPlatformPolicyPpi->MemConfig->ThrtCkeMinTmrLpddr = NbSetupData->ThrtCkeMinTmrLpddr; + SaPlatformPolicyPpi->MemConfig->EnablePwrDnLpddr = NbSetupData->EnablePwrDnLpddr; + } + + + // + // Scrambler + // + SaPlatformPolicyPpi->MemConfig->ScramblerSupport = NbSetupData->ScramblerSupport; + + // + // Power Mode Setting + // + SaPlatformPolicyPpi->MemConfig->ForceColdReset = NbSetupData->ForceColdReset; + // + // Channel DIMM Disable + // + SaPlatformPolicyPpi->MemConfig->DisableDimmChannel[0] = NbSetupData->DisableDimmChannel0; + SaPlatformPolicyPpi->MemConfig->DisableDimmChannel[1] = NbSetupData->DisableDimmChannel1; + + SaPlatformPolicyPpi->MemConfig->AutoSelfRefreshSupport = NbSetupData->AutoSelfRefreshSupport; + SaPlatformPolicyPpi->MemConfig->ExtTemperatureSupport = NbSetupData->ExtTemperatureSupport; + + /// + /// Options for MC Register Offsets + /// + SaPlatformPolicyPpi->MemConfig->CAVrefCtlOffset = NbSetupData->CAVrefCtlOffset; + SaPlatformPolicyPpi->MemConfig->Ch0VrefCtlOffset = NbSetupData->Ch0VrefCtlOffset; + SaPlatformPolicyPpi->MemConfig->Ch1VrefCtlOffset = NbSetupData->Ch1VrefCtlOffset; + SaPlatformPolicyPpi->MemConfig->Ch0ClkPiCodeOffset = NbSetupData->Ch0ClkPiCodeOffset; + SaPlatformPolicyPpi->MemConfig->Ch1ClkPiCodeOffset = NbSetupData->Ch1ClkPiCodeOffset; + SaPlatformPolicyPpi->MemConfig->Ch0RcvEnOffset = NbSetupData->Ch0RcvEnOffset; + SaPlatformPolicyPpi->MemConfig->Ch0RxDqsOffset = NbSetupData->Ch0RxDqsOffset; + SaPlatformPolicyPpi->MemConfig->Ch0TxDqOffset = NbSetupData->Ch0TxDqOffset; + SaPlatformPolicyPpi->MemConfig->Ch0TxDqsOffset = NbSetupData->Ch0TxDqsOffset; + SaPlatformPolicyPpi->MemConfig->Ch0VrefOffset = NbSetupData->Ch0VrefOffset; + SaPlatformPolicyPpi->MemConfig->Ch1RcvEnOffset = NbSetupData->Ch1RcvEnOffset; + SaPlatformPolicyPpi->MemConfig->Ch1RxDqsOffset = NbSetupData->Ch1RxDqsOffset; + SaPlatformPolicyPpi->MemConfig->Ch1TxDqOffset = NbSetupData->Ch1TxDqOffset; + SaPlatformPolicyPpi->MemConfig->Ch1TxDqsOffset = NbSetupData->Ch1TxDqsOffset; + SaPlatformPolicyPpi->MemConfig->Ch1VrefOffset = NbSetupData->Ch1VrefOffset; + + // + // Initialize the 16bit CMOS location for scrambling seed storage when iFFS is enabled + // + SaPlatformPolicyPpi->ScramblerSeedCmosLocation = NB_CMOS_IFFS_SCRAMBLER_SEED; + + SaPlatformPolicyPpi->MemConfig->RemapEnable = NbSetupData->RemapEnable; + +#ifdef BDAT_SUPPORT + SaPlatformPolicyPpi->MemConfig->RmtBdatEnable = NbSetupData->BdatAcpiTableSupport; +#endif + + SaPlatformPolicyPpi->PcieConfig->PegGen3Equalization = NbSetupData->PegGen3Equalization; + + // + // PEG Sampler Calibration: 0 = Disabled, 1 = Enabled, 2 = Auto (default) + // + SaPlatformPolicyPpi->PcieConfig->PegSamplerCalibrate = NbSetupData->PegSamplerCalibrate;; + + // + // PEG Gen3 Equalization Phase 2: 0 = Disabled (default), 1 = Enabled + // + SaPlatformPolicyPpi->PcieConfig->PegGen3EqualizationPhase2 = NbSetupData->PegGen3EqualizationPhase2; + + // + // PEG Gen3 Preset Search: 0 = Disabled (default), 1 = Enabled + // PEG Gen3 Preset Search dwell time: 400 ms + // PEG Gen3 Preset Search Margin Steps: 2 + // PEG Gen3 Preset Search Start Margin: 15 + // PEG Gen3 Preset Search Error Target: 4 + // + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearch = NbSetupData->PegGen3PresetSearch; + SaPlatformPolicyPpi->PcieConfig->PegGen3ForcePresetSearch = NbSetupData->PegGen3ForcePresetSearch; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchDwellTime = NbSetupData->PegGen3PresetSearchDwellTime; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchMarginSteps = NbSetupData->PegGen3PresetSearchMarginSteps; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchStartMargin = NbSetupData->PegGen3PresetSearchStartMargin; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchVoltageMarginSteps = NbSetupData->PegGen3PresetSearchVoltageMarginSteps; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchVoltageStartMargin = NbSetupData->PegGen3PresetSearchVoltageStartMargin; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchFavorTiming = NbSetupData->PegGen3PresetSearchFavorTiming; + SaPlatformPolicyPpi->PcieConfig->PegGen3PresetSearchErrorTarget = NbSetupData->PegGen3PresetSearchErrorTarget; + + for (i = 0; i < 16; i++) { + // RP preset goes to bits [3:0] and [19:16] + // EP preset goes to bits [11:8] and [27:24] + // EP hint goes to bits [14:12] and [30:28] + SaPlatformPolicyPpi->PcieConfig->Gen3RootPortPreset[i] = NbSetupData->Gen3RootPortPreset[i]; + SaPlatformPolicyPpi->PcieConfig->Gen3EndPointPreset[i] = NbSetupData->Gen3EndPointPreset[i]; + SaPlatformPolicyPpi->PcieConfig->Gen3EndPointHint[i] = NbSetupData->Gen3EndPointHint[i]; + } + + /// + /// Parameters for PCIe ASPM flow control + /// InitPcieAspmAfterOprom: + /// 0 (default) - PCIe ASPM will be initialized Before Oprom + /// 1 - PCIe ASPM will be initialized After Oprom (required IOTRAP SMI handler) + /// Note: This setting should match supported mode! + /// + /// SaIotrapSmiAddress: + /// IOTRAP SMI address for SA SMI callback handler. This should be given if platform supports InitPcieAspmAfterOprom = 1 scenario (SaLateInitSmm driver was compiled) + /// + SaPlatformPolicyPpi->PcieConfig->InitPcieAspmAfterOprom = NbSetupData->InitPcieAspmAfterOprom; + SaPlatformPolicyPpi->PcieConfig->SaIotrapSmiAddress = NB_IOTRAP_SMI_ADDRESSE; + + /// + /// Parameters for PCIe Gen3 device reset + /// + SaPlatformPolicyPpi->PcieConfig->PegGpioData->GpioSupport = NbSetupData->AllowPerstGpioUsage; + if (SaPlatformPolicyPpi->PcieConfig->PegGpioData->GpioSupport) { + /// + /// PEG Reset: GPIO 50, Active Low (Mobile PDG) + /// + SaPlatformPolicyPpi->PcieConfig->PegGpioData->SaPegReset->Value = NbSetupData->AllowPerstGpio; + SaPlatformPolicyPpi->PcieConfig->PegGpioData->SaPegReset->Active = NbSetupData->AllowPerstGpioActive; + } + + /// + /// Enable/Disable RxCEM Loop back + /// 1=Enable, 0=Disable (default) + /// When enabled, Lane for loop back should be selected (0 ~ 15 and default is Lane 0) + /// + SaPlatformPolicyPpi->PcieConfig->RxCEMLoopback = NbSetupData->RxCEMLoopback; + SaPlatformPolicyPpi->PcieConfig->RxCEMLoopbackLane = NbSetupData->RxCEMLoopbackLane; + + /// + /// Gen3 RxCTLE peaking default is 8 + /// + for (i = 0; i < SA_PEG_MAX_BUNDLE; i++) { + SaPlatformPolicyPpi->PcieConfig->Gen3RxCtleP[i] = NbSetupData->Gen3RxCtleP[i]; + } + + /// + /// Initialize the SA PEG Data pointer for saved preset search results + /// + SaPlatformPolicyPpi->PcieConfig->PegDataPtr = NULL; + + SaPlatformPolicyPpi->PcieConfig->PegSwingControl = NbSetupData->SwingControl; + + SaPlatformPolicyPpi->PcieConfig->PegComplianceTestingMode = NbSetupData->PegComplianceTestingMode; + + + // + // Read DDR Frequecy setting selected in Bios setup + // + switch (NbSetupData->DdrFreqLimit) { + case DDR3_FREQ_1067: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 1067; + break; + + case DDR3_FREQ_1333: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 1333; + break; + + case DDR3_FREQ_1600: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 1600; + break; + + case DDR3_FREQ_1867: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 1867; + break; + + case DDR3_FREQ_2133: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 2133; + break; + + case DDR3_FREQ_2400: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 2400; + break; + + case DDR3_FREQ_2667: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 2667; + break; + + case DDR3_FREQ_AUTO: + default: + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 0; + break; + + } + +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 0 +{ + WDT_PPI *WdtPpi = NULL; + UINT8 WdtFlag = V_PCH_OC_WDT_CTL_STATUS_FAILURE; + + // + // Locate WDT PPI for access to Wdt->CheckStatus() + // + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gWdtPpiGuid, + 0, + NULL, + &WdtPpi + ); + if (!EFI_ERROR (Status)) { + WdtFlag = WdtPpi->CheckStatus(); + } + + if (WdtFlag == V_PCH_OC_WDT_CTL_STATUS_OK) { + if(NbSetupData->SpdProfileSelected == 1) { // UserDefault + if(NbSetupData->OcDdrFreqLimit != 0) + + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = NbSetupData->OcDdrFreqLimit; + // if (SettingData.MemoryClockMultiplier == 100) + // SaPlatformPolicyPpi->MemConfig->RefClk = MRC_REF_CLOCK_100; + + SaPlatformPolicyPpi->MemConfig->Ratio = \ + NbFrequencyToRatio(SaPlatformPolicyPpi->MemConfig->DdrFreqLimit, MRC_REF_CLOCK_133, SaPlatformPolicyPpi->MemConfig->BClkFrequency);//SaPlatformPolicyPpi->MemConfig->RefClk); + + SaPlatformPolicyPpi->MemConfig->tCL = NbSetupData->tCL; + SaPlatformPolicyPpi->MemConfig->tCWL = NbSetupData->tCWL; + SaPlatformPolicyPpi->MemConfig->tFAW = NbSetupData->tFAW; + SaPlatformPolicyPpi->MemConfig->tRAS = NbSetupData->tRAS; + SaPlatformPolicyPpi->MemConfig->tRC = NbSetupData->tRC; + SaPlatformPolicyPpi->MemConfig->tRCD = NbSetupData->tRCD; + SaPlatformPolicyPpi->MemConfig->tREFI = NbSetupData->tREFI; + SaPlatformPolicyPpi->MemConfig->tRFC = NbSetupData->tRFC; + SaPlatformPolicyPpi->MemConfig->tRP = NbSetupData->tRP; + SaPlatformPolicyPpi->MemConfig->tRRD = NbSetupData->tRRD; + SaPlatformPolicyPpi->MemConfig->tRTP = NbSetupData->tRTP; + SaPlatformPolicyPpi->MemConfig->tWR = NbSetupData->tWR; + SaPlatformPolicyPpi->MemConfig->tWTR = NbSetupData->tWTR; +// SaPlatformPolicyPpi->MemConfig->tWTR = NbSetupData->tRPab; + + } else if (SaPlatformPolicyPpi->MemConfig->SpdProfileSelected >= 2) { // XMP + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 0; + } + +#ifndef EFI_DEBUG + if (WdtPpi != NULL && SaPlatformPolicyPpi->MemConfig->SpdProfileSelected != 0) { + WdtPpi->ReloadAndStart (10); // 10 Sec + } +#endif + + } else if (WdtFlag == V_PCH_OC_WDT_CTL_STATUS_FAILURE) { + SaPlatformPolicyPpi->MemConfig->SpdProfileSelected = 0; // Auto + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = 0; + } +} +#endif +// (P20121012A) >> Update XTU 4.0 +#if defined PERF_TUNE_SUPPORT && PERF_TUNE_SUPPORT == 1 +#if defined IXTU_LABLE_VERSION && IXTU_LABLE_VERSION >= 0x00C +{ + PERF_TUNE_PPI *PerfTunePpi; + BIOS_SETTING_DATA SettingData; + + Status = (*PeiServices)->LocatePpi( + PeiServices, + &gPerfTunePpiGuid, + 0, + NULL, + &PerfTunePpi); + if (EFI_ERROR(Status)) + { + ASSERT_PEI_ERROR(PeiServices, Status); + }else{ + + Status = PerfTunePpi->GetSettingData(PeiServices, &SettingData); + if((!EFI_ERROR (Status)) && (!PerfTunePpi->IsRunDefault(PeiServices))) + { + + SaPlatformPolicyPpi->MemConfig->SpdProfileSelected = (UINT8)SettingData.XmpProfilesSelect; + if (SettingData.XmpProfilesSelect == 1) { // UserDefault + + + if (SettingData.MemoryClockMultiplier == 100) + SaPlatformPolicyPpi->MemConfig->RefClk = MRC_REF_CLOCK_100; + + SaPlatformPolicyPpi->MemConfig->Ratio = (UINT8)SettingData.DDRMul / 2; + + SaPlatformPolicyPpi->MemConfig->DdrFreqLimit = \ + NbRatioToFrequency(SaPlatformPolicyPpi->MemConfig->Ratio, SaPlatformPolicyPpi->MemConfig->RefClk, SaPlatformPolicyPpi->MemConfig->BClkFrequency); + + SaPlatformPolicyPpi->MemConfig->tCL = SettingData.tCL; + SaPlatformPolicyPpi->MemConfig->tCWL = SettingData.tCWL; + SaPlatformPolicyPpi->MemConfig->tFAW = SettingData.tFAW; + SaPlatformPolicyPpi->MemConfig->tRAS = SettingData.tRAS; + SaPlatformPolicyPpi->MemConfig->tRC = SettingData.tRC; + SaPlatformPolicyPpi->MemConfig->tRCD = SettingData.tRCD; + SaPlatformPolicyPpi->MemConfig->tREFI = SettingData.tREFI; + SaPlatformPolicyPpi->MemConfig->tRFC = SettingData.tRFC; + SaPlatformPolicyPpi->MemConfig->tRP = SettingData.tRP; + SaPlatformPolicyPpi->MemConfig->tRRD = SettingData.tRRD; + SaPlatformPolicyPpi->MemConfig->tRTP = SettingData.tRTP; + SaPlatformPolicyPpi->MemConfig->tWR = SettingData.tWR; + SaPlatformPolicyPpi->MemConfig->tWTR = SettingData.tWTR; + //SaPlatformPolicyPpi->MemConfig->tRPab = SettingData.tRPab; + } // SettingData.XmpProfilesSelect == 1 + + WRITE_MEM8_MCH(0x5990, (UINT8)SettingData.RuntimeTurbo); + + NbSetupData->GtOcSupport = 0; // if XTU is Enable, Default = disable. + if((SettingData.GraphicTurboRatioLimit!=0xFFFF)){ + NbSetupData->GtMaxOcTurboRatio = SettingData.GraphicTurboRatioLimit; + NbSetupData->GtExtraTurboVoltage = SettingData.GraphicsCoreVoltageOverride; + + NbSetupData->GtVoltageOverride = SettingData.GraphicsCoreVoltageOverride; + NbSetupData->GtVoltageMode = (UINT8)SettingData.GraphicsCoreVoltageMode; + // GT offset + if (SettingData.GraphicsCoreVoltageOffset >=0 && \ + SettingData.GraphicsCoreVoltageOffset <= 999){ + NbSetupData->GtVoltageOffset = ~(1000 - SettingData.GraphicsCoreVoltageOffset) + 1; + }else if (SettingData.GraphicsCoreVoltageOffset >=1000 && \ + SettingData.GraphicsCoreVoltageOffset <= 1998){ + NbSetupData->GtVoltageOffset = SettingData.GraphicsCoreVoltageOffset - 1000; + } + // SA offset + if (SettingData.SystemAgentVoltageOffset >=0 && \ + SettingData.SystemAgentVoltageOffset <= 999){ + NbSetupData->SaVoltageOffset = ~(1000 - SettingData.SystemAgentVoltageOffset) + 1; + }else if (SettingData.SystemAgentVoltageOffset >=1000 && \ + SettingData.SystemAgentVoltageOffset <= 1998){ + NbSetupData->SaVoltageOffset = SettingData.SystemAgentVoltageOffset - 1000; + } + // IOA offset + if (SettingData.IOAnalogVoltageOffset >=0 && \ + SettingData.IOAnalogVoltageOffset <= 999){ + NbSetupData->IoaVoltageOffset = ~(1000 - SettingData.IOAnalogVoltageOffset) + 1; + }else if (SettingData.IOAnalogVoltageOffset >=1000 && \ + SettingData.IOAnalogVoltageOffset <= 1998){ + NbSetupData->IoaVoltageOffset = SettingData.IOAnalogVoltageOffset - 1000; + } + + // IOD offset + if (SettingData.IODigitalVoltageOffset >=0 && \ + SettingData.IODigitalVoltageOffset <= 999){ + NbSetupData->IodVoltageOffset = ~(1000 - SettingData.IODigitalVoltageOffset) + 1; + }else if (SettingData.IODigitalVoltageOffset >=1000 && \ + SettingData.IODigitalVoltageOffset <= 1998){ + NbSetupData->IodVoltageOffset = SettingData.IODigitalVoltageOffset - 1000; + } + NbSetupData->GtOcSupport = 1; + } + }else{ + NbSetupData->GtVoltageOffset = 0; + NbSetupData->GtVoltageOverride = 0; + NbSetupData->GtExtraTurboVoltage = 0; + NbSetupData->GtMaxOcTurboRatio = READ_MEM8_MCH(0x5998); + NbSetupData->SaVoltageOffset = 0; + NbSetupData->GtVoltageMode = 0; + NbSetupData->GtOcSupport = 1; + NbSetupData->IoaVoltageOffset = 0; + NbSetupData->IodVoltageOffset = 0; + } + } +} +#endif +#endif + + /// + /// Initialize the Overclocking Configuration + /// + if (NbSetupData->GtOcSupport == 0) + { + SaPlatformPolicyPpi->OcConfig->GtVoltageOffset = 0; + SaPlatformPolicyPpi->OcConfig->GtVoltageOverride = 0; + SaPlatformPolicyPpi->OcConfig->GtExtraTurboVoltage = 0; + SaPlatformPolicyPpi->OcConfig->GtMaxOcTurboRatio = 0; + SaPlatformPolicyPpi->OcConfig->SaVoltageOffset = 0; + SaPlatformPolicyPpi->OcConfig->GtVoltageMode = 0; + SaPlatformPolicyPpi->OcConfig->OcSupport = 0; + SaPlatformPolicyPpi->OcConfig->IoaVoltageOffset = 0; + SaPlatformPolicyPpi->OcConfig->IodVoltageOffset = 0; + } else { + SaPlatformPolicyPpi->OcConfig->GtVoltageOffset = NbSetupData->GtVoltageOffset; + SaPlatformPolicyPpi->OcConfig->GtVoltageOverride = NbSetupData->GtVoltageOverride; + SaPlatformPolicyPpi->OcConfig->GtExtraTurboVoltage = NbSetupData->GtExtraTurboVoltage; + SaPlatformPolicyPpi->OcConfig->GtMaxOcTurboRatio = NbSetupData->GtMaxOcTurboRatio; + SaPlatformPolicyPpi->OcConfig->SaVoltageOffset = NbSetupData->SaVoltageOffset; + SaPlatformPolicyPpi->OcConfig->GtVoltageMode = NbSetupData->GtVoltageMode; + SaPlatformPolicyPpi->OcConfig->OcSupport = 1; + SaPlatformPolicyPpi->OcConfig->IoaVoltageOffset = NbSetupData->IoaVoltageOffset; + SaPlatformPolicyPpi->OcConfig->IodVoltageOffset = NbSetupData->IodVoltageOffset; + } +// (P20121012A) << Update XTU 4.0 + // Make sure we have a PPI. + if (VariableServices != NULL) { + + // If Maximum TOLUD set to Dynamic assignment in BIOS setup, then set TOLUD/TOLM based on largest MMIO length of graphic controllers + if (NbSetupData->MaxTolud == NB_MAX_TOLUD_DYNAMIC) { + VariableSize = sizeof(UINT32); + Status = VariableServices->GetVariable( + VariableServices, + L"MemCeil.", + &gEfiNbMrcS3DataGuid, + NULL, + &VariableSize, + &MemoryCeiling); + + if(Status == EFI_NOT_FOUND) { + Status = VariableServices->GetVariable( + VariableServices, + L"MemCeil.", + &gEfiGlobalVariableGuid, + NULL, + &VariableSize, + &MemoryCeiling); + } + if(!EFI_ERROR(Status)) { + if(MemoryCeiling >= 0xE0000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_3_5G; + } else if(MemoryCeiling >= 0xD0000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_3_25G; + } else if(MemoryCeiling >= 0xC0000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_3G; + } else if(MemoryCeiling >= 0xB0000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_2_75G; + } else if(MemoryCeiling >= 0xA0000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_2_5G; + } else if(MemoryCeiling >= 0x90000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_2_25G; + } else if(MemoryCeiling >= 0x80000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_2G; + } else if(MemoryCeiling >= 0x70000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_1_75G; + } else if(MemoryCeiling >= 0x60000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_1_5G; + } else if(MemoryCeiling >= 0x50000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_1_25G; + } else if(MemoryCeiling >= 0x40000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_1G; + } else if(MemoryCeiling >= 0x30000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_0_75G; + } else if(MemoryCeiling <= 0x20000000) { + NbSetupData->MaxTolud = NB_MAX_TOLUD_0_5G; + } + } else { + NbSetupData->MaxTolud = NB_MAX_TOLUD_DYNAMIC; // default value + } + } + } + + // + // Based on BIOS setup to determine maximum top of memory size below 4G, and reserved for MMIO + // + switch (NbSetupData->MaxTolud) { + case NB_MAX_TOLUD_0_5G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0xE00; + break; + + case NB_MAX_TOLUD_0_75G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0xD00; + break; + + case NB_MAX_TOLUD_1G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0xC00; + break; + + case NB_MAX_TOLUD_1_25G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0xB00; + break; + + case NB_MAX_TOLUD_1_5G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0xA00; + break; + + case NB_MAX_TOLUD_1_75G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x900; + break; + + case NB_MAX_TOLUD_2G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x800; + break; + + case NB_MAX_TOLUD_2_25G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x700; + break; + + case NB_MAX_TOLUD_2_5G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x600; + break; + + case NB_MAX_TOLUD_2_75G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x500; + break; + + default: + + case NB_MAX_TOLUD_3G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x400; + break; + + case NB_MAX_TOLUD_3_25G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x300; + break; + + case NB_MAX_TOLUD_3_5G: + SaPlatformPolicyPpi->GtConfig->MmioSize = 0x200; + break; + } + + // EccSupport = 1 for UpSever and WS + if (!(IS_SA_DEVICE_ID_SERVER (McDeviceId) || IS_PCH_LPT_LPC_DEVICE_ID_SERVER(LpcDeviceId)) && + (IS_PCH_LPT_LPC_DEVICE_ID_MOBILE(LpcDeviceId) || IS_PCH_LPT_LPC_DEVICE_ID_DESKTOP(LpcDeviceId))) { + SaPlatformPolicyPpi->MemConfig->EccSupport = NbSetupData->EccSupport; + } else { + SaPlatformPolicyPpi->MemConfig->EccSupport = 1; + } + + // Get the Memory Configuration from NbSetupData + SaPlatformPolicyPpi->MemConfig->MaxTolud = NbSetupData->MaxTolud; + +#if defined SwitchableGraphics_SUPPORT && SwitchableGraphics_SUPPORT == 1 + if (NbSetupData->PrimaryDisplay == 4) // SG + { + SaPlatformPolicyPpi->PcieConfig->AlwaysEnablePeg = 1; // Enable + SaPlatformPolicyPpi->GtConfig->PrimaryDisplay = 0; // IGFX + + /// + /// Initialize the Switchable Graphics Configuration + /// + /// + /// Switchable Graphics mode set as MUXLESS (By default) + /// + SaPlatformPolicyPpi->PlatformData->SgMode = SgModeMuxless; + SaPlatformPolicyPpi->PlatformData->SgSubSystemId = 0x2112; + + /// + /// Configure below based on the OEM platfrom design + /// Switchable Graphics GPIO support - 1=Supported 0=Not Supported + /// + SaPlatformPolicyPpi->SgGpioData->GpioSupport = SG_GPIO_SUPPORT; + + if (SaPlatformPolicyPpi->SgGpioData->GpioSupport) { + /// + /// Initialzie the GPIO Configuration + /// + if (GetPchSeries() == PchLp) { + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrOK->Value = GPIO_dGPU_PWROK_ULT; // dGPU PWROK GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrOK->Active = ACTIVE_dGPU_PWROK_ULT; // dGPU PWROK Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuHoldRst->Value = GPIO_dGPU_HOLD_RST_ULT; // dGPU HLD RST GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuHoldRst->Active = ACTIVE_dGPU_HOLD_RST_ULT; // dGPU HLD RST Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrEnable->Value = GPIO_dGPU_PWR_EN_ULT; // dGPU PWR Enable GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrEnable->Active = ACTIVE_dGPU_PWR_EN_ULT; // dGPU PWR Enable Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuPrsnt->Value = GPIO_dGPU_PRSNT_ULT; // dGPU_PRSNT# GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPrsnt->Active = ACTIVE_dGPU_PRSNT_ULT; // dGPU_PRSNT# Active Low + + } else{ + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrOK->Value = GPIO_dGPU_PWROK; // dGPU PWROK GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrOK->Active = ACTIVE_dGPU_PWROK; // dGPU PWROK Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuHoldRst->Value = GPIO_dGPU_HOLD_RST; // dGPU HLD RST GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuHoldRst->Active = ACTIVE_dGPU_HOLD_RST; // dGPU HLD RST Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrEnable->Value = GPIO_dGPU_PWR_EN; // dGPU PWR Enable GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPwrEnable->Active = ACTIVE_dGPU_PWR_EN; // dGPU PWR Enable Active + SaPlatformPolicyPpi->SgGpioData->SgDgpuPrsnt->Value = GPIO_dGPU_PRSNT; // dGPU_PRSNT# GPIO assigned + SaPlatformPolicyPpi->SgGpioData->SgDgpuPrsnt->Active = ACTIVE_dGPU_PRSNT; // dGPU_PRSNT# Active Low + } + } + } +#endif + +#if (defined RC_PEG_0) && RC_PEG_0 == 1 + if (NbSetupData->DetectNonComplaint && NbSetupData->AlwaysEnablePeg != 2) + { + SaPlatformPolicyPpi->PcieConfig->AlwaysEnablePeg = 1; // Enable + } +#endif + + if (GetPchSeries() == PchLp) { + SaPlatformPolicyPpi->PcieConfig->AlwaysEnablePeg = 2; + } + + // Make sure we have a PPI. + if (VariableServices != NULL) { + + // Get variable size first. + // Set VariableSize = 0 in order to get the required size. + VariableSize = 0; + MrcS3ResumeData = NULL; + + Status = VariableServices->GetVariable ( + VariableServices, + L"MrcS3Resume", + &gMemRestoreDataGuid, + NULL, + &VariableSize, + MrcS3ResumeData + ); + + // Should fail with EFI_BUFFER_TOO_SMALL + if (Status == EFI_BUFFER_TOO_SMALL) { + + // Allocate buffer for S3 data variable. + Status = (*PeiServices)->AllocatePool (PeiServices, VariableSize, &MrcS3ResumeData); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = VariableServices->GetVariable ( + VariableServices, + L"MrcS3Resume", + &gMemRestoreDataGuid, + NULL, + &VariableSize, + MrcS3ResumeData + ); + } + + if (Status == EFI_SUCCESS) { + // MemoryConfig variable memory layout: MRC_OutputParames, MRC_S3Params + // Increment the pointer, MrcS3ResumeData, to point to MRC_S3Params + SaPlatformPolicyPpi->S3DataPtr = MrcS3ResumeData; + } + + PegGen3Data = NULL; + VariableSize = sizeof(SA_PEG_DATA); + + // Allocate buffer for PegGen3PresetSearch data variable. + Status = (*PeiServices)->AllocatePool (PeiServices, VariableSize, &PegGen3Data); + ASSERT_PEI_ERROR (PeiServices, Status); + + Status = VariableServices->GetVariable ( + VariableServices, + L"PegGen3PresetSearchData", + &gAmiNbPegGen3PresetSearchGuid, + NULL, + &VariableSize, + PegGen3Data + ); + + if (Status == EFI_SUCCESS) { + // Increment the pointer, PegGen3PresetSearch Data, to point to PegDataPtr + SaPlatformPolicyPpi->PcieConfig->PegDataPtr = PegGen3Data; + } + + } + + // Install SA Platform Policy PPI + Status = (**PeiServices).InstallPpi (PeiServices, SaPlatformPolicyPpiDesc); + ASSERT_PEI_ERROR (PeiServices, Status); + + return Status; +} + +#ifdef SSA_FLAG + +MrcStatus +AmiSsaCallbackPpi ( + EFI_PEI_SERVICES **PeiServices, + struct _SSA_BIOS_CALLBACKS_PPI *SsaBiosCallBacksPpi, + MRC_OEM_STATUS_COMMAND StatusCommand, + VOID *CheckpointData) +{ + EFI_STATUS Status; + PEI_MEMORY_ERROR_REPORT_PPI *MemoryErrorPpi; + + // if oem have reinstall gAmiMemoryErrorReportPpi, it can Locate AmiMemoryError for oem. + Status = (*PeiServices)->LocatePpi( + PeiServices, &gAmiMemoryErrorReportPpiGuid, 0, NULL, + &MemoryErrorPpi ); + + ASSERT_PEI_ERROR(PeiServices, Status); + + if (Status == EFI_SUCCESS) + MemoryErrorPpi->AmiMemoryErrorRead(PeiServices, MemoryErrorPpi, (UINT32)StatusCommand); + + return StatusCommand; +} +#endif // #ifndef SSA_FLAG +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: MemoryErrorRead +// +// Description: +// This function reports the error status after memory training. +// +// Parameters: +// IN EFI_PEI_SERVICES PeiServices - PEI Services table pointer +// IN PEI_MEMORY_ERROR_REPORT_PPI *This - Pointer to the PPI structure +// IN OUT UINT32 MemErrData - Pointer to error data buffer +// +// Returns: +// EFI_STATUS +// EFI_SUCCESS The function completed successfully. +// Notes: +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS +MemoryErrorRead ( + IN EFI_PEI_SERVICES **PeiServices, + IN PEI_MEMORY_ERROR_REPORT_PPI *This, + IN OUT UINT32 MemErrData + ) +{ + EFI_STATUS Status = EFI_SUCCESS; + switch (MemErrData) { + case MRC_MC_CONFIG_ERROR : + case MRC_MC_MEMORY_MAP_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_CONFIGURING, EFI_ERROR_MAJOR); + break; + case MRC_DIMM_RON_ERROR : + case MRC_DIMM_ODT_ERROR : + case MRC_WRITE_DS_ERROR : + case MRC_WRITE_SR_ERROR : + case MRC_WRITE_EQ_ERROR : + case MRC_READ_ODT_ERROR : + case MRC_READ_EQ_ERROR : + case MRC_READ_AMP_POWER_ERROR : + case MRC_CMP_OPT_ERROR : + case MRC_PWR_MTR_ERROR : + case MRC_SPD_PROCESSING_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_SPD_FAIL, EFI_ERROR_MAJOR); + break; + case MRC_RESET_ERROR : ///< before jedec reset + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_INVALID_TYPE, EFI_ERROR_MAJOR); + break; + case MRC_PRE_TRAINING_ERROR : + case MRC_EARLY_COMMAND_ERROR : + case MRC_JEDEC_INIT_LPDDR3_ERROR : + case MRC_SENSE_AMP_OFFSET_ERROR : + case MRC_RECEIVE_ENABLE_ERROR : + case MRC_JEDEC_WRITE_LEVELING_ERROR : + case MRC_WRITE_TIMING_1D_ERROR : + case MRC_WRITE_TIMING_2D_ERROR : + case MRC_READ_TIMING_1D_ERROR : + case MRC_READ_TIMING_2D_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_INVALID_SPEED, EFI_ERROR_MAJOR); + break; + case MRC_ECC_CLEAN_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_ERROR, EFI_ERROR_MAJOR); + break; + case MRC_NO_MEMORY_DETECTED : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_NOT_DETECTED, EFI_ERROR_MAJOR); + break; + case MRC_MEM_INIT_DONE_WITH_ERRORS : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_TEST, EFI_ERROR_MAJOR); + break; + case MRC_WRITE_VREF_2D_ERROR : + case MRC_READ_VREF_2D_ERROR : + case MRC_LATE_COMMAND_ERROR : + case MRC_ROUND_TRIP_LAT_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_NONE_USEFUL, EFI_ERROR_MAJOR); + break; + case MRC_TURN_AROUND_ERROR : + case MRC_SAVE_MC_VALUES_ERROR : + case MRC_RMT_TOOL_ERROR : + case MRC_CPGC_MEMORY_TEST_ERROR : + case MRC_RESTORE_TRAINING_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_MISMATCH, EFI_ERROR_MAJOR); + break; + case MRC_SELF_REFRESH_EXIT_ERROR : + case MRC_MRC_NORMAL_MODE_ERROR : + case MRC_ALIAS_CHECK_ERROR : + case MRC_POST_TRAINING_ERROR : + case MRC_MC_ACTIVATE_ERROR : + case MRC_DONE_WITH_ERROR : + case MRC_FILL_RMT_STRUCTURE_ERROR : + PEI_ERROR_CODE(PeiServices, PEI_MEMORY_NOT_INSTALLED, EFI_ERROR_MAJOR); + break; + default : //Default to " N/A " + break; + } + + return Status; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* |