public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chiu, Chasel" <chasel.chiu@intel.com>
To: "Esakkithevar, Kathappan" <kathappan.esakkithevar@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Chaganty, Rangasai V" <rangasai.v.chaganty@intel.com>,
	"Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>,
	"Kethi Reddy, Deepika" <deepika.kethi.reddy@intel.com>,
	"Agyeman, Prince" <prince.agyeman@intel.com>
Subject: Re: [edk2-platforms] [PATCH v2 3/7] CometlakeOpenBoardPkg: Add library instances
Date: Wed, 12 Feb 2020 01:30:11 +0000	[thread overview]
Message-ID: <3C3EFB470A303B4AB093197B6777CCEC506905ED@PGSMSX111.gar.corp.intel.com> (raw)
In-Reply-To: <20200211191241.53188-4-kathappan.esakkithevar@intel.com>


Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>


> -----Original Message-----
> From: Esakkithevar, Kathappan <kathappan.esakkithevar@intel.com>
> Sent: Wednesday, February 12, 2020 3:13 AM
> To: devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Chiu, Chasel
> <chasel.chiu@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>; Kethi Reddy, Deepika
> <deepika.kethi.reddy@intel.com>; Agyeman, Prince
> <prince.agyeman@intel.com>
> Subject: [edk2-platforms] [PATCH v2 3/7] CometlakeOpenBoardPkg: Add
> library instances
> 
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2280
> 
> Common package library instances.
> 
> * BaseAcpiTimerLib - Support for ACPI timer services.
> * BaseGpioExpanderLib - Support for the TCA6424 IO expander.
> * DxePolicyUpdateLib - Policy update in DXE.
> * DxeTbtPolicyLib - DXE Thunderbolt policy initialization.
> * PeiDTbtInitLib - PEI discrete Thunderbolt initialization services.
> * PeiFspPolicyInitLib - PEI Intel FSP policy initialization.
> * PeiI2cAccessLib - Provides I2C read and write services.
> * PeiPolicyInitLib - Policy initialization in PEI.
> * PeiPolicyUpdateLib - Policy update in PEI.
> * PeiSiliconPolicyUpdateLibFsp - PEI FSP silicon policy initialization.
> * PeiTbtPolicyLib - PEI Thunderbolt policy initialization.
> * SecFspWrapperPlatformSecLib - FSP wrapper PlatformSecLib instance.
> * TbtCommonLib - Common Thunderbolt services.
> * PeiHdaVerbTableLib - PEI Intel HD Audio Verb Table library.
> * BaseGpioExpanderLib - Common Gpio Expander functions
> 
> Signed-off-by: Kathappan Esakkithevar <kathappan.esakkithevar@intel.com>
> Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Deepika Kethi Reddy <deepika.kethi.reddy@intel.com>
> Cc: Prince Agyeman <prince.agyeman@intel.com>
> ---
>  .../Tbt/Library/DxeTbtPolicyLib/DxeTbtPolicyLib.c  |  148 ++
>  .../Library/DxeTbtPolicyLib/DxeTbtPolicyLib.inf    |   45 +
>  .../Library/DxeTbtPolicyLib/DxeTbtPolicyLibrary.h  |   24 +
>  .../Library/PeiDxeSmmTbtCommonLib/TbtCommonLib.c   |  316 +++
>  .../Library/PeiDxeSmmTbtCommonLib/TbtCommonLib.inf |   60 +
>  .../Tbt/Library/PeiTbtPolicyLib/PeiTbtPolicyLib.c  |  206 ++
>  .../Library/PeiTbtPolicyLib/PeiTbtPolicyLib.inf    |   51 +
>  .../Library/PeiTbtPolicyLib/PeiTbtPolicyLibrary.h  |   19 +
>  .../Private/PeiDTbtInitLib/PeiDTbtInitLib.c        |  567 ++++++
>  .../Private/PeiDTbtInitLib/PeiDTbtInitLib.inf      |   45 +
>  .../PeiFspPolicyInitLib/PeiFspCpuPolicyInitLib.c   |  460 +++++
>  .../PeiFspPolicyInitLib/PeiFspMePolicyInitLib.c    |  121 ++
>  .../PeiFspPolicyInitLib/PeiFspMiscUpdInitLib.c     |   77 +
>  .../PeiFspPolicyInitLib/PeiFspPchPolicyInitLib.c   |  743 +++++++
>  .../PeiFspPolicyInitLib/PeiFspPolicyInitLib.c      |  223 +++
>  .../PeiFspPolicyInitLib/PeiFspPolicyInitLib.h      |  233 +++
>  .../PeiFspPolicyInitLib/PeiFspPolicyInitLib.inf    |  162 ++
>  .../PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c    |  848 ++++++++
>  .../PeiFspSecurityPolicyInitLib.c                  |   70 +
>  .../PeiFspPolicyInitLib/PeiFspSiPolicyInitLib.c    |   96 +
>  .../PeiFspMiscUpdUpdateLib.c                       |  100 +
>  .../PeiFspPolicyUpdateLib.c                        |  124 ++
>  .../PeiMiscPolicyUpdate.h                          |   25 +
>  .../PeiPchPolicyUpdate.c                           |   60 +
>  .../PeiPchPolicyUpdate.h                           |   27 +
>  .../PeiPchPolicyUpdatePreMem.c                     |   39 +
>  .../PeiSaPolicyUpdate.c                            |   85 +
>  .../PeiSaPolicyUpdate.h                            |   30 +
>  .../PeiSaPolicyUpdatePreMem.c                      |   87 +
>  .../PeiSiliconPolicyUpdateLibFsp.inf               |  140 ++
>  .../Library/AcpiTimerLib/AcpiTimerLib.c            |  394 ++++
>  .../Library/AcpiTimerLib/BaseAcpiTimerLib.c        |   48 +
>  .../Library/AcpiTimerLib/BaseAcpiTimerLib.inf      |   54 +
>  .../Library/AcpiTimerLib/BaseAcpiTimerLib.uni      |   15 +
>  .../BaseGpioExpanderLib/BaseGpioExpanderLib.c      |  308 +++
>  .../BaseGpioExpanderLib/BaseGpioExpanderLib.inf    |   36 +
>  .../Library/PeiHdaVerbTableLib/PchHdaVerbTables.c  | 2053
> ++++++++++++++++++++
>  .../PeiHdaVerbTableLib/PeiHdaVerbTableLib.c        |  137 ++
>  .../PeiHdaVerbTableLib/PeiHdaVerbTableLib.inf      |   69 +
>  .../Library/PeiI2cAccessLib/PeiI2cAccessLib.c      |  115 ++
>  .../Library/PeiI2cAccessLib/PeiI2cAccessLib.inf    |   39 +
>  .../DxePolicyUpdateLib/DxeCpuPolicyUpdate.c        |   88 +
>  .../Library/DxePolicyUpdateLib/DxeMePolicyUpdate.c |  105 +
>  .../Library/DxePolicyUpdateLib/DxeMePolicyUpdate.h |   90 +
>  .../DxePolicyUpdateLib/DxePchPolicyUpdate.c        |   40 +
>  .../DxePolicyUpdateLib/DxePolicyUpdateLib.inf      |   59 +
>  .../Library/DxePolicyUpdateLib/DxeSaPolicyUpdate.c |   58 +
>  .../Library/DxePolicyUpdateLib/DxeSaPolicyUpdate.h |   25 +
>  .../Library/PeiPolicyInitLib/PeiCpuPolicyInit.h    |   37 +
>  .../Library/PeiPolicyInitLib/PeiMePolicyInit.h     |   23 +
>  .../Library/PeiPolicyInitLib/PeiPolicyInit.c       |   65 +
>  .../Library/PeiPolicyInitLib/PeiPolicyInit.h       |   23 +
>  .../Library/PeiPolicyInitLib/PeiPolicyInitLib.inf  |   62 +
>  .../Library/PeiPolicyInitLib/PeiPolicyInitPreMem.c |   60 +
>  .../Library/PeiPolicyInitLib/PeiSaPolicyInit.c     |  114 ++
>  .../Library/PeiPolicyInitLib/PeiSaPolicyInit.h     |   58 +
>  .../Library/PeiPolicyInitLib/PeiSiPolicyInit.h     |   22 +
>  .../PeiPolicyUpdateLib/PeiCpuPolicyUpdate.c        |   80 +
>  .../PeiPolicyUpdateLib/PeiCpuPolicyUpdate.h        |   32 +
>  .../PeiPolicyUpdateLib/PeiCpuPolicyUpdatePreMem.c  |  108 +
>  .../Library/PeiPolicyUpdateLib/PeiMePolicyUpdate.c |   49 +
>  .../Library/PeiPolicyUpdateLib/PeiMePolicyUpdate.h |   14 +
>  .../PeiPolicyUpdateLib/PeiMePolicyUpdatePreMem.c   |   32 +
>  .../PeiPolicyUpdateLib/PeiPchPolicyUpdate.c        |  518 +++++
>  .../PeiPolicyUpdateLib/PeiPchPolicyUpdate.h        |   24 +
>  .../PeiPolicyUpdateLib/PeiPchPolicyUpdatePreMem.c  |  114 ++
>  .../PeiPolicyUpdateLib/PeiPolicyUpdateLib.inf      |  273 +++
>  .../Library/PeiPolicyUpdateLib/PeiSaPolicyUpdate.c |  243 +++
>  .../Library/PeiPolicyUpdateLib/PeiSaPolicyUpdate.h |   53 +
>  .../PeiPolicyUpdateLib/PeiSaPolicyUpdatePreMem.c   |  213 ++
>  .../Library/PeiPolicyUpdateLib/PeiSiPolicyUpdate.c |  169 ++
>  .../Library/PeiPolicyUpdateLib/PeiSiPolicyUpdate.h |   18 +
>  72 files changed, 11368 insertions(+)
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicyLi
> b/DxeTbtPolicyLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicyLi
> b/DxeTbtPolicyLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicyLi
> b/DxeTbtPolicyLibrary.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmTbt
> CommonLib/TbtCommonLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmTbt
> CommonLib/TbtCommonLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyLib
> /PeiTbtPolicyLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyLib
> /PeiTbtPolicyLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyLib
> /PeiTbtPolicyLibrary.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiDTbt
> InitLib/PeiDTbtInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiDTbt
> InitLib/PeiDTbtInitLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspCpuPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspMePolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspMiscUpdInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspPchPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspPolicyInitLib.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspPolicyInitLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspSaPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspSecurityPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyInit
> Lib/PeiFspSiPolicyInitLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiFspMiscUpdUpdateLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiFspPolicyUpdateLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiMiscPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiPchPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiPchPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiPchPolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiSaPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiSaPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiSaPolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPolicy
> UpdateLibFsp/PeiSiliconPolicyUpdateLibFsp.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/AcpiTimerLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTimer
> Lib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTimer
> Lib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTimer
> Lib.uni
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Base
> GpioExpanderLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Base
> GpioExpanderLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PchHda
> VerbTables.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHda
> VerbTableLib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHda
> VerbTableLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAccess
> Lib.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAccess
> Lib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xeCpuPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xeMePolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xeMePolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xePchPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xePolicyUpdateLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xeSaPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib/D
> xeSaPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiCp
> uPolicyInit.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiMe
> PolicyInit.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiPol
> icyInit.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiPol
> icyInit.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiPol
> icyInitLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiPol
> icyInitPreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiSaP
> olicyInit.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiSaP
> olicyInit.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiSiP
> olicyInit.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iCpuPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iCpuPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iCpuPolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iMePolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iMePolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iMePolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iPchPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iPchPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iPchPolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iPolicyUpdateLib.inf
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iSaPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iSaPolicyUpdate.h
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iSaPolicyUpdatePreMem.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iSiPolicyUpdate.c
>  create mode 100644
> Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/Pe
> iSiPolicyUpdate.h
> 
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.c
> new file mode 100644
> index 0000000000..3e3203b841
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.c
> @@ -0,0 +1,148 @@
> +/** @file
> +  This file is DxeTbtPolicyLib library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <DxeTbtPolicyLibrary.h>
> +#include <TbtBoardInfo.h>
> +#include <Protocol/DxeTbtPolicy.h>
> +#include <Guid/HobList.h>
> +#include <Library/HobLib.h>
> +
> +
> +/**
> +  Update Tbt Policy Callback
> +**/
> +
> +VOID
> +EFIAPI
> +UpdateTbtPolicyCallback (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                     Status;
> +  DXE_TBT_POLICY_PROTOCOL        *DxeTbtConfig;
> +
> +  DxeTbtConfig = NULL;
> +  Status = EFI_NOT_FOUND;
> +  DEBUG ((DEBUG_INFO, "UpdateTbtPolicyCallback\n"));
> +
> +  Status = gBS->LocateProtocol (
> +                  &gDxeTbtPolicyProtocolGuid,
> +                  NULL,
> +                  (VOID **) &DxeTbtConfig
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, " gDxeTbtPolicyProtocolGuid Not
> installed!!!\n"));
> +  } else {
> +
> +  }
> +
> +  return;
> +}
> +
> +/**
> +  Print DXE TBT Policy
> +**/
> +VOID
> +TbtPrintDxePolicyConfig (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                       Status;
> +  UINT8                            Index;
> +  DXE_TBT_POLICY_PROTOCOL          *DxeTbtConfig;
> +
> +  DEBUG ((DEBUG_INFO, "TbtPrintDxePolicyConfig Start\n"));
> +
> +  DxeTbtConfig = NULL;
> +  Status = EFI_NOT_FOUND;
> +  Status = gBS->LocateProtocol (
> +                  &gDxeTbtPolicyProtocolGuid,
> +                  NULL,
> +                  (VOID **) &DxeTbtConfig
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, " gDxeTbtPolicyProtocolGuid Not
> installed!!!\n"));
> +  }
> +  ASSERT_EFI_ERROR (Status);
> +  //
> +  // Print DTBT Policy
> +  //
> +  DEBUG ((DEBUG_ERROR, " ========================= DXE TBT POLICY
> ========================= \n"));
> +  for (Index = 0; Index < MAX_DTBT_CONTROLLER_NUMBER; Index++) {
> +    DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->DTbtResourceConfig[%x].DTbtPcieExtraBusRsvd = %x\n",
> Index, DxeTbtConfig->DTbtResourceConfig[Index].DTbtPcieExtraBusRsvd));
> +    DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->DTbtResourceConfig[%x].DTbtPcieMemRsvd = %x\n", Index,
> DxeTbtConfig->DTbtResourceConfig[Index].DTbtPcieMemRsvd));
> +    DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->DTbtResourceConfig[%x].DTbtPcieMemAddrRngMax = %x\n",
> Index,
> DxeTbtConfig->DTbtResourceConfig[Index].DTbtPcieMemAddrRngMax));
> +    DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->DTbtResourceConfig[%x].DTbtPciePMemRsvd = %x\n", Index,
> DxeTbtConfig->DTbtResourceConfig[Index].DTbtPciePMemRsvd));
> +    DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->DTbtResourceConfig[%x].DTbtPciePMemAddrRngMax =
> %x\n", Index,
> DxeTbtConfig->DTbtResourceConfig[Index].DTbtPciePMemAddrRngMax));
> +  }
> +
> +  //
> +  // Print TBT Common Policy
> +  //
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtAspm =
> %x\n", DxeTbtConfig->TbtCommonConfig.TbtAspm));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtL1SubStates
> = %x\n", DxeTbtConfig->TbtCommonConfig.TbtL1SubStates));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtHotNotify =
> %x\n", DxeTbtConfig->TbtCommonConfig.TbtHotNotify));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtHotSMI =
> %x\n", DxeTbtConfig->TbtCommonConfig.TbtHotSMI));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtLtr = %x\n",
> DxeTbtConfig->TbtCommonConfig.TbtLtr));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtPtm =
> %x\n", DxeTbtConfig->TbtCommonConfig.TbtPtm));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtSetClkReq =
> %x\n", DxeTbtConfig->TbtCommonConfig.TbtSetClkReq));
> +  DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->TbtCommonConfig.TbtWakeupSupport = %x\n",
> DxeTbtConfig->TbtCommonConfig.TbtWakeupSupport));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.SecurityMode
> = %x\n", DxeTbtConfig->TbtCommonConfig.SecurityMode));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.Gpio5Filter =
> %x\n", DxeTbtConfig->TbtCommonConfig.Gpio5Filter));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TrA0OsupWa =
> %x\n", DxeTbtConfig->TbtCommonConfig.TrA0OsupWa));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.TbtAcDcSwitch
> = %x\n", DxeTbtConfig->TbtCommonConfig.TbtAcDcSwitch));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.Rtd3Tbt =
> %x\n", DxeTbtConfig->TbtCommonConfig.Rtd3Tbt));
> +  DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->TbtCommonConfig.Rtd3TbtOffDelay = %x\n",
> DxeTbtConfig->TbtCommonConfig.Rtd3TbtOffDelay));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReq
> = %x\n", DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReq));
> +  DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReqDelay = %x\n",
> DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReqDelay));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.Win10Support
> = %x\n", DxeTbtConfig->TbtCommonConfig.Win10Support));
> +  DEBUG ((DEBUG_INFO,
> "DxeTbtConfig->TbtCommonConfig.TbtVtdBaseSecurity = %x\n",
> DxeTbtConfig->TbtCommonConfig.TbtVtdBaseSecurity));
> +  DEBUG ((DEBUG_INFO, "DxeTbtConfig->TbtCommonConfig.ControlIommu
> = %x\n", DxeTbtConfig->TbtCommonConfig.ControlIommu));
> +  return;
> +}
> +
> +/**
> +  Install Tbt Policy
> +
> +  @param[in] ImageHandle                Image handle of this driver.
> +
> +  @retval EFI_SUCCESS                   The policy is installed.
> +  @retval EFI_OUT_OF_RESOURCES          Insufficient resources to
> create buffer
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InstallTbtPolicy (
> +  IN  EFI_HANDLE                    ImageHandle
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  DXE_TBT_POLICY_PROTOCOL       *DxeTbtPolicy;
> +
> +  DEBUG ((DEBUG_INFO, "Install DXE TBT Policy\n"));
> +
> +  DxeTbtPolicy = NULL;
> +  //Alloc memory for DxeTbtPolicy
> +  DxeTbtPolicy = (DXE_TBT_POLICY_PROTOCOL *) AllocateZeroPool (sizeof
> (DXE_TBT_POLICY_PROTOCOL));
> +  if (DxeTbtPolicy == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  Status = gBS->InstallProtocolInterface (
> +                  &ImageHandle,
> +                  &gDxeTbtPolicyProtocolGuid,
> +                  EFI_NATIVE_INTERFACE,
> +                  DxeTbtPolicy
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "Install Tbt Secure Boot List protocol
> failed\n"));
> +  }
> +  return Status;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.inf
> new file mode 100644
> index 0000000000..eafe2ae56a
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLib.inf
> @@ -0,0 +1,45 @@
> +## @file
> +# Component description file for Tbt functionality
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +INF_VERSION = 0x00010017
> +BASE_NAME = DxeTbtPolicyLib
> +FILE_GUID = 28ABF346-4E52-4BD3-b1FF-63BA7563C9D4
> +VERSION_STRING = 1.0
> +MODULE_TYPE = BASE
> +LIBRARY_CLASS = DxeTbtPolicyLib
> +
> +
> +[LibraryClasses]
> +BaseMemoryLib
> +UefiRuntimeServicesTableLib
> +UefiBootServicesTableLib
> +DebugLib
> +PostCodeLib
> +HobLib
> +
> +[Packages]
> +MdePkg/MdePkg.dec
> +CoffeelakeSiliconPkg/SiPkg.dec
> +CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[Sources]
> +DxeTbtPolicyLib.c
> +
> +
> +[Guids]
> +gEfiEndOfDxeEventGroupGuid
> +gTbtInfoHobGuid
> +
> +[Protocols]
> +gDxeTbtPolicyProtocolGuid
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLibrary.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLibrary.h
> new file mode 100644
> index 0000000000..6603518f0a
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/DxeTbtPolicy
> Lib/DxeTbtPolicyLibrary.h
> @@ -0,0 +1,24 @@
> +/** @file
> +  Header file for the DxeTBTPolicy library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _DXE_TBT_POLICY_LIBRARY_H_
> +#define _DXE_TBT_POLICY_LIBRARY_H_
> +
> +#include <Uefi.h>
> +#include <Library/DebugLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <ConfigBlock.h>
> +//#include <SetupVariable.h>
> +#include <Guid/EventGroup.h>
> +
> +#endif // _DXE_TBT_POLICY_LIBRARY_H_
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.c
> new file mode 100644
> index 0000000000..c843175f82
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.c
> @@ -0,0 +1,316 @@
> +/** @file
> +  PeiTbtInit library implementition with empty functions.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/DebugLib.h>
> +#include <Uefi/UefiBaseType.h>
> +#include <Library/PchPcieRpLib.h>
> +#include <Library/TbtCommonLib.h>
> +#include <Library/PciSegmentLib.h>
> +#include <Library/TimerLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/GpioLib.h>
> +
> +
> +/**
> +  Selects the proper TBT Root port to assign resources
> +  based on the user input value
> +
> +  @param[in]  SetupData          Pointer to Setup data
> +
> +  @retval     TbtSelectorChosen  Rootport number.
> +**/
> +VOID
> +GetRootporttoSetResourcesforTbt (
> +  IN UINTN                              RpIndex,
> +  OUT UINT8                             *RsvdExtraBusNum,
> +  OUT UINT16                            *RsvdPcieMegaMem,
> +  OUT UINT8                             *PcieMemAddrRngMax,
> +  OUT UINT16                            *RsvdPciePMegaMem,
> +  OUT UINT8                             *PciePMemAddrRngMax,
> +  OUT BOOLEAN                           *SetResourceforTbt
> +  )
> +{
> +  UINTN TbtRpNumber;
> +  TbtRpNumber = (UINTN) PcdGet8 (PcdDTbtPcieRpNumber);
> +
> +    if (RpIndex == (TbtRpNumber - 1)) {
> +        *RsvdExtraBusNum = PcdGet8 (PcdDTbtPcieExtraBusRsvd);
> +        *RsvdPcieMegaMem = PcdGet16 (PcdDTbtPcieMemRsvd);
> +        *PcieMemAddrRngMax = PcdGet8
> (PcdDTbtPcieMemAddrRngMax);
> +        *RsvdPciePMegaMem = PcdGet16 (PcdDTbtPciePMemRsvd);
> +        *PciePMemAddrRngMax = PcdGet8
> (PcdDTbtPciePMemAddrRngMax);
> +        *SetResourceforTbt = TRUE;
> +      }
> +      else {
> +        *SetResourceforTbt = FALSE;
> +      }
> +  }
> +
> +/**
> +  Internal function to Wait for Tbt2PcieDone Bit.to Set or clear
> +  @param[in]  CommandOffsetAddress      Tbt2Pcie Register Address
> +  @param[in]  TimeOut                   Time out with 100 ms
> garnularity
> +  @param[in]  Tbt2PcieDone              Wait condition (wait for Bit
> to Clear/Set)
> +  @param[out] *Tbt2PcieValue Function   Register value
> +**/
> +BOOLEAN
> +InternalWaitforCommandCompletion(
> +  IN  UINT64   CommandOffsetAddress,
> +  IN  UINT32   TimeOut,
> +  IN  BOOLEAN  Tbt2PcieDone,
> +  OUT UINT32   *Tbt2PcieValue
> +  )
> +{
> +  BOOLEAN ReturnFlag;
> +  UINT32  Tbt2PcieCheck;
> +
> +  ReturnFlag = FALSE;
> +  while (TimeOut-- > 0) {
> +    *Tbt2PcieValue = PciSegmentRead32 (CommandOffsetAddress);
> +
> +    if (0xFFFFFFFF == *Tbt2PcieValue ) {
> +      //
> +      // Device is not here return now
> +      //
> +      ReturnFlag     = FALSE;
> +      break;
> +    }
> +
> +    if(Tbt2PcieDone) {
> +      Tbt2PcieCheck  =  *Tbt2PcieValue & TBT2PCIE_DON_R;
> +    } else {
> +      Tbt2PcieCheck  = !(*Tbt2PcieValue & TBT2PCIE_DON_R);
> +    }
> +
> +    if (Tbt2PcieCheck) {
> +      ReturnFlag     = TRUE;
> +      break;
> +    }
> +
> +    MicroSecondDelay(TBT_MAIL_BOX_DELAY);
> +  }
> +  return ReturnFlag;
> +}
> +/**
> +  Get Security Level.
> +  @param[in]  Bus       Bus number Host Router (DTBT)
> +  @param[in]  Device    Device number for Host Router (DTBT)
> +  @param[in]  Function  Function number for  Host Router (DTBT)
> +  @param[in]  Command   Command for  Host Router (DTBT)
> +  @param[in]  Timeout   Time out with 100 ms garnularity
> +**/
> +UINT8
> +GetSecLevel (
> +  IN    UINT8                   Bus,
> +  IN    UINT8                   Device,
> +  IN    UINT8                   Function,
> +  IN    UINT8                   Command,
> +  IN    UINT32                  Timeout
> +  )
> +{
> +  UINT64       Pcie2Tbt;
> +  UINT64       Tbt2Pcie;
> +  UINT32       RegisterValue;
> +  UINT8        ReturnFlag;
> +
> +  ReturnFlag           = 0xFF;
> +
> +  DEBUG ((DEBUG_INFO, "GetSecLevel() \n"));
> +
> +  GET_TBT2PCIE_REGISTER_ADDRESS(0, Bus, Device, Function, Tbt2Pcie)
> +  GET_PCIE2TBT_REGISTER_ADDRESS(0, Bus, Device, Function, Pcie2Tbt)
> +
> +  PciSegmentWrite32 (Pcie2Tbt, Command | PCIE2TBT_VLD_B);
> +
> +  if(InternalWaitforCommandCompletion(Tbt2Pcie, Timeout, TRUE,
> &RegisterValue)) {
> +    ReturnFlag     = (UINT8) (0xFF & (RegisterValue >> 8));
> +  }
> +
> +  PciSegmentWrite32 (Pcie2Tbt, 0);
> +
> +  InternalWaitforCommandCompletion(Tbt2Pcie, Timeout, FALSE,
> &RegisterValue);
> +  DEBUG ((DEBUG_INFO, "Security Level configured to %x \n", ReturnFlag));
> +
> +  return ReturnFlag;
> +}
> +
> +/**
> +  Set Security Level.
> +  @param[in]  Data      Security State
> +  @param[in]  Bus       Bus number for Host Router (DTBT)
> +  @param[in]  Device    Device number for Host Router (DTBT)
> +  @param[in]  Function  Function number for Host Router (DTBT)
> +  @param[in]  Command   Command for  Host Router (DTBT)
> +  @param[in]  Timeout   Time out with 100 ms garnularity
> +**/
> +BOOLEAN
> +SetSecLevel (
> +  IN    UINT8                   Data,
> +  IN    UINT8                   Bus,
> +  IN    UINT8                   Device,
> +  IN    UINT8                   Function,
> +  IN    UINT8                   Command,
> +  IN    UINT32                  Timeout
> +  )
> +{
> +  UINT64       Pcie2Tbt;
> +  UINT64       Tbt2Pcie;
> +  UINT32       RegisterValue;
> +  BOOLEAN      ReturnFlag;
> +
> +  ReturnFlag   = FALSE;
> +
> +  DEBUG ((DEBUG_INFO, "SetSecLevel() \n"));
> +
> +  GET_TBT2PCIE_REGISTER_ADDRESS(0, Bus, Device, Function, Tbt2Pcie)
> +  GET_PCIE2TBT_REGISTER_ADDRESS(0, Bus, Device, Function, Pcie2Tbt)
> +
> +  PciSegmentWrite32 (Pcie2Tbt, (Data << 8) | Command |
> PCIE2TBT_VLD_B);
> +
> +  ReturnFlag = InternalWaitforCommandCompletion(Tbt2Pcie, Timeout,
> TRUE, &RegisterValue);
> +  DEBUG ((DEBUG_INFO, "RegisterValue %x \n", RegisterValue));
> +  PciSegmentWrite32 (Pcie2Tbt, 0);
> +
> +  InternalWaitforCommandCompletion(Tbt2Pcie, Timeout, FALSE,
> &RegisterValue);
> +  DEBUG ((DEBUG_INFO, "Return value %x \n", ReturnFlag));
> +  return ReturnFlag;
> +}
> +
> +/**
> +Based on the Security Mode Selection, BIOS drives FORCE_PWR.
> +
> +@param[in]  GpioNumber
> +@param[in]  Value
> +**/
> +VOID
> +ForceDtbtPower(
> +  IN  UINT8          GpioAccessType,
> +  IN  UINT8          Expander,
> +  IN  UINT32         GpioNumber,
> +  IN  BOOLEAN        Value
> +)
> +{
> +  if (GpioAccessType == 0x01) {
> +    // PCH
> +    GpioSetOutputValue (GpioNumber, (UINT32)Value);
> +  } else if (GpioAccessType == 0x02) {
> +    // IoExpander {TCA6424A}
> +    GpioExpSetOutput (Expander, (UINT8)GpioNumber, (UINT8)Value);
> +  }
> +}
> +
> +/**
> +Execute TBT Mail Box Command
> +
> +@param[in]  Command   TBT Command
> +@param[in]  Bus       Bus number for  Host Router (DTBT)
> +@param[in]  Device    Device number for  Host Router (DTBT)
> +@param[in]  Function  Function number for  Host Router (DTBT)
> +@param[in]  Timeout   Time out with 100 ms garnularity
> +@Retval     true      if command executes succesfully
> +**/
> +BOOLEAN
> +TbtSetPcie2TbtCommand(
> +   IN    UINT8                   Command,
> +   IN    UINT8                   Bus,
> +   IN    UINT8                   Device,
> +   IN    UINT8                   Function,
> +   IN    UINT32                  Timeout
> +)
> +{
> +   UINT64      Pcie2Tbt;
> +   UINT64      Tbt2Pcie;
> +   UINT32      RegisterValue;
> +   BOOLEAN     ReturnFlag;
> +
> +   GET_TBT2PCIE_REGISTER_ADDRESS(0, Bus, Device, Function, Tbt2Pcie)
> +   GET_PCIE2TBT_REGISTER_ADDRESS(0, Bus, Device, Function, Pcie2Tbt)
> +
> +   PciSegmentWrite32 (Pcie2Tbt, Command | PCIE2TBT_VLD_B);
> +
> +   ReturnFlag = InternalWaitforCommandCompletion(Tbt2Pcie, Timeout,
> TRUE, &RegisterValue);
> +
> +   PciSegmentWrite32(Pcie2Tbt, 0);
> +
> +   return ReturnFlag;
> +}
> +/**
> +  Get Pch/Peg Pcie Root Port Device and Function Number for TBT by Root
> Port physical Number
> +
> +  @param[in]  RpNumber              Root port physical number.
> (0-based)
> +  @param[out] RpDev                 Return corresponding root port
> device number.
> +  @param[out] RpFun                 Return corresponding root port
> function number.
> +
> +  @retval     EFI_SUCCESS           Root port device and function is
> retrieved
> +  @retval     EFI_INVALID_PARAMETER If Invalid Root Port Number or
> TYPE is Passed
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetDTbtRpDevFun (
> +  IN  BOOLEAN Type,
> +  IN  UINTN   RpNumber,
> +  OUT UINTN   *RpDev,
> +  OUT UINTN   *RpFunc
> +  )
> +{
> +  EFI_STATUS            Status;
> +  UINTN                 TbtRpDev;
> +  UINTN                 TbtRpFunc;
> +
> +  Status = EFI_INVALID_PARAMETER; // Update the Status to EFI_SUCCESS if
> valid input found.
> +  //
> +  // PCH-H can support up to 24 root ports. PEG0,PEG1 and PEG2 will be
> +  // with device number 0x1 and Function number 0,1 and 2 respectively.
> +  //
> +  if (Type == DTBT_TYPE_PEG)
> +  {
> +    //
> +    //  PEG Rootport
> +    //
> +    if (RpNumber <= 2) {
> +      *RpDev  =   0x01;
> +      *RpFunc =   RpNumber;
> +      Status  =   EFI_SUCCESS;
> +    }
> +  }
> +  if (Type == DTBT_TYPE_PCH)
> +  {
> +    //
> +    //  PCH Rootport
> +    //
> +    if (RpNumber <= 23) {
> +      Status  = GetPchPcieRpDevFun (RpNumber, &TbtRpDev,
> &TbtRpFunc);
> +      *RpDev  = TbtRpDev;
> +      *RpFunc = TbtRpFunc;
> +    }
> +  }
> +
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> +
> +BOOLEAN
> +IsTbtHostRouter (
> +  IN    UINT16  DeviceID
> +  )
> +{
> +  switch (DeviceID) {
> +  case AR_HR_2C:
> +  case AR_HR_4C:
> +  case AR_HR_LP:
> +  case AR_HR_C0_2C:
> +  case AR_HR_C0_4C:
> +  case TR_HR_2C:
> +  case TR_HR_4C:
> +    return TRUE;
> +  }
> +
> +  return FALSE;
> +} // IsTbtHostRouter
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.inf
> new file mode 100644
> index 0000000000..7a9e2d28dd
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiDxeSmmT
> btCommonLib/TbtCommonLib.inf
> @@ -0,0 +1,60 @@
> +## @file
> +# Component information file for Tbt common library
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = TbtCommonLib
> +  FILE_GUID                      =
> 5F03614E-CB56-40B1-9989-A09E25BBA294
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = BASE
> +  LIBRARY_CLASS                  = TbtCommonLib
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64 EBC
> +#
> +
> +[LibraryClasses]
> +  DebugLib
> +  PchPcieRpLib
> +  PciSegmentLib
> +  TimerLib
> +  BaseLib
> +  GpioLib
> +  GpioExpanderLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +
> +
> +[Pcd]
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtSecurityMode
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtWakeupSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtHotSMI
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtHotNotify
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtSetClkReq
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtAspm
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtAcDcSwitch
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdRtd3Tbt
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdRtd3TbtClkReq
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtPcieMemAddrRngMax
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtPciePMemRsvd
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtPciePMemAddrRngMax
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtPcieRpNumber
> +
> +[Sources]
> +  TbtCommonLib.c
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.c
> new file mode 100644
> index 0000000000..7c1614a69a
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.c
> @@ -0,0 +1,206 @@
> +/** @file
> +  This file is PeiTbtPolicyLib library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/PeiServicesLib.h>
> +#include <Library/GpioLib.h>
> +#include <PiPei.h>
> +#include <PeiTbtPolicyLibrary.h>
> +#include <Ppi/ReadOnlyVariable2.h>
> +#include <Ppi/PeiTbtPolicy.h>
> +#include <Base.h>
> +#include <GpioConfig.h>
> +
> +/**
> +  Update PEI TBT Policy Callback
> +**/
> +VOID
> +EFIAPI
> +UpdatePeiTbtPolicy (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                       Status;
> +  EFI_PEI_READ_ONLY_VARIABLE2_PPI  *VariableServices;
> +  PEI_TBT_POLICY                   *PeiTbtConfig;
> +
> +  PeiTbtConfig = NULL;
> +  Status = EFI_NOT_FOUND;
> +
> +  DEBUG ((DEBUG_INFO, "UpdatePeiTbtPolicy \n"));
> +
> +  Status = PeiServicesLocatePpi (
> +             &gEfiPeiReadOnlyVariable2PpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &VariableServices
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PeiServicesLocatePpi (
> +             &gPeiTbtPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &PeiTbtConfig
> +             );
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
> +  }
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Update DTBT Policy
> +  //
> +  PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn = PcdGet8
> (PcdDTbtControllerEn);
> +  if (PcdGet8 (PcdDTbtControllerType) == TYPE_PEG)
> +  {
> +    PeiTbtConfig-> DTbtControllerConfig.Type = (UINT8) TYPE_PEG;
> +    PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber = 1; // PEG RP 1
> (Function no. 0)
> +  }
> +  else {
> +    PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber = PcdGet8
> (PcdDTbtPcieRpNumber);
> +    PeiTbtConfig-> DTbtControllerConfig.Type = PcdGet8
> (PcdDTbtControllerType);
> +  }
> +  PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.GpioPad =
> (GPIO_PAD) PcdGet32 (PcdDTbtCioPlugEventGpioPad);
> +  if
> (GpioCheckFor2Tier(PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.Gp
> ioPad)) {
> +
> PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePortin
> g = 0;
> +    PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature
> = SIGNATURE_32('X', 'T', 'B', 'T');
> +  }
> +  else {
> +
> PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePortin
> g = 1;
> +    //
> +    // Update Signature based on platform GPIO.
> +    //
> +    PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature
> = SIGNATURE_32('X', 'T', 'B', 'T');
> +  }
> +  PeiTbtConfig->DTbtCommonConfig.TbtBootOn = PcdGet8
> (PcdDTbtBootOn);
> +  PeiTbtConfig->DTbtCommonConfig.TbtUsbOn = PcdGet8 (PcdDTbtUsbOn);
> +  PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr = PcdGet8
> (PcdDTbtGpio3ForcePwr);
> +  PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly = PcdGet16
> (PcdDTbtGpio3ForcePwrDly);
> +
> +  return;
> +}
> +
> +/**
> +  Print PEI TBT Policy
> +**/
> +VOID
> +EFIAPI
> +TbtPrintPeiPolicyConfig (
> +  VOID
> +  )
> +{
> +  DEBUG_CODE_BEGIN ();
> +  EFI_STATUS                       Status;
> +  PEI_TBT_POLICY                   *PeiTbtConfig;
> +
> +  PeiTbtConfig = NULL;
> +  Status = EFI_NOT_FOUND;
> +  DEBUG ((DEBUG_INFO, "TbtPrintPolicyConfig Start\n"));
> +
> +  Status = PeiServicesLocatePpi (
> +             &gPeiTbtPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &PeiTbtConfig
> +             );
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
> +  }
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Print DTBT Policy
> +  //
> +  DEBUG ((DEBUG_INFO, "\n------------------------ TBT Policy (PEI) Print BEGIN
> -----------------\n"));
> +  DEBUG ((DEBUG_INFO, "Revision : 0x%x\n", PEI_TBT_POLICY_REVISION));
> +  DEBUG ((DEBUG_INFO, "------------------------ PEI_TBT_CONFIG
> -----------------\n"));
> +  DEBUG ((DEBUG_INFO, " Revision : %d\n", PEI_TBT_POLICY_REVISION));
> +
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.DTbtControllerEn = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn));
> +  DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtControllerConfig.Type = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.Type));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.PcieRpNumber = %x\n", PeiTbtConfig->
> DTbtControllerConfig.PcieRpNumber));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.ForcePwrGpio.GpioPad = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioPad));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.ForcePwrGpio.GpioLevel = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioLevel));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.PcieRstGpio.GpioPad = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioPad));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.PcieRstGpio.GpioLevel = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioLevel));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.GpioPad = %x\n",
> PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.GpioPad));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature =
> %x\n", PeiTbtConfig->
> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorti
> ng = %x\n", PeiTbtConfig->
> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting));
> +
> +
> +  //
> +  // Print DTBT Common Policy
> +  //
> +  DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.TbtBootOn =
> %x\n", PeiTbtConfig->DTbtCommonConfig.TbtBootOn));
> +  DEBUG ((DEBUG_INFO, "PeiTbtConfig->DTbtCommonConfig.TbtUsbOn =
> %x\n", PeiTbtConfig->DTbtCommonConfig.TbtUsbOn));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr = %x\n",
> PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly = %x\n",
> PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtCommonConfig.DTbtSharedGpioConfiguration = %x\n",
> PeiTbtConfig->DTbtCommonConfig.DTbtSharedGpioConfiguration));
> +  DEBUG ((DEBUG_INFO,
> "PeiTbtConfig->DTbtCommonConfig.PcieRstSupport = %x\n",
> PeiTbtConfig->DTbtCommonConfig.PcieRstSupport));
> +
> +  DEBUG ((DEBUG_INFO, "\n------------------------ TBT Policy (PEI) Print END
> -----------------\n"));
> +  DEBUG_CODE_END ();
> +
> +  return;
> +}
> +
> +/**
> +  Install Tbt Policy
> +
> +  @retval EFI_SUCCESS                   The policy is installed.
> +  @retval EFI_OUT_OF_RESOURCES          Insufficient resources to
> create buffer
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InstallPeiTbtPolicy (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  EFI_PEI_PPI_DESCRIPTOR        *PeiTbtPolicyPpiDesc;
> +  PEI_TBT_POLICY                *PeiTbtConfig;
> +
> +  DEBUG ((DEBUG_INFO, "Install PEI TBT Policy\n"));
> +
> +  PeiTbtConfig = NULL;
> +
> +  //
> +  // Allocate memory for PeiTbtPolicyPpiDesc
> +  //
> +  PeiTbtPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool
> (sizeof (EFI_PEI_PPI_DESCRIPTOR));
> +  ASSERT (PeiTbtPolicyPpiDesc != NULL);
> +  if (PeiTbtPolicyPpiDesc == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  //
> +  // Allocate memory and initialize all default to zero for PeiTbtPolicy
> +  //
> +  PeiTbtConfig = (PEI_TBT_POLICY *) AllocateZeroPool (sizeof
> (PEI_TBT_POLICY));
> +  ASSERT (PeiTbtConfig != NULL);
> +  if (PeiTbtConfig == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  //
> +  // Initialize PPI
> +  //
> +  PeiTbtPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> +  PeiTbtPolicyPpiDesc->Guid = &gPeiTbtPolicyPpiGuid;
> +  PeiTbtPolicyPpiDesc->Ppi = PeiTbtConfig;
> +
> +  Status = PeiServicesInstallPpi (PeiTbtPolicyPpiDesc);
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "Install PEI TBT Policy failed\n"));
> +  }
> +  return Status;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.inf
> new file mode 100644
> index 0000000000..a892479210
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLib.inf
> @@ -0,0 +1,51 @@
> +## @file
> +# Component description file for Tbt policy
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +INF_VERSION = 0x00010017
> +BASE_NAME = PeiTbtPolicyLib
> +FILE_GUID = 4A95FDBB-2535-49eb-9A79-D56D24257106
> +VERSION_STRING = 1.0
> +MODULE_TYPE = PEIM
> +LIBRARY_CLASS = PeiTbtPolicyLib
> +
> +
> +[LibraryClasses]
> +BaseMemoryLib
> +PeiServicesLib
> +PeiServicesTablePointerLib
> +MemoryAllocationLib
> +DebugLib
> +PostCodeLib
> +HobLib
> +GpioLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  WhiskeylakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[Pcd]
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDTbtCioPlugEventGpioPad
> ## CONSUMES
> +
> +[Sources]
> +PeiTbtPolicyLib.c
> +
> +[Guids]
> +gTbtInfoHobGuid
> +
> +[Ppis]
> +gEfiPeiReadOnlyVariable2PpiGuid
> +gPeiTbtPolicyPpiGuid
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLibrary.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLibrary.h
> new file mode 100644
> index 0000000000..f4b337f397
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/PeiTbtPolicyL
> ib/PeiTbtPolicyLibrary.h
> @@ -0,0 +1,19 @@
> +/** @file
> +  Header file for the PeiTBTPolicy library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_TBT_POLICY_LIBRARY_H_
> +#define _PEI_TBT_POLICY_LIBRARY_H_
> +
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesTablePointerLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +
> +#endif // _PEI_TBT_POLICY_LIBRARY_H_
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiDT
> btInitLib/PeiDTbtInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiD
> TbtInitLib/PeiDTbtInitLib.c
> new file mode 100644
> index 0000000000..cdfba613f2
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiD
> TbtInitLib/PeiDTbtInitLib.c
> @@ -0,0 +1,567 @@
> +/** @file
> +  Thunderbolt(TM) Pei Library
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/PeiServicesLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/GpioLib.h>
> +#include <GpioPinsSklLp.h>
> +#include <GpioPinsSklH.h>
> +#include <Library/TimerLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MmPciLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/GpioExpanderLib.h>
> +#include <Ppi/ReadOnlyVariable2.h>
> +
> +#include <Base.h>
> +#include <Library/TbtCommonLib.h>
> +#include <TbtBoardInfo.h>
> +#include <IndustryStandard/Pci22.h>
> +#include <Library/PchCycleDecodingLib.h>
> +#include <Ppi/PeiTbtPolicy.h>
> +#include <Library/PciSegmentLib.h>
> +#include <Library/PeiTbtPolicyLib.h>
> +#include <Library/PchPmcLib.h>
> +#include <Private/Library/PeiDTbtInitLib.h>
> +
> +/**
> +Is host router (For dTBT) or End Point (For iTBT) present before sleep
> +
> +@param[in] ControllerType - DTBT_CONTROLLER or ITBT_CONTROLLER
> +@param[in] Controller     - Controller begin offset of CMOS
> +
> +@Retval     TRUE      There is a TBT HostRouter presented before sleep
> +@Retval     FALSE     There is no TBT HostRouter presented before
> sleep
> +
> +BOOLEAN
> +IsHostRouterPresentBeforeSleep(
> +IN  UINT8        ControllerType,
> +IN  UINT8        Controller
> +)
> +{
> +  UINT8 SavedState;
> +
> +  SavedState = (UINT8)GetTbtHostRouterStatus();
> +  if (ControllerType == DTBT_CONTROLLER){
> +    return ((SavedState & (DTBT_SAVE_STATE_OFFSET << Controller)) ==
> (DTBT_SAVE_STATE_OFFSET << Controller));
> +  } else {
> +    if (ControllerType == ITBT_CONTROLLER) {
> +      return ((SavedState & (ITBT_SAVE_STATE_OFFSET << Controller)) ==
> (ITBT_SAVE_STATE_OFFSET << Controller));
> +    }
> +  }
> +  return 0;
> +}
> +**/
> +
> +/**
> +Execute TBT PCIE2TBT_SX_EXIT_TBT_CONNECTED Mail Box Command for S4
> mode with PreBootAclEnable
> +
> +@param[in]  Bus       Bus number for Host Router (DTBT)
> +@param[in]  Device    Device number for Host Router (DTBT)
> +@param[in]  Function  Function number for Host Router (DTBT)
> +@param[in]  Timeout   Time out with 100 ms garnularity
> +@Retval     true      if command executes succesfully
> +**/
> +BOOLEAN
> +TbtSetPcie2TbtSxExitCommandWithPreBootAclEnable(
> +   IN    UINT8                   Bus,
> +   IN    UINT8                   Device,
> +   IN    UINT8                   Function,
> +   IN    UINT32                  Timeout
> +)
> +{
> +  UINT64      Pcie2Tbt;
> +  UINT64      Tbt2Pcie;
> +  UINT32      RegisterValue;
> +  BOOLEAN     ReturnFlag;
> +  UINT32      Command;
> +
> +  GET_TBT2PCIE_REGISTER_ADDRESS(0, Bus, Device, Function, Tbt2Pcie)
> +  GET_PCIE2TBT_REGISTER_ADDRESS(0, Bus, Device, Function, Pcie2Tbt)
> +
> +// If PreBootAcl is Enable, we need to enable DATA bit while sending SX EXIT
> MAIL BOX Command
> +  Command = (1 << 8) | PCIE2TBT_SX_EXIT_TBT_CONNECTED;
> +  PciSegmentWrite32 (Pcie2Tbt, Command | PCIE2TBT_VLD_B);
> +
> +  ReturnFlag = InternalWaitforCommandCompletion(Tbt2Pcie, Timeout,
> TRUE, &RegisterValue);
> +
> +  PciSegmentWrite32(Pcie2Tbt, 0);
> +
> +  return ReturnFlag;
> +}
> +
> +/**
> +Set the Sleep Mode if the HR is up.
> +@param[in]  Bus       Bus number for Host Router (DTBT)
> +@param[in]  Device    Device number for Host Router (DTBT)
> +@param[in]  Function  Function number for Host Router (DTBT)
> +**/
> +VOID
> +TbtSetSxMode(
> +IN    UINT8                   Bus,
> +IN    UINT8                   Device,
> +IN    UINT8                   Function,
> +IN    UINT8                   TbtBootOn
> +)
> +{
> +  UINT64                          TbtUsDevId;
> +  UINT64                          Tbt2Pcie;
> +  UINT32                          RegVal;
> +  UINT32                          MaxLoopCount;
> +  UINTN                           Delay;
> +  UINT8                           RetCode;
> +  EFI_BOOT_MODE                   BootMode;
> +  EFI_STATUS                      Status;
> +
> +  TbtUsDevId = PCI_SEGMENT_LIB_ADDRESS(0, Bus, Device, Function, 0);
> +  GET_TBT2PCIE_REGISTER_ADDRESS(0, Bus, Device, Function, Tbt2Pcie)
> +
> +  MaxLoopCount = TBT_5S_TIMEOUT;  // Wait 5 sec
> +  Delay = 100 * 1000;
> +  RetCode = 0x62;
> +
> +  Status = PeiServicesGetBootMode(&BootMode);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  if ((BootMode == BOOT_ON_S4_RESUME) && (TbtBootOn == 2)) {
> +    MaxLoopCount = TBT_3S_TIMEOUT;
> +    if (!TbtSetPcie2TbtSxExitCommandWithPreBootAclEnable(Bus, Device,
> Function, MaxLoopCount)) {
> +      //
> +      // Nothing to wait, HR is not responsive
> +      //
> +      return;
> +    }
> +  }
> +  else {
> +    if (!TbtSetPcie2TbtCommand(PCIE2TBT_SX_EXIT_TBT_CONNECTED, Bus,
> Device, Function, MaxLoopCount)) {
> +      //
> +      // Nothing to wait, HR is not responsive
> +      //
> +      return;
> +    }
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Wait for Dev ID != 0xFF\n"));
> +
> +  while (MaxLoopCount-- > 0) {
> +    //
> +    // Check what HR still here
> +    //
> +    RegVal = PciSegmentRead32(Tbt2Pcie);
> +    if (0xFFFFFFFF == RegVal) {
> +      RetCode = 0x6F;
> +      break;
> +    }
> +    //
> +    // Check completion of TBT link
> +    //
> +    RegVal = PciSegmentRead32(TbtUsDevId);
> +    if (0xFFFFFFFF != RegVal) {
> +      RetCode = 0x61;
> +      break;
> +    }
> +
> +    MicroSecondDelay(Delay);
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Return code = 0x%x\n", RetCode));
> +}
> +/**
> +  set tPCH25 Timing to 10 ms for DTBT.
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtSetTPch25Timing (
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +  DEBUG ((DEBUG_INFO, "DTbtSetTPch25Timing call Inside\n"));
> +  UINT32                PchPwrmBase;
> +
> +  //
> +  //During boot, reboot and wake  tPCH25 Timing should be set to 10 ms
> +  //
> +  MmioOr32 (
> +    (UINTN) (PchPwrmBase + R_PCH_PWRM_CFG),
> +    (BIT0 | BIT1)
> +    );
> +
> +  DEBUG((DEBUG_INFO, "DTbtSetTPch25Timing call Return\n"));
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Do ForcePower for DTBT Controller
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtForcePower (
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +
> +  DEBUG ((DEBUG_INFO, "DTbtForcePower call Inside\n"));
> +
> +      if (PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr) {
> +        DEBUG((DEBUG_INFO, "ForcePwrGpio.GpioPad = %x \n",
> PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioPad));
> +        ForceDtbtPower(PeiTbtConfig->
> DTbtControllerConfig.ForcePwrGpio.GpioAccessType,PeiTbtConfig->
> DTbtControllerConfig.ForcePwrGpio.Expander, PeiTbtConfig->
> DTbtControllerConfig.ForcePwrGpio.GpioPad, PeiTbtConfig->
> DTbtControllerConfig.ForcePwrGpio.GpioLevel);
> +        DEBUG((DEBUG_INFO, "ForceDtbtPower asserted \n"));
> +
> MicroSecondDelay(PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly *
> 1000);
> +        DEBUG((DEBUG_INFO, "Delay after ForceDtbtPower = 0x%x ms \n",
> PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly));
> +      }
> +
> +  DEBUG ((DEBUG_INFO, "DTbtForcePower call Return\n"));
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Clear VGA Registers for DTBT.
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtClearVgaRegisters (
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +  UINTN      RpDev;
> +  UINTN      RpFunc;
> +  EFI_STATUS Status;
> +  UINT64     BridngeBaseAddress;
> +  UINT16     Data16;
> +
> +  DEBUG ((DEBUG_INFO, "DTbtClearVgaRegisters call Inside\n"));
> +
> +  Status = EFI_SUCCESS;
> +
> +  Status = GetDTbtRpDevFun(PeiTbtConfig-> DTbtControllerConfig.Type,
> PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber - 1, &RpDev, &RpFunc);
> +  ASSERT_EFI_ERROR(Status);
> +  //
> +  // VGA Enable and VGA 16-bit decode registers of Bridge control register of
> Root port where
> +  // Host router resides should be cleaned
> +  //
> +
> +  BridngeBaseAddress = PCI_SEGMENT_LIB_ADDRESS(0, 0, (UINT32)RpDev,
> (UINT32)RpFunc, 0);
> +  Data16 = PciSegmentRead16(BridngeBaseAddress +
> PCI_BRIDGE_CONTROL_REGISTER_OFFSET);
> +  Data16 &= (~(EFI_PCI_BRIDGE_CONTROL_VGA |
> EFI_PCI_BRIDGE_CONTROL_VGA_16));
> +  PciSegmentWrite16(BridngeBaseAddress +
> PCI_BRIDGE_CONTROL_REGISTER_OFFSET, Data16);
> +
> +  DEBUG ((DEBUG_INFO, "DTbtClearVgaRegisters call Return\n"));
> +  return Status;
> +}
> +
> +/**
> +  Exectue Mail box command "Boot On".
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtBootOn(
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +  EFI_STATUS Status;
> +  UINT32     OrgBusNumberConfiguration;
> +  UINTN      RpDev;
> +  UINTN      RpFunc;
> +
> +  DEBUG((DEBUG_INFO, "DTbtBootOn call Inside\n"));
> +
> +  Status = EFI_SUCCESS;
> +
> +      Status = GetDTbtRpDevFun(PeiTbtConfig-> DTbtControllerConfig.Type,
> PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber - 1, &RpDev, &RpFunc);
> +      ASSERT_EFI_ERROR(Status);
> +      OrgBusNumberConfiguration = PciSegmentRead32
> (PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev, RpFunc,
> PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET));
> +      //
> +      // Set Sec/Sub buses to 0xF0
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET), 0x00F0F000);
> +      //
> +      //When Thunderbolt(TM) boot [TbtBootOn] is enabled in bios setup
> we need to do the below:
> +      //Bios should send "Boot On" message through PCIE2TBT register
> +      //The Boot On command as described above would include the
> command and acknowledge from FW (with the default timeout in BIOS),
> +      //once the Boot On command is completed it is guaranteed that the
> AlpineRidge(AR) device is there and the PCI tunneling was done by FW,
> +      //next step from BIOS is enumeration using SMI
> +      //
> +
> +      if (PeiTbtConfig->DTbtCommonConfig.TbtBootOn > 0) {
> +        //
> +        // Exectue Mail box command "Boot On / Pre-Boot ACL"
> +        //
> +        //Command may be executed only during boot/reboot and not
> during Sx exit flow
> +        if (PeiTbtConfig->DTbtCommonConfig.TbtBootOn == 1) {
> +          if (!TbtSetPcie2TbtCommand(PCIE2TBT_BOOT_ON, 0xF0, 0, 0,
> TBT_5S_TIMEOUT)) {
> +            //
> +            // Nothing to wait, HR is not responsive
> +            //
> +            DEBUG((DEBUG_INFO, "<TbtPei> DTbtBootOn - Boot On
> message sent failed \n"));
> +          }
> +        }
> +        if (PeiTbtConfig->DTbtCommonConfig.TbtBootOn == 2) {
> +          if (!TbtSetPcie2TbtCommand(PCIE2TBT_PREBOOTACL, 0xF0, 0, 0,
> TBT_3S_TIMEOUT)) {
> +            //
> +            // Nothing to wait, HR is not responsive
> +            //
> +            DEBUG((DEBUG_INFO, "<TbtPei> DTbtBootOn - Pre-Boot ACL
> message sent failed \n"));
> +          }
> +        }
> +      }
> +      //
> +      // Reset Sec/Sub buses to original value
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET),
> OrgBusNumberConfiguration);
> +
> +  DEBUG((DEBUG_INFO, "DTbtBootOn call Return\n"));
> +  return Status;
> +}
> +
> +/**
> +  Exectue Mail box command "USB On".
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtUsbOn(
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +  EFI_STATUS                      Status;
> +  UINTN                           RpDev;
> +  UINTN                           RpFunc;
> +  UINT32                          OrgBusNumberConfiguration;
> +  UINT64                          TbtBaseAddress;
> +  UINT32                          MaxWaitIter;
> +  UINT32                          RegVal;
> +  EFI_BOOT_MODE                   BootMode;
> +
> +  DEBUG((DEBUG_INFO, "DTbtUsbOn call Inside\n"));
> +
> +  Status = EFI_SUCCESS;
> +
> +      Status = GetDTbtRpDevFun(PeiTbtConfig-> DTbtControllerConfig.Type,
> PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber - 1, &RpDev, &RpFunc);
> +      ASSERT_EFI_ERROR(Status);
> +      OrgBusNumberConfiguration =
> PciSegmentRead32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev, RpFunc,
> PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET));
> +      //
> +      // Set Sec/Sub buses to 0xF0
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET), 0x00F0F000);
> +
> +      //
> +      //When Thunderbolt(TM) Usb boot [TbtUsbOn] is enabled in bios
> setup we need to do the below:
> +      //Bios should send "Usb On" message through PCIE2TBT register
> +      //The Usb On command as described above would include the
> command and acknowledge from FW (with the default timeout in BIOS),
> +      //once the Usb On command is completed it is guaranteed that the
> AlpineRidge(AR) device is there and the PCI tunneling was done by FW,
> +      //next step from BIOS is enumeration using SMI
> +      //
> +      if (PeiTbtConfig->DTbtCommonConfig.TbtUsbOn) {
> +        if (PeiTbtConfig->DTbtCommonConfig.TbtBootOn > 0) {
> +          MaxWaitIter = 50;   // Wait 5 sec
> +          TbtBaseAddress = PCI_SEGMENT_LIB_ADDRESS(0, 0xF0, 0, 0, 0);
> +          //
> +          // Driver clears the PCIe2TBT Valid bit to support two consicutive
> mailbox commands
> +          //
> +          PciSegmentWrite32(TbtBaseAddress + PCIE2TBT_DTBT_R, 0);
> +          DEBUG((DEBUG_INFO, "TbtBaseAddress + PCIE2TBT_DTBT_R =
> 0x%lx \n", TbtBaseAddress + PCIE2TBT_DTBT_R));
> +          while (MaxWaitIter-- > 0) {
> +            RegVal = PciSegmentRead32(TbtBaseAddress +
> TBT2PCIE_DTBT_R);
> +            if (0xFFFFFFFF == RegVal) {
> +              //
> +              // Device is not here return now
> +              //
> +              DEBUG((DEBUG_INFO, "TBT device is not present \n"));
> +              break;
> +            }
> +
> +            if (!(RegVal & TBT2PCIE_DON_R)) {
> +              break;
> +            }
> +            MicroSecondDelay(100 * 1000);
> +          }
> +        }
> +
> +        Status = PeiServicesGetBootMode(&BootMode);
> +        ASSERT_EFI_ERROR(Status);
> +
> +        //
> +        // Exectue Mail box command "Usb On"
> +        //
> +        //Command may be executed only during boot/reboot and not
> during S3 exit flow
> +        //In case of S4 Exit send USB ON cmd only if Host Router was
> inactive/not present during S4 entry
> +        if ((BootMode == BOOT_ON_S4_RESUME) ) {
> +          // USB_ON cmd not required
> +        } else {
> +          if (!TbtSetPcie2TbtCommand(PCIE2TBT_USB_ON, 0xF0, 0, 0,
> TBT_5S_TIMEOUT)) {
> +            //
> +            // Nothing to wait, HR is not responsive
> +            //
> +            DEBUG((DEBUG_INFO, "<TbtPei> TbtBootSupport - Usb On
> message sent failed \n"));
> +          }
> +        }
> +      }
> +      //
> +      // Reset Sec/Sub buses to original value
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET),
> OrgBusNumberConfiguration);
> +
> +  DEBUG((DEBUG_INFO, "DTbtUsbOn call return\n"));
> +  return Status;
> +}
> +
> +/**
> +  Exectue Mail box command "Sx Exit".
> +
> +  @param[in]  PEI_TBT_POLICY   PeiTbtConfig
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     EFI_UNSUPPORTED  dTBT is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DTbtSxExitFlow(
> +  IN  PEI_TBT_POLICY  *PeiTbtConfig
> +)
> +{
> +  EFI_STATUS                      Status;
> +  UINT32                          OrgBusNumberConfiguration;
> +  UINTN                           RpDev;
> +  UINTN                           RpFunc;
> +  UINT32                          Count;
> +
> +  DEBUG((DEBUG_INFO, "DTbtSxExitFlow call Inside\n"));
> +
> +  Status = EFI_SUCCESS;
> +  Count = 0;
> +
> +      Status = GetDTbtRpDevFun(PeiTbtConfig-> DTbtControllerConfig.Type,
> PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber - 1, &RpDev, &RpFunc);
> +      ASSERT_EFI_ERROR(Status);
> +      OrgBusNumberConfiguration =
> PciSegmentRead32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev, RpFunc,
> PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET));
> +      //
> +      // Set Sec/Sub buses to 0xF0
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET), 0x00F0F000);
> +
> +      if ( (PeiTbtConfig->DTbtCommonConfig.TbtBootOn == 2)) {
> +        //
> +        // WA: When system with TBT 3.1 device, resume SX system need
> to wait device ready. In document that maximum time out should be 500ms.
> +        //
> +        while (PciSegmentRead32(PCI_SEGMENT_LIB_ADDRESS(0, 0xf0,
> 0x0, 0x0, 0x08)) == 0xffffffff) { //End Device will be with Device Number 0x0,
> Function Number 0x0.
> +          MicroSecondDelay(STALL_ONE_MICRO_SECOND * 1000); //
> 1000usec
> +          Count++;
> +          if (Count > 10000) { //Allowing Max Delay of 10 sec for CFL-S
> board.
> +          break;
> +          }
> +        }
> +
> +        //
> +        // Upon wake, if BIOS saved pre-Sx Host Router state as active
> (system went to sleep with
> +        // attached devices), BIOS should:
> +        // 1. Execute "Sx_Exit_TBT_Connected" mailbox command.
> +        // 2. If procedure above returns true, BIOS should perform "wait
> for fast link bring-up" loop
> +        // 3. Continue regular wake flow.
> +        //
> +        //
> +        // Exectue Mail box command and perform "wait for fast link
> bring-up" loop
> +        //
> +        TbtSetSxMode(0xF0, 0, 0,
> PeiTbtConfig->DTbtCommonConfig.TbtBootOn);
> +      }
> +      //
> +      // Reset Sec/Sub buses to original value
> +      //
> +      PciSegmentWrite32(PCI_SEGMENT_LIB_ADDRESS (0, 0, RpDev,
> RpFunc, PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET),
> OrgBusNumberConfiguration);
> +
> +  DEBUG((DEBUG_INFO, "DTbtSxExitFlow call Return\n"));
> +  return Status;
> +}
> +
> +
> +/**
> +  Initialize Thunderbolt(TM)
> +
> +  @retval     EFI_SUCCESS  The function completes successfully
> +  @retval     others
> +**/
> +EFI_STATUS
> +EFIAPI
> +TbtInit (
> +  VOID
> +  )
> +{
> +  EFI_STATUS            Status;
> +  PEI_TBT_POLICY             *PeiTbtConfig;
> +
> +  //
> +  // Get the TBT Policy
> +  //
> +  Status = PeiServicesLocatePpi (
> +             &gPeiTbtPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &PeiTbtConfig
> +             );
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
> +  }
> +  ASSERT_EFI_ERROR (Status);
> +  //
> +  // Exectue Mail box command "Boot On"
> +  //
> +  Status = DTbtBootOn (PeiTbtConfig);
> +  //
> +  // Exectue Mail box command "Usb On"
> +  //
> +  Status = DTbtUsbOn (PeiTbtConfig);
> +  //
> +  //During boot, reboot and wake  (bits [1:0]) of PCH PM_CFG register
> should be
> +  //set to 11b - 10 ms (default value is 0b - 10 us)
> +  //
> +  Status = DTbtSetTPch25Timing (PeiTbtConfig);
> +  //
> +  // Configure Tbt Force Power
> +  //
> +  Status = DTbtForcePower (PeiTbtConfig);
> +  //
> +  // VGA Enable and VGA 16-bit decode registers of Bridge control register of
> Root port where
> +  // Host router resides should be cleaned
> +  //
> +  Status = DTbtClearVgaRegisters (PeiTbtConfig);
> +  //
> +  // Upon wake, if BIOS saved pre-Sx Host Router state as active (system
> went to sleep with
> +  // attached devices), BIOS should:
> +  // 1. Execute "Sx_Exit_TBT_Connected" mailbox command.
> +  // 2. If procedure above returns true, BIOS should perform "wait for fast
> link bring-up" loop
> +  // 3. Continue regular wake flow.
> +  //
> +  Status = DTbtSxExitFlow (PeiTbtConfig);
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiDT
> btInitLib/PeiDTbtInitLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiD
> TbtInitLib/PeiDTbtInitLib.inf
> new file mode 100644
> index 0000000000..3f075e0ec2
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Features/Tbt/Library/Private/PeiD
> TbtInitLib/PeiDTbtInitLib.inf
> @@ -0,0 +1,45 @@
> +## @file
> +# Component description file for PEI DTBT Init library.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = PeiDTbtInitLib
> +  FILE_GUID                      =
> 06768A8D-8152-403f-83C1-59584FD2B438
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = PEIM
> +  LIBRARY_CLASS                  = PeiDTbtInitLib
> +
> +[LibraryClasses]
> +  PeiServicesLib
> +  DebugLib
> +  PcdLib
> +  TbtCommonLib
> +  PciSegmentLib
> +  PeiTbtPolicyLib
> +  PchPmcLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +
> +[Ppis]
> +  gPeiTbtPolicyPpiGuid                          ## CONSUMES
> +
> +[Pcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress  ## CONSUMES
> +  #gClientCommonModuleTokenSpaceGuid.PcdTbtSupport    ##
> PRODUCES
> +
> +[Sources]
> +  PeiDTbtInitLib.c
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspCpuPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspCpuPolicyInitLib.c
> new file mode 100644
> index 0000000000..9c29f93fc2
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspCpuPolicyInitLib.c
> @@ -0,0 +1,460 @@
> +/** @file
> +  Implementation of Fsp CPU Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +
> +#include <Ppi/SiPolicy.h>
> +#include <Ppi/SecPlatformInformation2.h>
> +
> +#include <CpuAccess.h>
> +#include <Library/HobLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeiServicesTablePointerLib.h>
> +#include <Library/PcdLib.h>
> +#include <FspEas.h>
> +
> +/**
> +  Performs FSP CPU PEI Policy initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspCpuPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  SI_PREMEM_POLICY_PPI            *SiPreMemPolicyPpi;
> +  CPU_OVERCLOCKING_PREMEM_CONFIG
> *CpuOverClockingPreMemConfig;
> +  CPU_CONFIG_LIB_PREMEM_CONFIG    *CpuConfigLibPreMemConfig;
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Update SiCpuPolicy Pre-Mem
> Start\n"));
> +
> +  //
> +  // Locate SiPreMemPolicyPpi
> +  //
> +  SiPreMemPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicyPpi
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gCpuOverclockingPreMemConfigGuid, (VOID *)
> &CpuOverClockingPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gCpuConfigLibPreMemConfigGuid, (VOID *) &CpuConfigLibPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  ///
> +  ///
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Update SiCpuPolicy Pre-Mem
> End\n"));
> +
> +  //
> +  // Overclocking PreMem policies
> +  //
> +  FspmUpd->FspmConfig.OcSupport               = (UINT8)
> CpuOverClockingPreMemConfig->OcSupport;
> +  FspmUpd->FspmConfig.OcLock                  = (UINT8)
> CpuOverClockingPreMemConfig->OcLock;
> +  FspmUpd->FspmConfig.CoreMaxOcRatio          = (UINT8)
> CpuOverClockingPreMemConfig->CoreMaxOcRatio;
> +  FspmUpd->FspmConfig.CoreVoltageMode         = (UINT8)
> CpuOverClockingPreMemConfig->CoreVoltageMode;
> +  FspmUpd->FspmConfig.CoreVoltageOverride     = (UINT16)
> CpuOverClockingPreMemConfig->CoreVoltageOverride;
> +  FspmUpd->FspmConfig.CoreVoltageAdaptive     = (UINT16)
> CpuOverClockingPreMemConfig->CoreVoltageAdaptive;
> +  FspmUpd->FspmConfig.CoreVoltageOffset       = (UINT16)
> CpuOverClockingPreMemConfig->CoreVoltageOffset;
> +  FspmUpd->FspmConfig.CorePllVoltageOffset    = (UINT8)
> CpuOverClockingPreMemConfig->CorePllVoltageOffset;
> +  FspmUpd->FspmConfig.RingMaxOcRatio          = (UINT8)
> CpuOverClockingPreMemConfig->RingMaxOcRatio;
> +  FspmUpd->FspmConfig.RingVoltageOverride     = (UINT16)
> CpuOverClockingPreMemConfig->RingVoltageOverride;
> +  FspmUpd->FspmConfig.RingVoltageAdaptive     = (UINT16)
> CpuOverClockingPreMemConfig->RingVoltageAdaptive;
> +  FspmUpd->FspmConfig.RingVoltageOffset       = (UINT16)
> CpuOverClockingPreMemConfig->RingVoltageOffset;
> +  FspmUpd->FspmConfig.RingPllVoltageOffset    = (UINT8)
> CpuOverClockingPreMemConfig->RingPllVoltageOffset;
> +  FspmUpd->FspmConfig.GtPllVoltageOffset      = (UINT8)
> CpuOverClockingPreMemConfig->GtPllVoltageOffset;
> +  FspmUpd->FspmConfig.RingPllVoltageOffset    = (UINT8)
> CpuOverClockingPreMemConfig->RingPllVoltageOffset;
> +  FspmUpd->FspmConfig.SaPllVoltageOffset      = (UINT8)
> CpuOverClockingPreMemConfig->SaPllVoltageOffset;
> +  FspmUpd->FspmConfig.McPllVoltageOffset      = (UINT8)
> CpuOverClockingPreMemConfig->McPllVoltageOffset;
> +  FspmUpd->FspmConfig.RingDownBin             = (UINT8)
> CpuOverClockingPreMemConfig->RingDownBin;
> +  FspmUpd->FspmConfig.RingVoltageMode         = (UINT8)
> CpuOverClockingPreMemConfig->RingVoltageMode;
> +  FspmUpd->FspmConfig.Avx2RatioOffset         = (UINT8)
> CpuOverClockingPreMemConfig->Avx2RatioOffset;
> +  FspmUpd->FspmConfig.Avx3RatioOffset         = (UINT8)
> CpuOverClockingPreMemConfig->Avx3RatioOffset;
> +  FspmUpd->FspmConfig.BclkAdaptiveVoltage     = (UINT8)
> CpuOverClockingPreMemConfig->BclkAdaptiveVoltage;
> +  FspmUpd->FspmConfig.TjMaxOffset             = (UINT8)
> CpuOverClockingPreMemConfig->TjMaxOffset;
> +  FspmUpd->FspmConfig.TvbRatioClipping        = (UINT8)
> CpuOverClockingPreMemConfig->TvbRatioClipping;
> +  FspmUpd->FspmConfig.TvbVoltageOptimization  = (UINT8)
> CpuOverClockingPreMemConfig->TvbVoltageOptimization;
> +
> +  //
> +  //  Cpu Config Lib policies
> +  //
> +  FspmUpd->FspmConfig.HyperThreading            = (UINT8)
> CpuConfigLibPreMemConfig->HyperThreading;
> +  FspmUpd->FspmConfig.BootFrequency             = (UINT8)
> CpuConfigLibPreMemConfig->BootFrequency;
> +  FspmUpd->FspmConfig.ActiveCoreCount           = (UINT8)
> CpuConfigLibPreMemConfig->ActiveCoreCount;
> +  FspmUpd->FspmConfig.JtagC10PowerGateDisable   = (UINT8)
> CpuConfigLibPreMemConfig->JtagC10PowerGateDisable;
> +  FspmUpd->FspmConfig.FClkFrequency             = (UINT8)
> CpuConfigLibPreMemConfig->FClkFrequency;
> +  FspmUpd->FspmConfig.BistOnReset               = (UINT8)
> CpuConfigLibPreMemConfig->BistOnReset;
> +  FspmUpd->FspmConfig.VmxEnable                 = (UINT8)
> CpuConfigLibPreMemConfig->VmxEnable;
> +  FspmUpd->FspmConfig.CpuRatio                  = (UINT8)
> CpuConfigLibPreMemConfig->CpuRatio;
> +  FspmUpd->FspmConfig.PeciSxReset               = (UINT8)
> CpuConfigLibPreMemConfig->PeciSxReset;
> +  FspmUpd->FspmConfig.PeciC10Reset              = (UINT8)
> CpuConfigLibPreMemConfig->PeciC10Reset;
> +  FspmUpd->FspmConfig.SkipMpInit                = (UINT8)
> CpuConfigLibPreMemConfig->SkipMpInit;
> +
> +  //
> +  // DisableMtrrProgram <1> Disable Mtrrs program. <0> Program Mtrrs in
> FSP
> +  //
> +  FspmUpd->FspmConfig.DisableMtrrProgram        = (UINT8) 0;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> + This routine is used to get Sec Platform Information Record2 Pointer.
> +
> + @param[in] PeiServices    Pointer to the PEI services table
> +
> + @retval GetSecPlatformInformation2 - The pointer of Sec Platform
> Information Record2 Pointer.
> + **/
> +
> +EFI_SEC_PLATFORM_INFORMATION_RECORD2 *
> GetSecPlatformInformation2(
> +  IN EFI_PEI_SERVICES **PeiServices
> +  )
> +{
> +  EFI_SEC_PLATFORM_INFORMATION2_PPI
> *SecPlatformInformation2Ppi;
> +  EFI_SEC_PLATFORM_INFORMATION_RECORD2 *SecPlatformInformation2
> = NULL;
> +  UINT64                               InformationSize;
> +  EFI_STATUS Status;
> +
> +  //
> +  // Get BIST information from Sec Platform Information2 Ppi firstly
> +  //
> +  Status = PeiServicesLocatePpi (
> +             &gEfiSecPlatformInformation2PpiGuid,   // GUID
> +             0,                                     // Instance
> +             NULL,                                  //
> EFI_PEI_PPI_DESCRIPTOR
> +             (VOID ** ) &SecPlatformInformation2Ppi // PPI
> +             );
> +
> +  DEBUG((DEBUG_INFO, "LocatePpi SecPlatformInformationPpi2 Status -
> %x\n", Status));
> +  if (EFI_ERROR(Status)) {
> +    return NULL;
> +  }
> +
> +  InformationSize = 0;
> +
> +  Status = SecPlatformInformation2Ppi->PlatformInformation2 (
> +                                         (CONST EFI_PEI_SERVICES
> **) PeiServices,
> +                                         &InformationSize,
> +                                         SecPlatformInformation2
> +                                         );
> +
> +  ASSERT (Status == EFI_BUFFER_TOO_SMALL);
> +  if (Status != EFI_BUFFER_TOO_SMALL) {
> +    return NULL;
> +  }
> +
> +  SecPlatformInformation2 = AllocatePool((UINTN)InformationSize);
> +  ASSERT (SecPlatformInformation2 != NULL);
> +  if (SecPlatformInformation2 == NULL) {
> +    return NULL;
> +  }
> +
> +  //
> +  // Retrieve BIST data from SecPlatform2
> +  //
> +  Status = SecPlatformInformation2Ppi->PlatformInformation2 (
> +                                         (CONST EFI_PEI_SERVICES
> **) PeiServices,
> +                                         &InformationSize,
> +                                         SecPlatformInformation2
> +                                         );
> +  DEBUG((DEBUG_INFO,
> "SecPlatformInformation2Ppi->PlatformInformation2 Status - %x\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    return NULL;
> +  }
> +
> +  return SecPlatformInformation2;
> +}
> +
> +/**
> + This routine is used to get Sec Platform Information Record Pointer.
> +
> + @param[in] PeiServices    Pointer to the PEI services table
> +
> + @retval GetSecPlatformInformation2 - The pointer of Sec Platform
> Information Record Pointer.
> + **/
> +EFI_SEC_PLATFORM_INFORMATION_RECORD2 *
> GetSecPlatformInformationInfoInFormat2(
> +  IN EFI_PEI_SERVICES **PeiServices
> +  )
> +{
> +  EFI_SEC_PLATFORM_INFORMATION_PPI
> *SecPlatformInformationPpi;
> +  EFI_SEC_PLATFORM_INFORMATION_RECORD  *SecPlatformInformation =
> NULL;
> +  EFI_SEC_PLATFORM_INFORMATION_RECORD2 *SecPlatformInformation2;
> +  UINT64                               InformationSize;
> +  EFI_STATUS                           Status;
> +
> +  //
> +  // Get BIST information from Sec Platform Information
> +  //
> +  Status = PeiServicesLocatePpi (
> +             &gEfiSecPlatformInformationPpiGuid,    // GUID
> +             0,                                     // Instance
> +             NULL,                                  //
> EFI_PEI_PPI_DESCRIPTOR
> +             (VOID ** ) &SecPlatformInformationPpi  // PPI
> +             );
> +
> +  DEBUG((DEBUG_INFO, "LocatePpi SecPlatformInformationPpi Status -
> %x\n", Status));
> +  if (EFI_ERROR(Status)) {
> +    return NULL;
> +  }
> +
> +  InformationSize = 0;
> +  Status = SecPlatformInformationPpi->PlatformInformation (
> +                                        (CONST EFI_PEI_SERVICES
> **) PeiServices,
> +                                        &InformationSize,
> +                                        SecPlatformInformation
> +                                        );
> +
> +  ASSERT (Status == EFI_BUFFER_TOO_SMALL);
> +  if (Status != EFI_BUFFER_TOO_SMALL) {
> +    return NULL;
> +  }
> +
> +  SecPlatformInformation = AllocatePool((UINTN)InformationSize);
> +  ASSERT (SecPlatformInformation != NULL);
> +  if (SecPlatformInformation == NULL) {
> +    return NULL;
> +  }
> +
> +  //
> +  // Retrieve BIST data from SecPlatform
> +  //
> +  Status = SecPlatformInformationPpi->PlatformInformation (
> +                                        (CONST EFI_PEI_SERVICES
> **) PeiServices,
> +                                        &InformationSize,
> +                                        SecPlatformInformation
> +                                        );
> +  DEBUG((DEBUG_INFO, "FSP
> SecPlatformInformation2Ppi->PlatformInformation Status - %x\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    return NULL;
> +  }
> +
> +  SecPlatformInformation2 = AllocatePool(sizeof
> (EFI_SEC_PLATFORM_INFORMATION_RECORD2));
> +  ASSERT (SecPlatformInformation2 != NULL);
> +  if (SecPlatformInformation2 == NULL) {
> +    return NULL;
> +  }
> +
> +  SecPlatformInformation2->NumberOfCpus = 1;
> +  SecPlatformInformation2->CpuInstance[0].CpuLocation = 0;
> +
> SecPlatformInformation2->CpuInstance[0].InfoRecord.x64HealthFlags.Uint32
> = SecPlatformInformation->x64HealthFlags.Uint32;
> +
> +  FreePool(SecPlatformInformation);
> +
> +  return SecPlatformInformation2;
> +}
> +
> +
> +/**
> + Performs FSP CPU PEI Policy post memory initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspCpuPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS                           Status;
> +  SI_POLICY_PPI                        *SiPolicyPpi;
> +  CPU_CONFIG                           *CpuConfig;
> +  CPU_POWER_MGMT_BASIC_CONFIG
> *CpuPowerMgmtBasicConfig;
> +  CPU_POWER_MGMT_CUSTOM_CONFIG
> *CpuPowerMgmtCustomConfig;
> +  CPU_TEST_CONFIG                      *CpuTestConfig;
> +  CPU_POWER_MGMT_TEST_CONFIG
> *CpuPowerMgmtTestConfig;
> +  UINTN                                Index;
> +  EFI_SEC_PLATFORM_INFORMATION_RECORD2 *SecPlatformInformation2;
> +  EFI_PEI_SERVICES                     **PeiServices;
> +
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Update SiCpuPolicy\n"));
> +  PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
> +  //
> +  // Locate gSiPolicyPpiGuid
> +  //
> +  SiPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPolicyPpi
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuConfigGuid, (VOID *)
> &CpuConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi,
> &gCpuPowerMgmtBasicConfigGuid, (VOID *) &CpuPowerMgmtBasicConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi,
> &gCpuPowerMgmtCustomConfigGuid, (VOID *)
> &CpuPowerMgmtCustomConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuTestConfigGuid, (VOID
> *) &CpuTestConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi,
> &gCpuPowerMgmtTestConfigGuid, (VOID *) &CpuPowerMgmtTestConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  ///
> +  ///Production RC Policies
> +  ///
> +
> +  FspsUpd->FspsConfig.AesEnable                 = (UINT8)
> CpuConfig->AesEnable;
> +  FspsUpd->FspsConfig.DebugInterfaceEnable      = (UINT8)
> CpuConfig->DebugInterfaceEnable;
> +
> +  FspsUpd->FspsConfig.TurboMode                 = (UINT8)
> CpuPowerMgmtBasicConfig->TurboMode;
> +
> +  ///
> +  /// Test RC Policies
> +  ///
> +  FspsUpd->FspsTestConfig.MlcStreamerPrefetcher      = (UINT8)
> CpuTestConfig->MlcStreamerPrefetcher;
> +  FspsUpd->FspsTestConfig.MlcSpatialPrefetcher       = (UINT8)
> CpuTestConfig->MlcSpatialPrefetcher;
> +  FspsUpd->FspsTestConfig.MonitorMwaitEnable         = (UINT8)
> CpuTestConfig->MonitorMwaitEnable;
> +  FspsUpd->FspsTestConfig.DebugInterfaceLockEnable   = (UINT8)
> CpuTestConfig->DebugInterfaceLockEnable;
> +  FspsUpd->FspsTestConfig.ApIdleManner               = PcdGet8
> (PcdCpuApLoopMode);
> +  FspsUpd->FspsTestConfig.ProcessorTraceOutputScheme = (UINT8)
> CpuTestConfig->ProcessorTraceOutputScheme;
> +  FspsUpd->FspsTestConfig.ProcessorTraceEnable       = (UINT8)
> CpuTestConfig->ProcessorTraceEnable;
> +  FspsUpd->FspsTestConfig.ProcessorTraceMemBase      =
> CpuTestConfig->ProcessorTraceMemBase;
> +  FspsUpd->FspsTestConfig.ProcessorTraceMemLength    = (UINT32)
> CpuTestConfig->ProcessorTraceMemLength;
> +  FspsUpd->FspsTestConfig.VoltageOptimization        = (UINT8)
> CpuTestConfig->VoltageOptimization;
> +  FspsUpd->FspsTestConfig.ThreeStrikeCounterDisable  = (UINT8)
> CpuTestConfig->ThreeStrikeCounterDisable;
> +  FspsUpd->FspsTestConfig.MachineCheckEnable         = (UINT8)
> CpuTestConfig->MachineCheckEnable;
> +  FspsUpd->FspsTestConfig.CpuWakeUpTimer             = (UINT8)
> CpuTestConfig->CpuWakeUpTimer;
> +
> +  FspsUpd->FspsTestConfig.OneCoreRatioLimit          = (UINT8)
> CpuPowerMgmtBasicConfig->OneCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.TwoCoreRatioLimit          = (UINT8)
> CpuPowerMgmtBasicConfig->TwoCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.ThreeCoreRatioLimit        = (UINT8)
> CpuPowerMgmtBasicConfig->ThreeCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.FourCoreRatioLimit         = (UINT8)
> CpuPowerMgmtBasicConfig->FourCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.FiveCoreRatioLimit         = (UINT8)
> CpuPowerMgmtBasicConfig->FiveCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.SixCoreRatioLimit          = (UINT8)
> CpuPowerMgmtBasicConfig->SixCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.SevenCoreRatioLimit        = (UINT8)
> CpuPowerMgmtBasicConfig->SevenCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.EightCoreRatioLimit        = (UINT8)
> CpuPowerMgmtBasicConfig->EightCoreRatioLimit;
> +  FspsUpd->FspsTestConfig.Hwp                        = (UINT8)
> CpuPowerMgmtBasicConfig->Hwp;
> +  FspsUpd->FspsTestConfig.HdcControl                 = (UINT8)
> CpuPowerMgmtBasicConfig->HdcControl;
> +  FspsUpd->FspsTestConfig.PowerLimit1Time            = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit1Time;
> +  FspsUpd->FspsTestConfig.PowerLimit2                = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit2;
> +  FspsUpd->FspsTestConfig.TurboPowerLimitLock        = (UINT8)
> CpuPowerMgmtBasicConfig->TurboPowerLimitLock;
> +  FspsUpd->FspsTestConfig.PowerLimit3Time            = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit3Time;
> +  FspsUpd->FspsTestConfig.PowerLimit3DutyCycle       = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit3DutyCycle;
> +  FspsUpd->FspsTestConfig.PowerLimit3Lock            = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit3Lock;
> +  FspsUpd->FspsTestConfig.PowerLimit4Lock            = (UINT8)
> CpuPowerMgmtBasicConfig->PowerLimit4Lock;
> +  FspsUpd->FspsTestConfig.TccActivationOffset        = (UINT8)
> CpuPowerMgmtBasicConfig->TccActivationOffset;
> +  FspsUpd->FspsTestConfig.TccOffsetClamp             = (UINT8)
> CpuPowerMgmtBasicConfig->TccOffsetClamp;
> +  FspsUpd->FspsTestConfig.TccOffsetLock              = (UINT8)
> CpuPowerMgmtBasicConfig->TccOffsetLock;
> +  FspsUpd->FspsTestConfig.PowerLimit1                = (UINT32)
> (CpuPowerMgmtBasicConfig->PowerLimit1 * 125);
> +  FspsUpd->FspsTestConfig.PowerLimit2Power           = (UINT32)
> (CpuPowerMgmtBasicConfig->PowerLimit2Power * 125);
> +  FspsUpd->FspsTestConfig.PowerLimit3                = (UINT32)
> (CpuPowerMgmtBasicConfig->PowerLimit3 * 125);
> +  FspsUpd->FspsTestConfig.PowerLimit4                = (UINT32)
> (CpuPowerMgmtBasicConfig->PowerLimit4 * 125);
> +  FspsUpd->FspsTestConfig.TccOffsetTimeWindowForRatl = (UINT32)
> CpuPowerMgmtBasicConfig->TccOffsetTimeWindowForRatl;
> +  FspsUpd->FspsTestConfig.HwpInterruptControl        = (UINT8)
> CpuPowerMgmtBasicConfig->HwpInterruptControl;
> +  FspsUpd->FspsTestConfig.EnableItbm                 = (UINT8)
> CpuPowerMgmtBasicConfig->EnableItbm;
> +  FspsUpd->FspsTestConfig.EnableItbmDriver           = (UINT8)
> CpuPowerMgmtBasicConfig->EnableItbmDriver;
> +  FspsUpd->FspsTestConfig.MinRingRatioLimit          = (UINT8)
> CpuPowerMgmtBasicConfig->MinRingRatioLimit;
> +  FspsUpd->FspsTestConfig.MaxRingRatioLimit          = (UINT8)
> CpuPowerMgmtBasicConfig->MaxRingRatioLimit;
> +  FspsUpd->FspsTestConfig.NumberOfEntries             = (UINT8)
> CpuPowerMgmtCustomConfig->CustomRatioTable.NumberOfEntries;
> +  FspsUpd->FspsTestConfig.Custom1PowerLimit1Time      = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[0].CustomPowerLimit
> 1Time;
> +  FspsUpd->FspsTestConfig.Custom2PowerLimit1Time      = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[1].CustomPowerLimit
> 1Time;
> +  FspsUpd->FspsTestConfig.Custom3PowerLimit1Time      = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[2].CustomPowerLimit
> 1Time;
> +  FspsUpd->FspsTestConfig.Custom1TurboActivationRatio = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[0].CustomTurboActiva
> tionRatio;
> +  FspsUpd->FspsTestConfig.Custom2TurboActivationRatio = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[1].CustomTurboActiva
> tionRatio;
> +  FspsUpd->FspsTestConfig.Custom3TurboActivationRatio = (UINT8)
> CpuPowerMgmtCustomConfig->CustomConfigTdpTable[2].CustomTurboActiva
> tionRatio;
> +  FspsUpd->FspsTestConfig.ConfigTdpLock               = (UINT8)
> CpuPowerMgmtCustomConfig->ConfigTdpLock;
> +  FspsUpd->FspsTestConfig.ConfigTdpBios               = (UINT8)
> CpuPowerMgmtCustomConfig->ConfigTdpBios;
> +  FspsUpd->FspsTestConfig.MaxRatio                    = (UINT8)
> CpuPowerMgmtCustomConfig->CustomRatioTable.MaxRatio;
> +  for (Index = 0; Index <
> CpuPowerMgmtCustomConfig->CustomRatioTable.NumberOfEntries; Index++)
> {
> +    FspsUpd->FspsTestConfig.StateRatio[Index]         = (UINT8)
> CpuPowerMgmtCustomConfig->CustomRatioTable.StateRatio[Index];
> +  }
> +  for (Index = 0; Index < MAX_16_CUSTOM_RATIO_TABLE_ENTRIES; Index++)
> {
> +    FspsUpd->FspsTestConfig.StateRatioMax16[Index]    = (UINT8)
> CpuPowerMgmtCustomConfig->CustomRatioTable.StateRatioMax16[Index];
> +  }
> +  FspsUpd->FspsTestConfig.Custom1PowerLimit1          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[0].CustomPowerLimi
> t1 * 125);
> +  FspsUpd->FspsTestConfig.Custom1PowerLimit2          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[0].CustomPowerLimi
> t2 * 125);
> +  FspsUpd->FspsTestConfig.Custom2PowerLimit1          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[1].CustomPowerLimi
> t1 * 125);
> +  FspsUpd->FspsTestConfig.Custom2PowerLimit2          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[1].CustomPowerLimi
> t2 * 125);
> +  FspsUpd->FspsTestConfig.Custom3PowerLimit1          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[2].CustomPowerLimi
> t1 * 125);
> +  FspsUpd->FspsTestConfig.Custom3PowerLimit2          = (UINT32)
> (CpuPowerMgmtCustomConfig->CustomConfigTdpTable[2].CustomPowerLimi
> t2 * 125);
> +
> +  FspsUpd->FspsTestConfig.Eist                          = (UINT8)
> CpuPowerMgmtTestConfig->Eist;
> +  FspsUpd->FspsTestConfig.EnergyEfficientPState         = (UINT8)
> CpuPowerMgmtTestConfig->EnergyEfficientPState;
> +  FspsUpd->FspsTestConfig.EnergyEfficientTurbo          = (UINT8)
> CpuPowerMgmtTestConfig->EnergyEfficientTurbo;
> +  FspsUpd->FspsTestConfig.TStates                       = (UINT8)
> CpuPowerMgmtTestConfig->TStates;
> +  FspsUpd->FspsTestConfig.BiProcHot                     = (UINT8)
> CpuPowerMgmtTestConfig->BiProcHot;
> +  FspsUpd->FspsTestConfig.DisableProcHotOut             = (UINT8)
> CpuPowerMgmtTestConfig->DisableProcHotOut;
> +  FspsUpd->FspsTestConfig.ProcHotResponse               = (UINT8)
> CpuPowerMgmtTestConfig->ProcHotResponse;
> +  FspsUpd->FspsTestConfig.DisableVrThermalAlert         = (UINT8)
> CpuPowerMgmtTestConfig->DisableVrThermalAlert;
> +  FspsUpd->FspsTestConfig.AutoThermalReporting          = (UINT8)
> CpuPowerMgmtTestConfig->AutoThermalReporting;
> +  FspsUpd->FspsTestConfig.ThermalMonitor                = (UINT8)
> CpuPowerMgmtTestConfig->ThermalMonitor;
> +  FspsUpd->FspsTestConfig.Cx                            = (UINT8)
> CpuPowerMgmtTestConfig->Cx;
> +  FspsUpd->FspsTestConfig.PmgCstCfgCtrlLock             = (UINT8)
> CpuPowerMgmtTestConfig->PmgCstCfgCtrlLock;
> +  FspsUpd->FspsTestConfig.C1e                           = (UINT8)
> CpuPowerMgmtTestConfig->C1e;
> +  FspsUpd->FspsTestConfig.C1StateAutoDemotion           = (UINT8)
> CpuPowerMgmtTestConfig->C1AutoDemotion;
> +  FspsUpd->FspsTestConfig.C1StateUnDemotion             = (UINT8)
> CpuPowerMgmtTestConfig->C1UnDemotion;
> +  FspsUpd->FspsTestConfig.C3StateAutoDemotion           = (UINT8)
> CpuPowerMgmtTestConfig->C3AutoDemotion;
> +  FspsUpd->FspsTestConfig.C3StateUnDemotion             = (UINT8)
> CpuPowerMgmtTestConfig->C3UnDemotion;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl0TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl0TimeUnit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl0Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl0Irtl;
> +  FspsUpd->FspsTestConfig.PkgCStateDemotion             = (UINT8)
> CpuPowerMgmtTestConfig->PkgCStateDemotion;
> +  FspsUpd->FspsTestConfig.PkgCStateUnDemotion           = (UINT8)
> CpuPowerMgmtTestConfig->PkgCStateUnDemotion;
> +  FspsUpd->FspsTestConfig.CStatePreWake                 = (UINT8)
> CpuPowerMgmtTestConfig->CStatePreWake;
> +  FspsUpd->FspsTestConfig.TimedMwait                    = (UINT8)
> CpuPowerMgmtTestConfig->TimedMwait;
> +  FspsUpd->FspsTestConfig.CstCfgCtrIoMwaitRedirection   = (UINT8)
> CpuPowerMgmtTestConfig->CstCfgCtrIoMwaitRedirection;
> +  FspsUpd->FspsTestConfig.PkgCStateLimit                = (UINT8)
> CpuPowerMgmtTestConfig->PkgCStateLimit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl1TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl1TimeUnit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl2TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl2TimeUnit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl3TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl3TimeUnit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl4TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl4TimeUnit;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl5TimeUnit = (UINT8)
> CpuPowerMgmtTestConfig->CstateLatencyControl5TimeUnit;
> +  FspsUpd->FspsTestConfig.PpmIrmSetting                 = (UINT8)
> CpuPowerMgmtTestConfig->PpmIrmSetting;
> +  FspsUpd->FspsTestConfig.ProcHotLock                   = (UINT8)
> CpuPowerMgmtTestConfig->ProcHotLock;
> +  FspsUpd->FspsTestConfig.RaceToHalt                    = (UINT8)
> CpuPowerMgmtTestConfig->RaceToHalt;
> +  FspsUpd->FspsTestConfig.ConfigTdpLevel                = (UINT8)
> CpuPowerMgmtTestConfig->ConfigTdpLevel;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl1Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl1Irtl;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl2Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl2Irtl;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl3Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl3Irtl;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl4Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl4Irtl;
> +  FspsUpd->FspsTestConfig.CstateLatencyControl5Irtl     = (UINT16)
> CpuPowerMgmtTestConfig->CstateLatencyControl5Irtl;
> +
> +  //
> +  // Get BIST information from Sec Platform Information
> +  //
> +  SecPlatformInformation2 = GetSecPlatformInformation2 (PeiServices);
> +  if (SecPlatformInformation2 == NULL) {
> +    SecPlatformInformation2 = GetSecPlatformInformationInfoInFormat2
> (PeiServices);
> +  }
> +
> +  ASSERT (SecPlatformInformation2 != NULL);
> +
> +  if (SecPlatformInformation2 != NULL) {
> +    FspsUpd->FspsConfig.CpuBistData = (UINT32)SecPlatformInformation2;
> +    DEBUG((DEBUG_INFO, "SecPlatformInformation NumberOfCpus -
> %x\n", SecPlatformInformation2->NumberOfCpus));
> +    DEBUG ((DEBUG_INFO, "SecPlatformInformation BIST - %x\n",
> SecPlatformInformation2->CpuInstance[0].InfoRecord.x64HealthFlags.Uint32))
> ;
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMePolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMePolicyInitLib.c
> new file mode 100644
> index 0000000000..66e7710595
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMePolicyInitLib.c
> @@ -0,0 +1,121 @@
> +/** @file
> +  Implementation of Fsp Me Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +#include <ConfigBlock/MePeiConfig.h>
> +#include <Ppi/SiPolicy.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Performs FSP ME PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMePolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                Status;
> +  SI_PREMEM_POLICY_PPI      *SiPreMemPolicy;
> +  ME_PEI_PREMEM_CONFIG      *MePeiPreMemConfig;
> +
> +  DEBUG ((DEBUG_INFO, "PeiFspMePolicyInitPreMem\n"));
> +
> +  //
> +  // Locate gSiPreMemPolicyPpi
> +  //
> +  SiPreMemPolicy = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicy
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gMePeiPreMemConfigGuid, (VOID *) &MePeiPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  FspmUpd->FspmConfig.HeciTimeouts                      = (UINT8)
> MePeiPreMemConfig->HeciTimeouts;
> +  //
> +  // Test policies
> +  //
> +  FspmUpd->FspmTestConfig.DidInitStat                   = (UINT8)
> MePeiPreMemConfig->DidInitStat;
> +  FspmUpd->FspmTestConfig.DisableCpuReplacedPolling     = (UINT8)
> MePeiPreMemConfig->DisableCpuReplacedPolling;
> +  FspmUpd->FspmTestConfig.SendDidMsg                    = (UINT8)
> MePeiPreMemConfig->SendDidMsg;
> +  FspmUpd->FspmTestConfig.DisableMessageCheck           = (UINT8)
> MePeiPreMemConfig->DisableMessageCheck;
> +  FspmUpd->FspmTestConfig.SkipMbpHob                    = (UINT8)
> MePeiPreMemConfig->SkipMbpHob;
> +
> +  FspmUpd->FspmTestConfig.HeciCommunication2            = (UINT8)
> MePeiPreMemConfig->HeciCommunication2;
> +  FspmUpd->FspmTestConfig.KtDeviceEnable                = (UINT8)
> MePeiPreMemConfig->KtDeviceEnable;
> +
> +  FspmUpd->FspmConfig.Heci1BarAddress                   =
> MePeiPreMemConfig->Heci1BarAddress;
> +  FspmUpd->FspmConfig.Heci2BarAddress                   =
> MePeiPreMemConfig->Heci2BarAddress;
> +  FspmUpd->FspmConfig.Heci3BarAddress                   =
> MePeiPreMemConfig->Heci3BarAddress;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP ME PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMePolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS                Status;
> +  SI_POLICY_PPI             *SiPolicyPpi;
> +  ME_PEI_CONFIG             *MePeiConfig;
> +
> +  DEBUG ((DEBUG_INFO, "PeiFspMePolicyInit \n"));
> +  //
> +  // Locate gSiPolicyPpiGuid
> +  //
> +  SiPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPolicyPpi
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gMePeiConfigGuid, (VOID
> *) &MePeiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  FspsUpd->FspsConfig.Heci3Enabled                  = (UINT8)
> MePeiConfig->Heci3Enabled;
> +  FspsUpd->FspsConfig.MeUnconfigOnRtcClear          = (UINT8)
> MePeiConfig->MeUnconfigOnRtcClear;
> +
> +  //
> +  // Test policies
> +  //
> +  FspsUpd->FspsTestConfig.MctpBroadcastCycle        = (UINT8)
> MePeiConfig->MctpBroadcastCycle;
> +  FspsUpd->FspsTestConfig.EndOfPostMessage          = (UINT8)
> MePeiConfig->EndOfPostMessage;
> +  FspsUpd->FspsTestConfig.DisableD0I3SettingForHeci = (UINT8)
> MePeiConfig->DisableD0I3SettingForHeci;
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMiscUpdInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMiscUpdInitLib.c
> new file mode 100644
> index 0000000000..ee2558e9d3
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspMiscUpdInitLib.c
> @@ -0,0 +1,77 @@
> +/** @file
> +  Implementation of Fsp Misc UPD Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/HobLib.h>
> +
> +#define STATUS_CODE_USE_RAM        BIT0
> +#define STATUS_CODE_USE_ISA_SERIAL BIT1
> +#define STATUS_CODE_USE_USB        BIT2
> +#define STATUS_CODE_USE_USB3       BIT3
> +#define STATUS_CODE_USE_SERIALIO   BIT4
> +#define STATUS_CODE_USE_TRACEHUB   BIT5
> +#define STATUS_CODE_CMOS_INVALID   BIT6
> +#define STATUS_CODE_CMOS_VALID     BIT7
> +/**
> +  Performs FSP Misc UPD initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSPM_UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMiscUpdInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                        Status;
> +  EFI_PEI_HOB_POINTERS              Hob;
> +  DEBUG_CONFIG_DATA_HOB             *DebugConfigData;
> +  UINT8                             DebugInterfaces;
> +
> +  FspmUpd->FspmArchUpd.StackBase = (VOID
> *)(UINTN)(PcdGet32(PcdTemporaryRamBase) +
> PcdGet32(PcdTemporaryRamSize) - (PcdGet32(PcdFspTemporaryRamSize) +
> PcdGet32(PcdFspReservedBufferSize)));
> +  FspmUpd->FspmArchUpd.StackSize =
> PcdGet32(PcdFspTemporaryRamSize);
> +
> +  Status = PeiServicesGetBootMode
> (&(FspmUpd->FspmArchUpd.BootMode));
> +  if (EFI_ERROR (Status)) {
> +    FspmUpd->FspmArchUpd.BootMode =
> BOOT_WITH_FULL_CONFIGURATION;
> +  }
> +
> +  FspmUpd->FspmArchUpd.BootLoaderTolumSize = 0x0;
> +
> +  //
> +  // Initialize DebugConfigData
> +  //
> +  DebugInterfaces = 0x00;
> +  Hob.Guid = GetFirstGuidHob (&gDebugConfigHobGuid);
> +  if (Hob.Guid != NULL) {
> +    DebugConfigData = (DEBUG_CONFIG_DATA_HOB *)
> GET_GUID_HOB_DATA (Hob.Guid);
> +    if (DebugConfigData != NULL) {
> +      // Debug Interfaces
> +      if (DebugConfigData->RamDebugInterface)      { DebugInterfaces
> |= STATUS_CODE_USE_RAM; }
> +      if (DebugConfigData->UartDebugInterface)     { DebugInterfaces |=
> STATUS_CODE_USE_ISA_SERIAL; }
> +      if (DebugConfigData->Usb3DebugInterface)     { DebugInterfaces
> |= STATUS_CODE_USE_USB3; }
> +      if (DebugConfigData->SerialIoDebugInterface) { DebugInterfaces |=
> STATUS_CODE_USE_SERIALIO; }
> +      if (DebugConfigData->TraceHubDebugInterface) { DebugInterfaces |=
> STATUS_CODE_USE_TRACEHUB; }
> +      FspmUpd->FspmConfig.PcdDebugInterfaceFlags  = DebugInterfaces;
> +      // Serial debug message baud rate
> +      FspmUpd->FspmConfig.PcdSerialDebugBaudRate  =
> DebugConfigData->SerialDebugBaudRate;
> +      //Serial debug message level
> +      FspmUpd->FspmConfig.PcdSerialDebugLevel     =
> DebugConfigData->SerialDebug;
> +    }
> +  }
> +  DEBUG ((DEBUG_INFO, "FspmConfig.PcdDebugInterfaceFlags is 0x%X\n",
> FspmUpd->FspmConfig.PcdDebugInterfaceFlags));
> +  DEBUG ((DEBUG_INFO, "FspmUpd->FspmConfig.PcdSerialDebugBaudRate
> is 0x%X\n", FspmUpd->FspmConfig.PcdSerialDebugBaudRate));
> +  DEBUG ((DEBUG_INFO, "FspmUpd->FspmConfig.PcdSerialDebugLevel is
> 0x%X\n", FspmUpd->FspmConfig.PcdSerialDebugLevel));
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPchPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPchPolicyInitLib.c
> new file mode 100644
> index 0000000000..65ec61f5ac
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPchPolicyInitLib.c
> @@ -0,0 +1,743 @@
> +/** @file
> +  Implementation of Fsp PCH Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +
> +#include <Ppi/SiPolicy.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Performs FSP PCH PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                       Status;
> +  UINTN                            Index;
> +  UINTN                            MaxPcieRootPorts;
> +  SI_PREMEM_POLICY_PPI             *SiPreMemPolicy;
> +  PCH_TRACE_HUB_PREMEM_CONFIG      *PchTraceHubPreMemConfig;
> +  PCH_SMBUS_PREMEM_CONFIG          *SmbusPreMemConfig;
> +  PCH_DCI_PREMEM_CONFIG            *DciPreMemConfig;
> +  PCH_HSIO_PCIE_PREMEM_CONFIG      *HsioPciePreMemConfig;
> +  PCH_HSIO_SATA_PREMEM_CONFIG      *HsioSataPreMemConfig;
> +  PCH_PCIE_RP_PREMEM_CONFIG        *PcieRpPreMemConfig;
> +  PCH_LPC_PREMEM_CONFIG            *LpcPreMemConfig;
> +  PCH_GENERAL_PREMEM_CONFIG        *PchGeneralPreMemConfig;
> +  PCH_WDT_PREMEM_CONFIG            *WdtPreMemConfig;
> +  PCH_HDAUDIO_PREMEM_CONFIG        *HdaPreMemConfig;
> +  PCH_ISH_PREMEM_CONFIG            *IshPreMemConfig;
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP
> UpdatePeiPchPolicyPreMem\n"));
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "FspmUpd = 0x%x\n", FspmUpd));
> +  //
> +  // Locate PchPreMemPolicyPpi
> +  //
> +  SiPreMemPolicy = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicy
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPchTraceHubPreMemConfigGuid, (VOID *) &PchTraceHubPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gSmbusPreMemConfigGuid, (VOID *) &SmbusPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gDciPreMemConfigGuid, (VOID *) &DciPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gHsioPciePreMemConfigGuid, (VOID *) &HsioPciePreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gHsioSataPreMemConfigGuid, (VOID *) &HsioSataPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gLpcPreMemConfigGuid, (VOID *) &LpcPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPchGeneralPreMemConfigGuid, (VOID *) &PchGeneralPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gWatchDogPreMemConfigGuid, (VOID *) &WdtPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPcieRpPreMemConfigGuid, (VOID *) &PcieRpPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gHdAudioPreMemConfigGuid, (VOID *) &HdaPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gIshPreMemConfigGuid, (VOID *) &IshPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "WYQ
> UpdatePeiPchPolicyPreMem\n"));
> +  //
> +  // Update PCIE RP policies
> +  //
> +//  MaxPcieRootPorts = 16;
> +
> +  MaxPcieRootPorts = GetPchMaxPciePortNum ();
> +//  MaxPcieRootPorts = 16;
> +  FspmUpd->FspmConfig.PcieRpEnableMask =
> PcieRpPreMemConfig->RpEnabledMask & ((1 << MaxPcieRootPorts) - 1);
> +  FspmUpd->FspmConfig.PcieImrEnabled =
> PcieRpPreMemConfig->PcieImrEnabled;
> +  FspmUpd->FspmConfig.PcieImrSize = PcieRpPreMemConfig->PcieImrSize;
> +  FspmUpd->FspmConfig.ImrRpSelection =
> PcieRpPreMemConfig->ImrRpSelection;
> +  //
> +  // Update TraceHub policies
> +  //
> +  FspmUpd->FspmConfig.PchTraceHubMode = (UINT8)
> PchTraceHubPreMemConfig->EnableMode;
> +  FspmUpd->FspmConfig.PchTraceHubMemReg0Size = (UINT8)
> PchTraceHubPreMemConfig->MemReg0Size;
> +  FspmUpd->FspmConfig.PchTraceHubMemReg1Size = (UINT8)
> PchTraceHubPreMemConfig->MemReg1Size;
> +
> +  //
> +  // Update Smbus policies
> +  //
> +  FspmUpd->FspmConfig.SmbusEnable =
> (UINT8)SmbusPreMemConfig->Enable;
> +  FspmUpd->FspmConfig.SmbusArpEnable =
> (UINT8)SmbusPreMemConfig->ArpEnable;
> +  FspmUpd->FspmTestConfig.SmbusDynamicPowerGating =
> (UINT8)SmbusPreMemConfig->DynamicPowerGating;
> +  FspmUpd->FspmTestConfig.SmbusSpdWriteDisable =
> (UINT8)SmbusPreMemConfig->SpdWriteDisable;
> +  FspmUpd->FspmConfig.PchSmbAlertEnable =
> (UINT8)SmbusPreMemConfig->SmbAlertEnable;
> +  FspmUpd->FspmConfig.PchSmbusIoBase =
> (UINT16)SmbusPreMemConfig->SmbusIoBase;
> +  FspmUpd->FspmConfig.PchNumRsvdSmbusAddresses =
> (UINT8)SmbusPreMemConfig->NumRsvdSmbusAddresses;
> +  FspmUpd->FspmConfig.RsvdSmbusAddressTablePtr =
> (UINT32)SmbusPreMemConfig->RsvdSmbusAddressTable;
> +
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "WYQ1
> UpdatePeiPchPolicyPreMem\n"));
> +  //
> +  // Update Dci policies
> +  //
> +  FspmUpd->FspmConfig.PlatformDebugConsent =
> (UINT8)DciPreMemConfig->PlatformDebugConsent;
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "WYQ11
> UpdatePeiPchPolicyPreMem\n"));
> +  FspmUpd->FspmConfig.DciUsb3TypecUfpDbg =
> (UINT8)DciPreMemConfig->DciUsb3TypecUfpDbg;
> +  //
> +  // Update HSIO PCIE policies
> +  //
> +  for (Index = 0; Index < MaxPcieRootPorts; Index ++) {
> +    FspmUpd->FspmConfig.PchPcieHsioRxSetCtleEnable[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioRxSetCtleEnable;
> +    FspmUpd->FspmConfig.PchPcieHsioRxSetCtle[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioRxSetCtle;
> +
> FspmUpd->FspmConfig.PchPcieHsioTxGen1DownscaleAmpEnable[Index]  =
> (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen1DownscaleAmpEna
> ble;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen1DownscaleAmp[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen1DownscaleAmp;
> +
> FspmUpd->FspmConfig.PchPcieHsioTxGen2DownscaleAmpEnable[Index]  =
> (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DownscaleAmpEna
> ble;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen2DownscaleAmp[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DownscaleAmp;
> +
> FspmUpd->FspmConfig.PchPcieHsioTxGen3DownscaleAmpEnable[Index]  =
> (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen3DownscaleAmpEna
> ble;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen3DownscaleAmp[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen3DownscaleAmp;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen1DeEmphEnable[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen1DeEmphEnable;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen1DeEmph[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen1DeEmph;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen2DeEmph3p5Enable[Index]
> =
> (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DeEmph3p5Enable;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen2DeEmph3p5[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DeEmph3p5;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen2DeEmph6p0Enable[Index]
> =
> (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DeEmph6p0Enable;
> +    FspmUpd->FspmConfig.PchPcieHsioTxGen2DeEmph6p0[Index]
> = (UINT8)HsioPciePreMemConfig->Lane[Index].HsioTxGen2DeEmph6p0;
> +  }
> +
> +  //
> +  // Update HSIO SATA policies
> +  //
> +  for (Index = 0; Index < PCH_MAX_SATA_PORTS; Index ++) {
> +    FspmUpd->FspmConfig.PchSataHsioRxGen1EqBoostMagEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen1EqBoostMagEn
> able;
> +    FspmUpd->FspmConfig.PchSataHsioRxGen1EqBoostMag[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen1EqBoostMag;
> +    FspmUpd->FspmConfig.PchSataHsioRxGen2EqBoostMagEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen2EqBoostMagEn
> able;
> +    FspmUpd->FspmConfig.PchSataHsioRxGen2EqBoostMag[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen2EqBoostMag;
> +    FspmUpd->FspmConfig.PchSataHsioRxGen3EqBoostMagEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen3EqBoostMagEn
> able;
> +    FspmUpd->FspmConfig.PchSataHsioRxGen3EqBoostMag[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioRxGen3EqBoostMag;
> +
> FspmUpd->FspmConfig.PchSataHsioTxGen1DownscaleAmpEnable[Index]  =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen1DownscaleAmp
> Enable;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen1DownscaleAmp[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen1DownscaleAmp
> ;
> +
> FspmUpd->FspmConfig.PchSataHsioTxGen2DownscaleAmpEnable[Index]  =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen2DownscaleAmp
> Enable;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen2DownscaleAmp[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen2DownscaleAmp
> ;
> +
> FspmUpd->FspmConfig.PchSataHsioTxGen3DownscaleAmpEnable[Index]  =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen3DownscaleAmp
> Enable;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen3DownscaleAmp[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen3DownscaleAmp
> ;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen1DeEmphEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen1DeEmphEnable
> ;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen1DeEmph[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen1DeEmph;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen2DeEmphEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen2DeEmphEnable
> ;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen2DeEmph[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen2DeEmph;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen3DeEmphEnable[Index]
> =
> (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen3DeEmphEnable
> ;
> +    FspmUpd->FspmConfig.PchSataHsioTxGen3DeEmph[Index]
> = (UINT8)HsioSataPreMemConfig->PortLane[Index].HsioTxGen3DeEmph;
> +  }
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "WYQ2
> UpdatePeiPchPolicyPreMem\n"));
> +  // Update LPC policies
> +  //
> +  FspmUpd->FspmConfig.PchLpcEnhancePort8xhDecoding =
> (UINT8)LpcPreMemConfig->EnhancePort8xhDecoding;
> +
> +  //
> +  // Update Pch General Premem policies
> +  //
> +  FspmUpd->FspmConfig.PchPort80Route =
> (UINT8)PchGeneralPreMemConfig->Port80Route;
> +
> +  //
> +  // Update Wdt policies
> +  //
> +  FspmUpd->FspmTestConfig.WdtDisableAndLock =
> (UINT8)WdtPreMemConfig->DisableAndLock;
> +
> +  //
> +  // HdAudioConfig
> +  //
> +  FspmUpd->FspmConfig.PchHdaEnable =
> (UINT8)HdaPreMemConfig->Enable;
> +
> +  //
> +  // IshConfig
> +  //
> +  FspmUpd->FspmConfig.PchIshEnable =
> (UINT8)IshPreMemConfig->Enable;
> +
> +  DEBUG((DEBUG_INFO | DEBUG_INIT, "WYQ3
> UpdatePeiPchPolicyPreMem\n"));
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP PCH PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS                   Status;
> +  UINTN                        Index;
> +  UINTN                        MaxPcieRootPorts;
> +  UINT8                        Data8;
> +  SI_POLICY_PPI                *SiPolicy;
> +  PCH_LAN_CONFIG               *LanConfig;
> +  PCH_HDAUDIO_CONFIG           *HdAudioConfig;
> +  PCH_SCS_CONFIG               *ScsConfig;
> +  PCH_ISH_CONFIG               *IshConfig;
> +  PCH_SATA_CONFIG              *SataConfig;
> +  USB_CONFIG                   *UsbConfig;
> +  PCH_SERIAL_IO_CONFIG         *SerialIoConfig;
> +  PCH_INTERRUPT_CONFIG         *InterruptConfig;
> +  PCH_LOCK_DOWN_CONFIG         *LockDownConfig;
> +  PCH_CNVI_CONFIG              *CnviConfig;
> +  PCH_HSIO_CONFIG              *HsioConfig;
> +  PCH_ESPI_CONFIG              *EspiConfig;
> +  PCH_PCIE_CONFIG              *PcieRpConfig;
> +  PCH_DMI_CONFIG               *DmiConfig;
> +  PCH_FLASH_PROTECTION_CONFIG  *FlashProtectionConfig;
> +  PCH_IOAPIC_CONFIG            *IoApicConfig;
> +  PCH_P2SB_CONFIG              *P2sbConfig;
> +  PCH_GENERAL_CONFIG           *PchGeneralConfig;
> +  PCH_PM_CONFIG                *PmConfig;
> +  PCH_LPC_SIRQ_CONFIG          *PchSerialIrqConfig;
> +  PCH_THERMAL_CONFIG           *PchThermalConfig;
> +
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP UpdatePeiPchPolicy\n"));
> +  //
> +  // Locate SiPolicyPpi
> +  //
> +  SiPolicy = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPolicy
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gLanConfigGuid, (VOID *)
> &LanConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gHdAudioConfigGuid, (VOID *)
> &HdAudioConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gScsConfigGuid, (VOID *)
> &ScsConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gIshConfigGuid, (VOID *)
> &IshConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSataConfigGuid, (VOID *)
> &SataConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gUsbConfigGuid, (VOID *)
> &UsbConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIoConfigGuid, (VOID *)
> &SerialIoConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gInterruptConfigGuid, (VOID *)
> &InterruptConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gLockDownConfigGuid, (VOID
> *) &LockDownConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPcieRpConfigGuid, (VOID *)
> &PcieRpConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gDmiConfigGuid, (VOID *)
> &DmiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gFlashProtectionConfigGuid,
> (VOID *) &FlashProtectionConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gIoApicConfigGuid, (VOID *)
> &IoApicConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gP2sbConfigGuid, (VOID *)
> &P2sbConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPchGeneralConfigGuid,
> (VOID *) &PchGeneralConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPmConfigGuid, (VOID *)
> &PmConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIrqConfigGuid, (VOID *)
> &PchSerialIrqConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gThermalConfigGuid, (VOID *)
> &PchThermalConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gCnviConfigGuid, (VOID *)
> &CnviConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gHsioConfigGuid, (VOID *)
> &HsioConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gEspiConfigGuid, (VOID *)
> &EspiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Update LAN policies
> +  //
> +  FspsUpd->FspsConfig.PchLanEnable          =
> (UINT8)LanConfig->Enable;
> +  FspsUpd->FspsConfig.PchLanLtrEnable       =
> (UINT8)LanConfig->LtrEnable;
> +
> +  //
> +  // Update HDA policies
> +  //
> +  FspsUpd->FspsConfig.PchHdaDspEnable             =
> (UINT8)HdAudioConfig->DspEnable;
> +  FspsUpd->FspsConfig.PchHdaPme                   =
> (UINT8)HdAudioConfig->Pme;
> +  FspsUpd->FspsConfig.PchHdaVcType                =
> (UINT8)HdAudioConfig->VcType;
> +  FspsUpd->FspsConfig.PchHdaLinkFrequency         =
> (UINT8)HdAudioConfig->HdAudioLinkFrequency;
> +  FspsUpd->FspsConfig.PchHdaIDispLinkFrequency    =
> (UINT8)HdAudioConfig->IDispLinkFrequency;
> +  FspsUpd->FspsConfig.PchHdaIDispLinkTmode        =
> (UINT8)HdAudioConfig->IDispLinkTmode;
> +  FspsUpd->FspsConfig.PchHdaDspUaaCompliance      =
> (UINT8)HdAudioConfig->DspUaaCompliance;
> +  FspsUpd->FspsConfig.PchHdaIDispCodecDisconnect  =
> (UINT8)HdAudioConfig->IDispCodecDisconnect;
> +  FspsUpd->FspsConfig.PchHdaCodecSxWakeCapability =
> (UINT8)HdAudioConfig->CodecSxWakeCapability;
> +  FspsUpd->FspsTestConfig.PchHdaResetWaitTimer    =
> (UINT16)HdAudioConfig->ResetWaitTimer;
> +  FspsUpd->FspsConfig.PchHdaVerbTableEntryNum     =
> HdAudioConfig->VerbTableEntryNum;
> +  FspsUpd->FspsConfig.PchHdaVerbTablePtr          =
> HdAudioConfig->VerbTablePtr;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkHda          =
> (UINT8)HdAudioConfig->AudioLinkHda;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkDmic0        =
> (UINT8)HdAudioConfig->AudioLinkDmic0;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkDmic1        =
> (UINT8)HdAudioConfig->AudioLinkDmic1;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSsp0         =
> (UINT8)HdAudioConfig->AudioLinkSsp0;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSsp1         =
> (UINT8)HdAudioConfig->AudioLinkSsp1;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSsp2         =
> (UINT8)HdAudioConfig->AudioLinkSsp2;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSndw1        =
> (UINT8)HdAudioConfig->AudioLinkSndw1;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSndw2        =
> (UINT8)HdAudioConfig->AudioLinkSndw2;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSndw3        =
> (UINT8)HdAudioConfig->AudioLinkSndw3;
> +  FspsUpd->FspsConfig.PchHdaAudioLinkSndw4        =
> (UINT8)HdAudioConfig->AudioLinkSndw4;
> +  FspsUpd->FspsConfig.PchHdaSndwBufferRcomp       =
> (UINT8)HdAudioConfig->SndwBufferRcomp;
> +
> +  //
> +  // Update SCS policies
> +  //
> +  FspsUpd->FspsConfig.ScsEmmcEnabled =
> (UINT8)ScsConfig->ScsEmmcEnabled;
> +  FspsUpd->FspsConfig.ScsEmmcHs400Enabled =
> (UINT8)ScsConfig->ScsEmmcHs400Enabled;
> +  FspsUpd->FspsConfig.ScsSdCardEnabled =
> (UINT8)ScsConfig->ScsSdcardEnabled;
> +  FspsUpd->FspsConfig.SdCardPowerEnableActiveHigh =
> (UINT8)ScsConfig->SdCardPowerEnableActiveHigh;
> +#ifdef CFL_SIMICS
> +  FspsUpd->FspsConfig.ScsUfsEnabled    = 0;
> +#else
> +  FspsUpd->FspsConfig.ScsUfsEnabled    =
> (UINT8)ScsConfig->ScsUfsEnabled;
> +#endif
> +  FspsUpd->FspsConfig.PchScsEmmcHs400TuningRequired =
> (UINT8)ScsConfig->ScsEmmcHs400TuningRequired;
> +  FspsUpd->FspsConfig.PchScsEmmcHs400DllDataValid   =
> (UINT8)ScsConfig->ScsEmmcHs400DllDataValid;
> +  FspsUpd->FspsConfig.PchScsEmmcHs400RxStrobeDll1   =
> (UINT8)ScsConfig->ScsEmmcHs400RxStrobeDll1;
> +  FspsUpd->FspsConfig.PchScsEmmcHs400TxDataDll      =
> (UINT8)ScsConfig->ScsEmmcHs400TxDataDll;
> +  FspsUpd->FspsConfig.PchScsEmmcHs400DriverStrength =
> (UINT8)ScsConfig->ScsEmmcHs400DriverStrength;
> +
> +  //
> +  // Update ISH policies
> +  //
> +  FspsUpd->FspsConfig.PchIshSpiGpioAssign   =
> (UINT8)IshConfig->SpiGpioAssign;
> +  FspsUpd->FspsConfig.PchIshUart0GpioAssign =
> (UINT8)IshConfig->Uart0GpioAssign;
> +  FspsUpd->FspsConfig.PchIshUart1GpioAssign =
> (UINT8)IshConfig->Uart1GpioAssign;
> +  FspsUpd->FspsConfig.PchIshI2c0GpioAssign  =
> (UINT8)IshConfig->I2c0GpioAssign;
> +  FspsUpd->FspsConfig.PchIshI2c1GpioAssign  =
> (UINT8)IshConfig->I2c1GpioAssign;
> +  FspsUpd->FspsConfig.PchIshI2c2GpioAssign  =
> (UINT8)IshConfig->I2c2GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp0GpioAssign   =
> (UINT8)IshConfig->Gp0GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp1GpioAssign   =
> (UINT8)IshConfig->Gp1GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp2GpioAssign   =
> (UINT8)IshConfig->Gp2GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp3GpioAssign   =
> (UINT8)IshConfig->Gp3GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp4GpioAssign   =
> (UINT8)IshConfig->Gp4GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp5GpioAssign   =
> (UINT8)IshConfig->Gp5GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp6GpioAssign   =
> (UINT8)IshConfig->Gp6GpioAssign;
> +  FspsUpd->FspsConfig.PchIshGp7GpioAssign   =
> (UINT8)IshConfig->Gp7GpioAssign;
> +  FspsUpd->FspsConfig.PchIshPdtUnlock       =
> (UINT8)IshConfig->PdtUnlock;
> +
> +  //
> +  // Update PCIE RP RootPort policies
> +  //
> +  MaxPcieRootPorts = GetPchMaxPciePortNum ();
> +  FspsUpd->FspsConfig.PcieRpDpcMask = 0;
> +  FspsUpd->FspsConfig.PcieRpDpcExtensionsMask = 0;
> +  FspsUpd->FspsConfig.PcieRpPtmMask = 0;
> +  for (Index = 0; Index < MaxPcieRootPorts; Index ++) {
> +    FspsUpd->FspsConfig.PcieRpHotPlug[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].HotPlug;
> +    FspsUpd->FspsConfig.PcieRpSlotImplemented[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SlotImplemented;
> +    FspsUpd->FspsConfig.PcieRpPmSci[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].PmSci;
> +    FspsUpd->FspsConfig.PcieRpExtSync[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].ExtSync;
> +    FspsUpd->FspsConfig.PcieRpTransmitterHalfSwing[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].TransmitterHalfSwing;
> +    FspsUpd->FspsConfig.PcieRpClkReqDetect[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].ClkReqDetect;
> +    FspsUpd->FspsConfig.PcieRpAdvancedErrorReporting[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].AdvancedErrorReporting;
> +    FspsUpd->FspsConfig.PcieRpUnsupportedRequestReport[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].UnsupportedRequestReport;
> +    FspsUpd->FspsConfig.PcieRpFatalErrorReport[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].FatalErrorReport;
> +    FspsUpd->FspsConfig.PcieRpNoFatalErrorReport[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].NoFatalErrorReport;
> +    FspsUpd->FspsConfig.PcieRpCorrectableErrorReport[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].CorrectableErrorReport;
> +    FspsUpd->FspsConfig.PcieRpSystemErrorOnFatalError[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SystemErrorOnFatalError;
> +    FspsUpd->FspsConfig.PcieRpSystemErrorOnNonFatalError[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SystemErrorOnNonFatalError;
> +    FspsUpd->FspsConfig.PcieRpSystemErrorOnCorrectableError[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SystemErrorOnCorrectableError;
> +    FspsUpd->FspsConfig.PcieRpMaxPayload[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].MaxPayload;
> +    if (PcieRpConfig->RootPort[Index].DpcEnabled) {
> +      FspsUpd->FspsConfig.PcieRpDpcMask |= (BIT0<<Index);
> +    }
> +    if (PcieRpConfig->RootPort[Index].RpDpcExtensionsEnabled) {
> +      FspsUpd->FspsConfig.PcieRpDpcExtensionsMask |= (BIT0<<Index);
> +    }
> +    if (PcieRpConfig->RootPort[Index].PtmEnabled) {
> +      FspsUpd->FspsConfig.PcieRpPtmMask |= (BIT0<<Index);
> +    }
> +    FspsUpd->FspsConfig.PcieRpPcieSpeed[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].PcieSpeed;
> +    FspsUpd->FspsConfig.PcieRpGen3EqPh3Method[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].Gen3EqPh3Method;
> +    FspsUpd->FspsConfig.PcieRpPhysicalSlotNumber[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].PhysicalSlotNumber;
> +    FspsUpd->FspsConfig.PcieRpCompletionTimeout[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].CompletionTimeout;
> +    FspsUpd->FspsConfig.PcieRpAspm[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].Aspm;
> +    FspsUpd->FspsConfig.PcieRpL1Substates[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].L1Substates;
> +    FspsUpd->FspsConfig.PcieRpLtrEnable[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].LtrEnable;
> +    FspsUpd->FspsConfig.PcieRpLtrConfigLock[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].LtrConfigLock;
> +    FspsUpd->FspsConfig.PcieRpAcsEnabled[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].AcsEnabled;
> +    FspsUpd->FspsConfig.PcieRpDetectTimeoutMs[Index] =
> (UINT16)PcieRpConfig->RootPort[Index].DetectTimeoutMs;
> +    FspsUpd->FspsConfig.PcieRootPortGen2PllL1CgDisable[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].PcieRootPortGen2PllL1CgDisable;
> +
> +    FspsUpd->FspsTestConfig.PcieRpLtrMaxSnoopLatency[Index] =
> (UINT16)PcieRpConfig->RootPort[Index].LtrMaxSnoopLatency;
> +    FspsUpd->FspsTestConfig.PcieRpLtrMaxNoSnoopLatency[Index] =
> (UINT16)PcieRpConfig->RootPort[Index].LtrMaxNoSnoopLatency;
> +
> +    FspsUpd->FspsTestConfig.PcieRpSnoopLatencyOverrideMode[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SnoopLatencyOverrideMode;
> +    FspsUpd->FspsTestConfig.PcieRpSnoopLatencyOverrideMultiplier[Index]
> = (UINT8)PcieRpConfig->RootPort[Index].SnoopLatencyOverrideMultiplier;
> +    FspsUpd->FspsTestConfig.PcieRpSnoopLatencyOverrideValue[Index] =
> (UINT16)PcieRpConfig->RootPort[Index].SnoopLatencyOverrideValue;
> +
> +    FspsUpd->FspsTestConfig.PcieRpNonSnoopLatencyOverrideMode[Index]
> = (UINT8)PcieRpConfig->RootPort[Index].NonSnoopLatencyOverrideMode;
> +
> FspsUpd->FspsTestConfig.PcieRpNonSnoopLatencyOverrideMultiplier[Index]
> =
> (UINT8)PcieRpConfig->RootPort[Index].NonSnoopLatencyOverrideMultiplier;
> +    FspsUpd->FspsTestConfig.PcieRpNonSnoopLatencyOverrideValue[Index]
> = (UINT16)PcieRpConfig->RootPort[Index].NonSnoopLatencyOverrideValue;
> +
> +    FspsUpd->FspsTestConfig.PcieRpSlotPowerLimitScale[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].SlotPowerLimitScale;
> +    FspsUpd->FspsTestConfig.PcieRpSlotPowerLimitValue[Index] =
> (UINT16)PcieRpConfig->RootPort[Index].SlotPowerLimitValue;
> +    FspsUpd->FspsTestConfig.PcieRpUptp[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].Uptp;
> +    FspsUpd->FspsTestConfig.PcieRpDptp[Index] =
> (UINT8)PcieRpConfig->RootPort[Index].Dptp;
> +
> +  }
> +  for (Index = 0; Index < GetPchMaxPcieClockNum (); Index ++) {
> +    FspsUpd->FspsConfig.PcieClkSrcUsage[Index] =
> PcieRpConfig->PcieClock[Index].Usage;
> +    FspsUpd->FspsConfig.PcieClkSrcClkReq[Index] =
> PcieRpConfig->PcieClock[Index].ClkReq;
> +  }
> +
> +  //
> +  // Update PCIE RP EqPh3LaneParam policies
> +  //
> +  for (Index = 0; Index < MaxPcieRootPorts; Index ++) {
> +    FspsUpd->FspsConfig.PcieEqPh3LaneParamCm[Index] =
> (UINT8)PcieRpConfig->EqPh3LaneParam[Index].Cm;
> +    FspsUpd->FspsConfig.PcieEqPh3LaneParamCp[Index] =
> (UINT8)PcieRpConfig->EqPh3LaneParam[Index].Cp;
> +  }
> +
> +  //
> +  // Update PCIE RP SwEqCoeffList policies
> +  //
> +  for (Index = 0; Index < PCH_PCIE_SWEQ_COEFFS_MAX; Index ++) {
> +    FspsUpd->FspsConfig.PcieSwEqCoeffListCm[Index] =
> (UINT8)PcieRpConfig->SwEqCoeffList[Index].Cm;
> +    FspsUpd->FspsConfig.PcieSwEqCoeffListCp[Index] =
> (UINT8)PcieRpConfig->SwEqCoeffList[Index].Cp;
> +  }
> +
> +  //
> +  // Update PCIE RP policies
> +  //
> +  FspsUpd->FspsTestConfig.PcieEnablePort8xhDecode        =
> (UINT8)PcieRpConfig->EnablePort8xhDecode;
> +  FspsUpd->FspsTestConfig.PchPciePort8xhDecodePortIndex  =
> (UINT8)PcieRpConfig->PchPciePort8xhDecodePortIndex;
> +  FspsUpd->FspsConfig.PcieDisableRootPortClockGating =
> (UINT8)PcieRpConfig->DisableRootPortClockGating;
> +  FspsUpd->FspsConfig.PcieEnablePeerMemoryWrite      =
> (UINT8)PcieRpConfig->EnablePeerMemoryWrite;
> +  FspsUpd->FspsConfig.PcieComplianceTestMode         =
> (UINT8)PcieRpConfig->ComplianceTestMode;
> +  FspsUpd->FspsConfig.PcieRpFunctionSwap             =
> (UINT8)PcieRpConfig->RpFunctionSwap;
> +  FspsUpd->FspsConfig.PchPcieDeviceOverrideTablePtr  =
> PcieRpConfig->PcieDeviceOverrideTablePtr;
> +
> +  //
> +  // Update Sata Policies
> +  //
> +  FspsUpd->FspsConfig.SataEnable                     =
> (UINT8)SataConfig->Enable;
> +  FspsUpd->FspsTestConfig.SataTestMode               =
> (UINT8)SataConfig->TestMode;
> +  FspsUpd->FspsConfig.SataSalpSupport                =
> (UINT8)SataConfig->SalpSupport;
> +  FspsUpd->FspsConfig.SataPwrOptEnable =
> (UINT8)SataConfig->PwrOptEnable;
> +  FspsUpd->FspsConfig.EsataSpeedLimit  =
> (UINT8)SataConfig->EsataSpeedLimit;
> +  FspsUpd->FspsConfig.SataLedEnable    = (UINT8)SataConfig->LedEnable;
> +  FspsUpd->FspsConfig.SataMode         =
> (UINT8)SataConfig->SataMode;
> +  FspsUpd->FspsConfig.SataSpeedLimit   =
> (UINT8)SataConfig->SpeedLimit;
> +
> +  for (Index = 0; Index < PCH_MAX_SATA_PORTS; Index++) {
> +    FspsUpd->FspsConfig.SataPortsEnable[Index] =
> (UINT8)SataConfig->PortSettings[Index].Enable;
> +    FspsUpd->FspsConfig.SataPortsHotPlug[Index]     =
> (UINT8)SataConfig->PortSettings[Index].HotPlug;
> +    FspsUpd->FspsConfig.SataPortsInterlockSw[Index] =
> (UINT8)SataConfig->PortSettings[Index].InterlockSw;
> +    FspsUpd->FspsConfig.SataPortsExternal[Index]    =
> (UINT8)SataConfig->PortSettings[Index].External;
> +    FspsUpd->FspsConfig.SataPortsSpinUp[Index]      =
> (UINT8)SataConfig->PortSettings[Index].SpinUp;
> +    FspsUpd->FspsConfig.SataPortsSolidStateDrive[Index]  =
> (UINT8)SataConfig->PortSettings[Index].SolidStateDrive;
> +    FspsUpd->FspsConfig.SataPortsDevSlp[Index] =
> (UINT8)SataConfig->PortSettings[Index].DevSlp;
> +    FspsUpd->FspsConfig.SataPortsEnableDitoConfig[Index] =
> (UINT8)SataConfig->PortSettings[Index].EnableDitoConfig;
> +    FspsUpd->FspsConfig.SataPortsDmVal[Index]       =
> (UINT8)SataConfig->PortSettings[Index].DmVal;
> +    FspsUpd->FspsConfig.SataPortsDitoVal[Index]     =
> (UINT16)SataConfig->PortSettings[Index].DitoVal;
> +    FspsUpd->FspsConfig.SataPortsZpOdd[Index]       =
> (UINT8)SataConfig->PortSettings[Index].ZpOdd;
> +  }
> +
> +  FspsUpd->FspsConfig.SataRstRaidDeviceId            =
> (UINT8)SataConfig->Rst.RaidDeviceId;
> +  FspsUpd->FspsConfig.SataRstInterrupt               =
> (UINT8)SataConfig->Rst.SataRstInterrupt;
> +  FspsUpd->FspsConfig.SataRstRaid0                   =
> (UINT8)SataConfig->Rst.Raid0;
> +  FspsUpd->FspsConfig.SataRstRaid1                   =
> (UINT8)SataConfig->Rst.Raid1;
> +  FspsUpd->FspsConfig.SataRstRaid10                  =
> (UINT8)SataConfig->Rst.Raid10;
> +  FspsUpd->FspsConfig.SataRstRaid5                   =
> (UINT8)SataConfig->Rst.Raid5;
> +  FspsUpd->FspsConfig.SataRstIrrt                    =
> (UINT8)SataConfig->Rst.Irrt;
> +  FspsUpd->FspsConfig.SataRstOromUiBanner            =
> (UINT8)SataConfig->Rst.OromUiBanner;
> +  FspsUpd->FspsConfig.SataRstOromUiDelay             =
> (UINT8)SataConfig->Rst.OromUiDelay;
> +  FspsUpd->FspsConfig.SataRstHddUnlock               =
> (UINT8)SataConfig->Rst.HddUnlock;
> +  FspsUpd->FspsConfig.SataRstLedLocate               =
> (UINT8)SataConfig->Rst.LedLocate;
> +  FspsUpd->FspsConfig.SataRstIrrtOnly                =
> (UINT8)SataConfig->Rst.IrrtOnly;
> +  FspsUpd->FspsConfig.SataRstSmartStorage            =
> (UINT8)SataConfig->Rst.SmartStorage;
> +  FspsUpd->FspsConfig.SataRstOptaneMemory            =
> (UINT8)SataConfig->Rst.OptaneMemory;
> +  FspsUpd->FspsConfig.SataRstLegacyOrom              =
> (UINT8)SataConfig->Rst.LegacyOrom;
> +  FspsUpd->FspsConfig.SataRstCpuAttachedStorage      =
> (UINT8)SataConfig->Rst.CpuAttachedStorage;
> +
> +  for (Index = 0; Index < PCH_MAX_RST_PCIE_STORAGE_CR; Index++) {
> +    FspsUpd->FspsConfig.SataRstPcieEnable[Index]           =
> (UINT8)SataConfig->RstPcieStorageRemap[Index].Enable;
> +    FspsUpd->FspsConfig.SataRstPcieStoragePort[Index]      =
> (UINT8)SataConfig->RstPcieStorageRemap[Index].RstPcieStoragePort;
> +    FspsUpd->FspsConfig.SataRstPcieDeviceResetDelay[Index] =
> (UINT8)SataConfig->RstPcieStorageRemap[Index].DeviceResetDelay;
> +  }
> +
> +  FspsUpd->FspsConfig.SataP0T1M            =
> (UINT8)SataConfig->ThermalThrottling.P0T1M;
> +  FspsUpd->FspsConfig.SataP0T2M            =
> (UINT8)SataConfig->ThermalThrottling.P0T2M;
> +  FspsUpd->FspsConfig.SataP0T3M            =
> (UINT8)SataConfig->ThermalThrottling.P0T3M;
> +  FspsUpd->FspsConfig.SataP0TDisp          =
> (UINT8)SataConfig->ThermalThrottling.P0TDisp;
> +  FspsUpd->FspsConfig.SataP1T1M            =
> (UINT8)SataConfig->ThermalThrottling.P1T1M;
> +  FspsUpd->FspsConfig.SataP1T2M            =
> (UINT8)SataConfig->ThermalThrottling.P1T2M;
> +  FspsUpd->FspsConfig.SataP1T3M            =
> (UINT8)SataConfig->ThermalThrottling.P1T3M;
> +  FspsUpd->FspsConfig.SataP1TDisp          =
> (UINT8)SataConfig->ThermalThrottling.P1TDisp;
> +  FspsUpd->FspsConfig.SataP0Tinact         =
> (UINT8)SataConfig->ThermalThrottling.P0Tinact;
> +  FspsUpd->FspsConfig.SataP0TDispFinit     =
> (UINT8)SataConfig->ThermalThrottling.P0TDispFinit;
> +  FspsUpd->FspsConfig.SataP1Tinact         =
> (UINT8)SataConfig->ThermalThrottling.P1Tinact;
> +  FspsUpd->FspsConfig.SataP1TDispFinit     =
> (UINT8)SataConfig->ThermalThrottling.P1TDispFinit;
> +  FspsUpd->FspsConfig.SataThermalSuggestedSetting =
> (UINT8)SataConfig->ThermalThrottling.SuggestedSetting;
> +
> +  //
> +  // Update USB policies
> +  //
> +  FspsUpd->FspsConfig.PchEnableComplianceMode           =
> (UINT8)UsbConfig->EnableComplianceMode;
> +  FspsUpd->FspsConfig.UsbPdoProgramming                 =
> (UINT8)UsbConfig->PdoProgramming;
> +  FspsUpd->FspsConfig.PchUsbOverCurrentEnable           =
> (UINT8)UsbConfig->OverCurrentEnable;
> +  FspsUpd->FspsConfig.PchUsb2PhySusPgEnable             =
> (UINT8)UsbConfig->Usb2PhySusPgEnable;
> +  FspsUpd->FspsTestConfig.PchXhciOcLock                 =
> (UINT8)UsbConfig->XhciOcLock;
> +  for (Index = 0; Index < PCH_MAX_USB2_PORTS; Index++) {
> +    FspsUpd->FspsConfig.PortUsb20Enable[Index]  =
> (UINT8)UsbConfig->PortUsb20[Index].Enable;
> +    FspsUpd->FspsConfig.Usb2OverCurrentPin[Index] =
> (UINT8)UsbConfig->PortUsb20[Index].OverCurrentPin;
> +    FspsUpd->FspsConfig.Usb2AfePetxiset[Index]  =
> (UINT8)UsbConfig->PortUsb20[Index].Afe.Petxiset;
> +    FspsUpd->FspsConfig.Usb2AfeTxiset[Index]    =
> (UINT8)UsbConfig->PortUsb20[Index].Afe.Txiset;
> +    FspsUpd->FspsConfig.Usb2AfePredeemp[Index]  =
> (UINT8)UsbConfig->PortUsb20[Index].Afe.Predeemp;
> +    FspsUpd->FspsConfig.Usb2AfePehalfbit[Index] =
> (UINT8)UsbConfig->PortUsb20[Index].Afe.Pehalfbit;
> +  }
> +  for (Index = 0; Index < PCH_MAX_USB3_PORTS; Index++) {
> +    FspsUpd->FspsConfig.PortUsb30Enable[Index]              =
> (UINT8)UsbConfig->PortUsb30[Index].Enable;
> +    FspsUpd->FspsConfig.Usb3OverCurrentPin[Index]           =
> (UINT8)UsbConfig->PortUsb30[Index].OverCurrentPin;
> +    FspsUpd->FspsConfig.Usb3HsioTxDeEmphEnable[Index]       =
> (UINT8)UsbConfig->PortUsb30[Index].HsioTxDeEmphEnable;
> +    FspsUpd->FspsConfig.Usb3HsioTxDeEmph[Index]             =
> (UINT8)UsbConfig->PortUsb30[Index].HsioTxDeEmph;
> +    FspsUpd->FspsConfig.Usb3HsioTxDownscaleAmpEnable[Index] =
> (UINT8)UsbConfig->PortUsb30[Index].HsioTxDownscaleAmpEnable;
> +    FspsUpd->FspsConfig.Usb3HsioTxDownscaleAmp[Index]       =
> (UINT8)UsbConfig->PortUsb30[Index].HsioTxDownscaleAmp;
> +
> +    Data8 = 0;
> +    Data8 |=
> UsbConfig->PortUsb30HsioRx[Index].HsioCtrlAdaptOffsetCfgEnable ?
> B_XHCI_HSIO_CTRL_ADAPT_OFFSET_CFG_EN : 0;
> +    Data8 |= UsbConfig->PortUsb30HsioRx[Index].HsioFilterSelNEnable ?
> B_XHCI_HSIO_FILTER_SELECT_N_EN : 0;
> +    Data8 |= UsbConfig->PortUsb30HsioRx[Index].HsioFilterSelPEnable ?
> B_XHCI_HSIO_FILTER_SELECT_P_EN : 0;
> +    Data8 |=
> UsbConfig->PortUsb30HsioRx[Index].HsioOlfpsCfgPullUpDwnResEnable ?
> B_XHCI_HSIO_LFPS_CFG_PULLUP_DWN_RES_EN : 0;
> +    FspsUpd->FspsConfig.PchUsbHsioRxTuningEnable[Index] = Data8;
> +
> +    Data8 = ((UsbConfig->PortUsb30HsioRx[Index].HsioCtrlAdaptOffsetCfg
> & 0x1F) << N_XHCI_UPD_HSIO_CTRL_ADAPT_OFFSET_CFG) |
> +
> ((UsbConfig->PortUsb30HsioRx[Index].HsioOlfpsCfgPullUpDwnRes & 0x7) <<
> N_XHCI_UPD_HSIO_LFPS_CFG_PULLUP_DWN_RES);
> +    FspsUpd->FspsConfig.PchUsbHsioRxTuningParameters[Index] = Data8;
> +
> +    Data8 = ((UsbConfig->PortUsb30HsioRx[Index].HsioFilterSelN & 0x7) <<
> N_XHCI_UPD_HSIO_FILTER_SELECT_N) |
> +            ((UsbConfig->PortUsb30HsioRx[Index].HsioFilterSelP & 0x7)
> << N_XHCI_UPD_HSIO_FILTER_SELECT_P);
> +    FspsUpd->FspsConfig.PchUsbHsioFilterSel[Index] = Data8;
> +  }
> +
> +  FspsUpd->FspsConfig.XdciEnable     =
> (UINT8)UsbConfig->XdciConfig.Enable;
> +
> +  //
> +  // Update SerialIo policies
> +  //
> +  for (Index = 0; Index < GetPchMaxSerialIoSpiControllersNum (); Index++) {
> +    FspsUpd->FspsConfig.SerialIoSpiMode[Index] =
> SerialIoConfig->DevMode[Index];
> +  }
> +
> +  //
> +  // SPI CS Polarity
> +  //
> +  FspsUpd->FspsConfig.SerialIoSpi0CsPolarity[0] = 1;
> +  FspsUpd->FspsConfig.SerialIoSpi0CsPolarity[1] = 0;
> +  FspsUpd->FspsConfig.SerialIoSpi1CsPolarity[0] = 0;
> +  FspsUpd->FspsConfig.SerialIoSpi1CsPolarity[1] = 0;
> +  FspsUpd->FspsConfig.SerialIoSpi2CsPolarity[0] = 1;
> +  FspsUpd->FspsConfig.SerialIoSpi2CsPolarity[1] = 0;
> +  for (Index = 0; Index < GetPchMaxSerialIoUartControllersNum (); Index++)
> {
> +    FspsUpd->FspsConfig.SerialIoUartAutoFlow[Index] =
> SerialIoConfig->UartHwFlowCtrl[Index];
> +  }
> +  for (Index = 0; Index < GetPchMaxSerialIoI2cControllersNum (); Index++) {
> +    FspsUpd->FspsConfig.SerialIoI2cMode[Index]               =
> SerialIoConfig->DevMode[Index];
> +    FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[Index] =
> SerialIoConfig->I2cPadsTermination[Index];
> +  }
> +
> +  FspsUpd->FspsConfig.SerialIoDebugUartNumber          =
> (UINT8)SerialIoConfig->DebugUartNumber;
> +  FspsUpd->FspsConfig.SerialIoUartPinMux[0]            =
> (UINT8)SerialIoConfig->Uart0PinMuxing;
> +
> +  //
> +  // Update Interrupt policies
> +  //
> +  FspsUpd->FspsConfig.DevIntConfigPtr =
> (UINT32)InterruptConfig->DevIntConfig;
> +  FspsUpd->FspsConfig.NumOfDevIntConfig =
> InterruptConfig->NumOfDevIntConfig;
> +  for (Index = 0; Index < PCH_MAX_PXRC_CONFIG; Index ++) {
> +    FspsUpd->FspsConfig.PxRcConfig[Index] =
> (UINT8)InterruptConfig->PxRcConfig[Index];
> +  }
> +  FspsUpd->FspsConfig.GpioIrqRoute =
> (UINT8)InterruptConfig->GpioIrqRoute;
> +  FspsUpd->FspsConfig.SciIrqSelect = (UINT8)InterruptConfig->SciIrqSelect;
> +  FspsUpd->FspsConfig.TcoIrqSelect = (UINT8)InterruptConfig->TcoIrqSelect;
> +  FspsUpd->FspsConfig.TcoIrqEnable =
> (UINT8)InterruptConfig->TcoIrqEnable;
> +
> +  //
> +  // Update LockDown policies
> +  //
> +  FspsUpd->FspsTestConfig.PchLockDownGlobalSmi     =
> (UINT8)LockDownConfig->GlobalSmi;
> +  FspsUpd->FspsTestConfig.PchLockDownBiosInterface =
> (UINT8)LockDownConfig->BiosInterface;
> +  FspsUpd->FspsConfig.PchLockDownBiosLock          =
> (UINT8)LockDownConfig->BiosLock;
> +  FspsUpd->FspsConfig.PchLockDownRtcMemoryLock     =
> (UINT8)LockDownConfig->RtcMemoryLock;
> +  FspsUpd->FspsTestConfig.PchUnlockGpioPads        =
> (UINT8)LockDownConfig->UnlockGpioPads;
> +
> +  //
> +  // Update Dmi policies
> +  //
> +  FspsUpd->FspsConfig.PchPwrOptEnable =
> (UINT8)DmiConfig->PwrOptEnable;
> +  FspsUpd->FspsConfig.PchDmiAspmCtrl =
> (UINT8)DmiConfig->DmiAspmCtrl;
> +
> +  //
> +  // Update Flash Protection policies
> +  //
> +  for (Index = 0; Index < PCH_FLASH_PROTECTED_RANGES; Index ++) {
> +    FspsUpd->FspsConfig.PchWriteProtectionEnable[Index] =
> (UINT8)FlashProtectionConfig->ProtectRange[Index].WriteProtectionEnable;
> +    FspsUpd->FspsConfig.PchReadProtectionEnable[Index]  =
> (UINT8)FlashProtectionConfig->ProtectRange[Index].ReadProtectionEnable;
> +    FspsUpd->FspsConfig.PchProtectedRangeLimit[Index]  =
> (UINT16)FlashProtectionConfig->ProtectRange[Index].ProtectedRangeLimit;
> +    FspsUpd->FspsConfig.PchProtectedRangeBase[Index]   =
> (UINT16)FlashProtectionConfig->ProtectRange[Index].ProtectedRangeBase;
> +  }
> +
> +  //
> +  // Update IO Apic policies
> +  //
> +  FspsUpd->FspsConfig.PchIoApicEntry24_119       =
> (UINT8)IoApicConfig->IoApicEntry24_119;
> +  FspsUpd->FspsConfig.Enable8254ClockGating      =
> (UINT8)IoApicConfig->Enable8254ClockGating;
> +  FspsUpd->FspsConfig.Enable8254ClockGatingOnS3  =
> (UINT8)IoApicConfig->Enable8254ClockGatingOnS3;
> +  FspsUpd->FspsConfig.PchIoApicId                =
> (UINT8)IoApicConfig->IoApicId;
> +
> +  //
> +  // Update P2sb policies
> +  //
> +  FspsUpd->FspsTestConfig.PchSbAccessUnlock  =
> (UINT8)P2sbConfig->SbAccessUnlock;
> +
> +  //
> +  // Update Pch General policies
> +  //
> +  FspsUpd->FspsConfig.PchCrid               =
> (UINT8)PchGeneralConfig->Crid;
> +  FspsUpd->FspsConfig.PchLegacyIoLowLatency =
> (UINT8)PchGeneralConfig->LegacyIoLowLatency;
> +
> +  //
> +  // Update Pm policies
> +  //
> +  FspsUpd->FspsConfig.PchPmPmeB0S5Dis         =
> (UINT8)PmConfig->WakeConfig.PmeB0S5Dis;
> +  FspsUpd->FspsConfig.PchPmWolEnableOverride  =
> (UINT8)PmConfig->WakeConfig.WolEnableOverride;
> +  FspsUpd->FspsConfig.PchPmPcieWakeFromDeepSx =
> (UINT8)PmConfig->WakeConfig.PcieWakeFromDeepSx;
> +  FspsUpd->FspsConfig.PchPmWoWlanEnable       =
> (UINT8)PmConfig->WakeConfig.WoWlanEnable;
> +  FspsUpd->FspsConfig.PchPmWoWlanDeepSxEnable =
> (UINT8)PmConfig->WakeConfig.WoWlanDeepSxEnable;
> +  FspsUpd->FspsConfig.PchPmLanWakeFromDeepSx  =
> (UINT8)PmConfig->WakeConfig.LanWakeFromDeepSx;
> +
> +  FspsUpd->FspsConfig.PchPmDeepSxPol          =
> (UINT8)PmConfig->PchDeepSxPol;
> +  FspsUpd->FspsConfig.PchPmSlpS3MinAssert     =
> (UINT8)PmConfig->PchSlpS3MinAssert;
> +  FspsUpd->FspsConfig.PchPmSlpS4MinAssert     =
> (UINT8)PmConfig->PchSlpS4MinAssert;
> +  FspsUpd->FspsConfig.PchPmSlpSusMinAssert    =
> (UINT8)PmConfig->PchSlpSusMinAssert;
> +  FspsUpd->FspsConfig.PchPmSlpAMinAssert      =
> (UINT8)PmConfig->PchSlpAMinAssert;
> +  FspsUpd->FspsConfig.PchPmLpcClockRun        =
> (UINT8)PmConfig->LpcClockRun;
> +  FspsUpd->FspsConfig.PchPmSlpStrchSusUp      =
> (UINT8)PmConfig->SlpStrchSusUp;
> +  FspsUpd->FspsConfig.PchPmSlpLanLowDc        =
> (UINT8)PmConfig->SlpLanLowDc;
> +  FspsUpd->FspsConfig.PchPmPwrBtnOverridePeriod =
> (UINT8)PmConfig->PwrBtnOverridePeriod;
> +  FspsUpd->FspsTestConfig.PchPmDisableEnergyReport  =
> (UINT8)PmConfig->DisableEnergyReport;
> +  FspsUpd->FspsConfig.PchPmDisableDsxAcPresentPulldown =
> (UINT8)PmConfig->DisableDsxAcPresentPulldown;
> +  FspsUpd->FspsConfig.PchPmDisableNativePowerButton    =
> (UINT8)PmConfig->DisableNativePowerButton;
> +  FspsUpd->FspsConfig.PmcPowerButtonDebounce  =
> PmConfig->PowerButtonDebounce;
> +  FspsUpd->FspsConfig.PchPmSlpS0Enable        =
> (UINT8)PmConfig->SlpS0Enable;
> +  FspsUpd->FspsConfig.PchPmMeWakeSts          =
> (UINT8)PmConfig->MeWakeSts;
> +  FspsUpd->FspsConfig.PchPmWolOvrWkSts        =
> (UINT8)PmConfig->WolOvrWkSts;
> +  FspsUpd->FspsConfig.EnableTcoTimer          =
> (UINT8)PmConfig->EnableTcoTimer;
> +  FspsUpd->FspsConfig.PchPmVrAlert            =
> (UINT8)PmConfig->VrAlert;
> +  FspsUpd->FspsConfig.PchPmPwrCycDur          =
> (UINT8)PmConfig->PchPwrCycDur;
> +  FspsUpd->FspsConfig.PchPmPciePllSsc         =
> (UINT8)PmConfig->PciePllSsc;
> +  FspsUpd->FspsConfig.PchPmSlpS0VmRuntimeControl =
> (UINT8)PmConfig->SlpS0VmRuntimeControl;
> +  FspsUpd->FspsConfig.PchPmSlpS0Vm070VSupport   =
> (UINT8)PmConfig->SlpS0Vm070VSupport;
> +  FspsUpd->FspsConfig.PchPmSlpS0Vm075VSupport   =
> (UINT8)PmConfig->SlpS0Vm075VSupport;
> +  FspsUpd->FspsConfig.SlpS0Override             =
> (UINT8)PmConfig->SlpS0Override;
> +  FspsUpd->FspsConfig.SlpS0DisQForDebug         =
> (UINT8)PmConfig->SlpS0DisQForDebug;
> +  FspsUpd->FspsConfig.PmcDbgMsgEn               =
> (UINT8)PmConfig->PmcDbgMsgEn;
> +  FspsUpd->FspsConfig.PsOnEnable                =
> (UINT8)PmConfig->PsOnEnable;
> +  FspsUpd->FspsConfig.PmcCpuC10GatePinEnable    =
> (UINT8)PmConfig->CpuC10GatePinEnable;
> +  FspsUpd->FspsConfig.PmcModPhySusPgEnable      =
> (UINT8)PmConfig->ModPhySusPgEnable;
> +  FspsUpd->FspsConfig.SlpS0WithGbeSupport       =
> (UINT8)PmConfig->SlpS0WithGbeSupport;
> +  //
> +  // Update Pch Serial IRQ policies
> +  //
> +  FspsUpd->FspsConfig.PchSirqEnable       =
> (UINT8)PchSerialIrqConfig->SirqEnable;
> +  FspsUpd->FspsConfig.PchSirqMode         =
> (UINT8)PchSerialIrqConfig->SirqMode;
> +  FspsUpd->FspsConfig.PchStartFramePulse  =
> (UINT8)PchSerialIrqConfig->StartFramePulse;
> +  //
> +  // Update Pch Thermal policies
> +  //
> +  FspsUpd->FspsConfig.PchTsmicLock        =
> (UINT8)PchThermalConfig->TsmicLock;
> +  FspsUpd->FspsConfig.PchHotEnable        =
> (UINT8)PchThermalConfig->PchHotEnable;
> +
> +  FspsUpd->FspsConfig.PchT0Level          =
> (UINT16)PchThermalConfig->TTLevels.T0Level;
> +  FspsUpd->FspsConfig.PchT1Level          =
> (UINT16)PchThermalConfig->TTLevels.T1Level;
> +  FspsUpd->FspsConfig.PchT2Level          =
> (UINT16)PchThermalConfig->TTLevels.T2Level;
> +  FspsUpd->FspsConfig.PchTTEnable         =
> (UINT8)PchThermalConfig->TTLevels.TTEnable;
> +  FspsUpd->FspsConfig.PchTTState13Enable  =
> (UINT8)PchThermalConfig->TTLevels.TTState13Enable;
> +  FspsUpd->FspsConfig.PchTTLock           =
> (UINT8)PchThermalConfig->TTLevels.TTLock;
> +  FspsUpd->FspsConfig.TTSuggestedSetting  =
> (UINT8)PchThermalConfig->TTLevels.SuggestedSetting;
> +  FspsUpd->FspsConfig.TTCrossThrottling   =
> (UINT8)PchThermalConfig->TTLevels.PchCrossThrottling;
> +
> +  FspsUpd->FspsConfig.PchDmiTsawEn        =
> (UINT8)PchThermalConfig->DmiHaAWC.DmiTsawEn;
> +  FspsUpd->FspsConfig.DmiSuggestedSetting =
> (UINT8)PchThermalConfig->DmiHaAWC.SuggestedSetting;
> +  FspsUpd->FspsConfig.DmiTS0TW            =
> (UINT8)PchThermalConfig->DmiHaAWC.TS0TW;
> +  FspsUpd->FspsConfig.DmiTS1TW            =
> (UINT8)PchThermalConfig->DmiHaAWC.TS1TW;
> +  FspsUpd->FspsConfig.DmiTS2TW            =
> (UINT8)PchThermalConfig->DmiHaAWC.TS2TW;
> +  FspsUpd->FspsConfig.DmiTS3TW            =
> (UINT8)PchThermalConfig->DmiHaAWC.TS3TW;
> +
> +  FspsUpd->FspsConfig.PchMemoryThrottlingEnable    =
> (UINT8)PchThermalConfig->MemoryThrottling.Enable;
> +  FspsUpd->FspsConfig.PchMemoryPmsyncEnable[0]     =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[0].PmsyncEn
> able;
> +  FspsUpd->FspsConfig.PchMemoryPmsyncEnable[1]     =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[1].PmsyncEn
> able;
> +  FspsUpd->FspsConfig.PchMemoryC0TransmitEnable[0] =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[0].C0Transmit
> Enable;
> +  FspsUpd->FspsConfig.PchMemoryC0TransmitEnable[1] =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[1].C0Transmit
> Enable;
> +  FspsUpd->FspsConfig.PchMemoryPinSelection[0]     =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[0].PinSelectio
> n;
> +  FspsUpd->FspsConfig.PchMemoryPinSelection[1]     =
> (UINT8)PchThermalConfig->MemoryThrottling.TsGpioPinSetting[1].PinSelectio
> n;
> +
> +  FspsUpd->FspsConfig.PchTemperatureHotLevel =
> (UINT16)PchThermalConfig->PchHotLevel;
> +
> +  //
> +  // Update Pch CNVi policies
> +  //
> +  FspsUpd->FspsConfig.CnviMode = (UINT8)CnviConfig->Mode;
> +
> +  //
> +  // Update Pch HSIO policies
> +  //
> +  FspsUpd->FspsConfig.ChipsetInitBinPtr = HsioConfig->ChipsetInitBinPtr;
> +  FspsUpd->FspsConfig.ChipsetInitBinLen = HsioConfig->ChipsetInitBinLen;
> +
> +  //
> +  // Update Pch Espi policies
> +  //
> +  FspsUpd->FspsConfig.PchEspiLgmrEnable =
> (UINT8)EspiConfig->LgmrEnable;
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.c
> new file mode 100644
> index 0000000000..50cfe7b27b
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.c
> @@ -0,0 +1,223 @@
> +/** @file
> +  Instance of Fsp Policy Initialization Library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +#include <Library/SpiLib.h>
> +
> +VOID
> +EFIAPI
> +FspPolicyInitPreMem(
> +  IN FSPM_UPD           *FspmUpdDataPtr
> +);
> +
> +VOID *
> +EFIAPI
> +SiliconPolicyInitPreMem(
> +  IN OUT VOID    *FspmUpd
> +)
> +{
> +  FspPolicyInitPreMem((FSPM_UPD *)FspmUpd);
> +  return FspmUpd;
> +}
> +
> +RETURN_STATUS
> +EFIAPI
> +SiliconPolicyDonePreMem(
> +  IN VOID *FspmUpd
> +)
> +{
> +  EFI_STATUS         Status;
> +
> +  Status = SpiServiceInit();
> +  ASSERT_EFI_ERROR(Status);
> +
> +  return RETURN_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP PEI Policy Pre-memory initialization.
> +
> +  @param[in] FspmUpdDataPtr       Pointer to FSPM UPD data.
> +**/
> +VOID
> +EFIAPI
> +FspPolicyInitPreMem (
> +  IN FSPM_UPD           *FspmUpdDataPtr
> +  )
> +{
> +  EFI_STATUS            Status;
> +
> +  //
> +  // SI Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSiPolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - SI Pei Fsp Policy in Pre-Memory
> Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // PCH Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspPchPolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - PCH Pei Fsp Policy in Pre-Memory
> Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // Cpu Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspCpuPolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - CPU Pei Fsp Policy in Pre-Memory
> Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // Security Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSecurityPolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - Security Pei Fsp Policy in
> Pre-Memory Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // ME Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspMePolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - ME Pei Fsp Policy in Pre-Memory
> Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // SystemAgent Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSaPolicyInitPreMem (FspmUpdDataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - SystemAgent Pei Fsp Policy in
> Pre-Memory Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // Other Upd Initialization
> +  //
> +  Status = PeiFspMiscUpdInitPreMem (FspmUpdDataPtr);
> +
> +}
> +
> +/**
> +  Performs FSP PEI Policy initialization.
> +
> +  @param[in][out] FspsUpd  Pointer UPD data region
> +
> +**/
> +VOID
> +EFIAPI
> +FspPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS            Status;
> +
> +  //
> +  // SI Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSiPolicyInit (FspsUpd);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - SI Pei Fsp Policy iInitialization fail,
> Status = %r\n", Status));
> +  }
> +
> +  //
> +  // PCH Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspPchPolicyInit (FspsUpd);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - PCH Pei Fsp Policy iInitialization fail,
> Status = %r\n", Status));
> +  }
> +
> +  //
> +  // ME Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspMePolicyInit (FspsUpd);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - ME Pei Fsp Policy Initialization fail,
> Status = %r\n", Status));
> +  }
> +
> +  //
> +  // SystemAgent Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSaPolicyInit (FspsUpd);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - SystemAgent Pei Fsp Policy
> Initialization fail, Status = %r\n", Status));
> +  }
> +
> +  //
> +  // Cpu Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspCpuPolicyInit (FspsUpd);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR - CPU Pei Fsp Policy Initialization fail,
> Status = %r\n", Status));
> +  }
> +
> +  //
> +  // Security Pei Fsp Policy Initialization
> +  //
> +  Status = PeiFspSecurityPolicyInit(FspsUpd);
> +  if (EFI_ERROR(Status)) {
> +    DEBUG((DEBUG_ERROR, "ERROR - Security Pei Fsp Policy Initialization
> fail, Status = %r\n", Status));
> +  }
> +
> +}
> +
> +/**
> +Performs silicon post-mem policy initialization.
> +
> +The meaning of Policy is defined by silicon code.
> +It could be the raw data, a handle, a PPI, etc.
> +
> +The returned data must be used as input data for
> SiliconPolicyDonePostMem(),
> +and SiliconPolicyUpdateLib.SiliconPolicyUpdatePostMem().
> +
> +1) In FSP path, the input Policy should be FspsUpd.
> +Value of FspsUpd has been initialized by FSP binary default value.
> +Only a subset of FspsUpd needs to be updated for different silicon sku.
> +The return data is same FspsUpd.
> +
> +2) In non-FSP path, the input policy could be NULL.
> +The return data is the initialized policy.
> +
> +@param[in, out] Policy       Pointer to policy.
> +
> +@return the initialized policy.
> +**/
> +VOID *
> +EFIAPI
> +SiliconPolicyInitPostMem(
> +  IN OUT VOID    *FspsUpd
> +)
> +{
> +  FspPolicyInit((FSPS_UPD *)FspsUpd);
> +  return FspsUpd;
> +}
> +
> +/*
> +The silicon post-mem policy is finalized.
> +Silicon code can do initialization based upon the policy data.
> +
> +The input Policy must be returned by SiliconPolicyInitPostMem().
> +
> +@param[in] Policy       Pointer to policy.
> +
> +@retval EFI_SUCCESS The policy is handled consumed by silicon code.
> +*/
> +EFI_STATUS
> +EFIAPI
> +SiliconPolicyDonePostMem(
> +  IN OUT VOID    *FspsUpd
> +)
> +{
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.h
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.h
> new file mode 100644
> index 0000000000..6b25f0763b
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.h
> @@ -0,0 +1,233 @@
> +/** @file
> +  Internal header file for Fsp Policy Initialization Library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_FSP_POLICY_INIT_LIB_H_
> +#define _PEI_FSP_POLICY_INIT_LIB_H_
> +
> +#include <PiPei.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesLib.h>
> +
> +#include <FspEas.h>
> +#include <FspmUpd.h>
> +#include <FspsUpd.h>
> +#include <Setup.h>
> +
> +/**
> +  Performs FSP SI PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSiPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +/**
> +  Performs FSP SI PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSiPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  );
> +
> +/**
> +  Performs FSP PCH PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +/**
> +  Performs FSP PCH PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyInit (
> +  IN OUT FSPS_UPD     *FspsUpd
> +  );
> +
> +/**
> +  Performs FSP CPU PEI Policy initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspCpuPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +/**
> +Performs FSP Security PEI Policy initialization.
> +
> +@param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +@retval          EFI_SUCCESS         FSP UPD Data is updated.
> +@retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +@retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSecurityPolicyInitPreMem(
> +IN OUT FSPM_UPD    *FspmUpd
> +);
> +
> +/**
> +  Performs FSP ME PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMePolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +/**
> +  Performs FSP ME PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMePolicyInit (
> +  IN OUT FSPS_UPD     *FspsUpd
> +  );
> +
> +/**
> +  Performs FSP SA PEI Policy initialization in pre-memory.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +/**
> +  Performs FSP SA PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  );
> +
> +/**
> +  Performs FSP CPU PEI Policy post memory initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspCpuPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  );
> +
> +/**
> +Performs FSP Security PEI Policy post memory initialization.
> +
> +@param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +@retval          EFI_SUCCESS         FSP UPD Data is updated.
> +@retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +@retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSecurityPolicyInit(
> +IN OUT FSPS_UPD    *FspsUpd
> +);
> +
> +/**
> +  PeiGetSectionFromFv finds the file in FV and gets file Address and Size
> +
> +  @param[in] NameGuid              - File GUID
> +  @param[out] Address              - Pointer to the File Address
> +  @param[out] Size                 - Pointer to File Size
> +
> +  @retval EFI_SUCCESS                Successfull in reading the section
> from FV
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiGetSectionFromFv (
> +  IN CONST  EFI_GUID        NameGuid,
> +  OUT VOID                  **Address,
> +  OUT UINT32               *Size
> +  );
> +
> +/**
> +  Performs FSP Misc UPD initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSPM_UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMiscUpdInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +#endif // _PEI_FSP_POLICY_INIT_LIB_H_
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.inf
> new file mode 100644
> index 0000000000..b92653b975
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspPolicyInitLib.inf
> @@ -0,0 +1,162 @@
> +## @file
> +# Library functions for Fsp Policy Initialization Library.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +###############################################################
> #################
> +#
> +# Defines Section - statements that will be processed to create a Makefile.
> +#
> +###############################################################
> #################
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = PeiFspPolicyInitLib
> +  FILE_GUID                      =
> 2CB87D67-D1A4-4CD3-8CD7-91A1FA1DF6E0
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = SiliconPolicyInitLib
> +
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32
> +#
> +
> +###############################################################
> #################
> +#
> +# Sources Section - list of files that are required for the build to succeed.
> +#
> +###############################################################
> #################
> +
> +[Sources]
> +  PeiFspPolicyInitLib.c
> +  PeiFspSiPolicyInitLib.c
> +  PeiFspPchPolicyInitLib.c
> +  PeiFspCpuPolicyInitLib.c
> +  PeiFspMePolicyInitLib.c
> +  PeiFspSaPolicyInitLib.c
> +  PeiFspSecurityPolicyInitLib.c
> +  PeiFspMiscUpdInitLib.c
> +
> +###############################################################
> #################
> +#
> +# Package Dependency Section - list of Package files that are required for
> +#                              this module.
> +#
> +###############################################################
> #################
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  IntelFsp2Pkg/IntelFsp2Pkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  CometLakeFspBinPkg/CometLake1/CometLakeFspBinPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  DebugLib
> +  IoLib
> +  PeiServicesLib
> +  SmbusLib
> +  ConfigBlockLib
> +  PcdLib
> +  MemoryAllocationLib
> +  PchInfoLib
> +  SpiLib
> +
> +[Pcd]
> +  gSiPkgTokenSpaceGuid.PcdTsegSize
> +  gSiPkgTokenSpaceGuid.PcdSmbusBaseAddress
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompResistor
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompTarget
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqByteMap
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqByteMapSize
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqsMapCpu2Dram
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqsMapCpu2DramSize
> ## CONSUMES
> +  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase
> ## CONSUMES
> +  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize
> ## CONSUMES
> +  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize
> ## CONSUMES
> +  gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedBufferSize
> ## CONSUMES
> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode
> ## CONSUMES
> +
> +[Ppis]
> +  gSiPolicyPpiGuid                        ## CONSUMES
> +  gSiPreMemPolicyPpiGuid                  ## CONSUMES
> +  gEfiSecPlatformInformation2PpiGuid      ## CONSUMES
> +  gEfiSecPlatformInformationPpiGuid       ## CONSUMES
> +
> +[Guids]
> +  gPchTraceHubPreMemConfigGuid            ## CONSUMES
> +  gSmbusPreMemConfigGuid                  ## CONSUMES
> +  gDciPreMemConfigGuid                    ## CONSUMES
> +  gPcieRpPreMemConfigGuid                 ## CONSUMES
> +  gHdAudioPreMemConfigGuid                ## CONSUMES
> +  gIshPreMemConfigGuid                    ## CONSUMES
> +  gHsioPciePreMemConfigGuid               ## CONSUMES
> +  gHsioSataPreMemConfigGuid               ## CONSUMES
> +  gLpcPreMemConfigGuid                    ## CONSUMES
> +  gPchGeneralPreMemConfigGuid             ## CONSUMES
> +  gWatchDogPreMemConfigGuid               ## CONSUMES
> +  gLanConfigGuid                          ## CONSUMES
> +  gPcieRpConfigGuid                       ## CONSUMES
> +  gSataConfigGuid                         ## CONSUMES
> +  gHdAudioConfigGuid                      ## CONSUMES
> +  gScsConfigGuid                          ## CONSUMES
> +  gIshConfigGuid                          ## CONSUMES
> +  gSataConfigGuid                         ## CONSUMES
> +  gUsbConfigGuid                          ## CONSUMES
> +  gSerialIoConfigGuid                     ## CONSUMES
> +  gInterruptConfigGuid                    ## CONSUMES
> +  gLockDownConfigGuid                     ## CONSUMES
> +  gSaMiscPeiPreMemConfigGuid              ## PRODUCES
> +  gSaMiscPeiConfigGuid                    ## PRODUCES
> +  gMemoryConfigGuid                       ## CONSUMES
> +  gMemoryConfigNoCrcGuid                  ## CONSUMES
> +  gSwitchableGraphicsConfigGuid           ## CONSUMES
> +  gGraphicsPeiPreMemConfigGuid            ## CONSUMES
> +  gSaPciePeiPreMemConfigGuid              ## CONSUMES
> +  gSaMiscPeiConfigGuid                    ## CONSUMES
> +  gSaPciePeiConfigGuid                    ## CONSUMES
> +  gGraphicsPeiConfigGuid                  ## CONSUMES
> +  gCpuTraceHubConfigGuid                  ## CONSUMES
> +  gIpuPreMemConfigGuid                    ## CONSUMES
> +  gCnviConfigGuid                         ## CONSUMES
> +  gHsioConfigGuid                         ## CONSUMES
> +  gEspiConfigGuid                         ## CONSUMES
> +  gGnaConfigGuid                          ## CONSUMES
> +  gVtdConfigGuid                          ## CONSUMES
> +  gSaOverclockingPreMemConfigGuid         ## CONSUMES
> +  gMePeiPreMemConfigGuid                  ## CONSUMES
> +  gMePeiConfigGuid                        ## CONSUMES
> +  gDmiConfigGuid                          ## CONSUMES
> +  gFlashProtectionConfigGuid              ## CONSUMES
> +  gIoApicConfigGuid                       ## CONSUMES
> +  gPmConfigGuid                           ## CONSUMES
> +  gP2sbConfigGuid                         ## CONSUMES
> +  gPchGeneralConfigGuid                   ## CONSUMES
> +  gSerialIrqConfigGuid                    ## CONSUMES
> +  gThermalConfigGuid                      ## CONSUMES
> +  gCpuSecurityPreMemConfigGuid            ## CONSUMES
> +  gCpuConfigGuid                          ## CONSUMES
> +  gCpuOverclockingPreMemConfigGuid        ## CONSUMES
> +  gCpuConfigLibPreMemConfigGuid           ## CONSUMES
> +  gCpuPowerMgmtBasicConfigGuid            ## CONSUMES
> +  gCpuPowerMgmtCustomConfigGuid           ## CONSUMES
> +  gCpuTestConfigGuid                      ## CONSUMES
> +  gCpuPidTestConfigGuid                   ## CONSUMES
> +  gCpuPowerMgmtTestConfigGuid             ## CONSUMES
> +  gFspNonVolatileStorageHobGuid           ## CONSUMES
> +  gSmramCpuDataHeaderGuid                 ## CONSUMES
> +  gFspReservedMemoryResourceHobTsegGuid   ## CONSUMES
> +  gSiConfigGuid                           ## CONSUMES
> +  gDebugConfigHobGuid                     ## CONSUMES
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSaPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSaPolicyInitLib.c
> new file mode 100644
> index 0000000000..45d76ad5e4
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSaPolicyInitLib.c
> @@ -0,0 +1,848 @@
> +/** @file
> +  Implementation of Fsp SA Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +
> +#include <Ppi/SiPolicy.h>
> +#include <ConfigBlock/MemoryConfig.h>
> +#include <Library/IoLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/SmbusLib.h>
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/PcdLib.h>
> +
> +#include <IndustryStandard/Pci.h>
> +#include <PchAccess.h>
> +#include <Ppi/FirmwareVolume.h>
> +#include <Pi/PiFirmwareFile.h>
> +#include <Pi/PiPeiCis.h>
> +#include <Core/Pei/PeiMain.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +#define MAX_SPD_PAGE_COUNT           (2)
> +#define MAX_SPD_PAGE_SIZE            (256)
> +#define MAX_SPD_SIZE                 (MAX_SPD_PAGE_SIZE *
> MAX_SPD_PAGE_COUNT)
> +#define SPD_PAGE_ADDRESS_0           (0x6C)
> +#define SPD_PAGE_ADDRESS_1           (0x6E)
> +#define SPD_DDR3_SDRAM_TYPE_OFFSET   (0x02)
> +#define SPD_DDR3_SDRAM_TYPE_NUMBER   (0x0B)
> +#define SPD_DDR4_SDRAM_TYPE_NUMBER   (0x0C)
> +#define SPD_LPDDR3_SDRAM_TYPE_NUMBER (0xF1)
> +#define SPD_JEDEC_LPDDR3_SDRAM_TYPE_NUMBER (0x0F)
> +#define XMP_ID_STRING                (0x4A0C)
> +#define SPD3_MANUF_START             (117)
> +#define SPD3_MANUF_END               (127)
> +#define SPD4_MANUF_START             (320)
> +#define SPD4_MANUF_END               (328)
> +#define SPDLP_MANUF_START            (320)
> +#define SPDLP_MANUF_END              (328)
> +
> +GLOBAL_REMOVE_IF_UNREFERENCED const SPD_OFFSET_TABLE
> mSpdDdr3Table[] = {
> +  {   0,               1,             (1 << SpdCold),},
> +  {   2,               2,             (1 << SpdCold) | (1 <<
> SpdFast),},
> +  {   3,              41,             (1 << SpdCold),},
> +  {  60,              63,             (1 << SpdCold),},
> +  { SPD3_MANUF_START, SPD3_MANUF_END, (1 << SpdCold) | (1 <<
> SpdFast),},
> +  { 128,             145,             (1 << SpdCold),},
> +  {  39,              59,             (1 << SpdCold),},
> +  {  64,             125,             (1 << SpdCold),},
> +  { 176,             179,             (1 << SpdCold),},
> +  { 180,             184,             (1 << SpdCold),},
> +  { 185,             215,             (1 << SpdCold),},
> +  { 220,             250,             (1 << SpdCold),},
> +};
> +
> +GLOBAL_REMOVE_IF_UNREFERENCED const SPD_OFFSET_TABLE
> mSpdDdr4Table[] = {
> +  {   0,               1,             (1 << SpdCold),},
> +  {   2,               2,             (1 << SpdCold) | (1 <<
> SpdFast),},
> +  {   3,              40,             (1 << SpdCold),},
> +  { 117,             131,             (1 << SpdCold),},
> +  { SPD4_MANUF_START, SPD4_MANUF_END, (1 << SpdCold) | (1 <<
> SpdFast),},
> +  { 329,             348,             (1 << SpdCold),},
> +  {  32,             119,             (1 << SpdCold),},
> +  { 126,             255,             (1 << SpdCold),},
> +  { 349,             383,             (1 << SpdCold),},
> +  { 384,             387,             (1 << SpdCold),},
> +  { 388,             389,             (1 << SpdCold),},
> +  { 393,             431,             (1 << SpdCold),},
> +  { 440,             478,             (1 << SpdCold),},
> +};
> +
> +GLOBAL_REMOVE_IF_UNREFERENCED const SPD_OFFSET_TABLE
> mSpdLpddrTable[] = {
> +  {   0,               1,               (1 << SpdCold),},
> +  {   2,               2,               (1 << SpdCold) | (1 <<
> SpdFast),},
> +  {   3,              32,               (1 << SpdCold),},
> +  { 120,             130,               (1 << SpdCold),},
> +  { SPDLP_MANUF_START, SPDLP_MANUF_END, (1 << SpdCold) | (1 <<
> SpdFast),},
> +  { 329,             348,               (1 << SpdCold),},
> +  {  31,             121,               (1 << SpdCold),},
> +  { 126,             255,               (1 << SpdCold),},
> +  { 349,             383,               (1 << SpdCold),},
> +  { 384,             387,               (1 << SpdCold),},
> +  { 388,             389,               (1 << SpdCold),},
> +  { 393,             431,               (1 << SpdCold),},
> +  { 440,             478,               (1 << SpdCold),},
> +};
> +
> +
> +/**
> +  Update Spd Data
> +
> +  @param[in][out] FspmUpd              Pointer to FSP UPD Data.
> +  @param[in]      MemConfigNoCrc       Pointer to Mem Config No
> Crc.
> +  @param[in]      MiscPeiPreMemConfig  Pointer to Misc Config.
> +
> +  @retval         EFI_SUCCESS          The function completes
> successfully
> +  @retval         Other                The function fail
> +**/
> +VOID
> +EFIAPI
> +InternalUpdateSpdInfo (
> +  IN OUT FSPM_UPD               *FspmUpd,
> +  IN MEMORY_CONFIG_NO_CRC       *MemConfigNoCrc,
> +  IN SA_MISC_PEI_PREMEM_CONFIG  *MiscPeiPreMemConfig
> +  )
> +{
> +
> +  DEBUG ((DEBUG_INFO, "Updating UPD:Memory Spd Pointers...\n"));
> +  if ((FspmUpd == NULL) || (MemConfigNoCrc == NULL) ||
> (MiscPeiPreMemConfig == NULL)) {
> +    DEBUG ((DEBUG_ERROR, "EFI_INVALID_PARAMETER.\n"));
> +    DEBUG ((DEBUG_ERROR, "Fail to access SPD from SiPolicyPpi\n"));
> +    return;
> +  }
> +
> +  //
> +  // Update MemorySpdPtrXX if SpdAddressTable is zero
> +  //
> +  if (MiscPeiPreMemConfig->SpdAddressTable[0] == 0x0) {
> +    FspmUpd->FspmConfig.MemorySpdPtr00 =
> (UINT32)MemConfigNoCrc->SpdData->SpdData;
> +  } else {
> +    FspmUpd->FspmConfig.SpdAddressTable[0] =
> MiscPeiPreMemConfig->SpdAddressTable[0];
> +  }
> +
> +  if (MiscPeiPreMemConfig->SpdAddressTable[1] == 0x0) {
> +    FspmUpd->FspmConfig.MemorySpdPtr01 =
> (UINT32)MemConfigNoCrc->SpdData->SpdData + (1 *
> SA_MC_MAX_SPD_SIZE);
> +  } else {
> +    FspmUpd->FspmConfig.SpdAddressTable[1] =
> MiscPeiPreMemConfig->SpdAddressTable[1];
> +  }
> +
> +  if (MiscPeiPreMemConfig->SpdAddressTable[2] == 0x0) {
> +    FspmUpd->FspmConfig.MemorySpdPtr10 =
> (UINT32)MemConfigNoCrc->SpdData->SpdData + (2 *
> SA_MC_MAX_SPD_SIZE);
> +  } else {
> +    FspmUpd->FspmConfig.SpdAddressTable[2] =
> MiscPeiPreMemConfig->SpdAddressTable[2];
> +  }
> +
> +  if (MiscPeiPreMemConfig->SpdAddressTable[3] == 0x0) {
> +    FspmUpd->FspmConfig.MemorySpdPtr11 =
> (UINT32)MemConfigNoCrc->SpdData->SpdData + (3 *
> SA_MC_MAX_SPD_SIZE);
> +  } else {
> +    FspmUpd->FspmConfig.SpdAddressTable[3] =
> MiscPeiPreMemConfig->SpdAddressTable[3];
> +  }
> +
> +  DEBUG ((DEBUG_INFO, "UPD:MemorySpdPtr Updated\n"));
> +}
> +
> +/**
> +  PeiGetSectionFromFv finds the file in FV and gets file Address and Size
> +
> +  @param[in] NameGuid              - File GUID
> +  @param[out] Address              - Pointer to the File Address
> +  @param[out] Size                 - Pointer to File Size
> +
> +  @retval EFI_SUCCESS                Successfull in reading the section
> from FV
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiGetSectionFromFv (
> +  IN CONST  EFI_GUID        NameGuid,
> +  OUT VOID                  **Address,
> +  OUT UINT32               *Size
> +  )
> +{
> +  EFI_STATUS  Status;
> +  EFI_PEI_FIRMWARE_VOLUME_PPI          *FvPpi;
> +  EFI_FV_FILE_INFO                     FvFileInfo;
> +  PEI_CORE_INSTANCE                    *PrivateData;
> +  UINTN                                CurrentFv;
> +  PEI_CORE_FV_HANDLE                   *CoreFvHandle;
> +  EFI_PEI_FILE_HANDLE                  VbtFileHandle;
> +  EFI_GUID                             *VbtGuid;
> +  EFI_COMMON_SECTION_HEADER            *Section;
> +  CONST EFI_PEI_SERVICES               **PeiServices;
> +
> +  PeiServices = GetPeiServicesTablePointer ();
> +
> +  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
> +
> +  Status = PeiServicesLocatePpi (
> +            &gEfiFirmwareFileSystem2Guid,
> +            0,
> +            NULL,
> +            (VOID **) &FvPpi
> +            );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  CurrentFv = PrivateData->CurrentPeimFvCount;
> +  CoreFvHandle = &(PrivateData->Fv[CurrentFv]);
> +
> +  Status = FvPpi->FindFileByName (FvPpi, &NameGuid,
> &CoreFvHandle->FvHandle, &VbtFileHandle);
> +  if (!EFI_ERROR(Status) && VbtFileHandle != NULL) {
> +
> +  DEBUG ((DEBUG_INFO, "Find SectionByType \n"));
> +
> +    Status = FvPpi->FindSectionByType (FvPpi, EFI_SECTION_RAW,
> VbtFileHandle, (VOID **) &VbtGuid);
> +    if (!EFI_ERROR (Status)) {
> +
> +    DEBUG ((DEBUG_INFO, "GetFileInfo \n"));
> +
> +      Status = FvPpi->GetFileInfo (FvPpi, VbtFileHandle, &FvFileInfo);
> +      Section = (EFI_COMMON_SECTION_HEADER *)FvFileInfo.Buffer;
> +
> +      if (IS_SECTION2 (Section)) {
> +        ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
> +        *Size = SECTION2_SIZE (Section) - sizeof
> (EFI_COMMON_SECTION_HEADER2);
> +        *Address = ((UINT8 *)Section + sizeof
> (EFI_COMMON_SECTION_HEADER2));
> +      } else {
> +        *Size = SECTION_SIZE (Section) - sizeof
> (EFI_COMMON_SECTION_HEADER);
> +        *Address = ((UINT8 *)Section + sizeof
> (EFI_COMMON_SECTION_HEADER));
> +      }
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP SA PEI Policy initialization in pre-memory.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  SA_MISC_PEI_PREMEM_CONFIG   *MiscPeiPreMemConfig;
> +  MEMORY_CONFIGURATION        *MemConfig;
> +  MEMORY_CONFIG_NO_CRC        *MemConfigNoCrc;
> +  SI_PREMEM_POLICY_PPI        *SiPreMemPolicyPpi;
> +  PCIE_PEI_PREMEM_CONFIG      *PciePeiPreMemConfig;
> +  SWITCHABLE_GRAPHICS_CONFIG  *SgGpioData;
> +  GRAPHICS_PEI_PREMEM_CONFIG  *GtPreMemConfig;
> +  OVERCLOCKING_PREMEM_CONFIG  *OcPreMemConfig;
> +  VTD_CONFIG                  *Vtd;
> +  IPU_PREMEM_CONFIG           *IpuPreMemPolicy;
> +  UINT8                       Index;
> +  VOID                        *Buffer;
> +
> +  SiPreMemPolicyPpi   = NULL;
> +  MiscPeiPreMemConfig = NULL;
> +  MemConfig           = NULL;
> +  MemConfigNoCrc      = NULL;
> +  PciePeiPreMemConfig = NULL;
> +  SgGpioData          = NULL;
> +  GtPreMemConfig      = NULL;
> +  OcPreMemConfig      = NULL;
> +  Vtd                 = NULL;
> +  IpuPreMemPolicy     = NULL;
> +
> +
> +
> +  //
> +  // Locate SiPreMemPolicyPpi
> +  //
> +  Status = PeiServicesLocatePpi(
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicyPpi
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +  if ((Status == EFI_SUCCESS) && (SiPreMemPolicyPpi != NULL)) {
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gMemoryConfigNoCrcGuid, (VOID *) &MemConfigNoCrc);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gMemoryConfigGuid, (VOID *) &MemConfig);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gGraphicsPeiPreMemConfigGuid, (VOID *) &GtPreMemConfig);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gSaPciePeiPreMemConfigGuid, (VOID *) &PciePeiPreMemConfig);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gSwitchableGraphicsConfigGuid, (VOID *) &SgGpioData);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gVtdConfigGuid,
> (VOID *) &Vtd);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gIpuPreMemConfigGuid, (VOID *) &IpuPreMemPolicy);
> +    ASSERT_EFI_ERROR (Status);
> +    Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gSaOverclockingPreMemConfigGuid, (VOID *) &OcPreMemConfig);
> +    ASSERT_EFI_ERROR (Status);
> +
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Updating Dq Byte Map and DQS Byte Swizzling
> Settings...\n"));
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcDqByteMap);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqByteMapCh0, Buffer, 12);
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqByteMapCh1, (UINT8*)
> Buffer + 12, 12);
> +  }
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcDqsMapCpu2Dram);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqsMapCpu2DramCh0,
> Buffer, 8);
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqsMapCpu2DramCh1,
> (UINT8*) Buffer + 8, 8);
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Updating Dq Pins Interleaved,Rcomp Resistor &
> Rcomp Target Settings...\n"));
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcRcompResistor);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.RcompResistor, Buffer, 6);
> +  }
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcRcompTarget);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.RcompTarget, Buffer, 10);
> +  }
> +
> +  //
> +  // Update UPD:MemorySpdPtrXX and SpdAddressTable
> +  //
> +  InternalUpdateSpdInfo (FspmUpd, MemConfigNoCrc,
> MiscPeiPreMemConfig);
> +
> +  //
> +  // Update UPD:MemorySpdDataLen
> +  //
> +  FspmUpd->FspmConfig.MemorySpdDataLen = SA_MC_MAX_SPD_SIZE;
> +
> +  if (MemConfigNoCrc != NULL) {
> +    //
> +    // Update UPD:PlatformMemorySize
> +    //
> +    //
> +    // @todo: This value is used since #183932. Revisit.
> +    //
> +    FspmUpd->FspmConfig.PlatformMemorySize  =
> MemConfigNoCrc->PlatformMemorySize;
> +    FspmUpd->FspmConfig.CleanMemory         = (UINT8)
> MemConfigNoCrc->CleanMemory;
> +    FspmUpd->FspmConfig.MemTestOnWarmBoot   = (UINT8)
> MemConfigNoCrc->MemTestOnWarmBoot;
> +  }
> +
> +  if (MemConfig != NULL) {
> +    //
> +    // Update UPD:DqPinsInterleaved
> +    //
> +    FspmUpd->FspmConfig.DqPinsInterleaved     = (UINT8)
> MemConfig->DqPinsInterleaved;
> +
> +    FspmUpd->FspmConfig.ProbelessTrace        =
> MemConfig->ProbelessTrace;
> +    FspmUpd->FspmConfig.GdxcIotSize           =
> MemConfig->GdxcIotSize;
> +    FspmUpd->FspmConfig.GdxcMotSize           =
> MemConfig->GdxcMotSize;
> +    FspmUpd->FspmConfig.DualDimmPerChannelBoardType =(UINT8)
> MemConfig->DualDimmPerChannelBoardType;
> +    FspmUpd->FspmConfig.Ddr4MixedUDimm2DpcLimit     =(UINT8)
> MemConfig->Ddr4MixedUDimm2DpcLimit;
> +    //
> +    // Update UPD:CaVrefConfig
> +    //
> +    FspmUpd->FspmConfig.CaVrefConfig          =
> MemConfig->CaVrefConfig;
> +    FspmUpd->FspmConfig.SaGv                  = MemConfig->SaGv;
> +    FspmUpd->FspmConfig.FreqSaGvLow           =
> MemConfig->FreqSaGvLow;
> +    FspmUpd->FspmConfig.RMT                   = (UINT8)
> MemConfig->RMT;
> +    FspmUpd->FspmConfig.DdrFreqLimit          =
> MemConfig->DdrFreqLimit;
> +
> +    FspmUpd->FspmConfig.SpdProfileSelected    =
> MemConfig->SpdProfileSelected;
> +    FspmUpd->FspmConfig.VddVoltage            =
> MemConfig->VddVoltage;
> +    FspmUpd->FspmConfig.RefClk                =
> MemConfig->RefClk;
> +    FspmUpd->FspmConfig.Ratio                 = MemConfig->Ratio;
> +    FspmUpd->FspmConfig.OddRatioMode          = (UINT8)
> MemConfig->OddRatioMode;
> +    FspmUpd->FspmConfig.tCL                   = (UINT8)
> MemConfig->tCL;
> +    FspmUpd->FspmConfig.tCWL                  = (UINT8)
> MemConfig->tCWL;
> +    FspmUpd->FspmConfig.tFAW                  =
> MemConfig->tFAW;
> +    FspmUpd->FspmConfig.tRAS                  = MemConfig->tRAS;
> +    FspmUpd->FspmConfig.tRCDtRP               = (UINT8)
> MemConfig->tRCDtRP;
> +    FspmUpd->FspmConfig.tREFI                 = MemConfig->tREFI;
> +    FspmUpd->FspmConfig.tRFC                  = MemConfig->tRFC;
> +    FspmUpd->FspmConfig.tRRD                  = (UINT8)
> MemConfig->tRRD;
> +    FspmUpd->FspmConfig.tRTP                  = (UINT8)
> MemConfig->tRTP;
> +    FspmUpd->FspmConfig.tWR                   = (UINT8)
> MemConfig->tWR;
> +    FspmUpd->FspmConfig.tWTR                  = (UINT8)
> MemConfig->tWTR;
> +    FspmUpd->FspmConfig.NModeSupport          =
> MemConfig->NModeSupport;
> +    FspmUpd->FspmConfig.DllBwEn0              =
> MemConfig->DllBwEn0;
> +    FspmUpd->FspmConfig.DllBwEn1              =
> MemConfig->DllBwEn1;
> +    FspmUpd->FspmConfig.DllBwEn2              =
> MemConfig->DllBwEn2;
> +    FspmUpd->FspmConfig.DllBwEn3              =
> MemConfig->DllBwEn3;
> +    FspmUpd->FspmConfig.MrcSafeConfig         = (UINT8)
> MemConfig->MrcSafeConfig; // Typecasting as MrcSafeConfig is of UINT32 in
> MEMORY_CONFIGURATION
> +    FspmUpd->FspmConfig.LpDdrDqDqsReTraining  = (UINT8)
> MemConfig->Lp4DqsOscEn;
> +    FspmUpd->FspmConfig.RmtPerTask            = (UINT8)
> MemConfig->RmtPerTask;
> +    FspmUpd->FspmConfig.TrainTrace            = (UINT8)
> MemConfig->TrainTrace;
> +    FspmUpd->FspmConfig.ScramblerSupport      = (UINT8)
> MemConfig->ScramblerSupport;
> +    FspmUpd->FspmConfig.SafeMode              = (UINT8)
> MemConfig->SafeMode;
> +
> +    //
> +    // Update UPD:SmramMask and DisableDimmChannel
> +    //
> +    FspmUpd->FspmConfig.SmramMask               =
> MemConfig->SmramMask;
> +    FspmUpd->FspmConfig.DisableDimmChannel0     =
> MemConfig->DisableDimmChannel[0];
> +    FspmUpd->FspmConfig.DisableDimmChannel1     =
> MemConfig->DisableDimmChannel[1];
> +    FspmUpd->FspmConfig.HobBufferSize           =
> MemConfig->HobBufferSize;
> +
> +    FspmUpd->FspmConfig.ECT                     = (UINT8)
> MemConfig->ECT;
> +    FspmUpd->FspmConfig.SOT                     = (UINT8)
> MemConfig->SOT;
> +    FspmUpd->FspmConfig.ERDMPRTC2D              = (UINT8)
> MemConfig->ERDMPRTC2D;
> +    FspmUpd->FspmConfig.RDMPRT                  = (UINT8)
> MemConfig->RDMPRT;
> +    FspmUpd->FspmConfig.RCVET                   = (UINT8)
> MemConfig->RCVET;
> +    FspmUpd->FspmConfig.JWRL                    = (UINT8)
> MemConfig->JWRL;
> +    FspmUpd->FspmConfig.EWRTC2D                 = (UINT8)
> MemConfig->EWRTC2D;
> +    FspmUpd->FspmConfig.ERDTC2D                 = (UINT8)
> MemConfig->ERDTC2D;
> +    FspmUpd->FspmConfig.WRTC1D                  = (UINT8)
> MemConfig->WRTC1D;
> +    FspmUpd->FspmConfig.WRVC1D                  = (UINT8)
> MemConfig->WRVC1D;
> +    FspmUpd->FspmConfig.RDTC1D                  = (UINT8)
> MemConfig->RDTC1D;
> +    FspmUpd->FspmConfig.DIMMODTT                = (UINT8)
> MemConfig->DIMMODTT;
> +    FspmUpd->FspmConfig.DIMMRONT                = (UINT8)
> MemConfig->DIMMRONT;
> +    FspmUpd->FspmConfig.WRSRT                   = (UINT8)
> MemConfig->WRSRT;
> +    FspmUpd->FspmConfig.RDODTT                  = (UINT8)
> MemConfig->RDODTT;
> +    FspmUpd->FspmConfig.RDEQT                   = (UINT8)
> MemConfig->RDEQT;
> +    FspmUpd->FspmConfig.RDAPT                   = (UINT8)
> MemConfig->RDAPT;
> +    FspmUpd->FspmConfig.WRTC2D                  = (UINT8)
> MemConfig->WRTC2D;
> +    FspmUpd->FspmConfig.RDTC2D                  = (UINT8)
> MemConfig->RDTC2D;
> +    FspmUpd->FspmConfig.WRVC2D                  = (UINT8)
> MemConfig->WRVC2D;
> +    FspmUpd->FspmConfig.RDVC2D                  = (UINT8)
> MemConfig->RDVC2D;
> +    FspmUpd->FspmConfig.CMDVC                   = (UINT8)
> MemConfig->CMDVC;
> +    FspmUpd->FspmConfig.LCT                     = (UINT8)
> MemConfig->LCT;
> +    FspmUpd->FspmConfig.RTL                     = (UINT8)
> MemConfig->RTL;
> +    FspmUpd->FspmConfig.TAT                     = (UINT8)
> MemConfig->TAT;
> +    FspmUpd->FspmConfig.RCVENC1D                = (UINT8)
> MemConfig->RCVENC1D;
> +    FspmUpd->FspmConfig.RMT                     = (UINT8)
> MemConfig->RMT;
> +    FspmUpd->FspmConfig.MEMTST                  = (UINT8)
> MemConfig->MEMTST;
> +    FspmUpd->FspmConfig.ALIASCHK                = (UINT8)
> MemConfig->ALIASCHK;
> +    FspmUpd->FspmConfig.RMC                     = (UINT8)
> MemConfig->RMC;
> +    FspmUpd->FspmConfig.WRDSUDT                 = (UINT8)
> MemConfig->WRDSUDT;
> +    FspmUpd->FspmConfig.EnBER                   = (UINT8)
> MemConfig->EnBER;
> +    FspmUpd->FspmConfig.EccSupport              = (UINT8)
> MemConfig->EccSupport;
> +    FspmUpd->FspmConfig.RemapEnable             = (UINT8)
> MemConfig->RemapEnable;
> +    FspmUpd->FspmConfig.ScramblerSupport        = (UINT8)
> MemConfig->ScramblerSupport;
> +    FspmUpd->FspmConfig.MrcFastBoot             = (UINT8)
> MemConfig->MrcFastBoot;
> +    FspmUpd->FspmConfig.RankInterleave          = (UINT8)
> MemConfig->RankInterleave;
> +    FspmUpd->FspmConfig.EnhancedInterleave      = (UINT8)
> MemConfig->EnhancedInterleave;
> +    FspmUpd->FspmConfig.MemoryTrace             = (UINT8)
> MemConfig->MemoryTrace;
> +    FspmUpd->FspmConfig.ChHashEnable            = (UINT8)
> MemConfig->ChHashEnable;
> +    FspmUpd->FspmConfig.EnableExtts             = (UINT8)
> MemConfig->EnableExtts;
> +    FspmUpd->FspmConfig.EnableCltm              = (UINT8)
> MemConfig->EnableCltm;
> +    FspmUpd->FspmConfig.EnableOltm              = (UINT8)
> MemConfig->EnableOltm;
> +    FspmUpd->FspmConfig.EnablePwrDn             = (UINT8)
> MemConfig->EnablePwrDn;
> +    FspmUpd->FspmConfig.EnablePwrDnLpddr        = (UINT8)
> MemConfig->EnablePwrDnLpddr;
> +    FspmUpd->FspmConfig.UserPowerWeightsEn      = (UINT8)
> MemConfig->UserPowerWeightsEn;
> +    FspmUpd->FspmConfig.RaplLim2Lock            = (UINT8)
> MemConfig->RaplLim2Lock;
> +    FspmUpd->FspmConfig.RaplLim2Ena             = (UINT8)
> MemConfig->RaplLim2Ena;
> +    FspmUpd->FspmConfig.RaplLim1Ena             = (UINT8)
> MemConfig->RaplLim1Ena;
> +    FspmUpd->FspmConfig.SrefCfgEna              = (UINT8)
> MemConfig->SrefCfgEna;
> +    FspmUpd->FspmConfig.ThrtCkeMinDefeatLpddr   = (UINT8)
> MemConfig->ThrtCkeMinDefeatLpddr;
> +    FspmUpd->FspmConfig.ThrtCkeMinDefeat        = (UINT8)
> MemConfig->ThrtCkeMinDefeat;
> +    FspmUpd->FspmConfig.RhPrevention            = (UINT8)
> MemConfig->RhPrevention;
> +    FspmUpd->FspmConfig.ExitOnFailure           = (UINT8)
> MemConfig->ExitOnFailure;
> +    FspmUpd->FspmConfig.DdrThermalSensor        = (UINT8)
> MemConfig->DdrThermalSensor;
> +    FspmUpd->FspmConfig.Ddr4DdpSharedClock      = (UINT8)
> MemConfig->Ddr4DdpSharedClock;
> +    FspmUpd->FspmConfig.Ddr4DdpSharedZq         = (UINT8)
> MemConfig->SharedZqPin;
> +    FspmUpd->FspmConfig.BClkFrequency           =
> MemConfig->BClkFrequency;
> +    FspmUpd->FspmConfig.ChHashInterleaveBit     =
> MemConfig->ChHashInterleaveBit;
> +    FspmUpd->FspmConfig.ChHashMask              =
> MemConfig->ChHashMask;
> +    FspmUpd->FspmConfig.EnergyScaleFact         =
> MemConfig->EnergyScaleFact;
> +    FspmUpd->FspmConfig.Idd3n                   =
> MemConfig->Idd3n;
> +    FspmUpd->FspmConfig.Idd3p                   =
> MemConfig->Idd3p;
> +    FspmUpd->FspmConfig.CMDSR                   = (UINT8)
> MemConfig->CMDSR;
> +    FspmUpd->FspmConfig.CMDDSEQ                 = (UINT8)
> MemConfig->CMDDSEQ;
> +    FspmUpd->FspmConfig.CMDNORM                 = (UINT8)
> MemConfig->CMDNORM;
> +    FspmUpd->FspmConfig.EWRDSEQ                 = (UINT8)
> MemConfig->EWRDSEQ;
> +    FspmUpd->FspmConfig.FreqSaGvLow             =
> MemConfig->FreqSaGvLow;
> +    FspmUpd->FspmConfig.RhActProbability        =
> MemConfig->RhActProbability;
> +    FspmUpd->FspmConfig.RaplLim2WindX           =
> MemConfig->RaplLim2WindX;
> +    FspmUpd->FspmConfig.RaplLim2WindY           =
> MemConfig->RaplLim2WindY;
> +    FspmUpd->FspmConfig.RaplLim1WindX           =
> MemConfig->RaplLim1WindX;
> +    FspmUpd->FspmConfig.RaplLim1WindY           =
> MemConfig->RaplLim1WindY;
> +    FspmUpd->FspmConfig.RaplLim2Pwr             =
> MemConfig->RaplLim2Pwr;
> +    FspmUpd->FspmConfig.RaplLim1Pwr             =
> MemConfig->RaplLim1Pwr;
> +    FspmUpd->FspmConfig.WarmThresholdCh0Dimm0   =
> MemConfig->WarmThresholdCh0Dimm0;
> +    FspmUpd->FspmConfig.WarmThresholdCh0Dimm1   =
> MemConfig->WarmThresholdCh0Dimm1;
> +    FspmUpd->FspmConfig.WarmThresholdCh1Dimm0   =
> MemConfig->WarmThresholdCh1Dimm0;
> +    FspmUpd->FspmConfig.WarmThresholdCh1Dimm1   =
> MemConfig->WarmThresholdCh1Dimm1;
> +    FspmUpd->FspmConfig.HotThresholdCh0Dimm0    =
> MemConfig->HotThresholdCh0Dimm0;
> +    FspmUpd->FspmConfig.HotThresholdCh0Dimm1    =
> MemConfig->HotThresholdCh0Dimm1;
> +    FspmUpd->FspmConfig.HotThresholdCh1Dimm0    =
> MemConfig->HotThresholdCh1Dimm0;
> +    FspmUpd->FspmConfig.HotThresholdCh1Dimm1    =
> MemConfig->HotThresholdCh1Dimm1;
> +    FspmUpd->FspmConfig.WarmBudgetCh0Dimm0      =
> MemConfig->WarmBudgetCh0Dimm0;
> +    FspmUpd->FspmConfig.WarmBudgetCh0Dimm1      =
> MemConfig->WarmBudgetCh0Dimm1;
> +    FspmUpd->FspmConfig.WarmBudgetCh1Dimm0      =
> MemConfig->WarmBudgetCh1Dimm0;
> +    FspmUpd->FspmConfig.WarmBudgetCh1Dimm1      =
> MemConfig->WarmBudgetCh1Dimm1;
> +    FspmUpd->FspmConfig.HotBudgetCh0Dimm0       =
> MemConfig->HotBudgetCh0Dimm0;
> +    FspmUpd->FspmConfig.HotBudgetCh0Dimm1       =
> MemConfig->HotBudgetCh0Dimm1;
> +    FspmUpd->FspmConfig.HotBudgetCh1Dimm0       =
> MemConfig->HotBudgetCh1Dimm0;
> +    FspmUpd->FspmConfig.HotBudgetCh1Dimm1       =
> MemConfig->HotBudgetCh1Dimm1;
> +    FspmUpd->FspmConfig.IdleEnergyCh0Dimm0      =
> MemConfig->IdleEnergyCh0Dimm0;
> +    FspmUpd->FspmConfig.IdleEnergyCh0Dimm1      =
> MemConfig->IdleEnergyCh0Dimm1;
> +    FspmUpd->FspmConfig.IdleEnergyCh1Dimm0      =
> MemConfig->IdleEnergyCh1Dimm0;
> +    FspmUpd->FspmConfig.IdleEnergyCh1Dimm1      =
> MemConfig->IdleEnergyCh1Dimm1;
> +    FspmUpd->FspmConfig.PdEnergyCh0Dimm0        =
> MemConfig->PdEnergyCh0Dimm0;
> +    FspmUpd->FspmConfig.PdEnergyCh0Dimm1        =
> MemConfig->PdEnergyCh0Dimm1;
> +    FspmUpd->FspmConfig.PdEnergyCh1Dimm0        =
> MemConfig->PdEnergyCh1Dimm0;
> +    FspmUpd->FspmConfig.PdEnergyCh1Dimm1        =
> MemConfig->PdEnergyCh1Dimm1;
> +    FspmUpd->FspmConfig.ActEnergyCh0Dimm0       =
> MemConfig->ActEnergyCh0Dimm0;
> +    FspmUpd->FspmConfig.ActEnergyCh0Dimm1       =
> MemConfig->ActEnergyCh0Dimm1;
> +    FspmUpd->FspmConfig.ActEnergyCh1Dimm0       =
> MemConfig->ActEnergyCh1Dimm0;
> +    FspmUpd->FspmConfig.ActEnergyCh1Dimm1       =
> MemConfig->ActEnergyCh1Dimm1;
> +    FspmUpd->FspmConfig.RdEnergyCh0Dimm0        =
> MemConfig->RdEnergyCh0Dimm0;
> +    FspmUpd->FspmConfig.RdEnergyCh0Dimm1        =
> MemConfig->RdEnergyCh0Dimm1;
> +    FspmUpd->FspmConfig.RdEnergyCh1Dimm0        =
> MemConfig->RdEnergyCh1Dimm0;
> +    FspmUpd->FspmConfig.RdEnergyCh1Dimm1        =
> MemConfig->RdEnergyCh1Dimm1;
> +    FspmUpd->FspmConfig.WrEnergyCh0Dimm0        =
> MemConfig->WrEnergyCh0Dimm0;
> +    FspmUpd->FspmConfig.WrEnergyCh0Dimm1        =
> MemConfig->WrEnergyCh0Dimm1;
> +    FspmUpd->FspmConfig.WrEnergyCh1Dimm0        =
> MemConfig->WrEnergyCh1Dimm0;
> +    FspmUpd->FspmConfig.WrEnergyCh1Dimm1        =
> MemConfig->WrEnergyCh1Dimm1;
> +    FspmUpd->FspmConfig.ThrtCkeMinTmr           =
> MemConfig->ThrtCkeMinTmr;
> +    FspmUpd->FspmConfig.CkeRankMapping          =
> MemConfig->CkeRankMapping;
> +    FspmUpd->FspmConfig.CaVrefConfig            =
> MemConfig->CaVrefConfig;
> +    FspmUpd->FspmConfig.RaplPwrFlCh1            =
> MemConfig->RaplPwrFlCh1;
> +    FspmUpd->FspmConfig.RaplPwrFlCh0            =
> MemConfig->RaplPwrFlCh0;
> +    FspmUpd->FspmConfig.EnCmdRate               =
> MemConfig->EnCmdRate;
> +    FspmUpd->FspmConfig.Refresh2X               =
> MemConfig->Refresh2X;
> +    FspmUpd->FspmConfig.EpgEnable               =
> MemConfig->EpgEnable;
> +    FspmUpd->FspmConfig.RhSolution              =
> MemConfig->RhSolution;
> +    FspmUpd->FspmConfig.UserThresholdEnable     =
> MemConfig->UserThresholdEnable;
> +    FspmUpd->FspmConfig.UserBudgetEnable        =
> MemConfig->UserBudgetEnable;
> +    FspmUpd->FspmConfig.TsodTcritMax            =
> MemConfig->TsodTcritMax;
> +    FspmUpd->FspmConfig.TsodEventMode           =
> MemConfig->TsodEventMode;
> +    FspmUpd->FspmConfig.TsodEventPolarity       =
> MemConfig->TsodEventPolarity;
> +    FspmUpd->FspmConfig.TsodCriticalEventOnly   =
> MemConfig->TsodCriticalEventOnly;
> +    FspmUpd->FspmConfig.TsodEventOutputControl  =
> MemConfig->TsodEventOutputControl;
> +    FspmUpd->FspmConfig.TsodAlarmwindowLockBit  =
> MemConfig->TsodAlarmwindowLockBit;
> +    FspmUpd->FspmConfig.TsodCriticaltripLockBit =
> MemConfig->TsodCriticaltripLockBit;
> +    FspmUpd->FspmConfig.TsodShutdownMode        =
> MemConfig->TsodShutdownMode;
> +    FspmUpd->FspmConfig.TsodThigMax             =
> MemConfig->TsodThigMax;
> +    FspmUpd->FspmConfig.TsodManualEnable        =
> MemConfig->TsodManualEnable;
> +    FspmUpd->FspmConfig.IsvtIoPort              =
> MemConfig->IsvtIoPort;
> +    FspmUpd->FspmConfig.ForceOltmOrRefresh2x    =
> MemConfig->ForceOltmOrRefresh2x;
> +    FspmUpd->FspmConfig.PwdwnIdleCounter        =
> MemConfig->PwdwnIdleCounter;
> +    FspmUpd->FspmConfig.CmdRanksTerminated      =
> MemConfig->CmdRanksTerminated;
> +    FspmUpd->FspmConfig.GdxcEnable              =
> MemConfig->GdxcEnable;
> +    FspmUpd->FspmConfig.RMTLoopCount            =
> MemConfig->RMTLoopCount;
> +
> +    // DDR4 Memory Timings
> +    FspmUpd->FspmTestConfig.tRRD_L = (UINT8) MemConfig->tRRD_L;
> +    FspmUpd->FspmTestConfig.tRRD_S = (UINT8) MemConfig->tRRD_S;
> +    FspmUpd->FspmTestConfig.tWTR_L = (UINT8) MemConfig->tWTR_L;
> +    FspmUpd->FspmTestConfig.tWTR_S = (UINT8) MemConfig->tWTR_S;
> +
> +    // TurnAround Timing
> +    // Read-to-Read
> +    FspmUpd->FspmTestConfig.tRd2RdSG = MemConfig->tRd2RdSG;
> +    FspmUpd->FspmTestConfig.tRd2RdDG = MemConfig->tRd2RdDG;
> +    FspmUpd->FspmTestConfig.tRd2RdDR = MemConfig->tRd2RdDR;
> +    FspmUpd->FspmTestConfig.tRd2RdDD = MemConfig->tRd2RdDD;
> +    // Write-to-Read
> +    FspmUpd->FspmTestConfig.tWr2RdSG = MemConfig->tWr2RdSG;
> +    FspmUpd->FspmTestConfig.tWr2RdDG = MemConfig->tWr2RdDG;
> +    FspmUpd->FspmTestConfig.tWr2RdDR = MemConfig->tWr2RdDR;
> +    FspmUpd->FspmTestConfig.tWr2RdDD = MemConfig->tWr2RdDD;
> +    // Write-to-Write
> +    FspmUpd->FspmTestConfig.tWr2WrSG = MemConfig->tWr2WrSG;
> +    FspmUpd->FspmTestConfig.tWr2WrDG = MemConfig->tWr2WrDG;
> +    FspmUpd->FspmTestConfig.tWr2WrDR = MemConfig->tWr2WrDR;
> +    FspmUpd->FspmTestConfig.tWr2WrDD = MemConfig->tWr2WrDD;
> +    // Read-to-Write
> +    FspmUpd->FspmTestConfig.tRd2WrSG = MemConfig->tRd2WrSG;
> +    FspmUpd->FspmTestConfig.tRd2WrDG = MemConfig->tRd2WrDG;
> +    FspmUpd->FspmTestConfig.tRd2WrDR = MemConfig->tRd2WrDR;
> +    FspmUpd->FspmTestConfig.tRd2WrDD = MemConfig->tRd2WrDD;
> +  }
> +
> +  if (MiscPeiPreMemConfig != NULL) {
> +    FspmUpd->FspmConfig.IedSize               =
> MiscPeiPreMemConfig->IedSize;
> +    FspmUpd->FspmConfig.UserBd                =
> MiscPeiPreMemConfig->UserBd;
> +    FspmUpd->FspmConfig.SgDelayAfterPwrEn     =
> MiscPeiPreMemConfig->SgDelayAfterPwrEn;
> +    FspmUpd->FspmConfig.SgDelayAfterHoldReset =
> MiscPeiPreMemConfig->SgDelayAfterHoldReset;
> +    FspmUpd->FspmConfig.MmioSize              =
> MiscPeiPreMemConfig->MmioSize;
> +    FspmUpd->FspmConfig.MmioSizeAdjustment    =
> MiscPeiPreMemConfig->MmioSizeAdjustment;
> +    FspmUpd->FspmConfig.TsegSize              =
> MiscPeiPreMemConfig->TsegSize;
> +
> +    FspmUpd->FspmTestConfig.SkipExtGfxScan           = (UINT8)
> MiscPeiPreMemConfig->SkipExtGfxScan;
> +    FspmUpd->FspmTestConfig.BdatEnable               = (UINT8)
> MiscPeiPreMemConfig->BdatEnable;
> +    FspmUpd->FspmTestConfig.BdatTestType             = (UINT8)
> MiscPeiPreMemConfig->BdatTestType;
> +    FspmUpd->FspmTestConfig.ScanExtGfxForLegacyOpRom = (UINT8)
> MiscPeiPreMemConfig->ScanExtGfxForLegacyOpRom;
> +    FspmUpd->FspmTestConfig.LockPTMregs              = (UINT8)
> MiscPeiPreMemConfig->LockPTMregs;
> +  }
> +
> +  if (Vtd != NULL) {
> +    FspmUpd->FspmConfig.X2ApicOptOut = (UINT8) Vtd->X2ApicOptOut;
> +    FspmUpd->FspmConfig.VtdBaseAddress[0] = Vtd->BaseAddress[0];
> +    FspmUpd->FspmConfig.VtdBaseAddress[1] = Vtd->BaseAddress[1];
> +    FspmUpd->FspmConfig.VtdBaseAddress[2] = Vtd->BaseAddress[2];
> +    FspmUpd->FspmTestConfig.VtdDisable = (UINT8) Vtd->VtdDisable;
> +  }
> +
> +  if (PciePeiPreMemConfig != NULL) {
> +    FspmUpd->FspmConfig.DmiGen3ProgramStaticEq = (UINT8)
> PciePeiPreMemConfig->DmiGen3ProgramStaticEq;
> +    FspmUpd->FspmConfig.Peg0Enable = (UINT8)
> PciePeiPreMemConfig->Peg0Enable;
> +    FspmUpd->FspmConfig.Peg1Enable = (UINT8)
> PciePeiPreMemConfig->Peg1Enable;
> +    FspmUpd->FspmConfig.Peg2Enable = (UINT8)
> PciePeiPreMemConfig->Peg2Enable;
> +    FspmUpd->FspmConfig.Peg3Enable = (UINT8)
> PciePeiPreMemConfig->Peg3Enable;
> +    FspmUpd->FspmConfig.Peg0MaxLinkSpeed = (UINT8)
> PciePeiPreMemConfig->Peg0MaxLinkSpeed;
> +    FspmUpd->FspmConfig.Peg1MaxLinkSpeed = (UINT8)
> PciePeiPreMemConfig->Peg1MaxLinkSpeed;
> +    FspmUpd->FspmConfig.Peg2MaxLinkSpeed = (UINT8)
> PciePeiPreMemConfig->Peg2MaxLinkSpeed;
> +    FspmUpd->FspmConfig.Peg3MaxLinkSpeed = (UINT8)
> PciePeiPreMemConfig->Peg3MaxLinkSpeed;
> +    FspmUpd->FspmConfig.Peg0MaxLinkWidth = (UINT8)
> PciePeiPreMemConfig->Peg0MaxLinkWidth;
> +    FspmUpd->FspmConfig.Peg1MaxLinkWidth = (UINT8)
> PciePeiPreMemConfig->Peg1MaxLinkWidth;
> +    FspmUpd->FspmConfig.Peg2MaxLinkWidth = (UINT8)
> PciePeiPreMemConfig->Peg2MaxLinkWidth;
> +    FspmUpd->FspmConfig.Peg3MaxLinkWidth = (UINT8)
> PciePeiPreMemConfig->Peg3MaxLinkWidth;
> +    FspmUpd->FspmConfig.Peg0PowerDownUnusedLanes = (UINT8)
> PciePeiPreMemConfig->Peg0PowerDownUnusedLanes;
> +    FspmUpd->FspmConfig.Peg1PowerDownUnusedLanes = (UINT8)
> PciePeiPreMemConfig->Peg1PowerDownUnusedLanes;
> +    FspmUpd->FspmConfig.Peg2PowerDownUnusedLanes = (UINT8)
> PciePeiPreMemConfig->Peg2PowerDownUnusedLanes;
> +    FspmUpd->FspmConfig.Peg3PowerDownUnusedLanes = (UINT8)
> PciePeiPreMemConfig->Peg3PowerDownUnusedLanes;
> +    FspmUpd->FspmConfig.InitPcieAspmAfterOprom = (UINT8)
> PciePeiPreMemConfig->InitPcieAspmAfterOprom;
> +    FspmUpd->FspmConfig.PegDisableSpreadSpectrumClocking = (UINT8)
> PciePeiPreMemConfig->PegDisableSpreadSpectrumClocking;
> +    for (Index = 0; Index < SA_DMI_MAX_LANE; Index++) {
> +      FspmUpd->FspmConfig.DmiGen3RootPortPreset[Index] =
> PciePeiPreMemConfig->DmiGen3RootPortPreset[Index];
> +      FspmUpd->FspmConfig.DmiGen3EndPointPreset[Index] =
> PciePeiPreMemConfig->DmiGen3EndPointPreset[Index];
> +      FspmUpd->FspmConfig.DmiGen3EndPointHint[Index] =
> PciePeiPreMemConfig->DmiGen3EndPointHint[Index];
> +    }
> +    for (Index = 0; Index < SA_DMI_MAX_BUNDLE; Index++) {
> +      FspmUpd->FspmConfig.DmiGen3RxCtlePeaking[Index] =
> PciePeiPreMemConfig->DmiGen3RxCtlePeaking[Index];
> +    }
> +    for (Index = 0; Index < SA_PEG_MAX_BUNDLE ; Index++) {
> +      FspmUpd->FspmConfig.PegGen3RxCtlePeaking[Index] =
> PciePeiPreMemConfig->PegGen3RxCtlePeaking[Index];
> +    }
> +    FspmUpd->FspmConfig.PegDataPtr = (UINT32)
> PciePeiPreMemConfig->PegDataPtr;
> +    CopyMem((VOID *)FspmUpd->FspmConfig.PegGpioData,
> &PciePeiPreMemConfig->PegGpioData, sizeof (PEG_GPIO_DATA));
> +    FspmUpd->FspmConfig.DmiDeEmphasis =
> PciePeiPreMemConfig->DmiDeEmphasis;
> +
> +    for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
> +      FspmUpd->FspmConfig.PegRootPortHPE[Index] =
> PciePeiPreMemConfig->PegRootPortHPE[Index];
> +    }
> +    FspmUpd->FspmTestConfig.DmiMaxLinkSpeed     = (UINT8)
> PciePeiPreMemConfig->DmiMaxLinkSpeed;
> +    FspmUpd->FspmTestConfig.DmiGen3EqPh2Enable  = (UINT8)
> PciePeiPreMemConfig->DmiGen3EqPh2Enable;
> +    FspmUpd->FspmTestConfig.DmiGen3EqPh3Method  = (UINT8)
> PciePeiPreMemConfig->DmiGen3EqPh3Method;
> +    FspmUpd->FspmTestConfig.Peg0Gen3EqPh2Enable = (UINT8)
> PciePeiPreMemConfig->Peg0Gen3EqPh2Enable;
> +    FspmUpd->FspmTestConfig.Peg1Gen3EqPh2Enable = (UINT8)
> PciePeiPreMemConfig->Peg1Gen3EqPh2Enable;
> +    FspmUpd->FspmTestConfig.Peg2Gen3EqPh2Enable = (UINT8)
> PciePeiPreMemConfig->Peg2Gen3EqPh2Enable;
> +    FspmUpd->FspmTestConfig.Peg3Gen3EqPh2Enable = (UINT8)
> PciePeiPreMemConfig->Peg3Gen3EqPh2Enable;
> +    FspmUpd->FspmTestConfig.Peg0Gen3EqPh3Method = (UINT8)
> PciePeiPreMemConfig->Peg0Gen3EqPh3Method;
> +    FspmUpd->FspmTestConfig.Peg1Gen3EqPh3Method = (UINT8)
> PciePeiPreMemConfig->Peg1Gen3EqPh3Method;
> +    FspmUpd->FspmTestConfig.Peg2Gen3EqPh3Method = (UINT8)
> PciePeiPreMemConfig->Peg2Gen3EqPh3Method;
> +    FspmUpd->FspmTestConfig.Peg3Gen3EqPh3Method = (UINT8)
> PciePeiPreMemConfig->Peg3Gen3EqPh3Method;
> +    FspmUpd->FspmTestConfig.PegGen3ProgramStaticEq = (UINT8)
> PciePeiPreMemConfig->PegGen3ProgramStaticEq;
> +    FspmUpd->FspmTestConfig.Gen3SwEqAlwaysAttempt = (UINT8)
> PciePeiPreMemConfig->Gen3SwEqAlwaysAttempt;
> +    FspmUpd->FspmTestConfig.Gen3SwEqNumberOfPresets = (UINT8)
> PciePeiPreMemConfig->Gen3SwEqNumberOfPresets;
> +    FspmUpd->FspmTestConfig.Gen3SwEqEnableVocTest = (UINT8)
> PciePeiPreMemConfig->Gen3SwEqEnableVocTest;
> +    FspmUpd->FspmTestConfig.PegRxCemTestingMode = (UINT8)
> PciePeiPreMemConfig->PegRxCemTestingMode;
> +    FspmUpd->FspmTestConfig.PegRxCemLoopbackLane = (UINT8)
> PciePeiPreMemConfig->PegRxCemLoopbackLane;
> +    FspmUpd->FspmTestConfig.PegGenerateBdatMarginTable = (UINT8)
> PciePeiPreMemConfig->PegGenerateBdatMarginTable;
> +    FspmUpd->FspmTestConfig.PegRxCemNonProtocolAwareness = (UINT8)
> PciePeiPreMemConfig->PegRxCemNonProtocolAwareness;
> +    FspmUpd->FspmTestConfig.PegGen3RxCtleOverride = (UINT8)
> PciePeiPreMemConfig->PegGen3RxCtleOverride;
> +    for (Index = 0; Index < SA_PEG_MAX_LANE; Index++) {
> +      FspmUpd->FspmTestConfig.PegGen3RootPortPreset[Index] =
> PciePeiPreMemConfig->PegGen3RootPortPreset[Index];
> +      FspmUpd->FspmTestConfig.PegGen3EndPointPreset[Index] =
> PciePeiPreMemConfig->PegGen3EndPointPreset[Index];
> +      FspmUpd->FspmTestConfig.PegGen3EndPointHint[Index] =
> PciePeiPreMemConfig->PegGen3EndPointHint[Index];
> +    }
> +    FspmUpd->FspmTestConfig.Gen3SwEqJitterDwellTime =
> PciePeiPreMemConfig->Gen3SwEqJitterDwellTime;
> +    FspmUpd->FspmTestConfig.Gen3SwEqJitterErrorTarget =
> PciePeiPreMemConfig->Gen3SwEqJitterErrorTarget;
> +    FspmUpd->FspmTestConfig.Gen3SwEqVocDwellTime =
> PciePeiPreMemConfig->Gen3SwEqVocDwellTime;
> +    FspmUpd->FspmTestConfig.Gen3SwEqVocErrorTarget =
> PciePeiPreMemConfig->Gen3SwEqVocErrorTarget;
> +  }
> +
> +  if (GtPreMemConfig != NULL) {
> +    FspmUpd->FspmConfig.PrimaryDisplay = (UINT8)
> GtPreMemConfig->PrimaryDisplay;
> +    FspmUpd->FspmConfig.InternalGfx = (UINT8)
> GtPreMemConfig->InternalGraphics;
> +    FspmUpd->FspmConfig.IgdDvmt50PreAlloc = (UINT8)
> GtPreMemConfig->IgdDvmt50PreAlloc;
> +    FspmUpd->FspmConfig.ApertureSize = (UINT8)
> GtPreMemConfig->ApertureSize;
> +    FspmUpd->FspmConfig.GttMmAdr = GtPreMemConfig->GttMmAdr;
> +    FspmUpd->FspmConfig.GmAdr = GtPreMemConfig->GmAdr;
> +    FspmUpd->FspmConfig.GttSize = GtPreMemConfig->GttSize;
> +    FspmUpd->FspmConfig.PsmiRegionSize = (UINT8)
> GtPreMemConfig->PsmiRegionSize;
> +    FspmUpd->FspmConfig.GtPsmiSupport =
> (UINT8)GtPreMemConfig->GtPsmiSupport;
> +    FspmUpd->FspmTestConfig.PanelPowerEnable = (UINT8)
> GtPreMemConfig->PanelPowerEnable;
> +    FspmUpd->FspmTestConfig.DeltaT12PowerCycleDelayPreMem =
> (UINT16) GtPreMemConfig->DeltaT12PowerCycleDelayPreMem;
> +  }
> +
> +  if (SgGpioData != NULL) {
> +    CopyMem((VOID *) FspmUpd->FspmConfig.SaRtd3Pcie0Gpio,
> &SgGpioData->SaRtd3Pcie0Gpio, sizeof (SA_PCIE_RTD3_GPIO));
> +    CopyMem((VOID *) FspmUpd->FspmConfig.SaRtd3Pcie1Gpio,
> &SgGpioData->SaRtd3Pcie1Gpio, sizeof (SA_PCIE_RTD3_GPIO));
> +    CopyMem((VOID *) FspmUpd->FspmConfig.SaRtd3Pcie2Gpio,
> &SgGpioData->SaRtd3Pcie2Gpio, sizeof (SA_PCIE_RTD3_GPIO));
> +    FspmUpd->FspmConfig.RootPortIndex = SgGpioData->RootPortIndex;
> +  }
> +
> +  if (IpuPreMemPolicy != NULL) {
> +    FspmUpd->FspmConfig.SaIpuEnable = (UINT8)
> IpuPreMemPolicy->SaIpuEnable;
> +    FspmUpd->FspmConfig.SaIpuImrConfiguration = (UINT8)
> IpuPreMemPolicy->SaIpuImrConfiguration;
> +  }
> +
> +  if (OcPreMemConfig != NULL) {
> +    FspmUpd->FspmConfig.SaOcSupport = (UINT8)
> OcPreMemConfig->OcSupport;
> +    FspmUpd->FspmConfig.RealtimeMemoryTiming = (UINT8)
> OcPreMemConfig->RealtimeMemoryTiming;
> +    FspmUpd->FspmConfig.GtVoltageMode = (UINT8)
> OcPreMemConfig->GtVoltageMode;
> +    FspmUpd->FspmConfig.GtMaxOcRatio =
> OcPreMemConfig->GtMaxOcRatio;
> +    FspmUpd->FspmConfig.GtVoltageOffset =
> OcPreMemConfig->GtVoltageOffset;
> +    FspmUpd->FspmConfig.GtVoltageOverride =
> OcPreMemConfig->GtVoltageOverride;
> +    FspmUpd->FspmConfig.GtExtraTurboVoltage =
> OcPreMemConfig->GtExtraTurboVoltage;
> +    FspmUpd->FspmConfig.SaVoltageOffset =
> OcPreMemConfig->SaVoltageOffset;
> +    FspmUpd->FspmConfig.GtusMaxOcRatio =
> OcPreMemConfig->GtusMaxOcRatio;
> +    FspmUpd->FspmConfig.GtusVoltageMode = (UINT8)
> OcPreMemConfig->GtusVoltageMode;
> +    FspmUpd->FspmConfig.GtusVoltageOffset =
> OcPreMemConfig->GtusVoltageOffset;
> +    FspmUpd->FspmConfig.GtusVoltageOverride =
> OcPreMemConfig->GtusVoltageOverride;
> +    FspmUpd->FspmConfig.GtusExtraTurboVoltage =
> OcPreMemConfig->GtusExtraTurboVoltage;
> +  }
> +
> +
> +
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Performs FSP SA PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS                Status;
> +  SI_POLICY_PPI             *SiPolicyPpi;
> +  SA_MISC_PEI_CONFIG        *MiscPeiConfig;
> +  GRAPHICS_PEI_CONFIG       *GtConfig;
> +  PCIE_PEI_CONFIG           *PciePeiConfig;
> +  GNA_CONFIG                *GnaConfig;
> +  UINT8                     Index;
> +  EFI_BOOT_MODE             BootMode;
> +
> +  MiscPeiConfig = NULL;
> +  GtConfig      = NULL;
> +  PciePeiConfig = NULL;
> +  GnaConfig     = NULL;
> +
> +  //
> +  // @todo This could be cleared up after FSP provides ExitBootServices
> NotifyPhase.
> +  //
> +  Status = PeiServicesGetBootMode (&BootMode);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Locate SiPolicyPpi
> +  //
> +  SiPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi(
> +             &gSiPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **)&SiPolicyPpi
> +             );
> +  if ((Status == EFI_SUCCESS) && (SiPolicyPpi != NULL)) {
> +    MiscPeiConfig = NULL;
> +    Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid,
> (VOID *) &MiscPeiConfig);
> +    ASSERT_EFI_ERROR (Status);
> +
> +    GtConfig = NULL;
> +    Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid,
> (VOID *) &GtConfig);
> +    ASSERT_EFI_ERROR (Status);
> +
> +    GnaConfig = NULL;
> +    Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gGnaConfigGuid, (VOID
> *) &GnaConfig);
> +    ASSERT_EFI_ERROR (Status);
> +
> +    PciePeiConfig = NULL;
> +    Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaPciePeiConfigGuid,
> (VOID *) &PciePeiConfig);
> +    ASSERT_EFI_ERROR (Status);
> +
> +  }
> +
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Wrapper
> UpdatePeiSaPolicy\n"));
> +
> +
> +  if (MiscPeiConfig != NULL) {
> +    FspsUpd->FspsConfig.Device4Enable = (UINT8)
> MiscPeiConfig->Device4Enable;
> +    FspsUpd->FspsConfig.CridEnable = (UINT8) MiscPeiConfig->CridEnable;
> +    FspsUpd->FspsTestConfig.ChapDeviceEnable = (UINT8)
> MiscPeiConfig->ChapDeviceEnable;
> +    FspsUpd->FspsTestConfig.SkipPamLock = (UINT8)
> MiscPeiConfig->SkipPamLock;
> +    FspsUpd->FspsTestConfig.EdramTestMode = (UINT8)
> MiscPeiConfig->EdramTestMode;
> +  }
> +
> +  if (PciePeiConfig != NULL) {
> +    FspsUpd->FspsConfig.DmiAspm = (UINT8) PciePeiConfig->DmiAspm;
> +    FspsUpd->FspsTestConfig.DmiExtSync = (UINT8)
> PciePeiConfig->DmiExtSync;
> +    FspsUpd->FspsTestConfig.DmiIot = (UINT8) PciePeiConfig->DmiIot;
> +    for (Index = 0; Index < SA_PEG_MAX_FUN; Index++) {
> +      FspsUpd->FspsConfig.PegDeEmphasis[Index] =
> PciePeiConfig->PegDeEmphasis[Index];
> +      FspsUpd->FspsConfig.PegSlotPowerLimitValue[Index] =
> PciePeiConfig->PegSlotPowerLimitValue[Index];
> +      FspsUpd->FspsConfig.PegSlotPowerLimitScale[Index] =
> PciePeiConfig->PegSlotPowerLimitScale[Index];
> +      FspsUpd->FspsConfig.PegPhysicalSlotNumber[Index] =
> PciePeiConfig->PegPhysicalSlotNumber[Index];
> +      FspsUpd->FspsTestConfig.PegMaxPayload[Index] =
> PciePeiConfig->PegMaxPayload[Index];
> +    }
> +  }
> +
> +  if (GtConfig != NULL) {
> +    FspsUpd->FspsConfig.PavpEnable = (UINT8) GtConfig->PavpEnable;
> +    FspsUpd->FspsConfig.CdClock = (UINT8) GtConfig->CdClock;
> +    FspsUpd->FspsTestConfig.RenderStandby = (UINT8)
> GtConfig->RenderStandby;
> +    FspsUpd->FspsTestConfig.PmSupport = (UINT8) GtConfig->PmSupport;
> +    FspsUpd->FspsTestConfig.CdynmaxClampEnable = (UINT8)
> GtConfig->CdynmaxClampEnable;
> +    FspsUpd->FspsTestConfig.GtFreqMax = (UINT8) GtConfig->GtFreqMax;
> +    FspsUpd->FspsTestConfig.DisableTurboGt = (UINT8)
> GtConfig->DisableTurboGt;
> +    FspsUpd->FspsConfig.SkipS3CdClockInit =
> (UINT8)GtConfig->SkipS3CdClockInit;
> +
> +    //
> +    // For FSP, FspsUpd->FspsConfig.PeiGraphicsPeimInit is always enabled
> as default.
> +    //
> +    FspsUpd->FspsConfig.PeiGraphicsPeimInit = (UINT8)
> GtConfig->PeiGraphicsPeimInit; // SA: InternalOnly: For Internal validation we
> still need to enable both Enable/Disable Cases
> +
> +    //
> +    // Update UPD: VBT & LogoPtr
> +    //
> +    if (BootMode == BOOT_ON_S3_RESUME) {
> +      FspsUpd->FspsConfig.GraphicsConfigPtr = (UINT32) NULL;
> +    } else {
> +      FspsUpd->FspsConfig.GraphicsConfigPtr = (UINT32)
> GtConfig->GraphicsConfigPtr;
> +    }
> +    DEBUG(( DEBUG_INFO, "VbtPtr from GraphicsPeiConfig is 0x%x\n",
> FspsUpd->FspsConfig.GraphicsConfigPtr));
> +
> +    FspsUpd->FspsConfig.LogoPtr  = (UINT32) GtConfig->LogoPtr;
> +    FspsUpd->FspsConfig.LogoSize = GtConfig->LogoSize;
> +    DEBUG(( DEBUG_INFO, "LogoPtr from PeiFspSaPolicyInit
> GraphicsPeiConfig is 0x%x\n", FspsUpd->FspsConfig.LogoPtr));
> +    DEBUG(( DEBUG_INFO, "LogoSize from PeiFspSaPolicyInit
> GraphicsPeiConfig is 0x%x\n", FspsUpd->FspsConfig.LogoSize));
> +
> +    FspsUpd->FspsConfig.BltBufferAddress  = (UINT32)
> GtConfig->BltBufferAddress;
> +    FspsUpd->FspsConfig.BltBufferSize     = (UINT32)
> GtConfig->BltBufferSize;
> +
> +    //
> +    // Update DDI/DDC configuration
> +    //
> +    FspsUpd->FspsConfig.DdiPortEdp =
> GtConfig->DdiConfiguration.DdiPortEdp;
> +    FspsUpd->FspsConfig.DdiPortBHpd =
> GtConfig->DdiConfiguration.DdiPortBHpd;
> +    FspsUpd->FspsConfig.DdiPortCHpd =
> GtConfig->DdiConfiguration.DdiPortCHpd;
> +    FspsUpd->FspsConfig.DdiPortDHpd =
> GtConfig->DdiConfiguration.DdiPortDHpd;
> +    FspsUpd->FspsConfig.DdiPortFHpd =
> GtConfig->DdiConfiguration.DdiPortFHpd;
> +    FspsUpd->FspsConfig.DdiPortBDdc =
> GtConfig->DdiConfiguration.DdiPortBDdc;
> +    FspsUpd->FspsConfig.DdiPortCDdc =
> GtConfig->DdiConfiguration.DdiPortCDdc;
> +    FspsUpd->FspsConfig.DdiPortDDdc =
> GtConfig->DdiConfiguration.DdiPortDDdc;
> +    FspsUpd->FspsConfig.DdiPortFDdc =
> GtConfig->DdiConfiguration.DdiPortFDdc;
> +
> +  }
> +
> +  if (GnaConfig != NULL) {
> +    FspsUpd->FspsConfig.GnaEnable = (UINT8) GnaConfig->GnaEnable;
> +#ifdef TESTMENU_FLAG
> +#endif // TESTMENU_FLAG
> +  }
> +
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSecurityPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSecurityPolicyInitLib.c
> new file mode 100644
> index 0000000000..47d0a85e77
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSecurityPolicyInitLib.c
> @@ -0,0 +1,70 @@
> +/** @file
> +  Implementation of Fsp Security Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Ppi/SiPolicy.h>
> +
> +/**
> +  Performs FSP Security PEI Policy initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSecurityPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  SI_PREMEM_POLICY_PPI          *SiPreMemPolicyPpi;
> +
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Update SecurityPolicy
> Pre-Mem Start\n"));
> +
> +  //
> +  // Locate SiPreMemPolicyPpi
> +  //
> +  SiPreMemPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicyPpi
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Update SecurityPolicy
> Pre-Mem End\n"));
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP Security PEI Policy post memory initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSecurityPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSiPolicyInitLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSiPolicyInitLib.c
> new file mode 100644
> index 0000000000..1a82436f23
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiFspPolicyI
> nitLib/PeiFspSiPolicyInitLib.c
> @@ -0,0 +1,96 @@
> +/** @file
> +  Implementation of Fsp SI Policy Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PeiFspPolicyInitLib.h>
> +#include <Ppi/SiPolicy.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Performs FSP SI PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSiPolicyInitPreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                Status;
> +  SI_PREMEM_POLICY_PPI      *SiPreMemPolicyPpi;
> +
> +  //
> +  // Locate SiPreMemPolicyPpi
> +  //
> +  SiPreMemPolicyPpi = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPreMemPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPreMemPolicyPpi
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Performs FSP SI PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSiPolicyInit (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  EFI_STATUS                   Status;
> +  SI_POLICY_PPI                *SiPolicy;
> +  SI_CONFIG                    *SiConfig;
> +
> +  //
> +  // Locate SiPolicyPpi
> +  //
> +  SiPolicy = NULL;
> +  Status = PeiServicesLocatePpi (
> +             &gSiPolicyPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &SiPolicy
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSiConfigGuid, (VOID *)
> &SiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Update SiConfig policies
> +  //
> +  FspsUpd->FspsConfig.SiCsmFlag                =
> (UINT8)SiConfig->CsmFlag;
> +  FspsUpd->FspsConfig.SiSsidTablePtr           =
> (UINT32)(UINTN)SiConfig->SsidTablePtr;
> +  FspsUpd->FspsConfig.SiNumberOfSsidTableEntry =
> (UINT16)SiConfig->NumberOfSsidTableEntry;
> +  FspsUpd->FspsConfig.TraceHubMemBase          =
> SiConfig->TraceHubMemBase;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspMiscUpdUpdateLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspMiscUpdUpdateLib.c
> new file mode 100644
> index 0000000000..7dbdfa7c16
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspMiscUpdUpdateLib.c
> @@ -0,0 +1,100 @@
> +/** @file
> +  Implementation of Fsp Misc UPD Initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/PeiLib.h>
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/PeiServicesLib.h>
> +
> +#include <FspEas.h>
> +#include <FspmUpd.h>
> +#include <FspsUpd.h>
> +
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/DebugPrintErrorLevelLib.h>
> +#include <Library/PciLib.h>
> +#include <Ppi/ReadOnlyVariable2.h>
> +#include <Guid/MemoryOverwriteControl.h>
> +#include <PchAccess.h>
> +
> +#include "PeiMiscPolicyUpdate.h"
> +
> +/**
> +  Performs FSP Misc UPD initialization.
> +
> +  @param[in,out]    FspmUpd                 Pointer to FSPM_UPD
> Data.
> +
> +  @retval           EFI_SUCCESS             FSP UPD Data is
> updated.
> +  @retval           EFI_NOT_FOUND           An instance of
> gEfiPeiReadOnlyVariable2PpiGuid
> +                                            could not be located.
> +  @retval           EFI_OUT_OF_RESOURCES    Insufficent resources
> to allocate a memory buffer.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMiscUpdUpdatePreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  EFI_STATUS                        Status;
> +  EFI_PEI_READ_ONLY_VARIABLE2_PPI   *VariableServices;
> +  UINTN                             VariableSize;
> +  VOID                              *MemorySavedData;
> +
> +  Status = PeiServicesLocatePpi (
> +             &gEfiPeiReadOnlyVariable2PpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &VariableServices
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    return Status;
> +  }
> +
> +  VariableSize = 0;
> +  MemorySavedData = NULL;
> +  Status = VariableServices->GetVariable (
> +                               VariableServices,
> +                               L"MemoryConfig",
> +                               &gFspNonVolatileStorageHobGuid,
> +                               NULL,
> +                               &VariableSize,
> +                               MemorySavedData
> +                               );
> +  if (Status == EFI_BUFFER_TOO_SMALL) {
> +    MemorySavedData = AllocatePool (VariableSize);
> +    if (MemorySavedData == NULL) {
> +      ASSERT (MemorySavedData != NULL);
> +      return EFI_OUT_OF_RESOURCES;
> +    }
> +
> +    DEBUG ((DEBUG_INFO, "VariableSize is 0x%x\n", VariableSize));
> +    Status = VariableServices->GetVariable (
> +                                 VariableServices,
> +                                 L"MemoryConfig",
> +                                 &gFspNonVolatileStorageHobGuid,
> +                                 NULL,
> +                                 &VariableSize,
> +                                 MemorySavedData
> +                                 );
> +    if (Status == EFI_SUCCESS) {
> +      FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData;
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "Fail to retrieve Variable:\"MemoryConfig\"
> gMemoryConfigVariableGuid, Status = %r\n", Status));
> +      ASSERT_EFI_ERROR (Status);
> +    }
> +  }
> +  FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspPolicyUpdateLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspPolicyUpdateLib.c
> new file mode 100644
> index 0000000000..820696584d
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiFspPolicyUpdateLib.c
> @@ -0,0 +1,124 @@
> +/** @file
> +  Provide FSP wrapper platform related function.
> +
> +`  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/PcdLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/FspWrapperApiLib.h>
> +#include <Library/SiliconPolicyUpdateLib.h>
> +
> +#include <FspEas.h>
> +#include <FspmUpd.h>
> +#include <FspsUpd.h>
> +
> +#include "PeiMiscPolicyUpdate.h"
> +
> +/**
> +  Performs FSP PCH PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyUpdate (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  );
> +
> +VOID
> +InternalPrintVariableData (
> +  IN UINT8   *Data8,
> +  IN UINTN   DataSize
> +  )
> +{
> +  UINTN      Index;
> +
> +  for (Index = 0; Index < DataSize; Index++) {
> +    if (Index % 0x10 == 0) {
> +      DEBUG ((DEBUG_INFO, "\n%08X:", Index));
> +    }
> +    DEBUG ((DEBUG_INFO, " %02X", *Data8++));
> +  }
> +  DEBUG ((DEBUG_INFO, "\n"));
> +}
> +
> +/**
> +  Performs silicon pre-mem policy update.
> +
> +  The meaning of Policy is defined by silicon code.
> +  It could be the raw data, a handle, a PPI, etc.
> +
> +  The input Policy must be returned by SiliconPolicyDonePreMem().
> +
> +  1) In FSP path, the input Policy should be FspmUpd.
> +  A platform may use this API to update the FSPM UPD policy initialized
> +  by the silicon module or the default UPD data.
> +  The output of FSPM UPD data from this API is the final UPD data.
> +
> +  2) In non-FSP path, the board may use additional way to get
> +  the silicon policy data field based upon the input Policy.
> +
> +  @param[in, out] Policy       Pointer to policy.
> +
> +  @return the updated policy.
> +**/
> +VOID *
> +EFIAPI
> +SiliconPolicyUpdatePreMem (
> +  IN OUT VOID    *FspmUpd
> +  )
> +{
> +  FSPM_UPD              *FspmUpdDataPtr;
> +
> +  FspmUpdDataPtr = FspmUpd;
> +
> +  PeiFspMiscUpdUpdatePreMem (FspmUpdDataPtr);
> +  InternalPrintVariableData ((VOID *) FspmUpdDataPtr, sizeof (FSPM_UPD));
> +
> +  return FspmUpd;
> +}
> +
> +/**
> +  Performs silicon post-mem policy update.
> +
> +  The meaning of Policy is defined by silicon code.
> +  It could be the raw data, a handle, a PPI, etc.
> +
> +  The input Policy must be returned by SiliconPolicyDonePostMem().
> +
> +  1) In FSP path, the input Policy should be FspsUpd.
> +  A platform may use this API to update the FSPS UPD policy initialized
> +  by the silicon module or the default UPD data.
> +  The output of FSPS UPD data from this API is the final UPD data.
> +
> +  2) In non-FSP path, the board may use additional way to get
> +  the silicon policy data field based upon the input Policy.
> +
> +  @param[in, out] Policy       Pointer to policy.
> +
> +  @return the updated policy.
> +**/
> +VOID *
> +EFIAPI
> +SiliconPolicyUpdatePostMem (
> +  IN OUT VOID    *FspsUpd
> +  )
> +{
> +  FSPS_UPD              *FspsUpdDataPtr;
> +
> +  FspsUpdDataPtr = FspsUpd;
> +
> +  PeiFspPchPolicyUpdate (FspsUpd);
> +  InternalPrintVariableData ((VOID * )FspsUpdDataPtr, sizeof (FSPS_UPD));
> +
> +  return FspsUpd;
> +}
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiMiscPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiMiscPolicyUpdate.h
> new file mode 100644
> index 0000000000..1f2e82cf43
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiMiscPolicyUpdate.h
> @@ -0,0 +1,25 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_MISC_POLICY_UPDATE_H_
> +#define _PEI_MISC_POLICY_UPDATE_H_
> +
> +#include <FspmUpd.h>
> +
> +/**
> +  Performs FSP Misc UPD initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSPM_UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspMiscUpdUpdatePreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  );
> +
> +#endif
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.c
> new file mode 100644
> index 0000000000..445a0de371
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.c
> @@ -0,0 +1,60 @@
> +/** @file
> +  This file is SampleCode of the library for Intel PCH PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/HdaVerbTableLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/HobLib.h>
> +#include <Guid/GlobalVariable.h>
> +#include <Library/PchGbeLib.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/PchPcrLib.h>
> +#include <Library/PchHsioLib.h>
> +#include <Library/PchSerialIoLib.h>
> +#include <Library/PchPcieRpLib.h>
> +#include <GpioConfig.h>
> +#include <GpioPinsSklH.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PchGbeLib.h>
> +#include <PcieDeviceOverrideTable.h>
> +
> +/**
> +  Performs FSP PCH PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyUpdate (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  FspsUpd->FspsConfig.PchPcieDeviceOverrideTablePtr = (UINT32)
> mPcieDeviceTable;
> +
> +  AddPlatformVerbTables (
> +    PchHdaCodecPlatformOnboard,
> +    &(FspsUpd->FspsConfig.PchHdaVerbTableEntryNum),
> +    &(FspsUpd->FspsConfig.PchHdaVerbTablePtr)
> +    );
> +
> +DEBUG_CODE_BEGIN();
> +if ((PcdGet8 (PcdSerialIoUartDebugEnable) == 1) &&
> +    FspsUpd->FspsConfig.SerialIoUartMode[PchSerialIoIndexUart0 +
> PcdGet8 (PcdSerialIoUartNumber)] == PchSerialIoDisabled ) {
> +    FspsUpd->FspsConfig.SerialIoUartMode[PchSerialIoIndexUart0 +
> PcdGet8 (PcdSerialIoUartNumber)] = PchSerialIoHidden;
> +  }
> +DEBUG_CODE_END();
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.h
> new file mode 100644
> index 0000000000..5684567c7b
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdate.h
> @@ -0,0 +1,27 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_PCH_POLICY_UPDATE_H_
> +#define _PEI_PCH_POLICY_UPDATE_H_
> +
> +//
> +// External include files do NOT need to be explicitly specified in real EDKII
> +// environment
> +//
> +#include <PiPei.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PciLib.h>
> +#include <Ppi/SiPolicy.h>
> +#include <Library/MmPciLib.h>
> +
> +#include <FspEas.h>
> +#include <FspmUpd.h>
> +#include <FspsUpd.h>
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..cbe9bf8fbb
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiPchPolicyUpdatePreMem.c
> @@ -0,0 +1,39 @@
> +/** @file
> +  This file is SampleCode of the library for Intel PCH PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/HobLib.h>
> +#include <Guid/GlobalVariable.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/PchPcrLib.h>
> +#include <Library/PchHsioLib.h>
> +#include <Library/PchPcieRpLib.h>
> +#include <PchHsioPtssTables.h>
> +#include <Library/DebugLib.h>
> +
> +/**
> +  Performs FSP PCH PEI Policy pre mem initialization.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspPchPolicyUpdatePreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.c
> new file mode 100644
> index 0000000000..b8905788df
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.c
> @@ -0,0 +1,85 @@
> +/** @file
> +Do Platform Stage System Agent initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiSaPolicyUpdate.h"
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Library/HobLib.h>
> +#include <PchAccess.h>
> +#include <SaAccess.h>
> +#include <Pi/PiFirmwareFile.h>
> +#include <Pi/PiPeiCis.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiSaPolicyLib.h>
> +#include <Library/PeiLib.h>
> +
> +/**
> +  Performs FSP SA PEI Policy initialization.
> +
> +  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyUpdate (
> +  IN OUT FSPS_UPD    *FspsUpd
> +  )
> +{
> +  VOID                            *Buffer;
> +  VOID                            *MemBuffer;
> +  UINT32                          Size;
> +
> +  DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n"));
> +
> +    FspsUpd->FspsConfig.PeiGraphicsPeimInit = 1;
> +
> +    Size   = 0;
> +    Buffer = NULL;
> +    PeiGetSectionFromAnyFv (PcdGetPtr (PcdGraphicsVbtGuid),
> EFI_SECTION_RAW, 0, &Buffer, &Size);
> +    if (Buffer == NULL) {
> +      DEBUG((DEBUG_WARN, "Could not locate VBT\n"));
> +    } else {
> +      MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES
> ((UINTN)Size));
> +      if ((MemBuffer != NULL) && (Buffer != NULL)) {
> +        CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
> +        FspsUpd->FspsConfig.GraphicsConfigPtr =
> (UINT32)(UINTN)MemBuffer;
> +      } else {
> +        DEBUG((DEBUG_WARN, "Error in locating / copying VBT.\n"));
> +        FspsUpd->FspsConfig.GraphicsConfigPtr = 0;
> +      }
> +    }
> +    DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromFv is
> 0x%x\n", FspsUpd->FspsConfig.GraphicsConfigPtr));
> +    DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromFv is 0x%x\n",
> Size));
> +
> +    Size   = 0;
> +    Buffer = NULL;
> +    PeiGetSectionFromAnyFv (&gTianoLogoGuid, EFI_SECTION_RAW, 0,
> &Buffer, &Size);
> +    if (Buffer == NULL) {
> +      DEBUG((DEBUG_WARN, "Could not locate Logo\n"));
> +    } else {
> +      MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES
> ((UINTN)Size));
> +      if ((MemBuffer != NULL) && (Buffer != NULL)) {
> +        CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
> +        FspsUpd->FspsConfig.LogoPtr = (UINT32)(UINTN)MemBuffer;
> +        FspsUpd->FspsConfig.LogoSize = Size;
> +      } else {
> +        DEBUG((DEBUG_WARN, "Error in locating / copying LogoPtr.\n"));
> +        FspsUpd->FspsConfig.LogoPtr = 0;
> +        FspsUpd->FspsConfig.LogoSize = 0;
> +      }
> +    }
> +    DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromFv is 0x%x\n",
> FspsUpd->FspsConfig.LogoPtr));
> +    DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromFv is 0x%x\n",
> FspsUpd->FspsConfig.LogoSize));
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.h
> new file mode 100644
> index 0000000000..07013eddb9
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdate.h
> @@ -0,0 +1,30 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_SA_POLICY_UPDATE_H_
> +#define _PEI_SA_POLICY_UPDATE_H_
> +
> +//
> +// External include files do NOT need to be explicitly specified in real EDKII
> +// environment
> +//
> +#include <SaPolicyCommon.h>
> +#include <Library/DebugPrintErrorLevelLib.h>
> +#include <CpuRegs.h>
> +#include <Library/CpuPlatformLib.h>
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/PcdLib.h>
> +#include <CpuAccess.h>
> +
> +#include <FspEas.h>
> +#include <FspmUpd.h>
> +#include <FspsUpd.h>
> +
> +extern EFI_GUID gTianoLogoGuid;
> +
> +#endif
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..fffd4156f4
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSaPolicyUpdatePreMem.c
> @@ -0,0 +1,87 @@
> +/** @file
> +Do Platform Stage System Agent initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiSaPolicyUpdate.h"
> +#include <CpuRegs.h>
> +#include <Library/CpuPlatformLib.h>
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Guid/MemoryOverwriteControl.h>
> +#include <Library/HobLib.h>
> +#include <PchAccess.h>
> +#include <SaAccess.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiSaPolicyLib.h>
> +#include <Library/GpioLib.h>
> +#include <GpioPinsSklH.h>
> +
> +
> +/**
> +  Performs FSP SA PEI Policy initialization in pre-memory.
> +
> +  @param[in][out]  FspmUpd             Pointer to FSP UPD Data.
> +
> +  @retval          EFI_SUCCESS         FSP UPD Data is updated.
> +  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
> +  @retval          Other               FSP UPD Data update process
> fail.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiFspSaPolicyUpdatePreMem (
> +  IN OUT FSPM_UPD    *FspmUpd
> +  )
> +{
> +  VOID                        *Buffer;
> +
> +  //
> +  // If SpdAddressTable are not all 0, it means DIMM slots implemented and
> +  // MemorySpdPtr* already updated by reading SPD from DIMM in
> SiliconPolicyInitPreMem.
> +  //
> +  // If SpdAddressTable all 0, this is memory down design and hardcoded
> SpdData
> +  // should be applied to MemorySpdPtr*.
> +  //
> +  if ((PcdGet8 (PcdMrcSpdAddressTable0) == 0) && (PcdGet8
> (PcdMrcSpdAddressTable1) == 0)
> +      && (PcdGet8 (PcdMrcSpdAddressTable2) == 0) && (PcdGet8
> (PcdMrcSpdAddressTable3) == 0)) {
> +    DEBUG ((DEBUG_INFO, "Overriding SPD data for down memory.\n"));
> +    CopyMem (
> +      (VOID *) (UINTN) FspmUpd->FspmConfig.MemorySpdPtr00,
> +      (VOID *) (UINTN) PcdGet32 (PcdMrcSpdData),
> +      PcdGet16 (PcdMrcSpdDataSize)
> +      );
> +    CopyMem (
> +      (VOID *) (UINTN) FspmUpd->FspmConfig.MemorySpdPtr10,
> +      (VOID *) (UINTN) PcdGet32 (PcdMrcSpdData),
> +      PcdGet16 (PcdMrcSpdDataSize)
> +      );
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Updating Dq Byte Map and DQS Byte Swizzling
> Settings...\n"));
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcDqByteMap);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqByteMapCh0, Buffer, 12);
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqByteMapCh1, (UINT8*)
> Buffer + 12, 12);
> +  }
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcDqsMapCpu2Dram);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqsMapCpu2DramCh0,
> Buffer, 8);
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.DqsMapCpu2DramCh1,
> (UINT8*) Buffer + 8, 8);
> +  }
> +
> +  DEBUG((DEBUG_INFO, "Updating Dq Pins Interleaved,Rcomp Resistor &
> Rcomp Target Settings...\n"));
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcRcompResistor);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.RcompResistor, Buffer, 6);
> +  }
> +  Buffer = (VOID *) (UINTN) PcdGet32 (PcdMrcRcompTarget);
> +  if (Buffer) {
> +    CopyMem ((VOID *)FspmUpd->FspmConfig.RcompTarget, Buffer, 10);
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSiliconPolicyUpdateLibFsp.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSiliconPolicyUpdateLibFsp.inf
> new file mode 100644
> index 0000000000..c842b7eef6
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/FspWrapper/Library/PeiSiliconPoli
> cyUpdateLibFsp/PeiSiliconPolicyUpdateLibFsp.inf
> @@ -0,0 +1,140 @@
> +## @file
> +#  Provide FSP wrapper platform related function.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +###############################################################
> #################
> +#
> +# Defines Section - statements that will be processed to create a Makefile.
> +#
> +###############################################################
> #################
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = SiliconPolicyUpdateLibFsp
> +  FILE_GUID                      =
> 4E83003B-49A9-459E-AAA6-1CA3C6D04FB2
> +  MODULE_TYPE                    = PEIM
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = SiliconPolicyUpdateLib
> +
> +
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64
> +#
> +
> +###############################################################
> #################
> +#
> +# Sources Section - list of files that are required for the build to succeed.
> +#
> +###############################################################
> #################
> +
> +[Sources]
> +  PeiFspPolicyUpdateLib.c
> +  PeiPchPolicyUpdatePreMem.c
> +  PeiPchPolicyUpdate.c
> +  PeiSaPolicyUpdatePreMem.c
> +  PeiSaPolicyUpdate.c
> +  PeiFspMiscUpdUpdateLib.c
> +
> +###############################################################
> #################
> +#
> +# Package Dependency Section - list of Package files that are required for
> +#                              this module.
> +#
> +###############################################################
> #################
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  IntelFsp2Pkg/IntelFsp2Pkg.dec
> +  IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  CometLakeFspBinPkg/CometLake1/CometLakeFspBinPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[LibraryClasses.IA32]
> +  FspWrapperApiLib
> +  OcWdtLib
> +  PchResetLib
> +  FspWrapperPlatformLib
> +  BaseMemoryLib
> +  CpuPlatformLib
> +  DebugLib
> +  HdaVerbTableLib
> +  HobLib
> +  IoLib
> +  PcdLib
> +  PostCodeLib
> +  SmbusLib
> +  ConfigBlockLib
> +  PeiSaPolicyLib
> +  PchGbeLib
> +  PchInfoLib
> +  PchHsioLib
> +  PchPcieRpLib
> +  MemoryAllocationLib
> +  DebugPrintErrorLevelLib
> +  SiPolicyLib
> +  PchGbeLib
> +  TimerLib
> +  GpioLib
> +  PeiLib
> +
> +[Pcd]
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompResistor
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompTarget
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqByteMap
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqsMapCpu2Dram
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdData
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdDataSize
> +
> +
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress         ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSerialIoUartDebugEnable           ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSerialIoUartNumber                ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSmmbaseSwSmi                      ##
> CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaDdrFreqLimit    ##
> CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowLpHsioPtssTable1
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowLpHsioPtssTable2
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowLpHsioPtssTable1Size
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowLpHsioPtssTable2Size
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificLpHsioPtssTable1
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificLpHsioPtssTable2
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificLpHsioPtssTable1Size
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificLpHsioPtssTable2Size
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowHHsioPtssTable1
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowHHsioPtssTable2
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowHHsioPtssTable1Size
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUnknowHHsioPtssTable2Size
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificHHsioPtssTable1
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificHHsioPtssTable2
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificHHsioPtssTable1Size
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSpecificHHsioPtssTable2Size
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdGraphicsVbtGuid
> +
> +  # SPD Address Table
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable0
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable1
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable2
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable3
> +
> +[Guids]
> +  gFspNonVolatileStorageHobGuid                 ## CONSUMES
> +  gTianoLogoGuid                                ## CONSUMES
> +  gEfiMemoryOverwriteControlDataGuid
> +
> +[Depex]
> +  gEdkiiVTdInfoPpiGuid
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/AcpiTimerLi
> b.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/AcpiTimerLi
> b.c
> new file mode 100644
> index 0000000000..446fb267fd
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/AcpiTimerLi
> b.c
> @@ -0,0 +1,394 @@
> +/** @file
> +  ACPI Timer implements one instance of Timer Library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Base.h>
> +#include <Library/TimerLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PciLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/DebugLib.h>
> +#include <IndustryStandard/Acpi.h>
> +//
> +// OVERRIDE: OverrideBegin
> +//
> +#include <Register/Cpuid.h>
> +//
> +// OVERRIDE: OverrideEnd
> +//
> +
> +
> +/**
> +  Internal function to retrieves the 64-bit frequency in Hz.
> +
> +  Internal function to retrieves the 64-bit frequency in Hz.
> +
> +  @return The frequency in Hz.
> +
> +**/
> +UINT64
> +InternalGetPerformanceCounterFrequency (
> +  VOID
> +  );
> +
> +/**
> +  The constructor function enables ACPI IO space.
> +
> +  If ACPI I/O space not enabled, this function will enable it.
> +  It will always return RETURN_SUCCESS.
> +
> +  @retval EFI_SUCCESS   The constructor always returns
> RETURN_SUCCESS.
> +
> +**/
> +RETURN_STATUS
> +EFIAPI
> +AcpiTimerLibConstructor (
> +  VOID
> +  )
> +{
> +  UINTN   Bus;
> +  UINTN   Device;
> +  UINTN   Function;
> +  UINTN   EnableRegister;
> +  UINT8   EnableMask;
> +
> +  //
> +  // ASSERT for the invalid PCD values. They must be configured to the real
> value.
> +  //
> +  ASSERT (PcdGet16 (PcdAcpiIoPciBarRegisterOffset) != 0xFFFF);
> +  ASSERT (PcdGet16 (PcdAcpiIoPortBaseAddress)      != 0xFFFF);
> +
> +  //
> +  // If the register offset to the BAR for the ACPI I/O Port Base Address is
> 0x0000, then
> +  // no PCI register programming is required to enable access to the the
> ACPI registers
> +  // specified by PcdAcpiIoPortBaseAddress
> +  //
> +  if (PcdGet16 (PcdAcpiIoPciBarRegisterOffset) == 0x0000) {
> +    return RETURN_SUCCESS;
> +  }
> +
> +  //
> +  // ASSERT for the invalid PCD values. They must be configured to the real
> value.
> +  //
> +  ASSERT (PcdGet8  (PcdAcpiIoPciDeviceNumber)   != 0xFF);
> +  ASSERT (PcdGet8  (PcdAcpiIoPciFunctionNumber) != 0xFF);
> +  ASSERT (PcdGet16 (PcdAcpiIoPciEnableRegisterOffset) != 0xFFFF);
> +
> +  //
> +  // Retrieve the PCD values for the PCI configuration space required to
> program the ACPI I/O Port Base Address
> +  //
> +  Bus            = PcdGet8  (PcdAcpiIoPciBusNumber);
> +  Device         = PcdGet8  (PcdAcpiIoPciDeviceNumber);
> +  Function       = PcdGet8  (PcdAcpiIoPciFunctionNumber);
> +  EnableRegister = PcdGet16 (PcdAcpiIoPciEnableRegisterOffset);
> +  EnableMask     = PcdGet8  (PcdAcpiIoBarEnableMask);
> +
> +  //
> +  // If ACPI I/O space is not enabled yet, program ACPI I/O base address and
> enable it.
> +  //
> +  if ((PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, EnableRegister)) &
> EnableMask) != EnableMask) {
> +    PciWrite16 (
> +      PCI_LIB_ADDRESS (Bus, Device, Function, PcdGet16
> (PcdAcpiIoPciBarRegisterOffset)),
> +      PcdGet16 (PcdAcpiIoPortBaseAddress)
> +      );
> +    PciOr8 (
> +      PCI_LIB_ADDRESS (Bus, Device, Function, EnableRegister),
> +      EnableMask
> +      );
> +  }
> +
> +  return RETURN_SUCCESS;
> +}
> +
> +/**
> +  Internal function to retrieve the ACPI I/O Port Base Address.
> +
> +  Internal function to retrieve the ACPI I/O Port Base Address.
> +
> +  @return The 16-bit ACPI I/O Port Base Address.
> +
> +**/
> +UINT16
> +InternalAcpiGetAcpiTimerIoPort (
> +  VOID
> +  )
> +{
> +  UINT16  Port;
> +
> +  Port = PcdGet16 (PcdAcpiIoPortBaseAddress);
> +
> +  //
> +  // If the register offset to the BAR for the ACPI I/O Port Base Address is not
> 0x0000, then
> +  // read the PCI register for the ACPI BAR value in case the BAR has been
> programmed to a
> +  // value other than PcdAcpiIoPortBaseAddress
> +  //
> +  if (PcdGet16 (PcdAcpiIoPciBarRegisterOffset) != 0x0000) {
> +    Port = PciRead16 (PCI_LIB_ADDRESS (
> +                        PcdGet8  (PcdAcpiIoPciBusNumber),
> +                        PcdGet8  (PcdAcpiIoPciDeviceNumber),
> +                        PcdGet8  (PcdAcpiIoPciFunctionNumber),
> +                        PcdGet16 (PcdAcpiIoPciBarRegisterOffset)
> +                        ));
> +  }
> +
> +  return (Port & PcdGet16 (PcdAcpiIoPortBaseAddressMask)) + PcdGet16
> (PcdAcpiPm1TmrOffset);
> +}
> +
> +/**
> +  Stalls the CPU for at least the given number of ticks.
> +
> +  Stalls the CPU for at least the given number of ticks. It's invoked by
> +  MicroSecondDelay() and NanoSecondDelay().
> +
> +  @param  Delay     A period of time to delay in ticks.
> +
> +**/
> +VOID
> +InternalAcpiDelay (
> +  IN UINT32  Delay
> +  )
> +{
> +  UINT16   Port;
> +  UINT32   Ticks;
> +  UINT32   Times;
> +
> +  Port   = InternalAcpiGetAcpiTimerIoPort ();
> +  Times  = Delay >> 22;
> +  Delay &= BIT22 - 1;
> +  do {
> +    //
> +    // The target timer count is calculated here
> +    //
> +    Ticks = IoBitFieldRead32 (Port, 0, 23) + Delay;
> +    Delay = BIT22;
> +    //
> +    // Wait until time out
> +    // Delay >= 2^23 could not be handled by this function
> +    // Timer wrap-arounds are handled correctly by this function
> +    //
> +    while (((Ticks - IoBitFieldRead32 (Port, 0, 23)) & BIT23) == 0) {
> +      CpuPause ();
> +    }
> +  } while (Times-- > 0);
> +}
> +
> +/**
> +  Stalls the CPU for at least the given number of microseconds.
> +
> +  Stalls the CPU for the number of microseconds specified by MicroSeconds.
> +
> +  @param  MicroSeconds  The minimum number of microseconds to
> delay.
> +
> +  @return MicroSeconds
> +
> +**/
> +UINTN
> +EFIAPI
> +MicroSecondDelay (
> +  IN UINTN  MicroSeconds
> +  )
> +{
> +  InternalAcpiDelay (
> +    (UINT32)DivU64x32 (
> +              MultU64x32 (
> +                MicroSeconds,
> +                ACPI_TIMER_FREQUENCY
> +                ),
> +              1000000u
> +              )
> +    );
> +  return MicroSeconds;
> +}
> +
> +/**
> +  Stalls the CPU for at least the given number of nanoseconds.
> +
> +  Stalls the CPU for the number of nanoseconds specified by NanoSeconds.
> +
> +  @param  NanoSeconds The minimum number of nanoseconds to delay.
> +
> +  @return NanoSeconds
> +
> +**/
> +UINTN
> +EFIAPI
> +NanoSecondDelay (
> +  IN UINTN  NanoSeconds
> +  )
> +{
> +  InternalAcpiDelay (
> +    (UINT32)DivU64x32 (
> +              MultU64x32 (
> +                NanoSeconds,
> +                ACPI_TIMER_FREQUENCY
> +                ),
> +              1000000000u
> +              )
> +    );
> +  return NanoSeconds;
> +}
> +
> +/**
> +  Retrieves the current value of a 64-bit free running performance counter.
> +
> +  Retrieves the current value of a 64-bit free running performance counter.
> The
> +  counter can either count up by 1 or count down by 1. If the physical
> +  performance counter counts by a larger increment, then the counter
> values
> +  must be translated. The properties of the counter can be retrieved from
> +  GetPerformanceCounterProperties().
> +
> +  @return The current value of the free running performance counter.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetPerformanceCounter (
> +  VOID
> +  )
> +{
> +  return AsmReadTsc ();
> +}
> +
> +/**
> +  Retrieves the 64-bit frequency in Hz and the range of performance
> counter
> +  values.
> +
> +  If StartValue is not NULL, then the value that the performance counter
> starts
> +  with immediately after is it rolls over is returned in StartValue. If
> +  EndValue is not NULL, then the value that the performance counter end
> with
> +  immediately before it rolls over is returned in EndValue. The 64-bit
> +  frequency of the performance counter in Hz is always returned. If
> StartValue
> +  is less than EndValue, then the performance counter counts up. If
> StartValue
> +  is greater than EndValue, then the performance counter counts down. For
> +  example, a 64-bit free running counter that counts up would have a
> StartValue
> +  of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running
> counter
> +  that counts down would have a StartValue of 0xFFFFFF and an EndValue
> of 0.
> +
> +  @param  StartValue  The value the performance counter starts with
> when it
> +                      rolls over.
> +  @param  EndValue    The value that the performance counter ends
> with before
> +                      it rolls over.
> +
> +  @return The frequency in Hz.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetPerformanceCounterProperties (
> +  OUT UINT64  *StartValue,  OPTIONAL
> +  OUT UINT64  *EndValue     OPTIONAL
> +  )
> +{
> +  if (StartValue != NULL) {
> +    *StartValue = 0;
> +  }
> +
> +  if (EndValue != NULL) {
> +    *EndValue = 0xffffffffffffffffULL;
> +  }
> +  return InternalGetPerformanceCounterFrequency ();
> +}
> +
> +/**
> +  Converts elapsed ticks of performance counter to time in nanoseconds.
> +
> +  This function converts the elapsed ticks of running performance counter
> to
> +  time value in unit of nanoseconds.
> +
> +  @param  Ticks     The number of elapsed ticks of running
> performance counter.
> +
> +  @return The elapsed time in nanoseconds.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetTimeInNanoSecond (
> +  IN UINT64  Ticks
> +  )
> +{
> +  UINT64  Frequency;
> +  UINT64  NanoSeconds;
> +  UINT64  Remainder;
> +  INTN    Shift;
> +  Frequency = GetPerformanceCounterProperties (NULL, NULL);
> +
> +  //
> +  //          Ticks
> +  // Time = --------- x 1,000,000,000
> +  //        Frequency
> +  //
> +  NanoSeconds = MultU64x32 (DivU64x64Remainder (Ticks, Frequency,
> &Remainder), 1000000000u);
> +
> +  //
> +  // Ensure (Remainder * 1,000,000,000) will not overflow 64-bit.
> +  // Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should <
> 2^(64-30) = 2^34,
> +  // i.e. highest bit set in Remainder should <= 33.
> +  //
> +  Shift = MAX (0, HighBitSet64 (Remainder) - 33);
> +  Remainder = RShiftU64 (Remainder, (UINTN) Shift);
> +  Frequency = RShiftU64 (Frequency, (UINTN) Shift);
> +  NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder,
> 1000000000u), Frequency, NULL);
> +
> +  return NanoSeconds;
> +}
> +
> +//
> +// OVERRIDE: OverrideBegin
> +//
> +/**
> +  Calculate TSC frequency.
> +
> +  The TSC counting frequency is determined by using CPUID leaf 0x15 that is
> the preferred
> +  method for Skylake and beyond.  Frequency in MHz = Core XTAL
> frequency * EBX/EAX.
> +  In newer flavors of the CPU, core xtal frequency is returned in ECX (or 0 if
> not
> +  supported).  If ECX is 0, 24MHz is assumed.
> +  @return The number of TSC counts per second.
> +
> +**/
> +UINT64
> +InternalCalculateTscFrequency (
> +  VOID
> +  )
> +{
> +  UINT64      TscFrequency;
> +  UINT64      CoreXtalFrequency;
> +  UINT32      RegEax;
> +  UINT32      RegEbx;
> +  UINT32      RegEcx;
> +
> +  //
> +  // Use CPUID leaf 0x15.
> +  // TSC frequency = (Core Xtal Frequency) * EBX/EAX.  EBX returns 0 if not
> +  // supported. ECX, if non zero, provides Core Xtal Frequency in hertz
> +  // (SDM Dec 2016).
> +  //
> +  AsmCpuid (CPUID_TIME_STAMP_COUNTER, &RegEax, &RegEbx, &RegEcx,
> NULL);
> +  ASSERT (RegEbx != 0);
> +
> +  //
> +  // If core xtal frequency (ECX) returns 0, it is safe to use 24MHz for post
> +  // Skylake client CPU's.
> +  //
> +  if (RegEcx == 0) {
> +    CoreXtalFrequency = 24000000ul;
> +  } else {
> +    CoreXtalFrequency = (UINT64)RegEcx;
> +  }
> +
> +  //
> +  // Calculate frequency.  For integer division, round up/down result
> +  // correctly by adding denominator/2 to the numerator prior to division.
> +  //
> +  TscFrequency = DivU64x32 (MultU64x32 (CoreXtalFrequency, RegEbx) +
> (UINT64)(RegEax >> 1), RegEax);
> +
> +  return TscFrequency;
> +}
> +//
> +// OVERRIDE: OverrideEnd
> +//
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.c
> new file mode 100644
> index 0000000000..523e88447a
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.c
> @@ -0,0 +1,48 @@
> +/** @file
> +  ACPI Timer implements one instance of Timer Library.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Base.h>
> +#include <Library/TimerLib.h>
> +#include <Library/BaseLib.h>
> +
> +/**
> +  Calculate TSC frequency.
> +
> +  The TSC counting frequency is determined by comparing how far it counts
> +  during a 101.4 us period as determined by the ACPI timer.
> +  The ACPI timer is used because it counts at a known frequency.
> +  The TSC is sampled, followed by waiting 363 counts of the ACPI timer,
> +  or 101.4 us. The TSC is then sampled again. The difference multiplied by
> +  9861 is the TSC frequency. There will be a small error because of the
> +  overhead of reading the ACPI timer. An attempt is made to determine and
> +  compensate for this error.
> +
> +  @return The number of TSC counts per second.
> +
> +**/
> +UINT64
> +InternalCalculateTscFrequency (
> +  VOID
> +  );
> +
> +/**
> +  Internal function to retrieves the 64-bit frequency in Hz.
> +
> +  Internal function to retrieves the 64-bit frequency in Hz.
> +
> +  @return The frequency in Hz.
> +
> +**/
> +UINT64
> +InternalGetPerformanceCounterFrequency (
> +  VOID
> +  )
> +{
> +  return InternalCalculateTscFrequency ();
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.inf
> new file mode 100644
> index 0000000000..918dd7bf92
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.inf
> @@ -0,0 +1,54 @@
> +## @file
> +#  Base ACPI Timer Library
> +#
> +#  Provides basic timer support using the ACPI timer hardware.  The
> performance
> +#  counter features are provided by the processors time stamp counter.
> +#
> +#  Note: The implementation uses the lower 24-bits of the ACPI timer and
> +#  is compatible with both 24-bit and 32-bit ACPI timers.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = BaseAcpiTimerLib
> +  FILE_GUID                      =
> 564DE85F-049E-4481-BF7A-CA04D2788CF9
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = TimerLib|SEC PEI_CORE PEIM
> +  CONSTRUCTOR                    = AcpiTimerLibConstructor
> +  MODULE_UNI_FILE                = BaseAcpiTimerLib.uni
> +
> +[Sources]
> +  AcpiTimerLib.c
> +  BaseAcpiTimerLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  PcAtChipsetPkg/PcAtChipsetPkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec      ## OVERRIDE
> +
> +[LibraryClasses]
> +  BaseLib
> +  PcdLib
> +  PciLib
> +  IoLib
> +  DebugLib
> +
> +[Pcd]
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPciBusNumber
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPciDeviceNumber
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPciFunctionNumber
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPciEnableRegisterOffset  ##
> CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoBarEnableMask
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPciBarRegisterOffset     ##
> CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPortBaseAddress
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiPm1TmrOffset
> ## CONSUMES
> +  gPcAtChipsetPkgTokenSpaceGuid.PcdAcpiIoPortBaseAddressMask
> ## CONSUMES
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.uni
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.uni
> new file mode 100644
> index 0000000000..5cf4d16d5c
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/AcpiTimerLib/BaseAcpiTim
> erLib.uni
> @@ -0,0 +1,15 @@
> +/** @file
> +  Base ACPI Timer Library
> +  Provides basic timer support using the ACPI timer hardware.  The
> performance
> +  counter features are provided by the processors time stamp counter.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#string STR_MODULE_ABSTRACT             #language en-US "ACPI
> Timer Library"
> +
> +#string STR_MODULE_DESCRIPTION          #language en-US "Provides
> basic timer support using the ACPI timer hardware."
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.c
> new file mode 100644
> index 0000000000..01a338c50f
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.c
> @@ -0,0 +1,308 @@
> +/** @file
> +  Support for IO expander TCA6424.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/GpioExpanderLib.h>
> +#include <Library/I2cAccessLib.h>
> +
> +//
> +// Addresses of registers inside expander
> +//
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT8  mInputRegister[3]    =
> {0x0,0x1,0x2};
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT8  mOutputRegister[3]   =
> {0x4,0x5,0x6};
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT8  mConfigRegister[3]   =
> {0xC,0xD,0xE};
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT8  mPolarityRegister[3] =
> {0x8,0x9,0xA};
> +
> +#define PCH_SERIAL_IO_I2C4                 4
> +#define TCA6424_I2C_ADDRESS 0x22
> +#define PINS_PER_REGISTER                  8
> +#define GPIO_EXP_PIN_DIRECTION_OUT         1
> +#define GPIO_EXP_PIN_DIRECTION_IN          0
> +#define GPIO_EXP_PIN_POLARITY_NORMAL       0
> +#define GPIO_EXP_PIN_POLARITY_INVERTED     1
> +#define GPIO_EXP_SET_OUTPUT                0
> +#define GPIO_EXP_SET_DIR                   1
> +#define GPIO_EXP_GET_INPUT                 2
> +#define GPIO_EXP_SET_POLARITY              3
> +#define AUTO_INCREMENT 0x80
> +
> +/**
> +  Returns the Controller on which GPIO expander is present.
> +
> +  This function returns the Controller value
> +
> +  @param[out] Controller              Pointer to a Controller value on
> +                                      which I2C expander is
> configured.
> +
> +  @retval     EFI_SUCCESS              non.
> +**/
> +EFI_STATUS
> +GpioExpGetController (
> +  OUT UINT8 *Controller
> +  )
> +{
> +  *Controller = PCH_SERIAL_IO_I2C4;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Returns the data from register value giving in the input.
> +
> +  This function is to get the data from the Expander
> +  Registers by following the I2C Protocol communication
> +
> +
> +  @param[in]  Bar0       Bar address of the SerialIo Controller
> +  @param[in]  Address    Expander Value with in the Contoller
> +  @param[in]  Register   Address of Input/Output/Configure/Polarity
> +                         registers with in the Expander
> +
> +  @retval     UINT8      Value returned from the register
> +**/
> +UINT8
> +GpioExpGetRegister (
> +  IN UINTN Bar0,
> +  IN UINT8 Address,
> +  IN UINT8 Register
> +  )
> +{
> +  UINT8 WriBuf[1];
> +  UINT8 ReBuf[1] = {0};
> +
> +  WriBuf[0] = Register;
> +  I2cWriteRead (Bar0, TCA6424_I2C_ADDRESS + Address, 1, WriBuf, 1, ReBuf,
> WAIT_1_SECOND);
> +
> +  return ReBuf[0];
> +}
> +/**
> +  Set the input register to a give value mentioned in the function.
> +
> +  This function is to Programm the data value to the Expander
> +  Register by following the I2C Protocol communication.
> +
> +  @param[in]  Bar0       Bar address of the SerialIo Controller
> +  @param[in]  Address    Expander Value with in the Contoller
> +  @param[in]  Register   Address of Input/Output/Configure/Polarity
> +                         registers with in the Expander
> +  @param[in]  Value      Value to set in the mentioned the register
> +**/
> +VOID
> +GpioExpSetRegister (
> +  IN UINTN Bar0,
> +  IN UINT8 Address,
> +  IN UINT8 Register,
> +  IN UINT8 Value
> +  )
> +{
> +  UINT8 WriBuf[2];
> +
> +  WriBuf[0] = Register;
> +  WriBuf[1] = Value;
> +
> +  I2cWriteRead (Bar0, TCA6424_I2C_ADDRESS + Address, 2, WriBuf, 0, NULL,
> WAIT_1_SECOND);
> +}
> +/**
> +  Set the input register to a give value mentioned in the function.
> +
> +  This function is to update the status of the Gpio Expander
> +  pin based on the input Operation value of the caller.This
> +  function calculates the exact address of the register with
> +  the help of the Register Bank
> +
> +  @param[in]  Controller  SerialIo Controller value
> +  @param[in]  Expander    Expander Value with in the Contoller
> +  @param[in]  Pin         Pin with in the Expnader Value
> +  @param[in]  Value       none
> +  @param[in]  Operation   Type of operation (Setoutput/Setdirection
> +                          /Getinput/Setpolarity)
> +  @retval     UINT8       Final Value returned from the register
> +**/
> +UINT8
> +GpioExpDecodeRegAccess (
> +  IN UINT8 Controller,
> +  IN UINT8 Expander,
> +  IN UINT8 Pin,
> +  IN UINT8 Value,
> +  IN UINT8 Operation
> +  )
> +{
> +  UINT8* RegisterBank;
> +  UINT8 OldValue;
> +  UINT8 NewValue;
> +  UINT8 RegisterAddress;
> +  UINT8 PinNumber;
> +  UINT8 ReturnValue = 0;
> +
> +  DEBUG ((DEBUG_INFO, "GpioExpDecodeRegAccess() %x:%x:%x:%x:%x\n",
> Controller, Expander, Pin, Value, Operation));
> +  ASSERT(Controller<6);
> +  ASSERT(Expander<2);
> +  ASSERT(Pin<24);
> +  ASSERT(Value<2);
> +  ASSERT(Operation<4);
> +  //
> +  // Find the register Address value based on the OPeration
> +  //
> +  switch(Operation) {
> +    case GPIO_EXP_SET_OUTPUT:
> +      RegisterBank = mOutputRegister;
> +      break;
> +    case GPIO_EXP_SET_DIR:
> +      RegisterBank = mConfigRegister;
> +      break;
> +    case GPIO_EXP_GET_INPUT:
> +      RegisterBank = mInputRegister;
> +      break;
> +    case GPIO_EXP_SET_POLARITY:
> +      RegisterBank = mPolarityRegister;
> +      break;
> +    default:
> +      ASSERT(FALSE);
> +      return 0;
> +    }
> +  //
> +  // Each bit of register represents each Pin
> +  // calaulate the register address and Pinnumber(offset with in register)
> +  //
> +  if (Pin >= 24) {
> +    //
> +    // Avoid out-of-bound usage of RegisterBank
> +    //
> +    return 0;
> +  }
> +
> +  RegisterAddress = RegisterBank[(Pin/PINS_PER_REGISTER)];
> +  PinNumber = Pin%PINS_PER_REGISTER;
> +
> +  OldValue = GpioExpGetRegister(FindSerialIoBar(Controller, 0), Expander,
> RegisterAddress);
> +  //
> +  // If it to get the data ,just returned otherwise mark the input value and
> write the register
> +  //
> +  if (Operation == GPIO_EXP_GET_INPUT) {
> +    ReturnValue = 0x1 & (OldValue>>PinNumber);
> +  } else {
> +    NewValue = OldValue;
> +    NewValue &= ~(BIT0<<PinNumber);
> +    NewValue |= (Value<<PinNumber);
> +    if(NewValue!=OldValue) {
> +      GpioExpSetRegister(FindSerialIoBar(Controller, 0), Expander,
> RegisterAddress, NewValue);
> +    }
> +  }
> +  return ReturnValue;
> +}
> +/**
> +  Set the Output value for the given Expander Gpio pin.
> +
> +  This function is to Set the Output value for the GPIO
> +  Pin within the giving Expander.
> +
> +  @param[in]  Expander    Expander Value with in the Contoller
> +  @param[in]  Pin         Pin with in the Expnader Value
> +  @param[in]  Value       none
> +
> +**/
> +VOID
> +GpioExpSetOutput (
> +  IN UINT8 Expander,
> +  IN UINT8 Pin,
> +  IN UINT8 Value
> +  )
> +{
> +  UINT8 Controller;
> +  if(!EFI_ERROR(GpioExpGetController(&Controller))) {
> +
> GpioExpDecodeRegAccess(Controller,Expander,Pin,Value,GPIO_EXP_SET_OUT
> PUT);
> +  }
> +}
> +/**
> +  Set the Direction value for the given Expander Gpio pin.
> +
> +  This function is to Set the direction value for the GPIO
> +  Pin within the giving Expander.
> +
> +  @param[in]  Expander    Expander Value with in the Contoller
> +  @param[in]  Pin         Pin with in the Expnader Value
> +  @param[in]  Value       none
> +**/
> +VOID
> +GpioExpSetDirection (
> +  IN UINT8 Expander,
> +  IN UINT8 Pin,
> +  IN UINT8 Value
> +  )
> +{
> +
> +  UINT8 Controller;
> +  if(!EFI_ERROR(GpioExpGetController(&Controller))) {
> +
> GpioExpDecodeRegAccess(Controller,Expander,Pin,Value,GPIO_EXP_SET_DIR);
> +  }
> +}
> +
> +
> +/**
> +  Get the input value for the given Expander Gpio pin.
> +
> +  This function is to get the input value for the GPIO
> +  Pin within the giving Expander.
> +
> +  @param[in]  Expander    Expander Value with in the Contoller
> +  @param[in]  Pin         Pin with in the Expnader Value
> +
> +  @retval     UINT8       Final Value returned from the register
> +**/
> +UINT8
> +GpioExpGetInput (
> +  IN UINT8 Expander,
> +  IN UINT8 Pin
> +  )
> +{
> +  UINT8 Controller;
> +  if(!EFI_ERROR(GpioExpGetController(&Controller))) {
> +    return
> GpioExpDecodeRegAccess(Controller,Expander,Pin,0,GPIO_EXP_GET_INPUT);
> +  }
> +  return 0;
> +}
> +
> +/**
> +  Configures all registers of a single IO Expander in one go.
> +
> +  @param[in]  Expander    Expander number (0/1)
> +  @param[in]  Direction   Bit-encoded direction values. BIT0 is for pin0,
> etc. 0=output, 1=input
> +  @param[in]  Polarity    Bit-encoded input inversion values. BIT0 is for
> pin0, etc. 0=normal, 1=inversion
> +  @param[in]  Output      Bit-encoded output state, ignores polarity,
> only applicable if direction=INPUT. BIT0 is for pin0, etc. 0=low, 1=high
> +
> +**/
> +VOID
> +GpioExpBulkConfig (
> +  IN UINT8  Expander,
> +  IN UINT32 Direction,
> +  IN UINT32 Polarity,
> +  IN UINT32 Output
> +  )
> +{
> +  UINT8 WriteBuf[4];
> +  UINT8 Controller;
> +
> +  GpioExpGetController(&Controller);
> +
> +  WriteBuf[0] = mOutputRegister[0] + AUTO_INCREMENT;
> +  WriteBuf[1] = Output & 0xFF;
> +  WriteBuf[2] = (Output>>8) & 0xFF;
> +  WriteBuf[3] = (Output>>16) & 0xFF;
> +  I2cWriteRead( FindSerialIoBar(Controller,0),
> TCA6424_I2C_ADDRESS+Expander, 4, WriteBuf, 0, NULL, WAIT_1_SECOND);
> +  WriteBuf[0] = mPolarityRegister[0] + AUTO_INCREMENT;
> +  WriteBuf[1] = Polarity & 0xFF;
> +  WriteBuf[2] = (Polarity>>8) & 0xFF;
> +  WriteBuf[3] = (Polarity>>16) & 0xFF;
> +  I2cWriteRead( FindSerialIoBar(Controller,0),
> TCA6424_I2C_ADDRESS+Expander, 4, WriteBuf, 0, NULL, WAIT_1_SECOND);
> +  WriteBuf[0] = mConfigRegister[0] + AUTO_INCREMENT;
> +  WriteBuf[1] = Direction & 0xFF;
> +  WriteBuf[2] = (Direction>>8) & 0xFF;
> +  WriteBuf[3] = (Direction>>16) & 0xFF;
> +  I2cWriteRead( FindSerialIoBar(Controller,0),
> TCA6424_I2C_ADDRESS+Expander, 4, WriteBuf, 0, NULL, WAIT_1_SECOND);
> +
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.inf
> new file mode 100644
> index 0000000000..fe9238a553
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/BaseGpioExpanderLib/Bas
> eGpioExpanderLib.inf
> @@ -0,0 +1,36 @@
> +## @file
> +# Library producing Gpio Expander functionality.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = BaseGpioExpanderLib
> +  FILE_GUID                      =
> D10AE2A4-782E-427E-92FB-BB74505ED329
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = BASE
> +  LIBRARY_CLASS                  = GpioExpanderLib
> +
> +[LibraryClasses]
> +  BaseLib
> +  IoLib
> +  DebugLib
> +  TimerLib
> +  PchSerialIoLib
> +  I2cAccessLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +
> +[Sources]
> +  BaseGpioExpanderLib.c
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PchH
> daVerbTables.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PchH
> daVerbTables.c
> new file mode 100644
> index 0000000000..0f5571724d
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PchH
> daVerbTables.c
> @@ -0,0 +1,2053 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <ConfigBlock/HdAudioConfig.h>
> +#include <Ppi/SiPolicy.h>
> +
> +HDAUDIO_VERB_TABLE HdaVerbTableDisplayAudio =
> HDAUDIO_VERB_TABLE_INIT (
> +  //
> +  //  VerbTable: CFL Display Audio Codec
> +  //  Revision ID = 0xFF
> +  //  Codec Vendor: 0x8086280B
> +  //
> +  0x8086, 0x280B,
> +  0xFF, 0xFF,
> +  //
> +  // Display Audio Verb Table
> +  //
> +  // For GEN9, the Vendor Node ID is 08h
> +  // Port to be exposed to the inbox driver in the vanilla mode: PORT C -
> BIT[7:6] = 01b
> +  0x00878140,
> +  // Pin Widget 5 - PORT B - Configuration Default: 0x18560010
> +  0x00571C10,
> +  0x00571D00,
> +  0x00571E56,
> +  0x00571F18,
> +  // Pin Widget 6 - PORT C - Configuration Default: 0x18560020
> +  0x00671C20,
> +  0x00671D00,
> +  0x00671E56,
> +  0x00671F18,
> +  // Pin Widget 7 - PORT D - Configuration Default: 0x18560030
> +  0x00771C30,
> +  0x00771D00,
> +  0x00771E56,
> +  0x00771F18,
> +  // Disable the third converter and third Pin (NID 08h)
> +  0x00878140
> +);
> +
> +//
> +//codecs verb tables
> +//
> +HDAUDIO_VERB_TABLE HdaVerbTableAlc700 = HDAUDIO_VERB_TABLE_INIT
> (
> +  //
> +  //  VerbTable: (Realtek ALC700)
> +  //  Revision ID = 0xff
> +  //  Codec Verb Table
> +  //  Codec Address: CAd value (0/1/2)
> +  //  Codec Vendor: 0x10EC0700
> +  //
> +  0x10EC, 0x0700,
> +  0xFF, 0xFF,
> +
> //==============================================================
> =====================================
> +  //
> +  //                               Realtek Semiconductor Corp.
> +  //
> +
> //==============================================================
> =====================================
> +
> +  //Realtek High Definition Audio Configuration - Version : 5.0.3.0
> +  //Realtek HD Audio Codec : ALC700
> +  //PCI PnP ID : PCI\VEN_8086&DEV_2668&SUBSYS_72708086
> +  //HDA Codec PnP ID :
> HDAUDIO\FUNC_01&VEN_10EC&DEV_0700&SUBSYS_10EC10F2
> +  //The number of verb command block : 17
> +
> +  //    NID 0x12 : 0x411111F0
> +  //    NID 0x13 : 0x40000000
> +  //    NID 0x14 : 0x411111F0
> +  //    NID 0x15 : 0x411111F0
> +  //    NID 0x16 : 0x411111F0
> +  //    NID 0x17 : 0x90170110
> +  //    NID 0x18 : 0x411111F0
> +  //    NID 0x19 : 0x04A11030
> +  //    NID 0x1A : 0x411111F0
> +  //    NID 0x1B : 0x411111F0
> +  //    NID 0x1D : 0x40622005
> +  //    NID 0x1E : 0x411111F0
> +  //    NID 0x1F : 0x411111F0
> +  //    NID 0x21 : 0x04211020
> +  //    NID 0x29 : 0x411111F0
> +
> +  //===== HDA Codec Subsystem ID Verb-table =====
> +  //HDA Codec Subsystem ID  : 0x10EC10F2
> +  0x001720F2,
> +  0x00172110,
> +  0x001722EC,
> +  0x00172310,
> +
> +  //===== Pin Widget Verb-table =====
> +  //Widget node 0x01 :
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  //Pin widget 0x12 - DMIC
> +  0x01271C00,
> +  0x01271D00,
> +  0x01271E00,
> +  0x01271F40,
> +  //Pin widget 0x13 - DMIC
> +  0x01371C00,
> +  0x01371D00,
> +  0x01371E00,
> +  0x01371F40,
> +  //Pin widget 0x14 - FRONT (Port-D)
> +  0x01471CF0,
> +  0x01471D11,
> +  0x01471E11,
> +  0x01471F41,
> +  //Pin widget 0x15 - I2S-OUT
> +  0x01571CF0,
> +  0x01571D11,
> +  0x01571E11,
> +  0x01571F41,
> +  //Pin widget 0x16 - LINE3 (Port-B)
> +  0x01671CF0,
> +  0x01671D11,
> +  0x01671E11,
> +  0x01671F41,
> +  //Pin widget 0x17 - I2S-OUT
> +  0x01771C10,
> +  0x01771D01,
> +  0x01771E17,
> +  0x01771F90,
> +  //Pin widget 0x18 - I2S-IN
> +  0x01871CF0,
> +  0x01871D11,
> +  0x01871E11,
> +  0x01871F41,
> +  //Pin widget 0x19 - MIC2 (Port-F)
> +  0x01971C30,
> +  0x01971D10,
> +  0x01971EA1,
> +  0x01971F04,
> +  //Pin widget 0x1A - LINE1 (Port-C)
> +  0x01A71CF0,
> +  0x01A71D11,
> +  0x01A71E11,
> +  0x01A71F41,
> +  //Pin widget 0x1B - LINE2 (Port-E)
> +  0x01B71CF0,
> +  0x01B71D11,
> +  0x01B71E11,
> +  0x01B71F41,
> +  //Pin widget 0x1D - PC-BEEP
> +  0x01D71C05,
> +  0x01D71D20,
> +  0x01D71E62,
> +  0x01D71F40,
> +  //Pin widget 0x1E - S/PDIF-OUT
> +  0x01E71CF0,
> +  0x01E71D11,
> +  0x01E71E11,
> +  0x01E71F41,
> +  //Pin widget 0x1F - S/PDIF-IN
> +  0x01F71CF0,
> +  0x01F71D11,
> +  0x01F71E11,
> +  0x01F71F41,
> +  //Pin widget 0x21 - HP-OUT (Port-I)
> +  0x02171C20,
> +  0x02171D10,
> +  0x02171E21,
> +  0x02171F04,
> +  //Pin widget 0x29 - I2S-IN
> +  0x02971CF0,
> +  0x02971D11,
> +  0x02971E11,
> +  0x02971F41,
> +  //Widget node 0x20 :
> +  0x02050045,
> +  0x02045289,
> +  0x0205004A,
> +  0x0204201B,
> +  //Widget node 0x20 - 1 :
> +  0x05850000,
> +  0x05843888,
> +  0x0205006F,
> +  0x02042C0B,
> +
> +
> +  //Widget node 0X20 for ALC1305   20160603 update
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040000,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040004,
> +  0x02050028,
> +  0x02040600,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FFD0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040080,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003A,
> +  0x02050028,
> +  0x02040DFE,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x0204005D,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02040442,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040005,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040006,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040008,
> +  0x02050028,
> +  0x0204B000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204002E,
> +  0x02050028,
> +  0x02040800,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400C3,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204D4A0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400CC,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204400A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400C1,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02040320,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040039,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003B,
> +  0x02050028,
> +  0x0204FFFF,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FC20,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003A,
> +  0x02050028,
> +  0x02041DFE,
> +  0x02050029,
> +  0x0204B024,
> +  //
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C0,
> +  0x02050028,
> +  0x020401FA,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C1,
> +  0x02050028,
> +  0x0204DE23,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C2,
> +  0x02050028,
> +  0x02041C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C3,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C4,
> +  0x02050028,
> +  0x02040200,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C5,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C6,
> +  0x02050028,
> +  0x020403F5,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C7,
> +  0x02050028,
> +  0x0204AF1B,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C8,
> +  0x02050028,
> +  0x02041E0A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C9,
> +  0x02050028,
> +  0x0204368E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CA,
> +  0x02050028,
> +  0x020401FA,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CB,
> +  0x02050028,
> +  0x0204DE23,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CC,
> +  0x02050028,
> +  0x02041C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CD,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CE,
> +  0x02050028,
> +  0x02040200,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CF,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D0,
> +  0x02050028,
> +  0x020403F5,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D1,
> +  0x02050028,
> +  0x0204AF1B,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D2,
> +  0x02050028,
> +  0x02041E0A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D3,
> +  0x02050028,
> +  0x0204368E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040040,
> +  0x02050028,
> +  0x0204800F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040062,
> +  0x02050028,
> +  0x02048000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040063,
> +  0x02050028,
> +  0x02044848,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040064,
> +  0x02050028,
> +  0x02040800,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040065,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040066,
> +  0x02050028,
> +  0x02044004,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040067,
> +  0x02050028,
> +  0x02040802,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040068,
> +  0x02050028,
> +  0x0204890F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040069,
> +  0x02050028,
> +  0x0204E021,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040070,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040071,
> +  0x02050000,
> +  0x02043330,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040072,
> +  0x02050000,
> +  0x02043333,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040073,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040074,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040075,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040076,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040050,
> +  0x02050028,
> +  0x020402EC,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040051,
> +  0x02050028,
> +  0x02044909,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040052,
> +  0x02050028,
> +  0x020440B0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040046,
> +  0x02050028,
> +  0x0204C22E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040047,
> +  0x02050028,
> +  0x02040C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040048,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040049,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204004A,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204004B,
> +  0x02050028,
> +  0x02041C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x02040090,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204721F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204009E,
> +  0x02050028,
> +  0x02040001,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040004,
> +  0x02050028,
> +  0x02040500,
> +  0x02050029,
> +  0x0204B024
> +); // HdaVerbTableAlc700
> +
> +HDAUDIO_VERB_TABLE HdaVerbTableAlc701 = HDAUDIO_VERB_TABLE_INIT
> (
> +  //
> +  //  VerbTable: (Realtek ALC701)
> +  //  Revision ID = 0xff
> +  //  Codec Verb Table
> +  //  Codec Address: CAd value (0/1/2)
> +  //  Codec Vendor: 0x10EC0701
> +  //
> +  0x10EC, 0x0701,
> +  0xFF, 0xFF,
> +
> //==============================================================
> =====================================
> +  //
> +  //                               Realtek Semiconductor Corp.
> +  //
> +
> //==============================================================
> =====================================
> +
> +  //Realtek High Definition Audio Configuration - Version : 5.0.3.0
> +  //Realtek HD Audio Codec : ALC701
> +  //PCI PnP ID : PCI\VEN_8086&DEV_2668&SUBSYS_72708086
> +  //HDA Codec PnP ID :
> HDAUDIO\FUNC_01&VEN_10EC&DEV_0701&SUBSYS_10EC1124
> +  //The number of verb command block : 17
> +
> +  //    NID 0x12 : 0x411111F0
> +  //    NID 0x13 : 0x40000000
> +  //    NID 0x14 : 0x411111F0
> +  //    NID 0x15 : 0x411111F0
> +  //    NID 0x16 : 0x411111F0
> +  //    NID 0x17 : 0x90170110
> +  //    NID 0x18 : 0x411111F0
> +  //    NID 0x19 : 0x04A11030
> +  //    NID 0x1A : 0x411111F0
> +  //    NID 0x1B : 0x411111F0
> +  //    NID 0x1D : 0x40610041
> +  //    NID 0x1E : 0x411111F0
> +  //    NID 0x1F : 0x411111F0
> +  //    NID 0x21 : 0x04211020
> +  //    NID 0x29 : 0x411111F0
> +
> +
> +  //===== HDA Codec Subsystem ID Verb-table =====
> +  //HDA Codec Subsystem ID  : 0x10EC1124
> +  0x00172024,
> +  0x00172111,
> +  0x001722EC,
> +  0x00172310,
> +  //===== Pin Widget Verb-table =====
> +  //Widget node 0x01 :
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  //Pin widget 0x12 - DMIC
> +  0x01271C00,
> +  0x01271D00,
> +  0x01271E00,
> +  0x01271F40,
> +  //Pin widget 0x13 - DMIC
> +  0x01371C00,
> +  0x01371D00,
> +  0x01371E00,
> +  0x01371F40,
> +  //Pin widget 0x14 - FRONT (Port-D)
> +  0x01471CF0,
> +  0x01471D11,
> +  0x01471E11,
> +  0x01471F41,
> +  //Pin widget 0x15 - I2S-OUT
> +  0x01571CF0,
> +  0x01571D11,
> +  0x01571E11,
> +  0x01571F41,
> +  //Pin widget 0x16 - LINE3 (Port-B)
> +  0x01671CF0,
> +  0x01671D11,
> +  0x01671E11,
> +  0x01671F41,
> +  //Pin widget 0x17 - I2S-OUT
> +  0x01771C10,
> +  0x01771D01,
> +  0x01771E17,
> +  0x01771F90,
> +  //Pin widget 0x18 - I2S-IN
> +  0x01871CF0,
> +  0x01871D11,
> +  0x01871E11,
> +  0x01871F41,
> +  //Pin widget 0x19 - MIC2 (Port-F)
> +  0x01971C30,
> +  0x01971D10,
> +  0x01971EA1,
> +  0x01971F04,
> +  //Pin widget 0x1A - LINE1 (Port-C)
> +  0x01A71CF0,
> +  0x01A71D11,
> +  0x01A71E11,
> +  0x01A71F41,
> +  //Pin widget 0x1B - LINE2 (Port-E)
> +  0x01B71CF0,
> +  0x01B71D11,
> +  0x01B71E11,
> +  0x01B71F41,
> +  //Pin widget 0x1D - PC-BEEP
> +  0x01D71C41,
> +  0x01D71D00,
> +  0x01D71E61,
> +  0x01D71F40,
> +  //Pin widget 0x1E - S/PDIF-OUT
> +  0x01E71CF0,
> +  0x01E71D11,
> +  0x01E71E11,
> +  0x01E71F41,
> +  //Pin widget 0x1F - S/PDIF-IN
> +  0x01F71CF0,
> +  0x01F71D11,
> +  0x01F71E11,
> +  0x01F71F41,
> +  //Pin widget 0x21 - HP-OUT (Port-I)
> +  0x02171C20,
> +  0x02171D10,
> +  0x02171E21,
> +  0x02171F04,
> +  //Pin widget 0x29 - I2S-IN
> +  0x02971CF0,
> +  0x02971D11,
> +  0x02971E11,
> +  0x02971F41,
> +  //Widget node 0x20 :
> +  0x02050045,
> +  0x02045289,
> +  0x0205004A,
> +  0x0204201B,
> +  //Widget node 0x20 - 1 :
> +  0x05850000,
> +  0x05843888,
> +  0x0205006F,
> +  0x02042C0B
> +); // HdaVerbTableAlc701
> +
> +HDAUDIO_VERB_TABLE HdaVerbTableAlc274 = HDAUDIO_VERB_TABLE_INIT
> (
> +  //
> +  //  VerbTable: (Realtek ALC274)
> +  //  Revision ID = 0xff
> +  //  Codec Verb Table
> +  //  Codec Address: CAd value (0/1/2)
> +  //  Codec Vendor: 0x10EC0274
> +  //
> +  0x10EC, 0x0274,
> +  0xFF, 0xFF,
> +
> //==============================================================
> =====================================
> +  //
> +  //                               Realtek Semiconductor Corp.
> +  //
> +
> //==============================================================
> =====================================
> +
> +  //Realtek High Definition Audio Configuration - Version : 5.0.3.0
> +  //Realtek HD Audio Codec : ALC274
> +  //PCI PnP ID : PCI\VEN_8086&DEV_2668&SUBSYS_72708086
> +  //HDA Codec PnP ID :
> HDAUDIO\FUNC_01&VEN_10EC&DEV_0274&SUBSYS_10EC10F6
> +  //The number of verb command block : 16
> +
> +  //    NID 0x12 : 0x40000000
> +  //    NID 0x13 : 0x411111F0
> +  //    NID 0x14 : 0x411111F0
> +  //    NID 0x15 : 0x411111F0
> +  //    NID 0x16 : 0x411111F0
> +  //    NID 0x17 : 0x411111F0
> +  //    NID 0x18 : 0x411111F0
> +  //    NID 0x19 : 0x04A11020
> +  //    NID 0x1A : 0x411111F0
> +  //    NID 0x1B : 0x411111F0
> +  //    NID 0x1D : 0x40451B05
> +  //    NID 0x1E : 0x411111F0
> +  //    NID 0x1F : 0x411111F0
> +  //    NID 0x21 : 0x04211010
> +
> +
> +  //===== HDA Codec Subsystem ID Verb-table =====
> +  //,DA Codec Subsystem ID  : 0x10EC10F6
> +  0x001720F6,
> +  0x00172110,
> +  0x001722EC,
> +  0x00172310,
> +
> +  //===== Pin Widget Verb-table =====
> +  //Widget node 0x01 :
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  //Pin widget 0x12 - DMIC
> +  0x01271C00,
> +  0x01271D00,
> +  0x01271E00,
> +  0x01271F40,
> +  //Pin widget 0x13 - DMIC
> +  0x01371CF0,
> +  0x01371D11,
> +  0x01371E11,
> +  0x01371F41,
> +  //Pin widget 0x14 - NPC
> +  0x01471CF0,
> +  0x01471D11,
> +  0x01471E11,
> +  0x01471F41,
> +  //Pin widget 0x15 - I2S_OUT2
> +  0x01571CF0,
> +  0x01571D11,
> +  0x01571E11,
> +  0x01571F41,
> +  //Pin widget 0x16 - LINE3 (Port-B)
> +  0x01671CF0,
> +  0x01671D11,
> +  0x01671E11,
> +  0x01671F41,
> +  //Pin widget 0x17 - I2S_OUT1
> +  0x01771CF0,
> +  0x01771D11,
> +  0x01771E11,
> +  0x01771F41,
> +  //Pin widget 0x18 - I2S_IN
> +  0x01871CF0,
> +  0x01871D11,
> +  0x01871E11,
> +  0x01871F41,
> +  //Pin widget 0x19 - MIC2 (Port-F)
> +  0x01971C20,
> +  0x01971D10,
> +  0x01971EA1,
> +  0x01971F04,
> +  //Pin widget 0x1A - LINE1 (Port-C)
> +  0x01A71CF0,
> +  0x01A71D11,
> +  0x01A71E11,
> +  0x01A71F41,
> +  //Pin widget 0x1B - LINE2 (Port-E)
> +  0x01B71CF0,
> +  0x01B71D11,
> +  0x01B71E11,
> +  0x01B71F41,
> +  //Pin widget 0x1D - PC-BEEP
> +  0x01D71C05,
> +  0x01D71D1B,
> +  0x01D71E45,
> +  0x01D71F40,
> +  //Pin widget 0x1E - S/PDIF-OUT
> +  0x01E71CF0,
> +  0x01E71D11,
> +  0x01E71E11,
> +  0x01E71F41,
> +  //Pin widget 0x1F - S/PDIF-IN
> +  0x01F71CF0,
> +  0x01F71D11,
> +  0x01F71E11,
> +  0x01F71F41,
> +  //Pin widget 0x21 - HP-OUT (Port-I)
> +  0x02171C10,
> +  0x02171D10,
> +  0x02171E21,
> +  0x02171F04,
> +  //Widget node 0x20 :
> +  0x02050045,
> +  0x02045289,
> +  0x0205006F,
> +  0x02042C0B,
> +  //Widget node 0x20 - 1 :
> +  0x02050035,
> +  0x02048968,
> +  0x05B50001,
> +  0x05B48540,
> +  //Widget node 0x20 - 2 :
> +  0x05850000,
> +  0x05843888,
> +  0x05850000,
> +  0x05843888,
> +  //Widget node 0x20 - 3 :
> +  0x0205004A,
> +  0x0204201B,
> +  0x0205004A,
> +  0x0204201B
> +); //HdaVerbTableAlc274
> +
> +//
> +// WHL codecs verb tables
> +//
> +HDAUDIO_VERB_TABLE WhlHdaVerbTableAlc700 =
> HDAUDIO_VERB_TABLE_INIT (
> +  //
> +  //  VerbTable: (Realtek ALC700) WHL RVP
> +  //  Revision ID = 0xff
> +  //  Codec Verb Table for WHL PCH boards
> +  //  Codec Address: CAd value (0/1/2)
> +  //  Codec Vendor: 0x10EC0700
> +  //
> +  0x10EC, 0x0700,
> +  0xFF, 0xFF,
> +
> //==============================================================
> =====================================
> +  //
> +  //                               Realtek Semiconductor Corp.
> +  //
> +
> //==============================================================
> =====================================
> +
> +  //Realtek High Definition Audio Configuration - Version : 5.0.3.1
> +  //Realtek HD Audio Codec : ALC700
> +  //PCI PnP ID : PCI\VEN_8086&DEV_2668&SUBSYS_72708086
> +  //HDA Codec PnP ID :
> HDAUDIO\FUNC_01&VEN_10EC&DEV_0700&SUBSYS_10EC10F2
> +  //The number of verb command block : 17
> +
> +  //    NID 0x12 : 0x411111F0
> +  //    NID 0x13 : 0x40000000
> +  //    NID 0x14 : 0x411111F0
> +  //    NID 0x15 : 0x411111F0
> +  //    NID 0x16 : 0x411111F0
> +  //    NID 0x17 : 0x90170110
> +  //    NID 0x18 : 0x411111F0
> +  //    NID 0x19 : 0x02A19040
> +  //    NID 0x1A : 0x411111F0
> +  //    NID 0x1B : 0x411111F0
> +  //    NID 0x1D : 0x40638029
> +  //    NID 0x1E : 0x411111F0
> +  //    NID 0x1F : 0x411111F0
> +  //    NID 0x21 : 0x02211020
> +  //    NID 0x29 : 0x411111F0
> +
> +  //===== HDA Codec Subsystem ID Verb-table =====
> +  //HDA Codec Subsystem ID  : 0x10EC10F2
> +  0x001720F2,
> +  0x00172110,
> +  0x001722EC,
> +  0x00172310,
> +
> +  //===== Pin Widget Verb-table =====
> +  //Widget node 0x01 :
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  0x0017FF00,
> +  //Pin widget 0x12 - DMIC
> +  0x01271CF0,
> +  0x01271D11,
> +  0x01271E11,
> +  0x01271F41,
> +  //Pin widget 0x13 - DMIC
> +  0x01371C00,
> +  0x01371D00,
> +  0x01371E00,
> +  0x01371F40,
> +  //Pin widget 0x14 - FRONT (Port-D)
> +  0x01471CF0,
> +  0x01471D11,
> +  0x01471E11,
> +  0x01471F41,
> +  //Pin widget 0x15 - I2S-OUT
> +  0x01571CF0,
> +  0x01571D11,
> +  0x01571E11,
> +  0x01571F41,
> +  //Pin widget 0x16 - LINE3 (Port-B)
> +  0x01671CF0,
> +  0x01671D11,
> +  0x01671E11,
> +  0x01671F41,
> +  //Pin widget 0x17 - I2S-OUT
> +  0x01771C10,
> +  0x01771D01,
> +  0x01771E17,
> +  0x01771F90,
> +  //Pin widget 0x18 - I2S-IN
> +  0x01871CF0,
> +  0x01871D11,
> +  0x01871E11,
> +  0x01871F41,
> +  //Pin widget 0x19 - MIC2 (Port-F)
> +  0x01971C40,
> +  0x01971D90,
> +  0x01971EA1,
> +  0x01971F02,
> +  //Pin widget 0x1A - LINE1 (Port-C)
> +  0x01A71CF0,
> +  0x01A71D11,
> +  0x01A71E11,
> +  0x01A71F41,
> +  //Pin widget 0x1B - LINE2 (Port-E)
> +  0x01B71CF0,
> +  0x01B71D11,
> +  0x01B71E11,
> +  0x01B71F41,
> +  //Pin widget 0x1D - PC-BEEP
> +  0x01D71C29,
> +  0x01D71D80,
> +  0x01D71E63,
> +  0x01D71F40,
> +  //Pin widget 0x1E - S/PDIF-OUT
> +  0x01E71CF0,
> +  0x01E71D11,
> +  0x01E71E11,
> +  0x01E71F41,
> +  //Pin widget 0x1F - S/PDIF-IN
> +  0x01F71CF0,
> +  0x01F71D11,
> +  0x01F71E11,
> +  0x01F71F41,
> +  //Pin widget 0x21 - HP-OUT (Port-I)
> +  0x02171C20,
> +  0x02171D10,
> +  0x02171E21,
> +  0x02171F02,
> +  //Pin widget 0x29 - I2S-IN
> +  0x02971CF0,
> +  0x02971D11,
> +  0x02971E11,
> +  0x02971F41,
> +  //Widget node 0x20 - 0  FAKE JD unplug
> +  0x02050008,
> +  0x0204A80F,
> +  0x02050008,
> +  0x0204A80F,
> +
> +  //Widget node 0x20 - 1 : //remove NID 58 realted setting for ALC700
> bypass DAC02 DRE(NID5B bit14)
> +  0x05B50010,
> +  0x05B45C1D,
> +  0x0205006F,
> +  0x02040F8B,   //Zeek, 0F8Bh
> +
> +  //Widget node 0x20 -2:
> +  0x02050045,
> +  0x02045089,
> +  0x0205004A,
> +  0x0204201B,
> +
> +  //Widget node 0x20 - 3   From JD detect
> +  0x02050008,
> +  0x0204A807,
> +  0x02050008,
> +  0x0204A807,
> +
> +  //Widget node 0x20 - 4  Pull high ALC700 GPIO5 for AMP1305 PD pin and
> enable I2S BCLK first
> +  0x02050090,
> +  0x02040424,
> +  0x00171620,
> +  0x00171720,
> +
> +  0x00171520,
> +  0x01770740,
> +  0x01770740,
> +  0x01770740,
> +
> +  //Widget node 0x20 for ALC1305   20181105 update   2W/4ohm to
> remove ALC1305 EQ setting and enable ALC1305 silencet detect to prevent I2S
> noise
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040000,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400CF,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02045548,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003F,
> +  0x02050028,
> +  0x02041000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040004,
> +  0x02050028,
> +  0x02040600,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FFD0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040080,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003A,
> +  0x02050028,
> +  0x02040DFE,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x0204005D,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02040442,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040005,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040006,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040008,
> +  0x02050028,
> +  0x0204B000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204002E,
> +  0x02050028,
> +  0x02040800,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400C3,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204D4A0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400CC,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204400A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x020400C1,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02040320,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040039,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003B,
> +  0x02050028,
> +  0x0204FFFF,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FC20,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x02040006,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x020400C0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FCA0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FCE0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FCF0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040080,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040880,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FCE0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FCA0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003C,
> +  0x02050028,
> +  0x0204FC20,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x02040006,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040080,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C0,
> +  0x02050028,
> +  0x020401F0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C1,
> +  0x02050028,
> +  0x0204C1C7,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C2,
> +  0x02050028,
> +  0x02041C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C3,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C4,
> +  0x02050028,
> +  0x02040200,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C5,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C6,
> +  0x02050028,
> +  0x020403E1,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C7,
> +  0x02050028,
> +  0x02040F5A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C8,
> +  0x02050028,
> +  0x02041E1E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400C9,
> +  0x02050028,
> +  0x0204083F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CA,
> +  0x02050028,
> +  0x020401F0,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CB,
> +  0x02050028,
> +  0x0204C1C7,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CC,
> +  0x02050028,
> +  0x02041C00,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CD,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CE,
> +  0x02050028,
> +  0x02040200,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400CF,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D0,
> +  0x02050028,
> +  0x020403E1,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D1,
> +  0x02050028,
> +  0x02040F5A,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D2,
> +  0x02050028,
> +  0x02041E1E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x020400D3,
> +  0x02050028,
> +  0x0204083F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040062,
> +  0x02050028,
> +  0x02048000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040063,
> +  0x02050028,
> +  0x02045F5F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040064,
> +  0x02050028,
> +  0x02042000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040065,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040066,
> +  0x02050028,
> +  0x02044004,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040067,
> +  0x02050028,
> +  0x02040802,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040068,
> +  0x02050028,
> +  0x0204890F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040069,
> +  0x02050028,
> +  0x0204E021,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040070,
> +  0x02050028,
> +  0x02048012,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040071,
> +  0x02050028,
> +  0x02043450,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040072,
> +  0x02050028,
> +  0x02040123,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040073,
> +  0x02050028,
> +  0x02044543,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040074,
> +  0x02050028,
> +  0x02042100,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040075,
> +  0x02050028,
> +  0x02044321,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040076,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040050,
> +  0x02050028,
> +  0x02048200,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040051,
> +  0x02050028,
> +  0x02040707,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040052,
> +  0x02050028,
> +  0x02044090,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006A,
> +  0x02050028,
> +  0x02040090,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204006C,
> +  0x02050028,
> +  0x0204721F,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040012,
> +  0x02050028,
> +  0x0204DFDF,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204009E,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040004,
> +  0x02050028,
> +  0x02040500,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040060,
> +  0x02050028,
> +  0x0204E213,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003A,
> +  0x02050028,
> +  0x02041DFE,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204003F,
> +  0x02050028,
> +  0x02043000,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040040,
> +  0x02050028,
> +  0x0204000C,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x02040046,
> +  0x02050028,
> +  0x0204422E,
> +  0x02050029,
> +  0x0204B024,
> +
> +  0x02050024,
> +  0x02040010,
> +  0x02050026,
> +  0x0204004B,
> +  0x02050028,
> +  0x02040000,
> +  0x02050029,
> +  0x0204B024
> +); // WhlHdaVerbTableAlc700
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.c
> new file mode 100644
> index 0000000000..c0af462193
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.c
> @@ -0,0 +1,137 @@
> +/** @file
> +  This file is SampleCode of the library for Intel HD Audio Verb Table
> configuration.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <ConfigBlock.h>
> +#include <PlatformBoardId.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/HdaVerbTableLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PcdLib.h>
> +
> +extern HDAUDIO_VERB_TABLE HdaVerbTableDisplayAudio;
> +extern HDAUDIO_VERB_TABLE HdaVerbTableAlc274;
> +extern HDAUDIO_VERB_TABLE HdaVerbTableAlc700;
> +extern HDAUDIO_VERB_TABLE HdaVerbTableAlc701;
> +extern HDAUDIO_VERB_TABLE WhlHdaVerbTableAlc700;
> +
> +/**
> +  Add verb table helper function.
> +  This function calculates verbtable number and shows verb table
> information.
> +
> +  @param[in,out] VerbTableEntryNum      Input current VerbTable
> number and output the number after adding new table
> +  @param[in,out] VerbTableArray         Pointer to array of VerbTable
> +  @param[in]     VerbTable              VerbTable which is going to
> add into array
> +**/
> +STATIC
> +VOID
> +InternalAddVerbTable (
> +  IN OUT  UINT8                   *VerbTableEntryNum,
> +  IN OUT  UINT32                  *VerbTableArray,
> +  IN      HDAUDIO_VERB_TABLE      *VerbTable
> +  )
> +{
> +  if (VerbTable == NULL) {
> +    DEBUG ((DEBUG_INFO, "InternalAddVerbTable wrong input: VerbTable
> == NULL\n"));
> +    return;
> +  }
> +
> +  VerbTableArray[*VerbTableEntryNum] = (UINT32) VerbTable;
> +  *VerbTableEntryNum += 1;
> +
> +  DEBUG ((DEBUG_INFO,
> +    "HDA: Add verb table for vendor = 0x%04X devId = 0x%04X (size = %d
> DWords)\n",
> +    VerbTable->Header.VendorId,
> +    VerbTable->Header.DeviceId,
> +    VerbTable->Header.DataDwords)
> +    );
> +}
> +
> +/**
> +  Add verb table function.
> +  This function update the verb table number and verb table ptr of policy.
> +
> +  @param[in]  HdAudioConfig            HD Audio config block
> +  @param[out] VerbTableEntryNum        Number of verb table entries
> +  @param[out] HdaVerbTablePtr          Pointer to the verb table
> +**/
> +VOID
> +AddPlatformVerbTables (
> +  IN   UINT8              CodecType,
> +  OUT  UINT8              *VerbTableEntryNum,
> +  OUT  UINT32             *HdaVerbTablePtr
> +  )
> +{
> +  UINT8                   VerbTableEntries;
> +  UINT32                  VerbTableArray[6];
> +  UINT32                  *VerbTablePtr;
> +
> +  VerbTableEntries = 0;
> +
> +  InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdDisplayAudioHdaVerbTable));
> +
> +  if (CodecType == PchHdaCodecPlatformOnboard) {
> +    DEBUG ((DEBUG_INFO, "HDA Policy: Onboard codec selected\n"));
> +    InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdHdaVerbTable));
> +    InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdHdaVerbTable2));
> +  } else {
> +    DEBUG ((DEBUG_INFO, "HDA Policy: External codec kit selected\n"));
> +    InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdCommonHdaVerbTable1));
> +    InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdCommonHdaVerbTable2));
> +    InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *)
> (UINTN) PcdGet32 (PcdCommonHdaVerbTable3));
> +  }
> +
> +  *VerbTableEntryNum = VerbTableEntries;
> +
> +  VerbTablePtr = (UINT32 *) AllocateZeroPool (sizeof (UINT32) *
> VerbTableEntries);
> +  CopyMem (VerbTablePtr, VerbTableArray, sizeof (UINT32) *
> VerbTableEntries);
> +  *HdaVerbTablePtr = (UINT32) VerbTablePtr;
> +}
> +
> +/**
> +  HDA VerbTable init function for PEI post memory phase.
> +
> +  @param[in]  BoardId   An unsigned integrer represent the board id.
> +
> +  @retval EFI_SUCCESS   The function completed successfully.
> +**/
> +EFI_STATUS
> +HdaVerbTableInit (
> +  IN UINT16 BoardId
> +  )
> +{
> +  HDAUDIO_VERB_TABLE *VerbTable;
> +  HDAUDIO_VERB_TABLE *VerbTable2;
> +
> +  VerbTable = NULL;
> +  VerbTable2 = NULL;
> +
> +  switch (BoardId) {
> +
> +    case BoardIdCometLakeULpddr3Rvp:
> +      VerbTable = &WhlHdaVerbTableAlc700;
> +      break;
> +
> +    default:
> +      DEBUG ((DEBUG_INFO, "HDA: Init default verb tables (Realtek
> ALC700 and ALC701)\n"));
> +      VerbTable = &HdaVerbTableAlc700;
> +      VerbTable2 = &HdaVerbTableAlc701;
> +      break;
> +  }
> +
> +  PcdSet32S (PcdHdaVerbTable, (UINT32) VerbTable);
> +  PcdSet32S (PcdHdaVerbTable2, (UINT32) VerbTable2);
> +  PcdSet32S (PcdDisplayAudioHdaVerbTable, (UINT32)
> &HdaVerbTableDisplayAudio);
> +
> +  // Codecs - Realtek ALC700, ALC701, ALC274 (external - connected via HDA
> header)
> +  PcdSet32S (PcdCommonHdaVerbTable1, (UINT32) &HdaVerbTableAlc700);
> +  PcdSet32S (PcdCommonHdaVerbTable2, (UINT32) &HdaVerbTableAlc701);
> +  PcdSet32S (PcdCommonHdaVerbTable3, (UINT32) &HdaVerbTableAlc274);
> +
> +  return EFI_SUCCESS;
> +}
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.inf
> new file mode 100644
> index 0000000000..3a4c38f0db
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiHdaVerbTableLib/PeiHd
> aVerbTableLib.inf
> @@ -0,0 +1,69 @@
> +## @file
> +#  PEI Intel HD Audio Verb Table library.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +###############################################################
> #################
> +#
> +# Defines Section - statements that will be processed to create a Makefile.
> +#
> +###############################################################
> #################
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = PeiHdaVerbTableLib
> +  FILE_GUID                      =
> 821486A2-CF3B-4D24-BC45-AFE40D9737EB
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = HdaVerbTableLib
> +
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64
> +#
> +
> +###############################################################
> #################
> +#
> +# Sources Section - list of files that are required for the build to succeed.
> +#
> +###############################################################
> #################
> +
> +[Sources]
> +  PeiHdaVerbTableLib.c
> +  PchHdaVerbTables.c
> +
> +###############################################################
> #################
> +#
> +# Package Dependency Section - list of Package files that are required for
> +#                              this module.
> +#
> +###############################################################
> #################
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  MemoryAllocationLib
> +  PcdLib
> +
> +[Pcd]
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdHdaVerbTable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdHdaVerbTable2
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdExtHdaVerbTable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdCommonHdaVerbTable1
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdCommonHdaVerbTable2
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdCommonHdaVerbTable3
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDisplayAudioHdaVerbTable
> ## CONSUMES
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.c
> new file mode 100644
> index 0000000000..ddb0ec4640
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.c
> @@ -0,0 +1,115 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/I2cAccessLib.h>
> +
> +EFI_STATUS
> +I2cWriteRead (
> +  IN UINTN  MmioBase,
> +  IN UINT8  SlaveAddress,
> +  IN UINT8  WriteLength,
> +  IN UINT8  *WriteBuffer,
> +  IN UINT8  ReadLength,
> +  IN UINT8  *ReadBuffer,
> +  IN UINT64  TimeBudget
> +  //TODO: add Speed parameter
> +  )
> +{
> +  UINT8 ReadsNeeded = ReadLength;
> +  UINT64 CutOffTime;
> +
> +  if ((WriteLength == 0 && ReadLength == 0) ||
> +      (WriteLength != 0 && WriteBuffer == NULL) ||
> +      (ReadLength != 0 && ReadBuffer == NULL) ) {
> +    DEBUG ((DEBUG_ERROR, "I2cWR Invalid Parameters\n"));
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  // Sanity checks to verify the I2C controller is alive
> +  // Conveniently, ICON register's values of 0 or FFFFFFFF indicate
> +  // I2c controller is out-of-order: either disabled, in D3 or in reset.
> +  //
> +  if (MmioRead32(MmioBase+R_IC_CON) == 0xFFFFFFFF ||
> MmioRead32(MmioBase+R_IC_CON) == 0x0) {
> +    DEBUG ((DEBUG_ERROR, "I2cWR Device Error\n"));
> +    return EFI_DEVICE_ERROR;
> +  }
> +
> +  MmioWrite32(MmioBase+R_IC_ENABLE, 0x0);
> +  MmioRead32(MmioBase+0x40);
> +  MmioRead32(MmioBase+R_IC_CLR_TX_ABRT);
> +  MmioWrite32(MmioBase+R_IC_SDA_HOLD, 0x001C001C);
> +  //
> +  // Set I2C Bus Speed at 400 kHz for GPIO Expander
> +  //
> +  MmioWrite32(MmioBase + R_IC_FS_SCL_HCNT, 128);
> +  MmioWrite32(MmioBase + R_IC_FS_SCL_LCNT, 160);
> +  MmioWrite32(MmioBase + R_IC_TAR, SlaveAddress);
> +  MmioWrite32(MmioBase + R_IC_CON, B_IC_MASTER_MODE |
> V_IC_SPEED_FAST | B_IC_RESTART_EN | B_IC_SLAVE_DISABLE );
> +  MmioWrite32(MmioBase+R_IC_ENABLE, 0x1);
> +  CutOffTime = AsmReadTsc() + TimeBudget;
> +
> +  while ( (MmioRead32(MmioBase+R_IC_ENABLE_STATUS) & 1)==0 ) {
> +    if (AsmReadTsc() > CutOffTime) {
> +      DEBUG ((DEBUG_ERROR, "I2cWR timeout\n"));
> +      return EFI_TIMEOUT;
> +    }
> +  }
> +
> +  while(1) {
> +    if(MmioRead32(MmioBase+R_IC_INTR_STAT) & B_IC_INTR_TX_ABRT) {
> +      DEBUG ((DEBUG_ERROR, "I2cWR Transfer aborted, reason =
> 0x%08x\n",MmioRead32(MmioBase+R_IC_TX_ABRT_SOURCE)));
> +      MmioRead32(MmioBase+R_IC_CLR_TX_ABRT);
> +      MmioAnd32(MmioBase+R_IC_ENABLE, 0xFFFFFFFE);
> +      while ( (MmioRead32(MmioBase+R_IC_ENABLE_STATUS) & 1)==1 ) {}
> +      return EFI_DEVICE_ERROR;
> +    }
> +    if (MmioRead32(MmioBase+R_IC_STATUS) & B_IC_STATUS_TFNF) {
> +      if (WriteLength > 1) {
> +        MmioWrite32(MmioBase+R_IC_DATA_CMD, *WriteBuffer);
> +        WriteBuffer++;
> +        WriteLength--;
> +      } else if (WriteLength==1 && ReadLength != 0) {
> +        MmioWrite32(MmioBase+R_IC_DATA_CMD, *WriteBuffer);
> +        WriteBuffer++;
> +        WriteLength--;
> +      } else if (WriteLength==1 && ReadLength == 0) {
> +        MmioWrite32(MmioBase+R_IC_DATA_CMD, *WriteBuffer |
> B_IC_CMD_STOP);
> +        WriteBuffer++;
> +        WriteLength--;
> +      } else if (ReadLength > 1) {
> +        MmioWrite32(MmioBase+R_IC_DATA_CMD, B_IC_CMD_READ);
> +        ReadLength--;
> +      } else if (ReadLength == 1) {
> +        MmioWrite32(MmioBase+R_IC_DATA_CMD,
> B_IC_CMD_READ|B_IC_CMD_STOP);
> +        ReadLength--;
> +      }
> +    }
> +
> +    if (ReadsNeeded) {
> +      if (MmioRead32(MmioBase+R_IC_STATUS) & B_IC_STATUS_RFNE) {
> +        *ReadBuffer =
> (UINT8)MmioRead32(MmioBase+R_IC_DATA_CMD);
> +        ReadBuffer++;
> +        ReadsNeeded--;
> +      }
> +    }
> +    if (WriteLength==0 && ReadsNeeded==0
> && !(MmioRead32(MmioBase+R_IC_STATUS)&B_IC_STATUS_ACTIVITY)) {
> +      MmioAnd32(MmioBase+R_IC_ENABLE, 0xFFFFFFFE);
> +      while ( (MmioRead32(MmioBase+R_IC_ENABLE_STATUS) & 1)==1 ) {}
> +      DEBUG ((DEBUG_INFO, "I2cWR success\n"));
> +      return EFI_SUCCESS;
> +    }
> +    if (AsmReadTsc() > CutOffTime) {
> +      MmioAnd32(MmioBase+R_IC_ENABLE, 0xFFFFFFFE);
> +      while ( (MmioRead32(MmioBase+R_IC_ENABLE_STATUS) & 1)==1 ) {}
> +      DEBUG ((DEBUG_ERROR, "I2cWR wrong ENST value\n"));
> +      return EFI_TIMEOUT;
> +    }
> +
> +  }
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.inf
> new file mode 100644
> index 0000000000..faff1ce378
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Library/PeiI2cAccessLib/PeiI2cAcce
> ssLib.inf
> @@ -0,0 +1,39 @@
> +## @file
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = PeiI2cAccessLib
> +  FILE_GUID                      =
> 72CD3A7B-FEA5-4F5E-9165-4DD12187BB13
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = BASE
> +  LIBRARY_CLASS                  = PeiI2cAccessLib
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC
> +#
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  TimerLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  SecurityPkg/SecurityPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +
> +[Sources]
> +  PeiI2cAccessLib.c
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeCpuPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeCpuPolicyUpdate.c
> new file mode 100644
> index 0000000000..5a6c4d322f
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeCpuPolicyUpdate.c
> @@ -0,0 +1,88 @@
> +/** @file
> +  This file is the library for CPU DXE Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/DxeCpuPolicyUpdateLib.h>
> +
> +/**
> +  This function prints the CPU DXE phase policy.
> +
> +  @param[in] DxeCpuPolicy - CPU DXE Policy protocol
> +**/
> +VOID
> +CpuDxePrintPolicyProtocol (
> +  IN  DXE_CPU_POLICY_PROTOCOL  *DxeCpuPolicy
> +  )
> +{
> +  DEBUG_CODE_BEGIN ();
> +  DEBUG ((DEBUG_INFO, "\n------------------------ CPU Policy (DXE) print
> BEGIN -----------------\n"));
> +  DEBUG ((DEBUG_INFO, "Revision : %x\n", DxeCpuPolicy->Revision));
> +  ASSERT (DxeCpuPolicy->Revision ==
> DXE_CPU_POLICY_PROTOCOL_REVISION);
> +  DEBUG ((DEBUG_INFO, "\n------------------------ CPU_DXE_CONFIG
> -----------------\n"));
> +  DEBUG ((DEBUG_INFO, "EnableDts : %x\n", DxeCpuPolicy->EnableDts));
> +  DEBUG ((DEBUG_INFO, "\n------------------------ CPU Policy (DXE) print END
> -----------------\n"));
> +  DEBUG_CODE_END ();
> +}
> +
> +/**
> +  Get data for CPU policy from setup options.
> +
> +  @param[in] DxeCpuPolicy              The pointer to get CPU Policy
> protocol instance
> +
> +  @retval EFI_SUCCESS                  Operation success.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdateDxeSiCpuPolicy (
> +  IN OUT  DXE_CPU_POLICY_PROTOCOL  *DxeCpuPolicy
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  CpuInstallPolicyProtocol installs CPU Policy.
> +  While installed, RC assumes the Policy is ready and finalized. So please
> update and override
> +  any setting before calling this function.
> +
> +  @param[in] ImageHandle                Image handle of this driver.
> +  @param[in] DxeCpuPolicy               The pointer to CPU Policy
> Protocol instance
> +
> +  @retval EFI_SUCCESS                   The policy is installed.
> +  @retval EFI_OUT_OF_RESOURCES          Insufficient resources to
> create buffer
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +CpuInstallPolicyProtocol (
> +  IN  EFI_HANDLE                  ImageHandle,
> +  IN  DXE_CPU_POLICY_PROTOCOL     *DxeCpuPolicy
> +  )
> +{
> +  EFI_STATUS            Status;
> +
> +  ///
> +  /// Print CPU DXE Policy
> +  ///
> +  CpuDxePrintPolicyProtocol(DxeCpuPolicy);
> +
> +  ///
> +  /// Install the DXE_CPU_POLICY_PROTOCOL interface
> +  ///
> +  Status = gBS->InstallMultipleProtocolInterfaces (
> +                  &ImageHandle,
> +                  &gDxeCpuPolicyProtocolGuid,
> +                  DxeCpuPolicy,
> +                  NULL
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  return Status;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.c
> new file mode 100644
> index 0000000000..aa5f7eef32
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.c
> @@ -0,0 +1,105 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "DxeMePolicyUpdate.h"
> +
> +//
> +// Record version
> +//
> +#define RECORD_REVISION_1              0x01
> +#define MAX_FW_UPDATE_BIOS_SELECTIONS  2
> +
> +//
> +// Function implementations executed during policy initialization phase
> +//
> +
> +/**
> +  Update the ME Policy Library
> +
> +  @param[in, out] DxeMePolicy           The pointer to get ME Policy
> protocol instance
> +
> +  @retval EFI_SUCCESS                   Initialization complete.
> +  @retval EFI_UNSUPPORTED               The chipset is unsupported
> by this driver.
> +  @retval EFI_OUT_OF_RESOURCES          Do not have enough
> resources to initialize the driver.
> +  @retval EFI_DEVICE_ERROR              Device error, driver exits
> abnormally.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdateDxeMePolicy (
> +  IN OUT  ME_POLICY_PROTOCOL            *DxeMePolicy
> +  )
> +{
> +  EFI_STATUS              Status;
> +  EFI_EVENT               EndOfDxeEvent;
> +
> +  DEBUG ((DEBUG_INFO, "UpdateDxeMePolicy\n"));
> +  UpdateMePolicyFromSetup (DxeMePolicy);
> +  UpdateMePolicyFromMeSetup (DxeMePolicy);
> +
> +  //
> +  // Register End of DXE event
> +  //
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_NOTIFY,
> +                  UpdateMeSetupCallback,
> +                  NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &EndOfDxeEvent
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> +
> +/**
> +  Update ME Policy while MePlatformProtocol is installed.
> +
> +  @param[in] MePolicyInstance     Instance of ME Policy Protocol
> +
> +**/
> +VOID
> +UpdateMePolicyFromMeSetup (
> +  IN ME_POLICY_PROTOCOL           *MePolicyInstance
> +  )
> +{
> +
> +}
> +
> +/**
> +  Update ME Policy if Setup variable exists.
> +
> +  @param[in, out] MePolicyInstance     Instance of ME Policy Protocol
> +
> +**/
> +VOID
> +UpdateMePolicyFromSetup (
> +  IN OUT ME_POLICY_PROTOCOL     *MePolicyInstance
> +  )
> +{
> +
> +}
> +
> +/**
> +  Functions performs HECI exchange with FW to update MePolicy settings.
> +
> +  @param[in] Event         A pointer to the Event that triggered the
> callback.
> +  @param[in] Context       A pointer to private data registered with the
> callback function.
> +
> +**/
> +VOID
> +EFIAPI
> +UpdateMeSetupCallback (
> +  IN  EFI_EVENT                   Event,
> +  IN  VOID                        *Context
> +  )
> +{
> +  gBS->CloseEvent (Event);
> +
> +  return;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.h
> new file mode 100644
> index 0000000000..8637c9b43e
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeMePolicyUpdate.h
> @@ -0,0 +1,90 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _DXE_ME_POLICY_UPDATE_H_
> +#define _DXE_ME_POLICY_UPDATE_H_
> +
> +#include <PiDxe.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Library/DebugLib.h>
> +#include <Guid/EventGroup.h>
> +#include <IndustryStandard/Acpi10.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Protocol/MePolicy.h>
> +#include <Library/HobLib.h>
> +#include <ConfigBlock/MePeiConfig.h>
> +
> +#define PLATFORM_BOOT_TABLE_PTR_TYPE   0x1001
> +#define PLATFORM_BOOT_RECORD_TYPE      0x1022
> +//
> +// Timeout values based on HPET
> +//
> +#define HECI_MSG_DELAY                 2000000  ///< show warning
> msg and stay for 2 seconds.
> +#define CONVERSION_MULTIPLIER          1000000  ///< msec to
> nanosec multiplier
> +#define PLATFORM_BOOT_TABLE_SIGNATURE  SIGNATURE_32 ('P', 'B', 'P',
> 'T')
> +
> +//
> +// Platform Boot Performance Table Record
> +//
> +
> +typedef struct {
> +  UINT16 Type;
> +  UINT8  Length;
> +  UINT8  Revision;
> +  UINT32 Reserved;
> +  UINT64 TimestampDelta1;
> +  UINT64 TimestampDelta2;
> +  UINT64 TimestampDelta3;
> +} PLATFORM_BOOT_TABLE_RECORD;
> +
> +//
> +// Platform boot Performance Table
> +//
> +
> +typedef struct {
> +  EFI_ACPI_COMMON_HEADER     Header;
> +  PLATFORM_BOOT_TABLE_RECORD PlatformBoot;
> +} PLATFORM_BOOT_PERFORMANCE_TABLE;
> +
> +/**
> +  Update ME Policy while MePlatformProtocol is installed.
> +
> +  @param[in] MePolicyInstance     Instance of ME Policy Protocol
> +
> +**/
> +VOID
> +UpdateMePolicyFromMeSetup (
> +  IN ME_POLICY_PROTOCOL           *MePolicyInstance
> +  );
> +
> +/**
> +  Update ME Policy if Setup variable exists.
> +
> +  @param[in, out] MePolicyInstance     Instance of ME Policy Protocol
> +
> +**/
> +VOID
> +UpdateMePolicyFromSetup (
> +  IN OUT ME_POLICY_PROTOCOL     *MePolicyInstance
> +  );
> +
> +/**
> +  Functions performs HECI exchange with FW to update MePolicy settings.
> +
> +  @param[in] Event         A pointer to the Event that triggered the
> callback.
> +  @param[in] Context       A pointer to private data registered with the
> callback function.
> +
> +**/
> +VOID
> +EFIAPI
> +UpdateMeSetupCallback (
> +  IN  EFI_EVENT                       Event,
> +  IN  VOID                            *Context
> +  );
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePchPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePchPolicyUpdate.c
> new file mode 100644
> index 0000000000..ca45c54162
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePchPolicyUpdate.c
> @@ -0,0 +1,40 @@
> +/** @file
> +  This file is the library for PCH DXE Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiDxe.h>
> +#include <PchAccess.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Protocol/PchPolicy.h>
> +#include <ConfigBlock/HdAudioConfig.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Get data for PCH policy from setup options.
> +
> +  @param[in] PchPolicy                 The pointer to get PCH Policy
> protocol instance
> +
> +  @retval EFI_SUCCESS                  Operation success.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdateDxePchPolicy (
> +  IN OUT  PCH_POLICY_PROTOCOL    *PchPolicy
> +  )
> +{
> +  EFI_STATUS              Status;
> +  PCH_HDAUDIO_DXE_CONFIG  *HdAudioDxeConfig;
> +
> +  Status = GetConfigBlock ((VOID *)PchPolicy, &gHdAudioDxeConfigGuid,
> (VOID *)&HdAudioDxeConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  return Status;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePolicyUpdateLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePolicyUpdateLib.inf
> new file mode 100644
> index 0000000000..71d1aa2dd2
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxePolicyUpdateLib.inf
> @@ -0,0 +1,59 @@
> +## @file
> +#  Component description file for DXE DxePolicyUpdateLib Library
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = DxePolicyUpdateLib
> +  FILE_GUID                      =
> 690B3786-D215-4ABB-9EF2-7A80128560E0
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = DxePolicyUpdateLib|DXE_DRIVER
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
> +#
> +
> +[Sources]
> +  DxeMePolicyUpdate.c
> +  DxeSaPolicyUpdate.c
> +  DxePchPolicyUpdate.c
> +  DxeCpuPolicyUpdate.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[LibraryClasses]
> +  UefiBootServicesTableLib
> +  UefiRuntimeServicesTableLib
> +  BaseLib
> +  BaseMemoryLib
> +  PcdLib
> +  DebugLib
> +  IoLib
> +  CpuPlatformLib
> +  HobLib
> +  ConfigBlockLib
> +  PciSegmentLib
> +
> +[Pcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress  ## CONSUMES
> +
> +[Guids]
> +  gEfiGlobalVariableGuid                        ## CONSUMES
> +  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES
> +  gMeInfoSetupGuid                              ## PRODUCES
> +  gMePolicyHobGuid                              ## CONSUMES
> +  gCpuSetupVariableGuid                         ## CONSUMES
> +  gPchSetupVariableGuid                         ## CONSUMES
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.c
> new file mode 100644
> index 0000000000..caac2c8bde
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.c
> @@ -0,0 +1,58 @@
> +/** @file
> +  This file is the library for SA DXE Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <DxeSaPolicyUpdate.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Get data for platform policy from setup options.
> +
> +  @param[in] SaPolicy                  The pointer to get SA Policy
> protocol instance
> +
> +  @retval EFI_SUCCESS                  Operation success.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdateDxeSaPolicy (
> +  IN OUT  SA_POLICY_PROTOCOL    *SaPolicy
> +  )
> +{
> +  EFI_STATUS                Status;
> +  GRAPHICS_DXE_CONFIG       *GraphicsDxeConfig;
> +  PCIE_DXE_CONFIG           *PcieDxeConfig;
> +  MISC_DXE_CONFIG           *MiscDxeConfig;
> +  MEMORY_DXE_CONFIG         *MemoryDxeConfig;
> +
> +  GraphicsDxeConfig = NULL;
> +  PcieDxeConfig = NULL;
> +  MiscDxeConfig = NULL;
> +  MemoryDxeConfig = NULL;
> +  //
> +  // Get requisite IP Config Blocks which needs to be used here
> +  //
> +  Status = GetConfigBlock ((VOID *)SaPolicy, &gGraphicsDxeConfigGuid,
> (VOID *)&GraphicsDxeConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *)SaPolicy, &gMiscDxeConfigGuid, (VOID
> *)&MiscDxeConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *)SaPolicy, &gPcieDxeConfigGuid, (VOID
> *)&PcieDxeConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *)SaPolicy, &gMemoryDxeConfigGuid,
> (VOID *)&MemoryDxeConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  PcieDxeConfig->PegAspmL0s[0] = 3;
> +  PcieDxeConfig->PegAspmL0s[1] = 3;
> +  PcieDxeConfig->PegAspmL0s[2] = 3;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.h
> new file mode 100644
> index 0000000000..0f38899284
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/DxePolicyUpdateLib
> /DxeSaPolicyUpdate.h
> @@ -0,0 +1,25 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _DXE_SA_POLICY_UPDATE_H_
> +#define _DXE_SA_POLICY_UPDATE_H_
> +
> +#include <PiDxe.h>
> +#include <CpuRegs.h>
> +#include <PchAccess.h>
> +#include <Library/IoLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Protocol/SaPolicy.h>
> +#include <Library/CpuPlatformLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/PciSegmentLib.h>
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiC
> puPolicyInit.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiC
> puPolicyInit.h
> new file mode 100644
> index 0000000000..bf5d9108a3
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiC
> puPolicyInit.h
> @@ -0,0 +1,37 @@
> +/** @file
> +  Header file for the PeiCpuPolicyInit.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_CPU_POLICY_INIT_H_
> +#define _PEI_CPU_POLICY_INIT_H_
> +
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/CpuPolicyLib.h>
> +#include <Library/CpuPlatformLib.h>
> +#include <Library/PeiSiPolicyUpdateLib.h>
> +#include <Library/PeiPolicyBoardConfigLib.h>
> +#include <FirwmareConfigurations.h>
> +
> +/**
> +  This function performs CPU PEI Policy initialization in PreMem.
> +
> +  @param[in, out] SiPreMemPolicyPpi  The Si Pre-Mem Policy PPI instance
> +
> +  @retval EFI_SUCCESS             The PPI is installed and initialized.
> +  @retval EFI ERRORS              The PPI is not successfully installed.
> +  @retval EFI_OUT_OF_RESOURCES    Do not have enough resources to
> initialize the driver
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiCpuPolicyPreMem (
> +  IN OUT  SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi
> +  );
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/Pei
> MePolicyInit.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/Pei
> MePolicyInit.h
> new file mode 100644
> index 0000000000..00d2b02462
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/Pei
> MePolicyInit.h
> @@ -0,0 +1,23 @@
> +/** @file
> +  Header file for the PeiMePolicyInit
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_ME_POLICY_INIT_H_
> +#define _PEI_ME_POLICY_INIT_H_
> +
> +#include <PiPei.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeiMePolicyLib.h>
> +
> +#include <Ppi/SiPolicy.h>
> +#include <Library/PeiSiPolicyUpdateLib.h>
> +#include <Library/PeiPolicyBoardConfigLib.h>
> +#include <FirwmareConfigurations.h>
> +
> +#endif // _PEI_ME_POLICY_INIT_H_
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.c
> new file mode 100644
> index 0000000000..4810a1a113
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.c
> @@ -0,0 +1,65 @@
> +/** @file
> +  This file is SampleCode for Intel PEI Platform Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPolicyInit.h"
> +
> +/**
> +  Initialize Intel PEI Platform Policy
> +
> +  @param[in] PeiServices            General purpose services available
> to every PEIM.
> +  @param[in] FirmwareConfiguration  It uses to skip specific policy init that
> depends
> +                                    on the 'FirmwareConfiguration'
> varaible.
> +**/
> +VOID
> +EFIAPI
> +PeiPolicyInit (
> +  IN UINT8                     FirmwareConfiguration
> +  )
> +{
> +  EFI_STATUS                   Status;
> +  SI_POLICY_PPI                *SiPolicyPpi;
> +
> +  //
> +  // Call SiCreateConfigBlocks to initialize Silicon Policy structure
> +  // and get all Intel default policy settings.
> +  //
> +  Status = SiCreateConfigBlocks (&SiPolicyPpi);
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR(Status)) {
> +    return;
> +  }
> +
> +  if (PcdGetBool (PcdDumpDefaultSiliconPolicy)) {
> +    DEBUG ((DEBUG_INFO, "Dump Default Silicon Policy...\n"));
> +    DumpSiPolicy (SiPolicyPpi);
> +  }
> +
> +  //
> +  // Update policy by board configuration
> +  //
> +  UpdatePeiSiPolicyBoardConfig (SiPolicyPpi);
> +  UpdatePeiPchPolicyBoardConfig (SiPolicyPpi);
> +  UpdatePeiSaPolicyBoardConfig (SiPolicyPpi);
> +  UpdatePeiCpuPolicyBoardConfig (SiPolicyPpi);
> +  UpdatePeiMePolicyBoardConfig (SiPolicyPpi);
> +
> +  UpdatePeiSiPolicy(SiPolicyPpi);
> +  UpdatePeiPchPolicy(SiPolicyPpi);
> +  UpdatePeiSaPolicy(SiPolicyPpi);
> +  UpdatePeiCpuPolicy(SiPolicyPpi);
> +  UpdatePeiMePolicy(SiPolicyPpi);
> +
> +  //
> +  // Install SiPolicyPpi.
> +  // While installed, RC assumes the Policy is ready and finalized. So please
> +  // update and override any setting before calling this function.
> +  //
> +  Status = SiInstallPolicyPpi (SiPolicyPpi);
> +  ASSERT_EFI_ERROR (Status);
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.h
> new file mode 100644
> index 0000000000..586f51ca33
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInit.h
> @@ -0,0 +1,23 @@
> +/** @file
> +  Header file for the PolicyInitPei PEIM.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_POLICY_INIT_H_
> +#define _PEI_POLICY_INIT_H_
> +
> +#include <PiPei.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +
> +#include "PeiCpuPolicyInit.h"
> +#include "PeiMePolicyInit.h"
> +#include "PeiSaPolicyInit.h"
> +#include "PeiSiPolicyInit.h"
> +#include <Ppi/SiPolicy.h>
> +#include <Library/PeiPolicyBoardConfigLib.h>
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitLib.inf
> new file mode 100644
> index 0000000000..a9f9e19610
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitLib.inf
> @@ -0,0 +1,62 @@
> +## @file
> +# Component description file for PeiPolicyInit library.
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = PeiPolicyInitLib
> +  FILE_GUID                      =
> B494DF39-A5F8-48A1-B2D0-EF523AD91C55
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = PEIM
> +  LIBRARY_CLASS                  = PeiPolicyInitLib
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  BaseLib
> +  CpuPlatformLib
> +  DebugLib
> +  DebugPrintErrorLevelLib
> +  HobLib
> +  IoLib
> +  MemoryAllocationLib
> +  PeiServicesLib
> +  PeiPolicyBoardConfigLib
> +  PeiPolicyUpdateLib
> +  PostCodeLib
> +  SmbusLib
> +  ConfigBlockLib
> +  SiPolicyLib
> +  TimerLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[Pcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress  ## CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdDumpDefaultSiliconPolicy ##
> CONSUMES
> +
> +
> +[Sources]
> +  PeiPolicyInitPreMem.c
> +  PeiPolicyInit.c
> +  PeiPolicyInit.h
> +  PeiCpuPolicyInit.h
> +  PeiMePolicyInit.h
> +  PeiSaPolicyInit.c
> +  PeiSaPolicyInit.h
> +
> +[Ppis]
> +  gEfiPeiReadOnlyVariable2PpiGuid               ## CONSUMES
> +  gSiPolicyPpiGuid                              ## CONSUMES
> +  gSiPreMemPolicyPpiGuid                        ## CONSUMES
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitPreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitPreMem.c
> new file mode 100644
> index 0000000000..3f81d7efc8
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiP
> olicyInitPreMem.c
> @@ -0,0 +1,60 @@
> +/** @file
> +  This file is SampleCode for Intel PEI Platform Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPolicyInit.h"
> +
> +/**
> +  Initialize Intel PEI Platform Policy
> +
> +  @param[in]  FirmwareConfiguration  It uses to skip specific policy init
> that depends
> +                                     on the 'FirmwareConfiguration'
> varaible.
> +**/
> +VOID
> +EFIAPI
> +PeiPolicyInitPreMem (
> +  IN UINT8                     FirmwareConfiguration
> +  )
> +{
> +  EFI_STATUS                   Status;
> +  SI_PREMEM_POLICY_PPI         *SiPreMemPolicyPpi;
> +
> +  DEBUG ((DEBUG_INFO, "Silicon PEI Policy Initialization Start in
> Pre-Memory...\n"));
> +  //
> +  // Call SiCreatePreMemConfigBlocks to initialize platform policy structure
> +  // and get all intel default policy settings.
> +  //
> +  Status = SiCreatePreMemConfigBlocks (&SiPreMemPolicyPpi);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Update policy by board configuration
> +  //
> +  UpdatePeiPchPolicyBoardConfigPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiMePolicyBoardConfigPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiSaPolicyBoardConfigPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiCpuPolicyBoardConfigPreMem (SiPreMemPolicyPpi);
> +
> +  //
> +  // Update and override all platform related and customized settings
> below.
> +  //
> +  UpdatePeiPchPolicyPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiMePolicyPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiSaPolicyPreMem (SiPreMemPolicyPpi);
> +  UpdatePeiCpuPolicyPreMem (SiPreMemPolicyPpi);
> +
> +  //
> +  // Install SiPreMemPolicyPpi.
> +  // While installed, RC assumes the Policy is ready and finalized. So please
> +  // update and override any setting before calling this function.
> +  //
> +  Status = SiPreMemInstallPolicyPpi (SiPreMemPolicyPpi);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  DEBUG ((DEBUG_INFO, "Silicon PEI Policy Initialization Done in
> Pre-Memory\n"));
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.c
> new file mode 100644
> index 0000000000..1c7d14b61b
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.c
> @@ -0,0 +1,114 @@
> +/** @file
> +  This file is SampleCode for Intel SA PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiSaPolicyInit.h"
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  PcieCardResetWorkAround performs PCIe Card reset on root port
> +
> +  @param[in out] SiPreMemPolicyPpi SI_PREMEM_POLICY_PPI
> +
> +  @retval EFI_SUCCESS              The policy is installed and
> initialized.
> +**/
> +EFI_STATUS
> +  PcieCardResetWorkAround (
> +  IN OUT   SI_PREMEM_POLICY_PPI         *SiPreMemPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  SA_MISC_PEI_PREMEM_CONFIG       *MiscPeiPreMemConfig;
> +  SWITCHABLE_GRAPHICS_CONFIG      *SgGpioData;
> +
> +  Status = GetConfigBlock((VOID *)SiPreMemPolicyPpi,
> &gSaMiscPeiPreMemConfigGuid, (VOID *)&MiscPeiPreMemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *)SiPreMemPolicyPpi,
> &gSwitchableGraphicsConfigGuid, (VOID *)&SgGpioData);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  if (SgGpioData->SaRtd3Pcie0Gpio.GpioSupport != NotSupported) {
> +    ///
> +    /// dGPU is present.
> +    ///      If PCIe Mode or SG Muxless
> +    ///              Power on MXM
> +    ///              Configure GPIOs to drive MXM in PCIe mode or SG
> Muxless
> +    ///      else
> +    ///              Do Nothing
> +    ///
> +    if ((MiscPeiPreMemConfig->SgMode == SgModeMuxless) ||
> +        (MiscPeiPreMemConfig->SgMode == SgModeDgpu)) {
> +      DEBUG((DEBUG_INFO, "Configure GPIOs for driving the dGPU.\n"));
> +      ///
> +      ///  Drive DGPU HOLD RST Enable to make sure we hold reset
> +      ///
> +      PcieGpioWrite (
> +        SgGpioData->SaRtd3Pcie0Gpio.HoldRst.GpioNo,
> +        SgGpioData->SaRtd3Pcie0Gpio.HoldRst.Active,
> +        GP_ENABLE
> +        );
> +      ///
> +      /// wait 100ms
> +      ///
> +      MicroSecondDelay((MiscPeiPreMemConfig->SgDelayAfterHoldReset)
> * STALL_ONE_MILLI_SECOND);
> +
> +      ///
> +      /// Drive DGPU PWR EN to Power On MXM
> +      ///
> +      PcieGpioWrite (
> +        SgGpioData->SaRtd3Pcie0Gpio.PwrEnable.GpioNo,
> +        SgGpioData->SaRtd3Pcie0Gpio.PwrEnable.Active,
> +        GP_ENABLE
> +        );
> +      ///
> +      /// wait 300ms
> +      ///
> +      MicroSecondDelay((MiscPeiPreMemConfig->SgDelayAfterPwrEn) *
> STALL_ONE_MILLI_SECOND);
> +
> +      ///
> +      /// Drive DGPU HOLD RST Disabled to remove reset
> +      ///
> +      PcieGpioWrite (
> +        SgGpioData->SaRtd3Pcie0Gpio.HoldRst.GpioNo,
> +        SgGpioData->SaRtd3Pcie0Gpio.HoldRst.Active,
> +        GP_DISABLE
> +        );
> +      ///
> +      /// wait 100ms
> +      ///
> +      MicroSecondDelay((MiscPeiPreMemConfig->SgDelayAfterHoldReset)
> * STALL_ONE_MILLI_SECOND);
> +    }
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  PCIe GPIO Write
> +
> +  @param[in] Gpio        - GPIO Number
> +  @param[in] Active      - GPIO Active Information; High/Low
> +  @param[in] Level       - Write GPIO value (0/1)
> +
> +**/
> +VOID
> +PcieGpioWrite (
> +  IN  UINT32                Gpio,
> +  IN  BOOLEAN               Active,
> +  IN  BOOLEAN               Level
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if (Active == 0) {
> +    Level = (~Level) & 0x1;
> +  }
> +  Status = GpioSetOutputValue(Gpio, (UINT32)Level);
> +  if (Status != EFI_SUCCESS) {
> +    return;
> +  }
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.h
> new file mode 100644
> index 0000000000..6d58c3d51f
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> aPolicyInit.h
> @@ -0,0 +1,58 @@
> +/** @file
> +  Header file for the SaPolicyInitPei PEIM.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _SA_POLICY_INIT_PEI_H_
> +#define _SA_POLICY_INIT_PEI_H_
> +
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeiSaPolicyLib.h>
> +#include <Ppi/SiPolicy.h>
> +#include <SaPolicyCommon.h>
> +#include <CpuRegs.h>
> +#include <Library/CpuPlatformLib.h>
> +#include <Library/PeiSiPolicyUpdateLib.h>
> +#include <Library/PeiPolicyBoardConfigLib.h>
> +#include <FirwmareConfigurations.h>
> +#include <Library/TimerLib.h>
> +#include <Library/GpioLib.h>
> +
> +//
> +// Functions
> +//
> +/**
> +PCIe GPIO Write
> +
> +@param[in] Gpio        - GPIO Number
> +@param[in] Active      - GPIO Active Information; High/Low
> +@param[in] Level       - Write GPIO value (0/1)
> +
> +**/
> +VOID
> +PcieGpioWrite(
> +IN       UINT32                       Gpio,
> +IN       BOOLEAN                      Active,
> +IN       BOOLEAN                      Level
> +);
> +
> +/**
> +PcieCardResetWorkAround performs PCIe Card reset on root port
> +
> +@param[in out] SiPreMemPolicyPpi       - SI_PREMEM_POLICY_PPI
> +
> +@retval EFI_SUCCESS              The policy is installed and initialized.
> +**/
> +EFI_STATUS
> +PcieCardResetWorkAround(
> +IN OUT   SI_PREMEM_POLICY_PPI         *SiPreMemPolicyPpi
> +);
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> iPolicyInit.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> iPolicyInit.h
> new file mode 100644
> index 0000000000..f485f54b70
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyInitLib/PeiS
> iPolicyInit.h
> @@ -0,0 +1,22 @@
> +/** @file
> +  Header file for the PeiSiPolicyInit
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _SI_POLICY_INIT_PEI_H_
> +#define _SI_POLICY_INIT_PEI_H_
> +
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/SiPolicyLib.h>
> +#include <Library/PeiSiPolicyUpdateLib.h>
> +#include <Library/PeiPolicyBoardConfigLib.h>
> +#include <FirwmareConfigurations.h>
> +
> +#endif // _SI_POLICY_INIT_PEI_H_
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.c
> new file mode 100644
> index 0000000000..b4f8bbb7d0
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.c
> @@ -0,0 +1,80 @@
> +/** @file
> +  CPU PEI Policy Update & initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiCpuPolicyUpdate.h"
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/CpuPlatformLib.h>
> +
> +/**
> +  This function performs CPU PEI Policy initialization.
> +
> +  @param[in] SiPolicyPpi           The SI Policy PPI instance
> +
> +  @retval EFI_SUCCESS              The PPI is installed and initialized.
> +  @retval EFI ERRORS               The PPI is not successfully installed.
> +  @retval EFI_OUT_OF_RESOURCES     Do not have enough resources to
> initialize the driver
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiCpuPolicy (
> +  IN OUT  SI_POLICY_PPI   *SiPolicyPpi
> +  )
> +{
> +  EFI_STATUS                       Status;
> +  CPU_CONFIG                       *CpuConfig;
> +  CPU_POWER_MGMT_BASIC_CONFIG      *CpuPowerMgmtBasicConfig;
> +  SI_PREMEM_POLICY_PPI             *SiPreMemPolicyPpi;
> +  CPU_POWER_MGMT_CUSTOM_CONFIG
> *CpuPowerMgmtCustomConfig;
> +  CPU_POWER_MGMT_TEST_CONFIG      *CpuPowerMgmtTestConfig;
> +  CPU_TEST_CONFIG                 *CpuTestConfig;
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuConfigGuid, (VOID *)
> &CpuConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi,
> &gCpuPowerMgmtBasicConfigGuid, (VOID *) &CpuPowerMgmtBasicConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock((VOID *)SiPolicyPpi,
> &gCpuPowerMgmtCustomConfigGuid, (VOID
> *)&CpuPowerMgmtCustomConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *)SiPolicyPpi, &gCpuTestConfigGuid, (VOID
> *)&CpuTestConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = PeiServicesLocatePpi (
> +                &gSiPreMemPolicyPpiGuid,
> +                0,
> +                NULL,
> +                (VOID **) &SiPreMemPolicyPpi
> +                );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock((VOID *)SiPolicyPpi,
> &gCpuPowerMgmtTestConfigGuid, (VOID *)&CpuPowerMgmtTestConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  //
> +  // Init Power Management Policy Variables
> +  //
> +  CpuPowerMgmtBasicConfig->HwpInterruptControl = 1;
> +  CpuPowerMgmtCustomConfig->CustomRatioTable.MaxRatio = 0x4;
> +  CpuPowerMgmtBasicConfig->OneCoreRatioLimit = 0x22;
> +  CpuPowerMgmtBasicConfig->TwoCoreRatioLimit = 0x22;
> +  CpuPowerMgmtBasicConfig->ThreeCoreRatioLimit = 0x22;
> +  CpuPowerMgmtBasicConfig->FourCoreRatioLimit = 0x22;
> +  CpuPowerMgmtBasicConfig->FiveCoreRatioLimit = 0;
> +  CpuPowerMgmtBasicConfig->SixCoreRatioLimit = 0;
> +  CpuPowerMgmtBasicConfig->SevenCoreRatioLimit = 0;
> +  CpuPowerMgmtBasicConfig->EightCoreRatioLimit = 0;
> +  CpuPowerMgmtBasicConfig->Hwp = 0x1;
> +  CpuTestConfig->CpuWakeUpTimer = 1;
> +  CpuPowerMgmtTestConfig->AutoThermalReporting = 0;
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.h
> new file mode 100644
> index 0000000000..4e2cd014de
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdate.h
> @@ -0,0 +1,32 @@
> +/** @file
> +  Header file for PEI CpuPolicyUpdate.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_CPU_POLICY_UPDATE_H_
> +#define _PEI_CPU_POLICY_UPDATE_H_
> +
> +#include <PiPei.h>
> +#include <Ppi/SiPolicy.h>
> +#include <Ppi/Wdt.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PeiPlatformLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <PlatformBoardId.h>
> +#include <PchAccess.h>
> +#include <Register/Cpuid.h>
> +#include <Register/Msr.h>
> +#include <CpuAccess.h>
> +#include <Ppi/MasterBootMode.h>
> +#include <Library/PeiServicesLib.h>
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/CpuPlatformLib.h>
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..050df4fcd9
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiCpuPolicyUpdatePreMem.c
> @@ -0,0 +1,108 @@
> +/** @file
> +  This file is SampleCode of the library for Intel CPU PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiCpuPolicyUpdate.h"
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/PmcLib.h>
> +#include <Library/PchCycleDecodingLib.h>
> +#include <Library/PciSegmentLib.h>
> +#include <Library/SpiLib.h>
> +
> +/**
> +  Check on the processor if SGX is supported.
> +
> +  @retval True if SGX supported or FALSE if not
> +**/
> +BOOLEAN
> +IsSgxCapSupported (
> +  VOID
> +  )
> +{
> +  EFI_CPUID_REGISTER CpuidRegs;
> +
> +  ///
> +  /// Processor support SGX feature by reading CPUID.(EAX=7,ECX=0):EBX[2]
> +  ///
> +  AsmCpuidEx (CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, 0,
> &CpuidRegs.RegEax,&CpuidRegs.RegEbx,&CpuidRegs.RegEcx,&CpuidRegs.Reg
> Edx);
> +
> +  ///
> +  /// SGX feature is supported only on WHL and later,
> +  /// with CPUID.(EAX=7,ECX=0):EBX[2]=1
> +  /// PRMRR configuration enabled, MSR IA32_MTRRCAP (FEh) [12] == 1
> +  ///
> +  if ((CpuidRegs.RegEbx & BIT2) && (AsmReadMsr64 (MSR_IA32_MTRRCAP)
> & BIT12)) {
> +    return TRUE;
> +  }
> +
> +  return FALSE;
> +}
> +
> +/**
> +  This function performs CPU PEI Policy initialization in Pre-memory.
> +
> +  @param[in] SiPreMemPolicyPpi     The SI Pre-Mem Policy PPI instance
> +
> +  @retval EFI_SUCCESS              The PPI is installed and initialized.
> +  @retval EFI ERRORS               The PPI is not successfully installed.
> +  @retval EFI_OUT_OF_RESOURCES     Do not have enough resources to
> initialize the driver
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiCpuPolicyPreMem (
> +  IN OUT  SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_BOOT_MODE                   BootMode;
> +  CPU_CONFIG_LIB_PREMEM_CONFIG    *CpuConfigLibPreMemConfig;
> +  CPU_OVERCLOCKING_PREMEM_CONFIG
> *CpuOverClockingPreMemConfig;
> +  UINT32                          PchSpiBar0;
> +  UINT32                          MaxLogicProcessors;
> +
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gCpuConfigLibPreMemConfigGuid, (VOID *) &CpuConfigLibPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi,
> &gCpuOverclockingPreMemConfigGuid, (VOID *)
> &CpuOverClockingPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  DEBUG ((DEBUG_INFO, "UpdatePeiCpuPolicyPreMem Start\n"));
> +
> +  //
> +  // Get current boot mode
> +  //
> +  Status = PeiServicesGetBootMode (&BootMode);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  SpiServiceInit ();
> +
> +  PchSpiBar0 = PciSegmentRead32 (PCI_SEGMENT_LIB_ADDRESS (
> +
> DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> +
> DEFAULT_PCI_BUS_NUMBER_PCH,
> +                                   PCI_DEVICE_NUMBER_PCH_SPI,
> +
> PCI_FUNCTION_NUMBER_PCH_SPI,
> +                                   R_SPI_CFG_BAR0
> +                                   ));
> +  PchSpiBar0 &= ~(B_SPI_CFG_BAR0_MASK);
> +
> +  if (PchSpiBar0 == 0) {
> +    DEBUG ((DEBUG_ERROR, "ERROR : PchSpiBar0 is invalid!\n"));
> +    ASSERT (FALSE);
> +  }
> +
> +  CpuConfigLibPreMemConfig->PeciC10Reset = 0;
> +  CpuConfigLibPreMemConfig->CpuRatio = 0;
> +  ///
> +  /// Set PcdCpuMaxLogicalProcessorNumber to max number of logical
> processors enabled
> +  /// Read MSR_CORE_THREAD_COUNT (0x35) to check the total active
> Threads
> +  ///
> +  MaxLogicProcessors = (UINT32) (AsmReadMsr64
> (MSR_CORE_THREAD_COUNT) & B_THREAD_COUNT_MASK);
> +  DEBUG ((DEBUG_INFO, "MaxLogicProcessors = %d\n",
> MaxLogicProcessors));
> +  PcdSet32S (PcdCpuMaxLogicalProcessorNumber, MaxLogicProcessors);
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.c
> new file mode 100644
> index 0000000000..e5e628ed02
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.c
> @@ -0,0 +1,49 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiMePolicyUpdate.h"
> +#include <ConfigBlock/MePeiConfig.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/ConfigBlockLib.h>
> +#include <Library/PmcLib.h>
> +
> +/**
> +  Update the ME Policy Library
> +
> +  @param[in, out] SiPolicyPpi     The pointer to SiPolicyPpi
> +
> +  @retval EFI_SUCCESS             Update complete.
> +**/
> +EFI_STATUS
> +UpdatePeiMePolicy (
> +  IN OUT SI_POLICY_PPI            *SiPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  ME_PEI_CONFIG                   *MePeiConfig;
> +
> +  DEBUG ((DEBUG_INFO, "UpdatePeiMePolicy\n"));
> +
> +  Status = EFI_SUCCESS;
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gMePeiConfigGuid, (VOID
> *) &MePeiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  if (!PmcIsRtcBatteryGood ()) {
> +    //
> +    // For non coin battery design, this can be skipped.
> +    //
> +    MePeiConfig->MeUnconfigOnRtcClear   = 2;
> +  }
> +
> +  return Status;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.h
> new file mode 100644
> index 0000000000..db91ab0b5a
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdate.h
> @@ -0,0 +1,14 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_ME_POLICY_UPDATE_H_
> +#define _PEI_ME_POLICY_UPDATE_H_
> +
> +#include <Library/DebugLib.h>
> +#include <Ppi/SiPolicy.h>
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..81c1bda17f
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiMePolicyUpdatePreMem.c
> @@ -0,0 +1,32 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiMePolicyUpdate.h"
> +#include <Library/PeiServicesLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  Update the ME Policy Library
> +
> +  @param[in] SiPreMemPolicyPpi  The pointer to SiPreMemPolicyPpi
> +
> +  @retval EFI_SUCCESS           Update complete.
> +**/
> +EFI_STATUS
> +UpdatePeiMePolicyPreMem (
> +  IN OUT SI_PREMEM_POLICY_PPI     *SiPreMemPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +
> +  DEBUG ((DEBUG_INFO, "UpdatePeiMePolicyPreMem\n"));
> +
> +  Status = EFI_SUCCESS;
> +
> +  return Status;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.c
> new file mode 100644
> index 0000000000..4a8ffa7226
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.c
> @@ -0,0 +1,518 @@
> +/** @file
> +  This file is SampleCode of the library for Intel PCH PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/HdaVerbTableLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PchGbeLib.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/SataLib.h>
> +#include <Library/PchPcrLib.h>
> +#include <Library/PchSerialIoLib.h>
> +#include <Library/PchPcieRpLib.h>
> +#include <Ppi/Spi.h>
> +#include <GpioConfig.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PchGbeLib.h>
> +#include <PlatformBoardConfig.h>
> +#include <Library/CnviLib.h>
> +#include <Register/PchRegsLpcCnl.h>
> +#include <PcieDeviceOverrideTable.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +VOID
> +UpdatePcieClockInfo (
> +  PCH_PCIE_CONFIG  *PcieRpConfig,
> +  UINTN            Index,
> +  UINT64           Data
> +  )
> +{
> +  PCD64_BLOB Pcd64;
> +
> +  Pcd64.Blob = Data;
> +  DEBUG ((DEBUG_INFO, "UpdatePcieClockInfo ClkIndex %x ClkUsage %x,
> Supported %x\n", Index, Pcd64.PcieClock.ClockUsage,
> Pcd64.PcieClock.ClkReqSupported));
> +
> +  PcieRpConfig->PcieClock[Index].Usage =
> (UINT8)Pcd64.PcieClock.ClockUsage;
> +  if (Pcd64.PcieClock.ClkReqSupported) {
> +    PcieRpConfig->PcieClock[Index].ClkReq = (UINT8)Index;
> +  } else {
> +    PcieRpConfig->PcieClock[Index].ClkReq = 0xFF;
> +  }
> +}
> +
> +/**
> +  This is helper function for getting I2C Pads Internal Termination settings
> from Pcd
> +
> +  @param[in]  Index            I2C Controller Index
> +**/
> +UINT8
> +GetSerialIoI2cPadsTerminationFromPcd (
> +  IN UINT8 Index
> +)
> +{
> +  switch (Index) {
> +    case 0:
> +      return PcdGet8 (PcdPchSerialIoI2c0PadInternalTerm);
> +    case 1:
> +      return PcdGet8 (PcdPchSerialIoI2c1PadInternalTerm);
> +    case 2:
> +      return PcdGet8 (PcdPchSerialIoI2c2PadInternalTerm);
> +    case 3:
> +      return PcdGet8 (PcdPchSerialIoI2c3PadInternalTerm);
> +    case 4:
> +      return PcdGet8 (PcdPchSerialIoI2c4PadInternalTerm);
> +    case 5:
> +      return PcdGet8 (PcdPchSerialIoI2c5PadInternalTerm);
> +    default:
> +      ASSERT (FALSE); // Invalid I2C Controller Index
> +  }
> +  return 0;
> +}
> +/**
> +  This is a helper function for updating USB Policy according to Blob data
> +
> +  @param[in]  UsbConfig        Pointer to USB_CONFIG data buffer
> +  @param[in]  PortIndex        USB Port index
> +  @param[in]  Data32           Blob containing USB2 Afe
> (PCD32_BLOB) data
> +**/
> +VOID
> +UpdateUsb20AfePolicy (
> +  IN USB_CONFIG                 *UsbConfig,
> +  IN UINT8                      PortIndex,
> +  UINT32                        Data32
> +)
> +{
> +  PCD32_BLOB Pcd32;
> +  Pcd32.Blob = Data32;
> +
> +  if (PortIndex < MAX_USB2_PORTS && Pcd32.Info.Petxiset != 0) {
> +    UsbConfig->PortUsb20[PortIndex].Afe.Petxiset     =
> Pcd32.Info.Petxiset;
> +    UsbConfig->PortUsb20[PortIndex].Afe.Txiset       = Pcd32.Info.Txiset;
> +    UsbConfig->PortUsb20[PortIndex].Afe.Predeemp     =
> Pcd32.Info.Predeemp;
> +    UsbConfig->PortUsb20[PortIndex].Afe.Pehalfbit    =
> Pcd32.Info.Pehalfbit;
> +  }
> +}
> +
> +/**
> +  This function updates USB Policy per port OC Pin number
> +
> +  @param[in]  PchUsbConfig     Pointer to USB_CONFIG data buffer
> +  @param[in]  PortIndex        USB Port index
> +  @param[in]  Pin              OverCurrent pin number
> +**/
> +VOID
> +UpdateUsb20OverCurrentPolicy (
> +  IN USB_CONFIG                 *UsbConfig,
> +  IN UINT8                      PortIndex,
> +  UINT8                         Pin
> +)
> +{
> +  if (PortIndex < MAX_USB2_PORTS && ((Pin < UsbOverCurrentPinMax) ||
> (Pin == UsbOverCurrentPinSkip))) {
> +    UsbConfig->PortUsb20[PortIndex].OverCurrentPin = Pin;
> +  } else {
> +    if (PortIndex >= MAX_USB2_PORTS) {
> +      DEBUG ((DEBUG_ERROR, "UpdateUsb20OverCurrentPolicy: USB2
> port number %d is not a valid USB2 port number\n", PortIndex));
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "UpdateUsb20OverCurrentPolicy: Invalid
> OverCurrent pin specified USB2 port %d\n", PortIndex));
> +    }
> +  }
> +}
> +
> +/**
> +  This function updates USB Policy per port OC Pin number
> +
> +  @param[in]  PchUsbConfig     Pointer to USB_CONFIG data buffer
> +  @param[in]  PortIndex        USB Port index
> +  @param[in]  Pin              OverCurrent pin number
> +**/
> +VOID
> +UpdateUsb30OverCurrentPolicy (
> +  IN USB_CONFIG                 *UsbConfig,
> +  IN UINT8                      PortIndex,
> +  UINT8                         Pin
> +)
> +{
> +  if (PortIndex < MAX_USB3_PORTS && ((Pin < UsbOverCurrentPinMax) ||
> (Pin == UsbOverCurrentPinSkip))) {
> +    UsbConfig->PortUsb30[PortIndex].OverCurrentPin = Pin;
> +  } else {
> +    if (PortIndex >= MAX_USB2_PORTS) {
> +      DEBUG ((DEBUG_ERROR, "UpdateUsb30OverCurrentPolicy: USB3
> port number %d is not a valid USB3 port number\n", PortIndex));
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "UpdateUsb30OverCurrentPolicy: Invalid
> OverCurrent pin specified USB3 port %d\n", PortIndex));
> +    }
> +  }
> +}
> +
> +/**
> +  This function performs PCH USB Platform Policy initialization
> +
> +  @param[in] PchUsbConfig         Pointer to USB_CONFIG data buffer
> +  @param[in] PchSetup             Pointer to PCH_SETUP data buffer
> +**/
> +VOID
> +UpdatePchUsbConfig (
> +  IN USB_CONFIG                *UsbConfig
> +  )
> +{
> +  UINTN              PortIndex;
> +
> +  UsbConfig->OverCurrentEnable = TRUE;
> +
> +  for (PortIndex = 0; PortIndex < GetPchUsb2MaxPhysicalPortNum ();
> PortIndex++) {
> +      UsbConfig->PortUsb20[PortIndex].Enable = TRUE;
> +  }
> +  for (PortIndex = 0; PortIndex < GetPchXhciMaxUsb3PortNum ();
> PortIndex++) {
> +      UsbConfig->PortUsb30[PortIndex].Enable = TRUE;
> +  }
> +
> +  UsbConfig->XdciConfig.Enable = FALSE;
> +
> +
> +  //
> +  // USB2 AFE settings.
> +  //
> +  UpdateUsb20AfePolicy (UsbConfig, 0, PcdGet32 (PcdUsb20Port0Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 1, PcdGet32 (PcdUsb20Port1Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 2, PcdGet32 (PcdUsb20Port2Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 3, PcdGet32 (PcdUsb20Port3Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 4, PcdGet32 (PcdUsb20Port4Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 5, PcdGet32 (PcdUsb20Port5Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 6, PcdGet32 (PcdUsb20Port6Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 7, PcdGet32 (PcdUsb20Port7Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 8, PcdGet32 (PcdUsb20Port8Afe));
> +  UpdateUsb20AfePolicy (UsbConfig, 9, PcdGet32 (PcdUsb20Port9Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,10, PcdGet32 (PcdUsb20Port10Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,11, PcdGet32 (PcdUsb20Port11Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,12, PcdGet32 (PcdUsb20Port12Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,13, PcdGet32 (PcdUsb20Port13Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,14, PcdGet32 (PcdUsb20Port14Afe));
> +  UpdateUsb20AfePolicy (UsbConfig,15, PcdGet32 (PcdUsb20Port15Afe));
> +
> +  //
> +  // Platform Board programming per the layout of each port.
> +  //
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 0, PcdGet8
> (PcdUsb20OverCurrentPinPort0));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 1, PcdGet8
> (PcdUsb20OverCurrentPinPort1));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 2, PcdGet8
> (PcdUsb20OverCurrentPinPort2));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 3, PcdGet8
> (PcdUsb20OverCurrentPinPort3));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 4, PcdGet8
> (PcdUsb20OverCurrentPinPort4));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 5, PcdGet8
> (PcdUsb20OverCurrentPinPort5));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 6, PcdGet8
> (PcdUsb20OverCurrentPinPort6));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 7, PcdGet8
> (PcdUsb20OverCurrentPinPort7));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 8, PcdGet8
> (PcdUsb20OverCurrentPinPort8));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig, 9, PcdGet8
> (PcdUsb20OverCurrentPinPort9));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,10, PcdGet8
> (PcdUsb20OverCurrentPinPort10));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,11, PcdGet8
> (PcdUsb20OverCurrentPinPort11));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,12, PcdGet8
> (PcdUsb20OverCurrentPinPort12));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,13, PcdGet8
> (PcdUsb20OverCurrentPinPort13));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,14, PcdGet8
> (PcdUsb20OverCurrentPinPort14));
> +  UpdateUsb20OverCurrentPolicy (UsbConfig,15, PcdGet8
> (PcdUsb20OverCurrentPinPort15));
> +
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 0, PcdGet8
> (PcdUsb30OverCurrentPinPort0));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 1, PcdGet8
> (PcdUsb30OverCurrentPinPort1));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 2, PcdGet8
> (PcdUsb30OverCurrentPinPort2));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 3, PcdGet8
> (PcdUsb30OverCurrentPinPort3));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 4, PcdGet8
> (PcdUsb30OverCurrentPinPort4));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 5, PcdGet8
> (PcdUsb30OverCurrentPinPort5));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 6, PcdGet8
> (PcdUsb30OverCurrentPinPort6));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 7, PcdGet8
> (PcdUsb30OverCurrentPinPort7));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 8, PcdGet8
> (PcdUsb30OverCurrentPinPort8));
> +  UpdateUsb30OverCurrentPolicy (UsbConfig, 9, PcdGet8
> (PcdUsb30OverCurrentPinPort9));
> +
> +}
> +
> +/**
> +  Return if input ImageGuid belongs to system FMP GUID list.
> +
> +  @param[in] ImageGuid A pointer to GUID
> +
> +  @retval TRUE  ImageGuid is in the list of
> PcdSystemFmpCapsuleImageTypeIdGuid
> +  @retval FALSE ImageGuid is not in the list of
> PcdSystemFmpCapsuleImageTypeIdGuid
> +**/
> +BOOLEAN
> +IsSystemFmpGuid (
> +  IN GUID   *ImageGuid
> +  )
> +{
> +  GUID      *Guid;
> +  UINTN     Count;
> +  UINTN     Index;
> +
> +  Guid = PcdGetPtr (PcdSystemFmpCapsuleImageTypeIdGuid);
> +  Count = PcdGetSize (PcdSystemFmpCapsuleImageTypeIdGuid) / sizeof
> (GUID);
> +
> +  for (Index = 0; Index < Count; Index++, Guid++) {
> +    if (CompareGuid (ImageGuid, Guid)) {
> +      return TRUE;
> +    }
> +  }
> +
> +  return FALSE;
> +}
> +
> +/**
> +  This function performs PCH PEI Policy initialization.
> +
> +  @param[in, out] SiPolicy        The SI Policy PPI instance
> +
> +  @retval EFI_SUCCESS             The PPI is installed and initialized.
> +  @retval EFI ERRORS              The PPI is not successfully installed.
> +  @retval EFI_OUT_OF_RESOURCES    Do not have enough resources to
> initialize the driver
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiPchPolicy (
> +  IN OUT      SI_POLICY_PPI     *SiPolicy
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  UINT8                           Index;
> +  DMI_HW_WIDTH_CONTROL            *DmiHaAWC;
> +  PCH_GENERAL_CONFIG              *PchGeneralConfig;
> +  PCH_PCIE_CONFIG                 *PcieRpConfig;
> +  PCH_SATA_CONFIG                 *SataConfig;
> +  PCH_IOAPIC_CONFIG               *IoApicConfig;
> +  PCH_DMI_CONFIG                  *DmiConfig;
> +  PCH_FLASH_PROTECTION_CONFIG     *FlashProtectionConfig;
> +  PCH_HDAUDIO_CONFIG              *HdAudioConfig;
> +  PCH_INTERRUPT_CONFIG            *InterruptConfig;
> +  PCH_ISH_CONFIG                  *IshConfig;
> +  PCH_LAN_CONFIG                  *LanConfig;
> +  PCH_LOCK_DOWN_CONFIG            *LockDownConfig;
> +  PCH_PM_CONFIG                   *PmConfig;
> +  PCH_SCS_CONFIG                  *ScsConfig;
> +  PCH_SERIAL_IO_CONFIG            *SerialIoConfig;
> +  PCH_LPC_SIRQ_CONFIG             *SerialIrqConfig;
> +  PCH_THERMAL_CONFIG              *ThermalConfig;
> +  USB_CONFIG                      *UsbConfig;
> +  PCH_ESPI_CONFIG                 *EspiConfig;
> +  PCH_CNVI_CONFIG                 *CnviConfig;
> +  SI_PREMEM_POLICY_PPI            *SiPreMemPolicyPpi;
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPchGeneralConfigGuid,
> (VOID *) &PchGeneralConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPcieRpConfigGuid, (VOID *)
> &PcieRpConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSataConfigGuid, (VOID *)
> &SataConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gIoApicConfigGuid, (VOID *)
> &IoApicConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gDmiConfigGuid, (VOID *)
> &DmiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gFlashProtectionConfigGuid,
> (VOID *) &FlashProtectionConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gHdAudioConfigGuid, (VOID *)
> &HdAudioConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gInterruptConfigGuid, (VOID *)
> &InterruptConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gIshConfigGuid, (VOID *)
> &IshConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gLanConfigGuid, (VOID *)
> &LanConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gLockDownConfigGuid, (VOID
> *) &LockDownConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gPmConfigGuid, (VOID *)
> &PmConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gScsConfigGuid, (VOID *)
> &ScsConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIoConfigGuid, (VOID *)
> &SerialIoConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIrqConfigGuid, (VOID *)
> &SerialIrqConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gThermalConfigGuid, (VOID *)
> &ThermalConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gUsbConfigGuid, (VOID *)
> &UsbConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gEspiConfigGuid, (VOID *)
> &EspiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gCnviConfigGuid, (VOID *)
> &CnviConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PeiServicesLocatePpi (
> +                &gSiPreMemPolicyPpiGuid,
> +                0,
> +                NULL,
> +                (VOID **) &SiPreMemPolicyPpi
> +                );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  DmiConfig->PwrOptEnable = TRUE;
> +  PmConfig->PchSlpS3MinAssert = 0;
> +  PmConfig->PchSlpS4MinAssert = 0;
> +  PmConfig->PchSlpSusMinAssert = 0;
> +  PmConfig->PchSlpAMinAssert = 0;
> +
> +  SataConfig->ThermalThrottling.P1T3M = 3;
> +  SataConfig->ThermalThrottling.P1T2M = 2;
> +  SataConfig->ThermalThrottling.P1T1M = 1;
> +  SataConfig->ThermalThrottling.P0T3M = 3;
> +  SataConfig->ThermalThrottling.P0T2M = 2;
> +  SataConfig->ThermalThrottling.P0T1M = 1;
> +
> +  UpdatePcieClockInfo (PcieRpConfig, 0, PcdGet64  (PcdPcieClock0));
> +  UpdatePcieClockInfo (PcieRpConfig, 1, PcdGet64  (PcdPcieClock1));
> +  UpdatePcieClockInfo (PcieRpConfig, 2, PcdGet64  (PcdPcieClock2));
> +  UpdatePcieClockInfo (PcieRpConfig, 3, PcdGet64  (PcdPcieClock3));
> +  UpdatePcieClockInfo (PcieRpConfig, 4, PcdGet64  (PcdPcieClock4));
> +  UpdatePcieClockInfo (PcieRpConfig, 5, PcdGet64  (PcdPcieClock5));
> +  UpdatePcieClockInfo (PcieRpConfig, 6, PcdGet64  (PcdPcieClock6));
> +  UpdatePcieClockInfo (PcieRpConfig, 7, PcdGet64  (PcdPcieClock7));
> +  UpdatePcieClockInfo (PcieRpConfig, 8, PcdGet64  (PcdPcieClock8));
> +  UpdatePcieClockInfo (PcieRpConfig, 9, PcdGet64  (PcdPcieClock9));
> +  UpdatePcieClockInfo (PcieRpConfig, 10, PcdGet64 (PcdPcieClock10));
> +  UpdatePcieClockInfo (PcieRpConfig, 11, PcdGet64 (PcdPcieClock11));
> +  UpdatePcieClockInfo (PcieRpConfig, 12, PcdGet64 (PcdPcieClock12));
> +  UpdatePcieClockInfo (PcieRpConfig, 13, PcdGet64 (PcdPcieClock13));
> +  UpdatePcieClockInfo (PcieRpConfig, 14, PcdGet64 (PcdPcieClock14));
> +  UpdatePcieClockInfo (PcieRpConfig, 15, PcdGet64 (PcdPcieClock15));
> +
> +  PcieRpConfig->PcieDeviceOverrideTablePtr = (UINT32) mPcieDeviceTable;
> +  PcieRpConfig->RootPort[0].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[1].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[2].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[3].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[4].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[5].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[6].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[7].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[8].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[9].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[10].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[11].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[12].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[13].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[14].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[15].ClkReqDetect = TRUE;
> +  PcieRpConfig->RootPort[0].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[1].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[2].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[3].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[4].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[5].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[6].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[7].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[8].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[9].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[10].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[11].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[12].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[13].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[14].AdvancedErrorReporting = TRUE;
> +  PcieRpConfig->RootPort[15].AdvancedErrorReporting = TRUE;
> +
> +  //
> +  // Install HDA Link/iDisplay Codec Verb Table
> +  //
> +  AddPlatformVerbTables (
> +    PchHdaCodecPlatformOnboard,
> +    &(HdAudioConfig->VerbTableEntryNum),
> +    &(HdAudioConfig->VerbTablePtr)
> +    );
> +
> +  LockDownConfig->BiosLock = FALSE;
> +  LockDownConfig->BiosInterface = FALSE;
> +
> +  //
> +  // IOAPIC Config
> +  //
> +//  IoApicConfig->IoApicEntry24_119     =
> PchSetup.PchIoApic24119Entries;
> +  //
> +  // To support SLP_S0, it's required to disable 8254 timer.
> +  // Note that CSM may require this option to be disabled for correct
> operation.
> +  // Once 8254 timer disabled, some legacy OPROM and legacy OS will fail
> while using 8254 timer.
> +  // For some OS environment that it needs to set 8254CGE in late state it
> should
> +  // set this policy to FALSE and use PmcSet8254ClockGateState (TRUE) in
> SMM later.
> +  // This is also required during S3 resume.
> +  //
> +  // The Enable8254ClockGatingOnS3 is only applicable when
> Enable8254ClockGating is disabled.
> +  // If Enable8254ClockGating is enabled, RC will do 8254 CGE programming
> on S3 as well.
> +  // else, RC will do the programming on S3 when
> Enable8254ClockGatingOnS3 is enabled.
> +  // This avoids the SMI requirement for the programming.
> +  //
> +  // If S0ix is not enabled, then disable 8254CGE for leagcy boot case.
> +  //
> +  IoApicConfig->Enable8254ClockGating     = FALSE;
> +  IoApicConfig->Enable8254ClockGatingOnS3 = FALSE;
> +
> +  //
> +  // SerialIo Config
> +  //
> +  SerialIoConfig->DevMode[0] = 1;
> +  SerialIoConfig->DevMode[1] = 1;
> +  SerialIoConfig->DevMode[2] = 0;
> +  SerialIoConfig->DevMode[3] = 0;
> +  SerialIoConfig->DevMode[4] = 1;
> +  SerialIoConfig->DevMode[5] = 0;
> +  SerialIoConfig->DevMode[6] = 0;
> +  SerialIoConfig->DevMode[7] = 0;
> +  SerialIoConfig->DevMode[8] = 0;
> +  SerialIoConfig->DevMode[9] = 0;
> +  SerialIoConfig->DevMode[10] = 0;
> +  SerialIoConfig->DevMode[11] = 3;
> +
> +  SerialIoConfig->Uart0PinMuxing = 1;
> +  SerialIoConfig->SpiCsPolarity[0] = 1;
> +  SerialIoConfig->SpiCsPolarity[1] = 0;
> +  SerialIoConfig->SpiCsPolarity[2] = 0;
> +
> +  SerialIoConfig->UartHwFlowCtrl[0] = 1;
> +  SerialIoConfig->UartHwFlowCtrl[1] = 1;
> +  SerialIoConfig->UartHwFlowCtrl[2] = 1;
> +  //
> +  // I2C4 and I2C5 don't exist in SPT-H chipset
> +  //
> +  if (IsPchH ()) {
> +    SerialIoConfig->DevMode[PchSerialIoIndexI2C4] = PchSerialIoDisabled;
> +    SerialIoConfig->DevMode[PchSerialIoIndexI2C5] = PchSerialIoDisabled;
> +  }
> +
> +  for (Index = 0; Index < GetPchMaxSerialIoI2cControllersNum (); Index++) {
> +    SerialIoConfig->I2cPadsTermination[Index] =
> GetSerialIoI2cPadsTerminationFromPcd (Index);
> +  }
> +
> +  PmConfig->SlpS0Override                         = 2;
> //PchSetup.SlpS0Override;
> +  PmConfig->SlpS0DisQForDebug                     = 3;
> //PchSetup.SlpS0DisQForDebug;
> +  PmConfig->SlpS0Vm075VSupport                    = 1; //
> PcdGetBool(PcdSlpS0Vm075VSupport);
> +  PmConfig->CpuC10GatePinEnable                   = 1;
> +
> +  //
> +  // Thermal Config
> +  //
> +  ThermalConfig->TsmicLock           = TRUE;
> +  ThermalConfig->PchHotEnable        = PcdGetBool
> (PcdPchThermalHotEnable);
> +
> +  DmiHaAWC = &ThermalConfig->DmiHaAWC;
> +  DmiHaAWC->TS3TW = 0;
> +  DmiHaAWC->TS2TW = 1;
> +  DmiHaAWC->TS1TW = 2;
> +  DmiHaAWC->TS0TW = 3;
> +  //
> +  // Update Pch Usb Config
> +  //
> +  UpdatePchUsbConfig (
> +    UsbConfig
> +    );
> +
> +  ScsConfig->ScsUfsEnabled = 0;
> +  ScsConfig->ScsEmmcHs400Enabled = 1;
> +  ScsConfig->ScsEmmcHs400TuningRequired = TRUE;
> +
> +  IshConfig->I2c0GpioAssign = 1;
> +  IshConfig->I2c1GpioAssign = 1;
> +  IshConfig->Gp0GpioAssign = 1;
> +  IshConfig->Gp1GpioAssign = 1;
> +  IshConfig->Gp2GpioAssign = 1;
> +  IshConfig->Gp3GpioAssign = 1;
> +  IshConfig->Gp4GpioAssign = 1;
> +  IshConfig->Gp5GpioAssign = 1;
> +  IshConfig->Gp6GpioAssign = 1;
> +
> +  return Status;
> +}
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.h
> new file mode 100644
> index 0000000000..5492cfc7d6
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdate.h
> @@ -0,0 +1,24 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_PCH_POLICY_UPDATE_H_
> +#define _PEI_PCH_POLICY_UPDATE_H_
> +
> +//
> +// External include files do NOT need to be explicitly specified in real EDKII
> +// environment
> +//
> +#include <PiPei.h>
> +#include <PlatformBoardId.h>
> +#include <Library/PeiPlatformLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Ppi/SiPolicy.h>
> +#include <PlatformBoardConfig.h>
> +
> +#endif
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..ac6da0293c
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPchPolicyUpdatePreMem.c
> @@ -0,0 +1,114 @@
> +/** @file
> +  This file is SampleCode of the library for Intel PCH PEI Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/SataLib.h>
> +#include <Library/PchPcrLib.h>
> +#include <Library/PchPcieRpLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PchPolicyLib.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +//
> +// Sawtooth Peak
> +// Single SPD EEPROM at 0xA2 serves both C0D0 and C1D0 (LPDDR is 1DPC
> only)
> +//
> +#define DIMM_SMB_SPD_P0C0D0_STP 0xA2
> +#define DIMM_SMB_SPD_P0C0D1_STP 0xA0
> +#define DIMM_SMB_SPD_P0C1D0_STP 0xA2
> +#define DIMM_SMB_SPD_P0C1D1_STP 0xA0
> +
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT8 mSmbusSTPRsvdAddresses[] =
> {
> +  DIMM_SMB_SPD_P0C0D0_STP,
> +  DIMM_SMB_SPD_P0C0D1_STP,
> +  DIMM_SMB_SPD_P0C1D0_STP,
> +  DIMM_SMB_SPD_P0C1D1_STP
> +};
> +
> +
> +/**
> +  This function performs PCH PEI Policy initialization.
> +
> +  @param[in, out] SiPreMemPolicy  The SI PREMEM Policy PPI instance
> +
> +  @retval EFI_SUCCESS             The PPI is installed and initialized.
> +  @retval EFI ERRORS              The PPI is not successfully installed.
> +  @retval EFI_OUT_OF_RESOURCES    Do not have enough resources to
> initialize the driver
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiPchPolicyPreMem (
> +  IN OUT   SI_PREMEM_POLICY_PPI  *SiPreMemPolicy
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  UINT8                           *SmBusReservedTable;
> +  UINT8                           SmBusReservedNum;
> +
> +  PCH_GENERAL_PREMEM_CONFIG       *PchGeneralPreMemConfig;
> +  PCH_TRACE_HUB_PREMEM_CONFIG     *PchTraceHubPreMemConfig;
> +  PCH_SMBUS_PREMEM_CONFIG         *SmbusPreMemConfig;
> +  PCH_LPC_PREMEM_CONFIG           *LpcPreMemConfig;
> +  PCH_WDT_PREMEM_CONFIG           *WatchDogPreMemConfig;
> +  PCH_DCI_PREMEM_CONFIG           *DciPreMemConfig;
> +  PCH_PCIE_RP_PREMEM_CONFIG       *PcieRpPreMemConfig;
> +  PCH_HDAUDIO_PREMEM_CONFIG       *HdaPreMemConfig;
> +  PCH_ISH_PREMEM_CONFIG           *IshPreMemConfig;
> +
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPchGeneralPreMemConfigGuid, (VOID *) &PchGeneralPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPchTraceHubPreMemConfigGuid, (VOID *) &PchTraceHubPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gSmbusPreMemConfigGuid, (VOID *) &SmbusPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gLpcPreMemConfigGuid, (VOID *) &LpcPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gWatchDogPreMemConfigGuid, (VOID *) &WatchDogPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gDciPreMemConfigGuid, (VOID *) &DciPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gPcieRpPreMemConfigGuid, (VOID *) &PcieRpPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gHdAudioPreMemConfigGuid, (VOID *) &HdaPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = GetConfigBlock ((VOID *) SiPreMemPolicy,
> &gIshPreMemConfigGuid, (VOID *) &IshPreMemConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  DciPreMemConfig->DciUsb3TypecUfpDbg = 2;
> +  PchTraceHubPreMemConfig->MemReg0Size = 3;
> +  PchTraceHubPreMemConfig->MemReg1Size = 3;
> +  //
> +  // SMBUS
> +  //
> +  SmbusPreMemConfig->Enable = TRUE;
> +  SmbusPreMemConfig->SmbAlertEnable = PcdGetBool
> (PcdSmbusAlertEnable);
> +  //
> +  // SMBUS reserved addresses
> +  //
> +  SmBusReservedTable = NULL;
> +  SmBusReservedNum   = 0;
> +  SmbusPreMemConfig->SmbusIoBase = PcdGet16
> (PcdSmbusBaseAddress);
> +  SmBusReservedTable = mSmbusSTPRsvdAddresses;
> +  SmBusReservedNum   = sizeof (mSmbusSTPRsvdAddresses);
> +
> +  if (SmBusReservedTable != NULL) {
> +    SmbusPreMemConfig->NumRsvdSmbusAddresses =
> SmBusReservedNum;
> +    CopyMem (
> +      SmbusPreMemConfig->RsvdSmbusAddressTable,
> +      SmBusReservedTable,
> +      SmBusReservedNum
> +      );
> +  }
> +
> +  return Status;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPolicyUpdateLib.inf
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPolicyUpdateLib.inf
> new file mode 100644
> index 0000000000..014967c7f6
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiPolicyUpdateLib.inf
> @@ -0,0 +1,273 @@
> +## @file
> +# Module Information file for PEI PolicyUpdateLib Library
> +#
> +#
> +#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = PeiPolicyUpdateLib
> +  FILE_GUID                      =
> 6EA9585C-3C15-47DA-9FFC-25E9E4EA4D0C
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = PEIM
> +  LIBRARY_CLASS                  = PeiPolicyUpdateLib|PEIM
> PEI_CORE SEC
> +
> +[LibraryClasses]
> +  HobLib
> +  BaseCryptLib
> +  CpuPlatformLib
> +  IoLib
> +  PeiSaPolicyLib
> +  ConfigBlockLib
> +  PchGbeLib
> +  PchInfoLib
> +  PchPcieRpLib
> +  HdaVerbTableLib
> +  MemoryAllocationLib
> +  PeiServicesTablePointerLib
> +  PcdLib
> +  Tpm2CommandLib
> +  Tpm12CommandLib
> +  Tpm2DeviceLib
> +  Tpm12DeviceLib
> +  PmcLib
> +  SataLib
> +  PchInfoLib
> +  PciSegmentLib
> +  SiPolicyLib
> +  PeiServicesLib
> +  SpiLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> +  CometlakeOpenBoardPkg/OpenBoardPkg.dec
> +  CoffeelakeSiliconPkg/SiPkg.dec
> +  SecurityPkg/SecurityPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +  IntelSiliconPkg/IntelSiliconPkg.dec
> +
> +[FixedPcd]
> +  gSiPkgTokenSpaceGuid.PcdTsegSize                             ##
> CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageSize          ##
> CONSUMES
> +
> +[Pcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress  ## CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdPciExpressRegionLength     ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdMchBaseAddress             ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSmbusBaseAddress           ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSerialIoUartDebugEnable    ## CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSerialIoUartNumber         ## CONSUMES
> +  gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid   ## CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdDmiBaseAddress    ##
> CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdEpBaseAddress     ## CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdGttMmAddress      ##
> CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdGmAdrAddress      ##
> CONSUMES
> +  gPlatformModuleTokenSpaceGuid.PcdEdramBaseAddress  ##
> CONSUMES
> +  gSiPkgTokenSpaceGuid.PcdSmbusBaseAddress           ##
> CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdBoardBomId
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdIoExpanderPresent
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaDdrFreqLimit       ##
> CONSUMES
> +
> +  # SA Misc Config
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaMiscUserBd
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaMiscMmioSizeAdjustment
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompResistor
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcRcompTarget
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqByteMap
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqByteMapSize
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqsMapCpu2Dram
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqsMapCpu2DramSize
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqPinsInterleavedControl
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcDqPinsInterleaved
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdData
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdDataSize
> ## CONSUMES
> +
> +  # Display DDI
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaDisplayConfigTable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSaDisplayConfigTableSize
> ## CONSUMES
> +
> +  # PEG Reset By GPIO
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPegGpioResetControl
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPegGpioResetSupoort
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPeg0ResetGpioPad
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPeg0ResetGpioActive
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPeg3ResetGpioPad
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPeg3ResetGpioActive
> ## CONSUMES
> +
> +  # PCIE RTD3 GPIO
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdRootPortDev
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdRootPortFunc
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdRootPortIndex
> ## CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0GpioSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0WakeGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0HoldRstExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0HoldRstGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0HoldRstActive
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0PwrEnableExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0PwrEnableGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie0PwrEnableActive
> ## CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1GpioSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1WakeGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1HoldRstExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1HoldRstGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1HoldRstActive
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1PwrEnableExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1PwrEnableGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie1PwrEnableActive
> ## CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2GpioSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2WakeGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2HoldRstExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2HoldRstGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2HoldRstActive
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2PwrEnableExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2PwrEnableGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie2PwrEnableActive
> ## CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3GpioSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3WakeGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3HoldRstExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3HoldRstGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3HoldRstActive
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3PwrEnableExpanderNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3PwrEnableGpioNo
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcie3PwrEnableActive
> ## CONSUMES
> +
> +  # SPD Address Table
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable0
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable1
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable2
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcSpdAddressTable3
> ## CONSUMES
> +
> +  # CA Vref Configuration
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMrcCaVrefConfig
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdDualDimmPerChannelBoardTy
> pe    ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMobileDramPresent
> ## CONSUMES
> +
> +  # PCIe Clock Info
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock0
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock1
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock2
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock3
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock4
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock5
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock6
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock7
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock8
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock9
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock10
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock11
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock12
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock13
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock14
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPcieClock15
> ## CONSUMES
> +
> +  # USB 2.0 Port AFE
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port0Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port1Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port2Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port3Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port4Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port5Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port6Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port7Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port8Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port9Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port10Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port11Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port12Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port13Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port14Afe
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20Port15Afe
> ## CONSUMES
> +
> +  # USB 2.0 Port Over Current Pin
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort0
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort1
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort2
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort3
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort4
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort5
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort6
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort7
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort8
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort9
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort10
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort11
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort12
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort13
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort14
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb20OverCurrentPinPort15
> ## CONSUMES
> +
> +  # USB 3.0 Port Over Current Pin
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort0
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort1
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort2
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort3
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort4
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort5
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort6
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort7
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort8
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdUsb30OverCurrentPinPort9
> ## CONSUMES
> +
> +  # Pch SerialIo I2c Pads Termination
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c0PadInternalTer
> m ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c1PadInternalTer
> m ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c2PadInternalTer
> m ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c3PadInternalTer
> m ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c4PadInternalTer
> m ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchSerialIoI2c5PadInternalTer
> m ## CONSUMES
> +
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdEcPresent
> +
> +  gIntelSiliconPkgTokenSpaceGuid.PcdIntelGraphicsVbtFileGuid
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSmbusAlertEnable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSataLedEnable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdVrAlertEnable
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSlpS0VmRuntimeControl
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSlpS0Vm070VSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdSlpS0Vm075VSupport
> ## CONSUMES
> +  gCometlakeOpenBoardPkgTokenSpaceGuid.PcdPchThermalHotEnable
> ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMemoryThermalSensorGpioC
> PmsyncEnable  ## CONSUMES
> +
> gCometlakeOpenBoardPkgTokenSpaceGuid.PcdMemoryThermalSensorGpioD
> PmsyncEnable  ## CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid
> ## CONSUMES
> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber
> ## CONSUMES
> +
> +[FixedPcd]
> +  gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiAcpiReclaimMemorySize
> ## CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiAcpiNvsMemorySize
> ## CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiReservedMemorySize
> ## CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiRtDataMemorySize
> ## CONSUMES
> +  gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiRtCodeMemorySize
> ## CONSUMES
> +
> +[Sources]
> +  PeiPchPolicyUpdatePreMem.c
> +  PeiPchPolicyUpdate.c
> +  PeiCpuPolicyUpdatePreMem.c
> +  PeiCpuPolicyUpdate.c
> +  PeiMePolicyUpdatePreMem.c
> +  PeiMePolicyUpdate.c
> +  PeiSaPolicyUpdate.c
> +  PeiSaPolicyUpdatePreMem.c
> +  PeiSiPolicyUpdate.c
> +
> +[Ppis]
> +  gWdtPpiGuid                                   ## CONSUMES
> +  gPchSpiPpiGuid                                ## CONSUMES
> +  gSiPolicyPpiGuid                              ## CONSUMES
> +  gSiPreMemPolicyPpiGuid                        ## CONSUMES
> +  gPeiTbtPolicyPpiGuid                          ## CONSUMES
> +
> +[Guids]
> +  gTianoLogoGuid                                ## CONSUMES
> +  gSiConfigGuid                                 ## CONSUMES
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.c
> new file mode 100644
> index 0000000000..fc9debbe38
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.c
> @@ -0,0 +1,243 @@
> +/** @file
> +Do Platform Stage System Agent initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiSaPolicyUpdate.h"
> +#include <Protocol/GraphicsOutput.h>
> +#include <IndustryStandard/Bmp.h>
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Library/HobLib.h>
> +#include <Platform.h>
> +#include <Ppi/FirmwareVolume.h>
> +#include <Pi/PiFirmwareFile.h>
> +#include <Pi/PiPeiCis.h>
> +#include <Core/Pei/PeiMain.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiSaPolicyLib.h>
> +#include <GpioPinsCnlLp.h>
> +#include <GpioPinsCnlH.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +/**
> +  UpdatePeiSaPolicy performs SA PEI Policy initialization
> +
> +  @param[in out] SiPolicyPpi     - SI_POLICY PPI
> +
> +  @retval EFI_SUCCESS              The policy is installed and
> initialized.
> +**/
> +EFI_STATUS
> +UpdatePeiSaPolicy (
> +  IN OUT   SI_POLICY_PPI      *SiPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_GUID                        FileGuid;
> +  VOID                            *Buffer;
> +  UINT8                           SaDisplayConfigTable[9] = {0};
> +  VOID                            *MemBuffer;
> +  BMP_IMAGE_HEADER                *BmpHeader;
> +  UINT64                          BltBufferSize;
> +  UINT32                          Size;
> +  GRAPHICS_PEI_CONFIG             *GtConfig;
> +  GNA_CONFIG                      *GnaConfig;
> +  WDT_PPI                         *gWdtPei;
> +  PCIE_PEI_CONFIG                 *PciePeiConfig;
> +  SA_MISC_PEI_CONFIG              *MiscPeiConfig;
> +  EFI_BOOT_MODE                   BootMode;
> +
> +  DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n"));
> +
> +  Size = 0;
> +  MemBuffer = NULL;
> +  BmpHeader = NULL;
> +  BltBufferSize = 0;
> +  GtConfig = NULL;
> +  GnaConfig = NULL;
> +
> +  Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid,
> (VOID *)&GtConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGnaConfigGuid, (VOID
> *)&GnaConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaPciePeiConfigGuid,
> (VOID *)&PciePeiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid,
> (VOID *)&MiscPeiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +
> +  //
> +  // Locate WDT_PPI (ICC WDT PPI)
> +  //
> +  gWdtPei = NULL;
> +  Status = PeiServicesLocatePpi(
> +             &gWdtPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &gWdtPei
> +             );
> +
> +  Status = PeiServicesGetBootMode(&BootMode);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  if (!EFI_ERROR (Status)) {
> +    Buffer = NULL;
> +
> +    CopyMem(&FileGuid, PcdGetPtr(PcdIntelGraphicsVbtFileGuid),
> sizeof(FileGuid));
> +    PeiGetSectionFromFv(FileGuid, &Buffer, &Size);
> +    if (Buffer == NULL) {
> +      DEBUG((DEBUG_ERROR, "Could not locate VBT\n"));
> +    }
> +
> +    MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES
> ((UINTN)Size));
> +    if ((MemBuffer != NULL) && (Buffer != NULL)) {
> +      CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
> +      GtConfig->GraphicsConfigPtr = MemBuffer;
> +    } else {
> +      DEBUG((DEBUG_WARN, "Error in locating / copying VBT.\n"));
> +      GtConfig->GraphicsConfigPtr = NULL;
> +    }
> +
> +    GtConfig->PeiGraphicsPeimInit = 1;
> +
> +    DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromFv is
> 0x%x\n", GtConfig->GraphicsConfigPtr));
> +    DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromFv is 0x%x\n",
> Size));
> +
> +    PeiGetSectionFromFv (gTianoLogoGuid, &Buffer, &Size);
> +    if (Buffer == NULL) {
> +      DEBUG((DEBUG_WARN, "Could not locate Logo\n"));
> +    }
> +
> +    MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES
> ((UINTN)Size));
> +    if ((MemBuffer != NULL) && (Buffer != NULL)) {
> +      CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
> +      GtConfig->LogoPtr = MemBuffer;
> +      GtConfig->LogoSize = Size;
> +
> +      //
> +      // Calculate the BltBuffer needed size.
> +      //
> +      BmpHeader = (BMP_IMAGE_HEADER *) GtConfig->LogoPtr;
> +
> +      if (BmpHeader->CharB == 'B' && BmpHeader->CharM == 'M') {
> +        BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth,
> BmpHeader->PixelHeight);
> +        if (BltBufferSize < DivU64x32 ((UINTN) ~0, sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
> +          BltBufferSize = MultU64x32 (BltBufferSize, sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
> +          GtConfig->BltBufferSize    = (UINT32) BltBufferSize;
> +          GtConfig->BltBufferAddress = (VOID *) AllocatePages
> (EFI_SIZE_TO_PAGES ((UINTN)GtConfig->BltBufferSize));
> +        } else {
> +          DEBUG ((DEBUG_ERROR, "Blt Buffer Size overflow.\n"));
> +          ASSERT (FALSE);
> +        }
> +      } else {
> +        DEBUG ((DEBUG_ERROR, "Wrong Bmp Image Header.\n"));
> +        ASSERT (FALSE);
> +      }
> +
> +    } else {
> +      DEBUG((DEBUG_WARN, "Error in locating / copying LogoPtr.\n"));
> +      GtConfig->LogoPtr = NULL;
> +      GtConfig->LogoSize = 0;
> +    }
> +
> +    DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromFv is 0x%x\n",
> GtConfig->LogoPtr));
> +    DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromFv is 0x%x\n",
> GtConfig->LogoSize));
> +
> +    //
> +    // Display DDI Initialization ( default Native GPIO as per board during
> AUTO case)
> +    //
> +    if (PcdGet32 (PcdSaDisplayConfigTable) != 0) {
> +      CopyMem (SaDisplayConfigTable, (VOID *) (UINTN) PcdGet32
> (PcdSaDisplayConfigTable), (UINTN)PcdGet16 (PcdSaDisplayConfigTableSize));
> +      GtConfig->DdiConfiguration.DdiPortEdp     =
> SaDisplayConfigTable[0];
> +      GtConfig->DdiConfiguration.DdiPortBHpd    =
> SaDisplayConfigTable[1];
> +      GtConfig->DdiConfiguration.DdiPortCHpd    =
> SaDisplayConfigTable[2];
> +      GtConfig->DdiConfiguration.DdiPortDHpd    =
> SaDisplayConfigTable[3];
> +      GtConfig->DdiConfiguration.DdiPortFHpd    =
> SaDisplayConfigTable[4];
> +      GtConfig->DdiConfiguration.DdiPortBDdc    =
> SaDisplayConfigTable[5];
> +      GtConfig->DdiConfiguration.DdiPortCDdc    =
> SaDisplayConfigTable[6];
> +      GtConfig->DdiConfiguration.DdiPortDDdc    =
> SaDisplayConfigTable[7];
> +      GtConfig->DdiConfiguration.DdiPortFDdc    =
> SaDisplayConfigTable[8];
> +    }
> +  }
> +
> +  PciePeiConfig->DmiAspm = 0x3;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  PeiGetSectionFromFv finds the file in FV and gets file Address and Size
> +
> +  @param[in] NameGuid              - File GUID
> +  @param[out] Address              - Pointer to the File Address
> +  @param[out] Size                 - Pointer to File Size
> +
> +  @retval EFI_SUCCESS                Successfull in reading the section
> from FV
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiGetSectionFromFv (
> +  IN CONST  EFI_GUID        NameGuid,
> +  OUT VOID                  **Address,
> +  OUT UINT32                *Size
> +  )
> +{
> +  EFI_STATUS                           Status;
> +  EFI_PEI_FIRMWARE_VOLUME_PPI          *FvPpi;
> +  EFI_FV_FILE_INFO                     FvFileInfo;
> +  PEI_CORE_INSTANCE                    *PrivateData;
> +  UINTN                                CurrentFv;
> +  PEI_CORE_FV_HANDLE                   *CoreFvHandle;
> +  EFI_PEI_FILE_HANDLE                  VbtFileHandle;
> +  EFI_GUID                             *VbtGuid;
> +  EFI_COMMON_SECTION_HEADER            *Section;
> +  CONST EFI_PEI_SERVICES               **PeiServices;
> +
> +  PeiServices = GetPeiServicesTablePointer();
> +
> +  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
> +
> +  Status = PeiServicesLocatePpi(
> +             &gEfiFirmwareFileSystem2Guid,
> +             0,
> +             NULL,
> +             (VOID **)&FvPpi
> +             );
> +  ASSERT_EFI_ERROR(Status);
> +
> +  CurrentFv = PrivateData->CurrentPeimFvCount;
> +  CoreFvHandle = &(PrivateData->Fv[CurrentFv]);
> +
> +  Status = FvPpi->FindFileByName(FvPpi, &NameGuid,
> &CoreFvHandle->FvHandle, &VbtFileHandle);
> +  if (!EFI_ERROR(Status) && VbtFileHandle != NULL) {
> +
> +    DEBUG((DEBUG_INFO, "Find SectionByType \n"));
> +
> +    Status = FvPpi->FindSectionByType(FvPpi, EFI_SECTION_RAW,
> VbtFileHandle, (VOID **)&VbtGuid);
> +    if (!EFI_ERROR(Status)) {
> +
> +      DEBUG((DEBUG_INFO, "GetFileInfo \n"));
> +
> +      Status = FvPpi->GetFileInfo(FvPpi, VbtFileHandle, &FvFileInfo);
> +      Section = (EFI_COMMON_SECTION_HEADER *)FvFileInfo.Buffer;
> +
> +      if (IS_SECTION2(Section)) {
> +        ASSERT(SECTION2_SIZE(Section) > 0x00FFFFFF);
> +        *Size = SECTION2_SIZE(Section) - sizeof
> (EFI_COMMON_SECTION_HEADER2);
> +        *Address = ((UINT8 *)Section + sizeof
> (EFI_COMMON_SECTION_HEADER2));
> +      } else {
> +        *Size = SECTION_SIZE(Section) - sizeof
> (EFI_COMMON_SECTION_HEADER);
> +        *Address = ((UINT8 *)Section + sizeof
> (EFI_COMMON_SECTION_HEADER));
> +      }
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.h
> new file mode 100644
> index 0000000000..ab5fbad638
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdate.h
> @@ -0,0 +1,53 @@
> +/** @file
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_SA_POLICY_UPDATE_H_
> +#define _PEI_SA_POLICY_UPDATE_H_
> +
> +//
> +// External include files do NOT need to be explicitly specified in real EDKII
> +// environment
> +//
> +#include <PlatformBoardId.h>
> +#include <SaPolicyCommon.h>
> +#include <Library/DebugPrintErrorLevelLib.h>
> +#include <Ppi/Wdt.h>
> +#include <CpuRegs.h>
> +#include <Library/CpuPlatformLib.h>
> +#include "PeiPchPolicyUpdate.h"
> +#include <Library/PcdLib.h>
> +#include <Library/PciSegmentLib.h>
> +#include <CpuAccess.h>
> +
> +#define WDT_TIMEOUT 60
> +
> +// BClk Frequency Limitations (in Hz)
> +#define BCLK_MAX                538000000
> +#define BCLK_100                100000000
> +#define BCLK_GRANULARITY        1000000
> +#define BCLK_100_KHZ            100000
> +
> +
> +/**
> +  PeiGetSectionFromFv finds the file in FV and gets file Address and Size
> +
> +  @param[in] NameGuid              - File GUID
> +  @param[out] Address              - Pointer to the File Address
> +  @param[out] Size                 - Pointer to File Size
> +
> +  @retval EFI_SUCCESS                Successfull in reading the section
> from FV
> +**/
> +EFI_STATUS
> +EFIAPI
> +PeiGetSectionFromFv (
> +  IN CONST  EFI_GUID        NameGuid,
> +  OUT VOID                  **Address,
> +  OUT UINT32               *Size
> +  );
> +
> +#endif
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdatePreMem.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdatePreMem.c
> new file mode 100644
> index 0000000000..1f38e4e475
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSaPolicyUpdatePreMem.c
> @@ -0,0 +1,213 @@
> +/** @file
> +  Platform Stage System Agent initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "PeiSaPolicyUpdate.h"
> +#include <CpuRegs.h>
> +#include <Register/Cpuid.h>
> +#include <Library/CpuPlatformLib.h>
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Guid/MemoryOverwriteControl.h>
> +#include <Library/HobLib.h>
> +#include <Platform.h>
> +#include <PlatformBoardConfig.h>
> +#include <Library/SiPolicyLib.h>
> +
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PeiSaPolicyLib.h>
> +#include <Library/GpioLib.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +///
> +/// Memory Reserved should be between 125% to 150% of the Current
> required memory
> +/// otherwise BdsMisc.c would do a reset to make it 125% to avoid s4
> resume issues.
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED STATIC
> EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
> +  { EfiACPIReclaimMemory,   FixedPcdGet32
> (PcdPlatformEfiAcpiReclaimMemorySize) },  // ASL
> +  { EfiACPIMemoryNVS,       FixedPcdGet32
> (PcdPlatformEfiAcpiNvsMemorySize) },      // ACPI NVS (including S3
> related)
> +  { EfiReservedMemoryType,  FixedPcdGet32
> (PcdPlatformEfiReservedMemorySize) },     // BIOS Reserved (including S3
> related)
> +  { EfiRuntimeServicesData, FixedPcdGet32
> (PcdPlatformEfiRtDataMemorySize) },       // Runtime Service Data
> +  { EfiRuntimeServicesCode, FixedPcdGet32
> (PcdPlatformEfiRtCodeMemorySize) },       // Runtime Service Code
> +  { EfiMaxMemoryType, 0 }
> +};
> +
> +/**
> +  UpdatePeiSaPolicyPreMem performs SA PEI Policy initialization
> +
> +  @param[in out] SiPreMemPolicyPpi - SI_PREMEM_POLICY PPI
> +
> +  @retval EFI_SUCCESS              The policy is installed and
> initialized.
> +**/
> +EFI_STATUS
> +UpdatePeiSaPolicyPreMem (
> +  IN OUT   SI_PREMEM_POLICY_PPI      *SiPreMemPolicyPpi
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  SA_MISC_PEI_PREMEM_CONFIG       *MiscPeiPreMemConfig = NULL;
> +  MEMORY_CONFIG_NO_CRC            *MemConfigNoCrc = NULL;
> +  SA_MEMORY_RCOMP                 *RcompData;
> +  WDT_PPI                         *gWdtPei;
> +  UINT8                           Index;
> +  UINTN                           DataSize;
> +  EFI_MEMORY_TYPE_INFORMATION
> MemoryData[EfiMaxMemoryType + 1];
> +  EFI_BOOT_MODE                   BootMode;
> +  UINT32                          TraceHubTotalMemSize;
> +  GRAPHICS_PEI_PREMEM_CONFIG      *GtPreMemConfig = NULL;
> +  MEMORY_CONFIGURATION            *MemConfig = NULL;
> +  PCIE_PEI_PREMEM_CONFIG          *PciePeiPreMemConfig = NULL;
> +  SWITCHABLE_GRAPHICS_CONFIG      *SgGpioData = NULL;
> +  IPU_PREMEM_CONFIG               *IpuPreMemPolicy = NULL;
> +  OVERCLOCKING_PREMEM_CONFIG      *OcPreMemConfig = NULL;
> +  VTD_CONFIG                      *Vtd = NULL;
> +  UINT32                          ProcessorTraceTotalMemSize;
> +
> +  TraceHubTotalMemSize = 0;
> +  ProcessorTraceTotalMemSize = 0;
> +
> +  DEBUG((DEBUG_INFO, "Entering Get Config Block function call from
> UpdatePeiSaPolicyPreMem\n"));
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gGraphicsPeiPreMemConfigGuid, (VOID *) &GtPreMemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gMemoryConfigGuid, (VOID *) &MemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gSaPciePeiPreMemConfigGuid, (VOID *) &PciePeiPreMemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gSwitchableGraphicsConfigGuid, (VOID *) &SgGpioData);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gIpuPreMemConfigGuid, (VOID *) &IpuPreMemPolicy);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gMemoryConfigNoCrcGuid, (VOID *) &MemConfigNoCrc);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi,
> &gSaOverclockingPreMemConfigGuid, (VOID *) &OcPreMemConfig);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi, &gVtdConfigGuid,
> (VOID *)&Vtd);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  RcompData = MemConfigNoCrc->RcompData;
> +
> +  //
> +  // Locate WDT_PPI (ICC WDT PPI)
> +  //
> +  gWdtPei = NULL;
> +  Status = PeiServicesLocatePpi(
> +             &gWdtPpiGuid,
> +             0,
> +             NULL,
> +             (VOID **) &gWdtPei
> +             );
> +
> +  Status = PeiServicesGetBootMode(&BootMode);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  MiscPeiPreMemConfig->S3DataPtr = NULL;
> +  MiscPeiPreMemConfig->UserBd = 0; // It's a CRB mobile board by default
> (btCRBMB)
> +
> +  PcdSetBoolS (PcdMobileDramPresent, (BOOLEAN)
> (MemConfig->MobilePlatform));
> +  MiscPeiPreMemConfig->SpdAddressTable[0] = PcdGet8
> (PcdMrcSpdAddressTable0);
> +  MiscPeiPreMemConfig->SpdAddressTable[1] = PcdGet8
> (PcdMrcSpdAddressTable1);
> +  MiscPeiPreMemConfig->SpdAddressTable[2] = PcdGet8
> (PcdMrcSpdAddressTable2);
> +  MiscPeiPreMemConfig->SpdAddressTable[3] = PcdGet8
> (PcdMrcSpdAddressTable3);
> +  MemConfig->CaVrefConfig                 = PcdGet8
> (PcdMrcCaVrefConfig);
> +  MemConfig->DualDimmPerChannelBoardType  = PcdGetBool
> (PcdDualDimmPerChannelBoardType);
> +  if (PcdGet32 (PcdMrcRcompResistor)) {
> +    CopyMem((VOID *)RcompData->RcompResistor, (VOID *) (UINTN)
> PcdGet32 (PcdMrcRcompResistor), sizeof (RcompData->RcompResistor));
> +  }
> +  if (PcdGet32 (PcdMrcRcompTarget)) {
> +    CopyMem((VOID *)RcompData->RcompTarget, (VOID *) (UINTN)
> PcdGet32 (PcdMrcRcompTarget), sizeof (RcompData->RcompTarget));
> +  }
> +  if (PcdGet32 (PcdMrcDqByteMap)) {
> +    CopyMem((VOID *)MemConfigNoCrc->DqByteMap, (VOID *) (UINTN)
> PcdGet32 (PcdMrcDqByteMap), sizeof (UINT8)* SA_MC_MAX_CHANNELS *
> SA_MRC_ITERATION_MAX * 2);
> +  }
> +  if (PcdGet32 (PcdMrcDqsMapCpu2Dram)) {
> +    CopyMem((VOID *)MemConfigNoCrc->DqsMap, (VOID *) (UINTN)
> PcdGet32 (PcdMrcDqsMapCpu2Dram), sizeof (UINT8)*
> SA_MC_MAX_CHANNELS * SA_MC_MAX_BYTES_NO_ECC);
> +  }
> +  if (PcdGetBool (PcdMrcDqPinsInterleavedControl)) {
> +    MemConfig->DqPinsInterleaved = PcdGetBool
> (PcdMrcDqPinsInterleaved);
> +  }
> +  if (PcdGet32 (PcdMrcSpdData)) {
> +    CopyMem((VOID *)MemConfigNoCrc->SpdData->SpdData[0][0], (VOID
> *) (UINTN) PcdGet32 (PcdMrcSpdData), SPD_DATA_SIZE);
> +    CopyMem((VOID *)MemConfigNoCrc->SpdData->SpdData[1][0], (VOID
> *) (UINTN) PcdGet32 (PcdMrcSpdData), SPD_DATA_SIZE);
> +  }
> +
> +  MiscPeiPreMemConfig->MchBar   = (UINTN) PcdGet64
> (PcdMchBaseAddress);
> +  MiscPeiPreMemConfig->DmiBar   = (UINTN) PcdGet64
> (PcdDmiBaseAddress);
> +  MiscPeiPreMemConfig->EpBar    = (UINTN) PcdGet64
> (PcdEpBaseAddress);
> +  MiscPeiPreMemConfig->EdramBar = (UINTN) PcdGet64
> (PcdEdramBaseAddress);
> +  MiscPeiPreMemConfig->SmbusBar = PcdGet16(PcdSmbusBaseAddress);
> +  MiscPeiPreMemConfig->TsegSize = PcdGet32(PcdTsegSize);
> +  MiscPeiPreMemConfig->UserBd   = PcdGet8 (PcdSaMiscUserBd);
> +  MiscPeiPreMemConfig->MmioSizeAdjustment = PcdGet16
> (PcdSaMiscMmioSizeAdjustment);
> +  if (PcdGetBool (PcdPegGpioResetControl)) {
> +    PciePeiPreMemConfig->PegGpioData.GpioSupport = PcdGetBool
> (PcdPegGpioResetSupoort);
> +  } else {
> +
> +  }
> +  PciePeiPreMemConfig->PegGpioData.SaPeg0ResetGpio.GpioPad =
> PcdGet32 (PcdPeg0ResetGpioPad);
> +  PciePeiPreMemConfig->PegGpioData.SaPeg0ResetGpio.Active  =
> PcdGetBool (PcdPeg0ResetGpioActive);
> +
> +  PciePeiPreMemConfig->PegGpioData.SaPeg3ResetGpio.GpioPad =
> PcdGet32 (PcdPeg3ResetGpioPad);
> +  PciePeiPreMemConfig->PegGpioData.SaPeg3ResetGpio.Active  =
> PcdGetBool (PcdPeg3ResetGpioActive);
> +
> +  MemConfig->CkeRankMapping = 0xAA;
> +  ///
> +  /// Initialize the VTD Configuration
> +  ///
> +  Vtd->VtdDisable = 0;
> +
> +  MemConfig->RMT = 1;
> +  MemConfig->UserPowerWeightsEn = 0;
> +  MemConfig->RaplLim2WindY = 0x0A;
> +  MemConfig->ExitOnFailure = 1;
> +
> +  MemConfigNoCrc->PlatformMemorySize = PEI_MIN_MEMORY_SIZE +
> TraceHubTotalMemSize + ProcessorTraceTotalMemSize;
> +  DataSize = sizeof (mDefaultMemoryTypeInformation);
> +  CopyMem(MemoryData, mDefaultMemoryTypeInformation, DataSize);
> +
> +  if (BootMode != BOOT_IN_RECOVERY_MODE) {
> +    for (Index = 0; Index < DataSize / sizeof
> (EFI_MEMORY_TYPE_INFORMATION); Index++) {
> +      MemConfigNoCrc->PlatformMemorySize +=
> MemoryData[Index].NumberOfPages * EFI_PAGE_SIZE;
> +    }
> +
> +    OcPreMemConfig->GtMaxOcRatio = 0;
> +    OcPreMemConfig->GtVoltageMode = 0;
> +    OcPreMemConfig->GtVoltageOverride = 0;
> +    OcPreMemConfig->GtExtraTurboVoltage = 0;
> +    OcPreMemConfig->GtVoltageOffset = 0;
> +    OcPreMemConfig->SaVoltageOffset = 0;
> +    OcPreMemConfig->GtusMaxOcRatio = 0;
> +    OcPreMemConfig->GtusVoltageMode = 0;
> +    OcPreMemConfig->GtusVoltageOverride = 0;
> +    OcPreMemConfig->GtusExtraTurboVoltage = 0;
> +    OcPreMemConfig->GtusVoltageOffset = 0;
> +
> +    ///
> +    /// Build the GUID'd HOB for DXE
> +    ///
> +    BuildGuidDataHob (
> +      &gEfiMemoryTypeInformationGuid,
> +      MemoryData,
> +      DataSize
> +      );
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.c
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.c
> new file mode 100644
> index 0000000000..7233925379
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.c
> @@ -0,0 +1,169 @@
> +/** @file
> +  This file is SampleCode of the library for Intel Silicon PEI
> +  Platform Policy initialization.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include "PeiSiPolicyUpdate.h"
> +#include <MeChipset.h>
> +#include <Library/PchInfoLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/SiPolicyLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/ConfigBlockLib.h>
> +
> +STATIC SVID_SID_INIT_ENTRY mCdfSsidTablePtr[] = {
> +  //
> +  // SA Device(s)
> +  //
> +  {{{PCI_SVID_OFFSET,    SA_MC_FUN,        SA_MC_DEV,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG0_FUN_NUM,  SA_PEG0_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG1_FUN_NUM,  SA_PEG1_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG2_FUN_NUM,  SA_PEG2_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_IGD_FUN_0,     SA_IGD_DEV,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_IPU_FUN_NUM,   SA_IPU_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_GNA_FUN_NUM,   SA_GNA_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  //
> +  // PCH Device(s)
> +  //
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_LPC,
> PCI_DEVICE_NUMBER_PCH_LPC,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_P2SB,
> PCI_DEVICE_NUMBER_PCH_P2SB,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_PMC,
> PCI_DEVICE_NUMBER_PCH_PMC,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_HDA,
> PCI_DEVICE_NUMBER_PCH_HDA,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_CDF_PCH_SATA_1,
> PCI_DEVICE_NUMBER_CDF_PCH_SATA_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_CDF_PCH_SATA_2,
> PCI_DEVICE_NUMBER_CDF_PCH_SATA_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_CDF_PCH_SATA_3,
> PCI_DEVICE_NUMBER_CDF_PCH_SATA_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_SMBUS,
> PCI_DEVICE_NUMBER_PCH_SMBUS,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_SPI,
> PCI_DEVICE_NUMBER_PCH_SPI,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_TRACE_HUB,
> PCI_DEVICE_NUMBER_PCH_TRACE_HUB,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_XHCI,
> PCI_DEVICE_NUMBER_PCH_XHCI,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_XDCI,
> PCI_DEVICE_NUMBER_PCH_XDCI,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_THERMAL,
> PCI_DEVICE_NUMBER_PCH_THERMAL,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_1,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_2,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_3,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_4,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_5,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_6,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_7,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_8,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_9,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_10,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_11,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_12,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +};
> +
> +STATIC SVID_SID_INIT_ENTRY mSsidTablePtr[] = {
> +  //
> +  // SA Device(s)
> +  //
> +  {{{PCI_SVID_OFFSET,    SA_MC_FUN,        SA_MC_DEV,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG0_FUN_NUM,  SA_PEG0_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG1_FUN_NUM,  SA_PEG1_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{R_SA_PEG_SS_OFFSET, SA_PEG2_FUN_NUM,  SA_PEG2_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_IGD_FUN_0,     SA_IGD_DEV,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_IPU_FUN_NUM,   SA_IPU_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    SA_GNA_FUN_NUM,   SA_GNA_DEV_NUM,
> SA_MC_BUS, 0, SA_SEG_NUM, 0}}, {0, 0},0},
> +  //
> +  // PCH Device(s)
> +  //
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_LPC,
> PCI_DEVICE_NUMBER_PCH_LPC,    DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_P2SB,
> PCI_DEVICE_NUMBER_PCH_P2SB,   DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_PMC,
> PCI_DEVICE_NUMBER_PCH_PMC,    DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_HDA,
> PCI_DEVICE_NUMBER_PCH_HDA,    DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_SATA,
> PCI_DEVICE_NUMBER_PCH_SATA,   DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_SMBUS,
> PCI_DEVICE_NUMBER_PCH_SMBUS,  DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_SPI,
> PCI_DEVICE_NUMBER_PCH_SPI,    DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  //
> +  // Skip PCH LAN controller
> +  // PCH LAN SVID/SID may be loaded automatically from the NVM Word
> 0Ch/0Bh upon power up or reset
> +  // depending on the "Load Subsystem ID" bit field in NVM word 0Ah
> +  //
> +  //{{{PCI_SVID_OFFSET,    PCI_FUNCTION_NUMBER_PCH_LAN,
> PCI_DEVICE_NUMBER_PCH_LAN,    DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_TRACE_HUB,
> PCI_DEVICE_NUMBER_PCH_TRACE_HUB,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART0,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART0,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART1,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI0,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI0,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI1,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_CNL_SCS_SDCARD,
> PCI_DEVICE_NUMBER_PCH_CNL_SCS_SDCARD,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_XHCI,
> PCI_DEVICE_NUMBER_PCH_XHCI,       DEFAULT_PCI_BUS_NUMBER_PCH,
> 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_XDCI,
> PCI_DEVICE_NUMBER_PCH_XDCI,       DEFAULT_PCI_BUS_NUMBER_PCH,
> 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_THERMAL,
> PCI_DEVICE_NUMBER_PCH_THERMAL,    DEFAULT_PCI_BUS_NUMBER_PCH,
> 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_ISH,
> PCI_DEVICE_NUMBER_PCH_ISH,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_1,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_2,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_3,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_4,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_5,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_6,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_7,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_8,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_9,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_10,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_11,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_12,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_13,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_14,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_15,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_16,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_17,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_18,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_19,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_20,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_21,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_22,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_23,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{R_PCH_PCIE_CFG_SVID,
> PCI_FUNCTION_NUMBER_PCH_PCIE_ROOT_PORT_24,
> PCI_DEVICE_NUMBER_PCH_PCIE_DEVICE_3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C0,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C0,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C1,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C1,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C2,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C3,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C3,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART2,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART2,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C5,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C5,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C4,
> PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C4,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  //
> +  // ME Device(s)
> +  //
> +  {{{PCI_SVID_OFFSET,  HECI_FUNCTION_NUMBER,
> ME_DEVICE_NUMBER, DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  HECI2_FUNCTION_NUMBER, ME_DEVICE_NUMBER,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  IDER_FUNCTION_NUMBER,
> ME_DEVICE_NUMBER, DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  SOL_FUNCTION_NUMBER,
> ME_DEVICE_NUMBER, DEFAULT_PCI_BUS_NUMBER_PCH, 0,
> DEFAULT_PCI_SEGMENT_NUMBER_PCH, 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  HECI3_FUNCTION_NUMBER, ME_DEVICE_NUMBER,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0},
> +  {{{PCI_SVID_OFFSET,  HECI4_FUNCTION_NUMBER, ME_DEVICE_NUMBER,
> DEFAULT_PCI_BUS_NUMBER_PCH, 0, DEFAULT_PCI_SEGMENT_NUMBER_PCH,
> 0}}, {0, 0},0}
> +};
> +
> +/**
> +  This function performs Silicon PEI Policy initialization.
> +
> +  @param[in] SiPolicy  The Silicon Policy PPI instance
> +
> +  @retval EFI_SUCCESS  The function completed successfully
> +**/
> +EFI_STATUS
> +EFIAPI
> +UpdatePeiSiPolicy (
> +  IN OUT SI_POLICY_PPI *SiPolicy
> +  )
> +{
> +  EFI_STATUS                         Status;
> +  SI_CONFIG                          *SiConfig;
> +
> +  Status = GetConfigBlock ((VOID *) SiPolicy, &gSiConfigGuid, (VOID *)
> &SiConfig);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  SiConfig->CsmFlag       = 0;
> +
> +  if (IsCdfPch ()) {
> +    SiConfig->SsidTablePtr = (UINT32*)(UINTN) mCdfSsidTablePtr;
> +    SiConfig->NumberOfSsidTableEntry = (sizeof (mCdfSsidTablePtr) / sizeof
> (SVID_SID_INIT_ENTRY));
> +  } else {
> +    SiConfig->SsidTablePtr = (UINT32*)(UINTN) mSsidTablePtr;
> +    SiConfig->NumberOfSsidTableEntry = (sizeof (mSsidTablePtr) / sizeof
> (SVID_SID_INIT_ENTRY));
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git
> a/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.h
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.h
> new file mode 100644
> index 0000000000..a68cba3201
> --- /dev/null
> +++
> b/Platform/Intel/CometlakeOpenBoardPkg/Policy/Library/PeiPolicyUpdateLib/
> PeiSiPolicyUpdate.h
> @@ -0,0 +1,18 @@
> +/** @file
> +   Header file for PEI SiPolicyUpdate.
> +
> +
> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef _PEI_SI_POLICY_UPDATE_H_
> +#define _PEI_SI_POLICY_UPDATE_H_
> +
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/PeiPlatformLib.h>
> +#include <Library/DebugLib.h>
> +#include <Ppi/SiPolicy.h>
> +
> +#endif
> +
> --
> 2.16.2.windows.1


  reply	other threads:[~2020-02-12  1:30 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-11 19:12 [edk2-platforms] [PATCH v2 0/7] Add CometlakeOpenBoardPkg support Kathappan Esakkithevar
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 1/7] CometlakeOpenBoardPkg: Add package and headers Kathappan Esakkithevar
2020-02-12  1:29   ` Chiu, Chasel
2020-02-12  7:20   ` Nate DeSimone
2020-02-12 10:01   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 2/7] CometlakeOpenBoardPkg/CometlakeURvp: Add headers Kathappan Esakkithevar
2020-02-12  1:29   ` Chiu, Chasel
2020-02-12  7:20   ` Nate DeSimone
2020-02-12 10:06   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 3/7] CometlakeOpenBoardPkg: Add library instances Kathappan Esakkithevar
2020-02-12  1:30   ` Chiu, Chasel [this message]
2020-02-12  7:20   ` Nate DeSimone
2020-02-12 10:16   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 4/7] CometlakeOpenBoardPkg/CometlakeURvp: " Kathappan Esakkithevar
2020-02-12  1:30   ` Chiu, Chasel
2020-02-12  7:20   ` Nate DeSimone
2020-02-12 10:19   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 5/7] CometlakeOpenBoardPkg: Add modules Kathappan Esakkithevar
2020-02-12  1:30   ` Chiu, Chasel
2020-02-12  7:23   ` Nate DeSimone
2020-02-12 10:22   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 6/7] CometlakeOpenBoardPkg/CometlakeURvp: Add DSC and build files Kathappan Esakkithevar
2020-02-12  1:30   ` Chiu, Chasel
2020-02-12  7:23   ` Nate DeSimone
2020-02-12 10:25   ` Chaganty, Rangasai V
2020-02-11 19:12 ` [edk2-platforms] [PATCH v2 7/7] Update Maintainers.txt for CometlakeOpenBoardPkg Kathappan Esakkithevar
2020-02-12  1:31   ` Chiu, Chasel
2020-02-12  7:23   ` Nate DeSimone
2020-02-12 10:27   ` Chaganty, Rangasai V
2020-02-12  1:31 ` [edk2-devel] [edk2-platforms] [PATCH v2 0/7] Add CometlakeOpenBoardPkg support Chiu, Chasel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3C3EFB470A303B4AB093197B6777CCEC506905ED@PGSMSX111.gar.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox