summaryrefslogtreecommitdiff
path: root/ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c
diff options
context:
space:
mode:
Diffstat (limited to 'ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c')
-rw-r--r--ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c548
1 files changed, 548 insertions, 0 deletions
diff --git a/ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c b/ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c
new file mode 100644
index 0000000..7317fb4
--- /dev/null
+++ b/ReferenceCode/Chipset/SystemAgent/SampleCode/SaPolicyInit/Pei/SaPeiPolicyInit.c
@@ -0,0 +1,548 @@
+/** @file
+ This file is SampleCode for Intel SA PEI Platform Policy initialzation.
+
+@copyright
+ Copyright (c) 1999 - 2014 Intel Corporation. All rights reserved
+ This software and associated documentation (if any) is furnished
+ under a license and may only be used or copied in accordance
+ with the terms of the license. Except as permitted by such
+ license, no part of this software or documentation may be
+ reproduced, stored in a retrieval system, or transmitted in any
+ form or by any means without the express written consent of
+ Intel Corporation.
+
+ This file contains a 'Sample Driver' and is licensed as such
+ under the terms of your license agreement with Intel or your
+ vendor. This file may be modified by the user, subject to
+ the additional terms of the license agreement
+
+**/
+#include "SaPeiPolicyInit.h"
+
+///
+/// This IO Trap address can be overridden by defining it
+/// in compiling environment variable
+/// It must not conflict with other IO address in platform
+///
+#ifndef SA_IOTRAP_SMI_ADDRESS
+#define SA_IOTRAP_SMI_ADDRESS 0x2000
+#endif
+
+EFI_STATUS
+SaPeiPolicyInitEntryPoint (
+ IN EFI_FFS_FILE_HEADER *FfsHeader,
+ IN EFI_PEI_SERVICES **PeiServices
+ )
+/**
+ This PEIM performs SA PEI Platform Policy initialzation.
+
+ @param[in] FfsHeader - Pointer to Firmware File System file header.
+ @param[in] PeiServices - General purpose services available to every PEIM.
+
+ @retval EFI_SUCCESS - The PPI is installed and initialized.
+ @retval EFI ERRORS - The PPI is not successfully installed.
+**/
+{
+ EFI_STATUS Status;
+ 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;
+ CPU_FAMILY CpuFamilyId;
+#ifdef SG_SUPPORT
+ SG_GPIO_DATA *SgGpioData;
+#endif
+ UINT8 Index;
+ ///
+ /// Allocate descriptor and PPI structures
+ ///
+ SaPlatformPolicyPpi = (SA_PLATFORM_POLICY_PPI *) AllocatePool (sizeof (SA_PLATFORM_POLICY_PPI));
+ ASSERT (SaPlatformPolicyPpi != NULL);
+ EfiCommonLibZeroMem (SaPlatformPolicyPpi, sizeof (SA_PLATFORM_POLICY_PPI));
+
+ SaPlatformPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
+ ASSERT (SaPlatformPolicyPpiDesc != NULL);
+ EfiCommonLibZeroMem (SaPlatformPolicyPpiDesc, sizeof (EFI_PEI_PPI_DESCRIPTOR));
+
+ PlatformData = (SA_PLATFORM_DATA *) AllocatePool (sizeof (SA_PLATFORM_DATA));
+ ASSERT (PlatformData != NULL);
+ EfiCommonLibZeroMem (PlatformData, sizeof (SA_PLATFORM_DATA));
+
+ GtConfig = (GT_CONFIGURATION *) AllocatePool (sizeof (GT_CONFIGURATION));
+ ASSERT (GtConfig != NULL);
+ EfiCommonLibZeroMem (GtConfig, sizeof (GT_CONFIGURATION));
+
+ MemConfig = (MEMORY_CONFIGURATION *) AllocatePool (sizeof (MEMORY_CONFIGURATION));
+ ASSERT (MemConfig != NULL);
+ EfiCommonLibZeroMem (MemConfig, sizeof (MEMORY_CONFIGURATION));
+
+ PcieConfig = (PCIE_CONFIGURATION *) AllocatePool (sizeof (PCIE_CONFIGURATION));
+ ASSERT (PcieConfig != NULL);
+ EfiCommonLibZeroMem (PcieConfig, sizeof (PCIE_CONFIGURATION));
+
+ PegGpioData = (PEG_GPIO_DATA *) AllocatePool (sizeof (PEG_GPIO_DATA));
+ ASSERT (PegGpioData != NULL);
+ EfiCommonLibZeroMem (PegGpioData, sizeof (PEG_GPIO_DATA));
+
+ OcConfig = (OVERCLOCKING_CONFIGURATION *) AllocatePool (sizeof (OVERCLOCKING_CONFIGURATION));
+ ASSERT (OcConfig != NULL);
+ EfiCommonLibZeroMem (OcConfig, sizeof (OVERCLOCKING_CONFIGURATION));
+
+#ifdef SG_SUPPORT
+ SgGpioData = (SG_GPIO_DATA *) AllocatePool (sizeof (SG_GPIO_DATA));
+ ASSERT (SgGpioData != NULL);
+ EfiCommonLibZeroMem (SgGpioData, sizeof (SG_GPIO_DATA));
+#endif
+
+ SetMem ((VOID *) SaPlatformPolicyPpi, sizeof (SA_PLATFORM_POLICY_PPI), 0);
+
+ ///
+ /// Initialize the PPI
+ ///
+ SaPlatformPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ SaPlatformPolicyPpiDesc->Guid = &gSaPlatformPolicyPpiGuid;
+ SaPlatformPolicyPpiDesc->Ppi = SaPlatformPolicyPpi;
+
+ ///
+ /// Update the REVISION number
+ ///
+ SaPlatformPolicyPpi->Revision = SA_PLATFORM_POLICY_PPI_REVISION_15;
+
+ CpuFamilyId = GetCpuFamily();
+
+ ///
+ /// Initialize the Platform Configuration
+ ///
+ PlatformData->SpdAddressTable[0] = 0xA0;
+ PlatformData->SpdAddressTable[1] = 0xA2;
+ PlatformData->SpdAddressTable[2] = 0xA4;
+ PlatformData->SpdAddressTable[3] = 0xA6;
+ PlatformData->MchBar = 0xfed10000;
+ PlatformData->DmiBar = 0xfed18000;
+ PlatformData->EpBar = 0xfed19000;
+ PlatformData->EdramBar = 0xfed80000;
+ PlatformData->PciExpressBar = (UINTN) PcdGet64 (PcdPciExpressBaseAddress);
+ PlatformData->SmbusBar = 0xEFA0;
+ PlatformData->TsegSize = 0x800000;
+ PlatformData->IedSize = 0x400000;
+ PlatformData->FastBoot = 0;
+ PlatformData->GdxcBar = 0xFED84000;
+ PlatformData->BoardId = 0;
+
+ SaPlatformPolicyPpi->PlatformData = PlatformData;
+ ///
+ /// Initialize the Graphics configuration
+ ///
+ GtConfig->GttSize = 2;
+ GtConfig->IgdDvmt50PreAlloc = 1;
+ GtConfig->InternalGraphics = 2;
+ GtConfig->PrimaryDisplay = 3;
+ GtConfig->ApertureSize = 2;
+ GtConfig->PanelPowerEnable = 0;
+ SaPlatformPolicyPpi->GtConfig = GtConfig;
+
+ ///
+ /// Initialize the Memory Configuration
+ ///
+ MemConfig->EccSupport = 1;
+ MemConfig->DdrFreqLimit = 0;
+ MemConfig->MaxTolud = 0;
+ MemConfig->SpdProfileSelected = 0;
+ MemConfig->NModeSupport = 0;
+ MemConfig->ScramblerSupport = 1;
+ MemConfig->PowerDownMode = 0xFF;
+ MemConfig->PwdwnIdleCounter = 0x80;
+ MemConfig->RankInterleave = TRUE;
+ MemConfig->EnhancedInterleave = TRUE;
+ MemConfig->WeaklockEn = TRUE;
+ MemConfig->EnCmdRate = 7;
+ MemConfig->CmdTriStateDis = FALSE;
+ MemConfig->RefreshRate2x = FALSE;
+ MemConfig->AutoSelfRefreshSupport = TRUE;
+ MemConfig->ExtTemperatureSupport = TRUE;
+
+ ///
+ /// Thermal Management Configuration
+ ///
+ MemConfig->ThermalManagement = 1;
+ MemConfig->PeciInjectedTemp = 0;
+ MemConfig->ExttsViaTsOnBoard = 0;
+ MemConfig->ExttsViaTsOnDimm = 0;
+ MemConfig->VirtualTempSensor = 0;
+ ///
+ /// Channel DIMM Disable
+ ///
+ MemConfig->DisableDimmChannel[0] = 0;
+ MemConfig->DisableDimmChannel[1] = 0;
+ ///
+ /// Channel Hash Configuration
+ ///
+ MemConfig->ChHashEnable = TRUE;
+ MemConfig->ChHashMask = 0x30CE;
+ MemConfig->ChHashInterleaveBit = 1;
+ ///
+ /// Options for Thermal settings
+ ///
+ MemConfig->EnableExtts = 0;
+ MemConfig->EnableCltm = 0;
+ MemConfig->EnableOltm = 0;
+ MemConfig->EnablePwrDn = 1;
+ if (CpuFamilyId == EnumCpuHswUlt) {
+ MemConfig->EnablePwrDnLpddr = 0;
+ }
+ MemConfig->Refresh2X = 0;
+ MemConfig->LpddrThermalSensor = 1;
+ MemConfig->LockPTMregs = 0;
+ MemConfig->UserPowerWeightsEn = 0;
+
+ MemConfig->EnergyScaleFact = 3;
+ MemConfig->RaplPwrFlCh1 = 0;
+ MemConfig->RaplPwrFlCh0 = 0;
+
+ MemConfig->RaplLim2Lock = 0;
+ MemConfig->RaplLim2WindX = 0;
+ MemConfig->RaplLim2WindY = 0;
+ MemConfig->RaplLim2Ena = 0;
+ MemConfig->RaplLim2Pwr = 0;
+ MemConfig->RaplLim1WindX = 0;
+ MemConfig->RaplLim1WindY = 0;
+ MemConfig->RaplLim1Ena = 0;
+ MemConfig->RaplLim1Pwr = 0;
+
+ MemConfig->WarmThresholdCh0Dimm0 = 0xFF;
+ MemConfig->WarmThresholdCh0Dimm1 = 0xFF;
+ MemConfig->WarmThresholdCh1Dimm0 = 0xFF;
+ MemConfig->WarmThresholdCh1Dimm1 = 0xFF;
+ MemConfig->HotThresholdCh0Dimm0 = 0xFF;
+ MemConfig->HotThresholdCh0Dimm1 = 0xFF;
+ MemConfig->HotThresholdCh1Dimm0 = 0xFF;
+ MemConfig->HotThresholdCh1Dimm1 = 0xFF;
+ MemConfig->WarmBudgetCh0Dimm0 = 0xFF;
+ MemConfig->WarmBudgetCh0Dimm1 = 0xFF;
+ MemConfig->WarmBudgetCh1Dimm0 = 0xFF;
+ MemConfig->WarmBudgetCh1Dimm1 = 0xFF;
+ MemConfig->HotBudgetCh0Dimm0 = 0xFF;
+ MemConfig->HotBudgetCh0Dimm1 = 0xFF;
+ MemConfig->HotBudgetCh1Dimm0 = 0xFF;
+ MemConfig->HotBudgetCh1Dimm1 = 0xFF;
+
+ MemConfig->IdleEnergyCh0Dimm1 = 0;
+ MemConfig->IdleEnergyCh0Dimm0 = 0;
+ MemConfig->PdEnergyCh0Dimm1 = 0;
+ MemConfig->PdEnergyCh0Dimm0 = 0;
+ MemConfig->ActEnergyCh0Dimm1 = 0;
+ MemConfig->ActEnergyCh0Dimm0 = 0;
+ MemConfig->RdEnergyCh0Dimm1 = 0;
+ MemConfig->RdEnergyCh0Dimm0 = 0;
+ MemConfig->WrEnergyCh0Dimm1 = 0;
+ MemConfig->WrEnergyCh0Dimm0 = 0;
+
+ MemConfig->IdleEnergyCh1Dimm1 = 0;
+ MemConfig->IdleEnergyCh1Dimm0 = 0;
+ MemConfig->PdEnergyCh1Dimm1 = 0;
+ MemConfig->PdEnergyCh1Dimm0 = 0;
+ MemConfig->ActEnergyCh1Dimm1 = 0;
+ MemConfig->ActEnergyCh1Dimm0 = 0;
+ MemConfig->RdEnergyCh1Dimm1 = 0;
+ MemConfig->RdEnergyCh1Dimm0 = 0;
+ MemConfig->WrEnergyCh1Dimm1 = 0;
+ MemConfig->WrEnergyCh1Dimm0 = 0;
+
+ MemConfig->SrefCfgEna = 1;
+ MemConfig->SrefCfgIdleTmr = 0x200;
+ MemConfig->ThrtCkeMinDefeat = 0;
+ MemConfig->ThrtCkeMinTmr = 0x30;
+ if (CpuFamilyId == EnumCpuHswUlt) {
+ MemConfig->ThrtCkeMinDefeatLpddr = 1;
+ MemConfig->ThrtCkeMinTmrLpddr = 0x40;
+ }
+
+
+ MemConfig->McLock = TRUE;
+
+ MemConfig->GdxcEnable = TRUE;
+ MemConfig->GdxcIotSize = 4;
+ MemConfig->GdxcMotSize = 12;
+
+ MemConfig->MemoryTrace = 0;
+
+ MemConfig->ECT = 0;
+ MemConfig->SOT = 1;
+ MemConfig->RDMPRT = 1;
+ MemConfig->RCVET = 1;
+ MemConfig->JWRL = 1;
+ MemConfig->FWRL = 0;
+ MemConfig->WRTC1D = 1;
+ MemConfig->RDTC1D = 1;
+ MemConfig->DIMMODTT = 1;
+ MemConfig->WRDST = 0;
+ MemConfig->WREQT = 1;
+ MemConfig->RDODTT = 1;
+ MemConfig->RDEQT = 0;
+ MemConfig->RDAPT = 1;
+ MemConfig->WRTC2D = 1;
+ MemConfig->RDTC2D = 1;
+ MemConfig->CMDVC = 1;
+ MemConfig->WRVC2D = 1;
+ MemConfig->RDVC2D = 1;
+ MemConfig->LCT = 1;
+ MemConfig->RTL = 1;
+ MemConfig->TAT = 1;
+ MemConfig->RMT = 0;
+ MemConfig->MEMTST = 0;
+ MemConfig->DIMMODTT1D = 0;
+ MemConfig->WRSRT = 0;
+ MemConfig->DIMMRONT = 1;
+ MemConfig->ALIASCHK = 1;
+ MemConfig->RCVENC1D = 1;
+ MemConfig->RMC = 1;
+
+ MemConfig->RemapEnable = TRUE;
+ MemConfig->RmtBdatEnable = FALSE;
+ MemConfig->MrcTimeMeasure = FALSE;
+ MemConfig->MrcFastBoot = TRUE;
+ MemConfig->DDR3Voltage = 0;
+ MemConfig->DDR3VoltageWaitTime = 0;
+ MemConfig->RefClk = 0;
+ MemConfig->Ratio = 0;
+ MemConfig->BClkFrequency = 100 * 1000 * 1000;
+ MemConfig->MaxRttWr = 0;
+ ///
+ /// MrcUltPoSafeConfig
+ /// 1 to enable, 0 to disable
+ ///
+ MemConfig->MrcUltPoSafeConfig = 0;
+
+ if (CpuFamilyId == EnumCpuHswUlt) {
+ ///
+ /// Interleaving mode of DQ/DQS pins - depends on board routing
+ ///
+ MemConfig->DqPinsInterleaved = FALSE;
+ }
+
+ SaPlatformPolicyPpi->MemConfig = MemConfig;
+
+ ///
+ /// Initialize the PciExpress Configuration
+ ///
+ PcieConfig->DmiVc1 = 0;
+ PcieConfig->DmiVcp = 1;
+ PcieConfig->DmiVcm = 1;
+ PcieConfig->DmiGen2 = 1;
+ PcieConfig->AlwaysEnablePeg = 0;
+ for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
+ PcieConfig->PegGenx[Index] = 0;
+ }
+
+ for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
+ PcieConfig->PowerDownUnusedBundles[Index] = 0xFF;
+ }
+
+ PcieConfig->PegGen3Equalization = 1;
+ PcieConfig->PegSamplerCalibrate = 0;
+ PcieConfig->PegSwingControl = 2;
+ PcieConfig->PegComplianceTestingMode = 0;
+
+ ///
+ /// PEG Gen3 Preset Search: 0 = Disabled, 1 = Enabled (default)
+ /// PEG Gen3 Force Preset Search (always re-search): 0 = Disabled (default), 1 = Enabled
+ /// PEG Gen3 Preset Search Dwell Time: 400 usec
+ /// PEG Gen3 Preset Search Timing Margin Steps: 2
+ /// PEG Gen3 Preset Search Timing Start Margin: 15
+ /// PEG Gen3 Preset Search Voltage Margin Steps: 2
+ /// PEG Gen3 Preset Search Voltage Start Margin: 20
+ /// PEG Gen3 Preset Search Favor Timing: 0 = Timing + Voltage (default), 1 = Timing only
+ /// PEG Gen3 Preset Search Error Target: 4
+ ///
+ PcieConfig->PegGen3PresetSearch = 1;
+ PcieConfig->PegGen3ForcePresetSearch = 0;
+ PcieConfig->PegGen3PresetSearchDwellTime = STALL_ONE_MILLI_SECOND;
+ PcieConfig->PegGen3PresetSearchStartMargin = 15;
+ PcieConfig->PegGen3PresetSearchVoltageStartMargin = 20;
+ PcieConfig->PegGen3PresetSearchErrorTarget = 1;
+
+ for (Index = 0; Index < SA_PEG_MAX_LANE; Index++) {
+ PcieConfig->Gen3RootPortPreset[Index] = 8;
+ PcieConfig->Gen3EndPointPreset[Index] = 7;
+ PcieConfig->Gen3EndPointHint[Index] = 2;
+ }
+
+ ///
+ /// 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)
+ ///
+ PcieConfig->InitPcieAspmAfterOprom = FALSE;
+ PcieConfig->SaIotrapSmiAddress = SA_IOTRAP_SMI_ADDRESS;
+
+ ///
+ /// Parameters for PCIe Gen3 device reset
+ /// Note: Refer to the Platform Design Guide (PDG) for additional information about this GPIO.
+ ///
+ PegGpioData->GpioSupport = TRUE;
+ if (PegGpioData->GpioSupport) {
+ PegGpioData->SaPegReset = (SA_GPIO_INFO *) AllocatePool (sizeof (SA_GPIO_INFO));
+ ASSERT (PegGpioData->SaPegReset != NULL);
+ if (PegGpioData->SaPegReset == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ ///
+ /// PEG Reset: GPIO 50, Active Low (Mobile PDG)
+ ///
+ PegGpioData->SaPegReset->Value = 50;
+ PegGpioData->SaPegReset->Active = 0;
+ PcieConfig->PegGpioData = PegGpioData;
+ }
+
+ ///
+ /// 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)
+ ///
+ PcieConfig->RxCEMLoopback = 0;
+ PcieConfig->RxCEMLoopbackLane = 0;
+
+ ///
+ /// Gen3 RxCTLE peaking default is 8
+ ///
+ for (Index = 0; Index < SA_PEG_MAX_BUNDLE; Index++) {
+ PcieConfig->Gen3RxCtleP[Index] = 8;
+ }
+
+ ///
+ /// Initialize the SA PEG Data pointer for saved preset search results
+ ///
+ PcieConfig->PegDataPtr = NULL;
+
+ SaPlatformPolicyPpi->PcieConfig = PcieConfig;
+
+ ///
+ /// Initialize the Overclocking Configuration
+ ///
+ OcConfig->GtVoltageOffset = 0;
+ OcConfig->GtVoltageOverride = 0;
+ OcConfig->GtExtraTurboVoltage = 0;
+ OcConfig->GtMaxOcTurboRatio = 0;
+ OcConfig->SaVoltageOffset = 0;
+ OcConfig->GtVoltageMode = 0;
+ OcConfig->OcSupport = 0;
+ OcConfig->IoaVoltageOffset = 0;
+ OcConfig->IodVoltageOffset = 0;
+
+ SaPlatformPolicyPpi->OcConfig = OcConfig;
+
+
+#ifdef SG_SUPPORT
+ ///
+ /// Initialize the Switchable Graphics Configuration
+ ///
+ ///
+ /// Switchable Graphics mode set as MUXLESS (By default)
+ ///
+ PlatformData->SgMode = SgModeMuxless;
+ PlatformData->SgSubSystemId = 0x2112;
+
+ SaPlatformPolicyPpi->PlatformData = PlatformData;
+
+ ///
+ /// Configure below based on the OEM platfrom design
+ /// Switchable Graphics GPIO support - 1=Supported, 0=Not Supported
+ ///
+ SgGpioData->GpioSupport = TRUE;
+
+ if (SgGpioData->GpioSupport) {
+ ///
+ /// Initialzie the GPIO Configuration
+ ///
+ ///
+ /// dGPU PWROK GPIO assigned
+ ///
+ SgGpioData->SgDgpuPwrOK = (SA_GPIO_INFO *) AllocatePool (sizeof (SA_GPIO_INFO));
+ ASSERT (SgGpioData->SgDgpuPwrOK != NULL);
+ if (SgGpioData->SgDgpuPwrOK == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ SgGpioData->SgDgpuPwrOK->Value = 17;
+ ///
+ /// dGPU PWROK Active High
+ ///
+ SgGpioData->SgDgpuPwrOK->Active = 1;
+
+ ///
+ /// dGPU HLD RST GPIO assigned
+ ///
+ SgGpioData->SgDgpuHoldRst = (SA_GPIO_INFO *) AllocatePool (sizeof (SA_GPIO_INFO));
+ ASSERT (SgGpioData->SgDgpuHoldRst != NULL);
+ if (SgGpioData->SgDgpuHoldRst == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ SgGpioData->SgDgpuHoldRst->Value = 50;
+ ///
+ /// dGPU HLD RST Active Low
+ ///
+ SgGpioData->SgDgpuHoldRst->Active = 0;
+
+ if (CpuFamilyId == EnumCpuHswUlt) {
+ SgGpioData->SgDgpuHoldRst->Value = 48;
+ }
+
+ ///
+ /// dGPU PWR Enable GPIO assigned
+ ///
+ SgGpioData->SgDgpuPwrEnable = (SA_GPIO_INFO *) AllocatePool (sizeof (SA_GPIO_INFO));
+ ASSERT (SgGpioData->SgDgpuPwrEnable != NULL);
+ if (SgGpioData->SgDgpuPwrEnable == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ SgGpioData->SgDgpuPwrEnable->Value = 54;
+ ///
+ /// dGPU PWR Enable Active Low
+ ///
+ SgGpioData->SgDgpuPwrEnable->Active = 0;
+
+ if (CpuFamilyId == EnumCpuHswUlt) {
+ SgGpioData->SgDgpuPwrEnable->Value = 84;
+ }
+
+ ///
+ /// dGPU_PRSNT# GPIO assigned
+ ///
+ SgGpioData->SgDgpuPrsnt = (SA_GPIO_INFO *) AllocatePool (sizeof (SA_GPIO_INFO));
+ ASSERT (SgGpioData->SgDgpuPrsnt != NULL);
+ if (SgGpioData->SgDgpuPrsnt == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ SgGpioData->SgDgpuPrsnt->Value = 67;
+ ///
+ /// dGPU_PRSNT# Active Low
+ ///
+ SgGpioData->SgDgpuPrsnt->Active = 0;
+
+ SaPlatformPolicyPpi->SgGpioData = SgGpioData;
+ }
+#endif
+
+ ///
+ /// Initialize the DataPtr for S3 resume
+ ///
+ SaPlatformPolicyPpi->S3DataPtr = NULL;
+
+ UpdatePeiSaPlatformPolicy (PeiServices, SaPlatformPolicyPpi);
+
+ ///
+ /// Install SA Platform Policy PPI
+ ///
+ Status = (**PeiServices).InstallPpi (PeiServices, SaPlatformPolicyPpiDesc);
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
+}