From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: chasel.chiu@intel.com) Received: from mga06.intel.com (mga06.intel.com []) by groups.io with SMTP; Fri, 16 Aug 2019 18:16:57 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Aug 2019 18:16:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,395,1559545200"; d="scan'208";a="179835091" Received: from pgsmsx114.gar.corp.intel.com ([10.108.55.203]) by orsmga003.jf.intel.com with ESMTP; 16 Aug 2019 18:16:55 -0700 Received: from pgsmsx111.gar.corp.intel.com ([169.254.2.22]) by pgsmsx114.gar.corp.intel.com ([169.254.4.237]) with mapi id 14.03.0439.000; Sat, 17 Aug 2019 09:15:19 +0800 From: "Chiu, Chasel" To: "Kubacki, Michael A" , "devel@edk2.groups.io" CC: "Chaganty, Rangasai V" , "Desimone, Nathaniel L" , "Gao, Liming" , "Kinney, Michael D" , "Sinha, Ankit" Subject: Re: [edk2-platforms][PATCH V1 15/37] CoffeelakeSiliconPkg/Cpu: Add library instances Thread-Topic: [edk2-platforms][PATCH V1 15/37] CoffeelakeSiliconPkg/Cpu: Add library instances Thread-Index: AQHVVJEd6kIxwzYopkSpoTESC0Pj7Kb+iUzg Date: Sat, 17 Aug 2019 01:15:18 +0000 Message-ID: <3C3EFB470A303B4AB093197B6777CCEC504623D4@PGSMSX111.gar.corp.intel.com> References: <20190817001603.30632-1-michael.a.kubacki@intel.com> <20190817001603.30632-16-michael.a.kubacki@intel.com> In-Reply-To: <20190817001603.30632-16-michael.a.kubacki@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYjZhNDcxNjItYjFmMy00YmIyLTljYjEtZmM0NDgyMzc4NDkxIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoicmNQVVVyZGRkN3d2QXg3b0RXN2xxT2JpSlFIYTI5cWdJZXljbExGd1A0cG41UG1LcElwMUVXREJYMkhyVWFPUyJ9 x-ctpclassification: CTP_NT x-originating-ip: [172.30.20.206] MIME-Version: 1.0 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Chasel Chiu > -----Original Message----- > From: Kubacki, Michael A > Sent: Saturday, August 17, 2019 8:16 AM > To: devel@edk2.groups.io > Cc: Chaganty, Rangasai V ; Chiu, Chasel > ; Desimone, Nathaniel L > ; Gao, Liming ; > Kinney, Michael D ; Sinha, Ankit > > Subject: [edk2-platforms][PATCH V1 15/37] CoffeelakeSiliconPkg/Cpu: Add > library instances >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2082 >=20 > Adds CPU library class instances. >=20 > * BaseCpuMailboxLibNull - Generic CPU mailbox interaction services. > * PeiCpuPolicyLib - CPU policy configuration services. > * PeiCpuPolicyLibPreMem - CPU policy pre-memory configuration services. > * PeiDxeSmmCpuPlatformLib - CPU platform services. >=20 > Cc: Sai Chaganty > Cc: Chasel Chiu > Cc: Nate DeSimone > Cc: Liming Gao > Cc: Michael D Kinney > Cc: Ankit Sinha > Signed-off-by: Michael Kubacki > --- >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Base > CpuMailboxLibNull.inf | 22 + >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPoli= cy > Lib.inf | 65 +++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPoli= cy > LibPreMem.inf | 43 ++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib/P > eiDxeSmmCpuPlatformLib.inf | 39 ++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPoli= cy > Library.h | 30 ++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib/C > puPlatformLibrary.h | 28 ++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Base > CpuMailboxLibNull.c | 90 ++++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrintPo= li > cy.c | 293 +++++++++++++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrintPo= li > cyPreMem.c | 108 +++++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPoli= cy > Lib.c | 434 ++++++++++++++++++++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPoli= cy > LibPreMem.c | 160 ++++++++ >=20 > Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib/C > puPlatformLibrary.c | 415 +++++++++++++++++++ > 12 files changed, 1727 insertions(+) >=20 > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.inf > new file mode 100644 > index 0000000000..4fcfca4670 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.inf > @@ -0,0 +1,22 @@ > +## @file > +# Component description file for Cpu Mailbox Null Lib > +# > +# Copyright (c) 2017 - 2019 Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION =3D 0x00010017 > +BASE_NAME =3D BaseCpuMailboxLibNull > +FILE_GUID =3D 74F470BC-1769-4732-B9C0-EE9AB0B12411 > +VERSION_STRING =3D 1.0 > +MODULE_TYPE =3D BASE > +LIBRARY_CLASS =3D CpuMailboxLib > + > +[Packages] > +MdePkg/MdePkg.dec > + > +[Sources] > +BaseCpuMailboxLibNull.c > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.inf > new file mode 100644 > index 0000000000..c986e35360 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.inf > @@ -0,0 +1,65 @@ > +## @file > +# Component description file for the PeiCpuPolicyLib library. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION =3D 0x00010017 > +BASE_NAME =3D PeiCpuPolicyLib > +FILE_GUID =3D 5baafc8f-25c6-4d19-b141-585757509372 > +VERSION_STRING =3D 1.0 > +MODULE_TYPE =3D PEIM > +LIBRARY_CLASS =3D CpuPolicyLib > + > + > +[LibraryClasses] > +DebugLib > +IoLib > +PeiServicesLib > +BaseMemoryLib > +MemoryAllocationLib > +CpuPlatformLib > +PciSegmentLib > +SaPlatformLib > +SiConfigBlockLib > +PostCodeLib > +PcdLib > + > +[Packages] > +MdePkg/MdePkg.dec > +UefiCpuPkg/UefiCpuPkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > +[Sources] > +PeiCpuPolicyLib.c > +PeiCpuPolicyLibrary.h > +CpuPrintPolicy.c > +PeiCpuPolicyLibPreMem.c > +CpuPrintPolicyPreMem.c > + > +[Ppis] > +gSiPolicyPpiGuid ## CONSUMES > +gSiPreMemPolicyPpiGuid ## CONSUMES > + > +[FixedPcd] > +gSiPkgTokenSpaceGuid.PcdFlashMicrocodeFvBase > +gSiPkgTokenSpaceGuid.PcdFlashMicrocodeFvSize > + > +[Pcd] > +gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## Produces > + > +[Guids] > +gCpuConfigGuid ## PRODUCES > +gCpuSgxConfigGuid ## PRODUCES > +gCpuPowerMgmtBasicConfigGuid ## PRODUCES > +gCpuPowerMgmtCustomConfigGuid ## PRODUCES > +gCpuTestConfigGuid ## PRODUCES > +gCpuPidTestConfigGuid ## PRODUCES > +gCpuPowerMgmtTestConfigGuid ## PRODUCES > +gCpuConfigLibPreMemConfigGuid ## PRODUCES > +gCpuSecurityPreMemConfigGuid ## PRODUCES > +gCpuOverclockingPreMemConfigGuid ## CONSUMES > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.inf > new file mode 100644 > index 0000000000..52dc989f74 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.inf > @@ -0,0 +1,43 @@ > +## @file > +# Component description file for the PeiCpuPolicyLibPreMem library. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION =3D 0x00010017 > +BASE_NAME =3D PeiCpuPolicyLibPreMem > +FILE_GUID =3D 5F4C2CF1-9DFE-4D99-9318-98FD31C8517D > +VERSION_STRING =3D 1.0 > +MODULE_TYPE =3D PEIM > +LIBRARY_CLASS =3D CpuPolicyLibPreMem > + > +[LibraryClasses] > +DebugLib > +IoLib > +PeiServicesLib > +BaseMemoryLib > +MemoryAllocationLib > +CpuPlatformLib > +SiConfigBlockLib > +PostCodeLib > + > +[Packages] > +MdePkg/MdePkg.dec > +UefiCpuPkg/UefiCpuPkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > +[Sources] > +PeiCpuPolicyLib.c > +PeiCpuPolicyLibrary.h > +CpuPrintPolicy.c > + > +[Ppis] > +gSiPreMemPolicyPpiGuid ## CONSUMES > + > +[Guids] > +gCpuSecurityPreMemConfigGuid ## PRODUCES > +gCpuOverclockingPreMemConfigGuid ## PRODUCES > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /PeiDxeSmmCpuPlatformLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /PeiDxeSmmCpuPlatformLib.inf > new file mode 100644 > index 0000000000..0a56e42817 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /PeiDxeSmmCpuPlatformLib.inf > @@ -0,0 +1,39 @@ > +## @file > +# Component description file for CPU Platform Lib > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION =3D 0x00010017 > +BASE_NAME =3D PeiDxeSmmCpuPlatformLib > +FILE_GUID =3D 11647130-6AA4-41A4-A3A8-5FA296ABD977 > +VERSION_STRING =3D 1.0 > +MODULE_TYPE =3D BASE > +LIBRARY_CLASS =3D CpuPlatformLib > + > +[LibraryClasses] > +BaseLib > +BaseMemoryLib > +DebugLib > +IoLib > +PcdLib > +CpuLib > +TimerLib > +SynchronizationLib > +PciSegmentLib > + > +[Packages] > +MdePkg/MdePkg.dec > +UefiCpuPkg/UefiCpuPkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > +[Pcd] > +gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress > + > +[Sources] > +CpuPlatformLibrary.h > +CpuPlatformLibrary.c > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibrary.h > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibrary.h > new file mode 100644 > index 0000000000..6e993053fc > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibrary.h > @@ -0,0 +1,30 @@ > +/** @file > + Header file for the PeiCpuPolicyLib library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef _PEI_CPU_POLICY_LIBRARY_H_ > +#define _PEI_CPU_POLICY_LIBRARY_H_ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define MAX_MICROCODE_PATCH_SIZE 0x20000 > + > +#endif // _PEI_CPU_POLICY_LIBRARY_H_ > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.h > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.h > new file mode 100644 > index 0000000000..0b780acd22 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.h > @@ -0,0 +1,28 @@ > +/** @file > + Header file for Cpu Platform Lib implementation. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef _CPU_PLATFORM_LIBRARY_IMPLEMENTATION_H_ > +#define _CPU_PLATFORM_LIBRARY_IMPLEMENTATION_H_ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > + > +#endif > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.c > new file mode 100644 > index 0000000000..2af11ce8d0 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/BaseCpuMailboxLibNull/Ba > seCpuMailboxLibNull.c > @@ -0,0 +1,90 @@ > +/** @file > + Mailbox Library. > + > + Copyright (c) 2017 - 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include > +#include > + > +/** > + Generic Mailbox function for mailbox write commands. This function wil= l > + poll the mailbox interface for control, issue the write request, poll > + for completion, and verify the write was successful. > + > + @param[in] MailboxType The type of mailbox interface to read. The > Overclocking mailbox is defined as MAILBOX_TYPE_OC =3D 2. > + @param[in] MailboxCommand Overclocking mailbox command data > + @param[in] MailboxData Overclocking mailbox interface data > + @param[out] *MailboxStatus Pointer to the mailbox status returned fro= m > pcode. Possible mailbox status values are: > + - SUCCESS (0) Command succee= ded. > + - OC_LOCKED (1) Overclocking i= s locked. > Service is read-only. > + - INVALID_DOMAIN (2) Invalid Domain= ID provided > in command data. > + - MAX_RATIO_EXCEEDED (3) Ratio exceeds = maximum > overclocking limits. > + - MAX_VOLTAGE_EXCEEDED (4) Voltage exceed= s input > VR's max voltage. > + - OC_NOT_SUPPORTED (5) Domain does no= t > support overclocking. > + > + @retval EFI_SUCCESS Command succeeded. > + @retval EFI_INVALID_PARAMETER Invalid read data detected from > pcode. > + @retval EFI_UNSUPPORTED Unsupported MailboxType parameter. > +**/ > +EFI_STATUS > +EFIAPI > +MailboxWrite ( > + IN UINT32 MailboxType, > + IN UINT32 MailboxCommand, > + IN UINT32 MailboxData, > + OUT UINT32 *MailboxStatus > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Generic Mailbox function for mailbox read commands. This function will > write > + the read request from MailboxType, and populate the read results in th= e > MailboxDataPtr. > + > + @param[in] MailboxType The type of mailbox interface to read. The > Overclocking mailbox is defined as MAILBOX_TYPE_OC =3D 2. > + @param[in] MailboxCommand Overclocking mailbox command data > + @param[out] *MailboxDataPtr Pointer to the overclocking mailbox > interface data > + @param[out] *MailboxStatus Pointer to the mailbox status returned fro= m > pcode. Possible mailbox status are > + - SUCCESS (0) Command succee= ded. > + - OC_LOCKED (1) Overclocking i= s locked. > Service is read-only. > + - INVALID_DOMAIN (2) Invalid Domain= ID provided > in command data. > + - MAX_RATIO_EXCEEDED (3) Ratio exceeds = maximum > overclocking limits. > + - MAX_VOLTAGE_EXCEEDED (4) Voltage exceed= s input > VR's max voltage. > + - OC_NOT_SUPPORTED (5) Domain does no= t > support overclocking. > + > + @retval EFI_SUCCESS Command succeeded. > + @retval EFI_INVALID_PARAMETER Invalid read data detected from pcode. > + @retval EFI_UNSUPPORTED Unsupported MailboxType parameter. > +**/ > +EFI_STATUS > +EFIAPI > +MailboxRead ( > + IN UINT32 MailboxType, > + IN UINT32 MailboxCommand, > + OUT UINT32 *MailboxDataPtr, > + OUT UINT32 *MailboxStatus > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Poll the run/busy bit of the mailbox until available or timeout expire= s. > + > + @param[in] MailboxType > + > + @retval EFI_SUCCESS Command succeeded. > + @retval EFI_TIMEOUT Command timeout. > +**/ > +EFI_STATUS > +EFIAPI > +PollMailboxReady ( > + IN UINT32 MailboxType > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicy.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicy.c > new file mode 100644 > index 0000000000..38cf383e8d > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicy.c > @@ -0,0 +1,293 @@ > +/** @file > + This file is PeiCpuPolicy library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiCpuPolicyLibrary.h" > +#include > +#include > + > +/** > + Print CPU_CONFIG and serial out. > + > + @param[in] CpuConfig Pointer to a CPU_CONFIG > +**/ > +VOID > +CpuConfigPrint ( > + IN CONST CPU_CONFIG *CpuConfig > + ) > +{ > + DEBUG ((DEBUG_INFO, "------------------ CPU Config ------------------\= n")); > + DEBUG ((DEBUG_INFO, " CPU_CONFIG : AesEnable : 0x%x\n", > CpuConfig->AesEnable)); > + DEBUG ((DEBUG_INFO, " CPU_CONFIG : MicrocodePatchAddress : 0x%x\n", > CpuConfig->MicrocodePatchAddress)); > + DEBUG ((DEBUG_INFO, " CPU_CONFIG : DebugInterfaceEnable : 0x%X\n", > CpuConfig->DebugInterfaceEnable)); > +} > + > +/** > + Print CPU_POWER_MGMT_BASIC_CONFIG and serial out. > + > + @param[in] CpuPowerMgmtBasicConfig Pointer to a > CPU_POWER_MGMT_BASIC_CONFIG > +**/ > +VOID > +CpuPowerMgmtBasicConfigPrint ( > + IN CONST CPU_POWER_MGMT_BASIC_CONFIG > *CpuPowerMgmtBasicConfig > + ) > +{ > + DEBUG ((DEBUG_INFO, "------------------ CPU Power Mgmt Basic Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG : > OneCoreRatioLimit : 0x%X , TwoCoreRatioLimit =3D 0x%X , ThreeCoreRatioLim= it =3D > 0x%X , FourCoreRatioLimit =3D 0x%X, FiveCoreRatioLimit =3D 0x%X, > SixCoreRatioLimit =3D 0x%X, SevenCoreRatioLimit =3D 0x%X, EightCoreRatioL= imit =3D > 0x%X \n", CpuPowerMgmtBasicConfig->OneCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->TwoCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->ThreeCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->FourCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->FiveCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->SixCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->SevenCoreRatioLimit, \ > + CpuPowerMgmtBasicConfig->EightCoreRatioLimit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: Hwp : > 0x%x\n", CpuPowerMgmtBasicConfig->Hwp)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > SkipSetBootPState : 0x%x\n", > CpuPowerMgmtBasicConfig->SkipSetBootPState)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: HdcControl : > 0x%X\n", CpuPowerMgmtBasicConfig->HdcControl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: (Intel Turbo > Boost Max Technology 3.0)EnableItbm : 0x%X\n", > CpuPowerMgmtBasicConfig->EnableItbm)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > EnableItbmDriver : 0x%X\n", > CpuPowerMgmtBasicConfig->EnableItbmDriver)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit2 : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit2)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > TurboPowerLimitLock : 0x%x\n", > CpuPowerMgmtBasicConfig->TurboPowerLimitLock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit3DutyCycle : 0x%x\n", > CpuPowerMgmtBasicConfig->PowerLimit3DutyCycle)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit3Lock : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit3Lock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit4Lock : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit4Lock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > TccOffsetClamp : 0x%X\n", CpuPowerMgmtBasicConfig->TccOffsetClamp)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > TccOffsetLock : 0x%X\n", CpuPowerMgmtBasicConfig->TccOffsetLock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: TurboMode : > 0x%x\n", CpuPowerMgmtBasicConfig->TurboMode)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > TccActivationOffset : 0x%X\n", > CpuPowerMgmtBasicConfig->TccActivationOffset)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit1 : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit1)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit2Power : 0x%x\n", > CpuPowerMgmtBasicConfig->PowerLimit2Power)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit3 : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit3)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit4 : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit4)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit1Time : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit1Time)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > PowerLimit3Time : 0x%x\n", CpuPowerMgmtBasicConfig->PowerLimit3Time)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > TccOffsetTimeWindowForRatl : 0x%X\n", > CpuPowerMgmtBasicConfig->TccOffsetTimeWindowForRatl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > HwpInterruptControl : 0x%x\n", > CpuPowerMgmtBasicConfig->HwpInterruptControl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > MinRingRatioLimit : 0x%x\n", > CpuPowerMgmtBasicConfig->MinRingRatioLimit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_BASIC_CONFIG: > MaxRingRatioLimit : 0x%x\n", > CpuPowerMgmtBasicConfig->MaxRingRatioLimit)); > +} > + > +/** > + Print CPU_POWER_MGMT_CUSTOM_CONFIG and serial out. > + > + @param[in] CpuPowerMgmtCustomConfig Pointer to a > CPU_POWER_MGMT_CUSTOM_CONFIG > +**/ > +VOID > +CpuPowerMgmtCustomConfigPrint ( > + IN CONST CPU_POWER_MGMT_CUSTOM_CONFIG > *CpuPowerMgmtCustomConfig > + ) > +{ > + UINT32 Index =3D 0; > + DEBUG ((DEBUG_INFO, "------------------ CPU Power Mgmt Custom Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, "\n CustomRatioTable... \n")); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > VidNumber : 0x%x\n", > CpuPowerMgmtCustomConfig->CustomRatioTable.NumberOfEntries)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: VidCpuid : > 0x%x\n", CpuPowerMgmtCustomConfig->CustomRatioTable.Cpuid)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > VidMaxRatio : 0x%x\n", > CpuPowerMgmtCustomConfig->CustomRatioTable.MaxRatio)); > + for (Index =3D 0; Index < MAX_CUSTOM_RATIO_TABLE_ENTRIES; Index++) { > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > StateRatio[%d] : 0x%x\n", Index, > CpuPowerMgmtCustomConfig->CustomRatioTable.StateRatio[Index])); > + } > + for (Index =3D 0; Index < MAX_16_CUSTOM_RATIO_TABLE_ENTRIES; Index++) = { > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > StateRatioMax16[%d] : 0x%x\n", Index, > CpuPowerMgmtCustomConfig->CustomRatioTable.StateRatioMax16[Index])) > ; > + } > + for (Index =3D 0; Index < MAX_CUSTOM_CTDP_ENTRIES; Index++) { > + DEBUG ( > + (DEBUG_INFO, > + " CPU_POWER_MGMT_CUSTOM_CONFIG: > CustomConfigTdpTable[%d] CustomPowerLimit1 : 0x%x\n", > + > Index,CpuPowerMgmtCustomConfig->CustomConfigTdpTable[Index].Custom > PowerLimit1) > + ); > + DEBUG ( > + (DEBUG_INFO, > + " CPU_POWER_MGMT_CUSTOM_CONFIG: > CustomConfigTdpTable[%d] CustomPowerLimit2 : 0x%x\n", > + > Index,CpuPowerMgmtCustomConfig->CustomConfigTdpTable[Index].Custom > PowerLimit2) > + ); > + DEBUG ( > + (DEBUG_INFO, > + " CPU_POWER_MGMT_CUSTOM_CONFIG: > CustomConfigTdpTable[%d] CustomPowerLimit1Time : 0x%x\n", > + > Index,CpuPowerMgmtCustomConfig->CustomConfigTdpTable[Index].Custom > PowerLimit1Time) > + ); > + DEBUG ( > + (DEBUG_INFO, > + " CPU_POWER_MGMT_CUSTOM_CONFIG: > CustomConfigTdpTable[%d] CustomTurboActivationRatio : 0x%x\n", > + > Index,CpuPowerMgmtCustomConfig->CustomConfigTdpTable[Index].Custom > TurboActivationRatio) > + ); > + } > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > ConfigTdpLock : 0x%x\n", CpuPowerMgmtCustomConfig->ConfigTdpLock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_CUSTOM_CONFIG: > ConfigTdpBios : 0x%x\n", CpuPowerMgmtCustomConfig->ConfigTdpBios)); > +} > + > +/** > + Print CPU_TEST_CONFIG and serial out. > + > + @param[in] CpuTestConfig Pointer to a CPU_TEST_CONFIG > +**/ > +VOID > +CpuTestConfigPrint ( > + IN CONST CPU_TEST_CONFIG *CpuTestConfig > + ) > +{ > + UINT8 PcdCpuApLoopMode; > + > + PcdCpuApLoopMode =3D PcdGet8 (PcdCpuApLoopMode); > + > + DEBUG ((DEBUG_INFO, "------------------ CPU Test Config --------------= ----\n")); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: MlcStreamerPrefetcher : > 0x%X\n", CpuTestConfig->MlcStreamerPrefetcher)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: MlcSpatialPrefetcher : > 0x%X\n", CpuTestConfig->MlcSpatialPrefetcher)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: MonitorMwaitEnable : > 0x%X\n", CpuTestConfig->MonitorMwaitEnable)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: MachineCheckEnable : > 0x%X\n", CpuTestConfig->MachineCheckEnable)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: DebugInterfaceLockEnable : > 0x%X\n", CpuTestConfig->DebugInterfaceLockEnable)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: ProcessorTraceOutputScheme : > 0x%X\n", CpuTestConfig->ProcessorTraceOutputScheme)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: ProcessorTraceEnable : > 0x%X\n", CpuTestConfig->ProcessorTraceEnable)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: ProcessorTraceMemBase : > 0x%llX\n", CpuTestConfig->ProcessorTraceMemBase)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: ProcessorTraceMemLength : > 0x%X\n", CpuTestConfig->ProcessorTraceMemLength)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: ThreeStrikeCounterDisable : > 0x%X\n", CpuTestConfig->ThreeStrikeCounterDisable)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: VoltageOptimization : 0x%X\n", > CpuTestConfig->VoltageOptimization)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: CpuWakeUpTimer : 0x%X\n", > CpuTestConfig->CpuWakeUpTimer)); > + DEBUG ((DEBUG_INFO, " CPU_TEST_CONFIG: PcdCpuApLoopMode: > 0x%X\n", PcdCpuApLoopMode)); > +} > + > +/** > + Print CPU_PID_TEST_CONFIG and serial out. > + > + @param[in] CpuPidTestConfig Pointer to a CPU_PID_TEST_CONFIG > +**/ > +VOID > +CpuPidTestConfigPrint ( > + IN CONST CPU_PID_TEST_CONFIG *CpuPidTestConfig > + ) > +{ > + UINT32 Index =3D 0; > + DEBUG ((DEBUG_INFO, "------------------ CPU PID Test Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : PidTuning : 0x%X\n", > Index, CpuPidTestConfig->PidTuning)); > + if ( CpuPidTestConfig->PidTuning =3D=3D 1) { > + for (Index =3D PID_DOMAIN_KP; Index <=3D PID_DOMAIN_KD; Index++) { > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : Ratl[%X] : 0x%X\n", > Index, CpuPidTestConfig->Ratl[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : VrTdcVr0[%X] : > 0x%X\n", Index, CpuPidTestConfig->VrTdcVr0[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : VrTdcVr1[%X] : > 0x%X\n", Index, CpuPidTestConfig->VrTdcVr1[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : VrTdcVr2[%X] : > 0x%X\n", Index, CpuPidTestConfig->VrTdcVr2[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : VrTdcVr3[%X] : > 0x%X\n", Index, CpuPidTestConfig->VrTdcVr3[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : PbmPsysPl1Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->PbmPsysPl1Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : > PbmPsysPl1MmioPcs[%X] : 0x%X\n", Index, > CpuPidTestConfig->PbmPsysPl1MmioPcs[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : PbmPsysPl2Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->PbmPsysPl2Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : > PbmPsysPl2MmioPcs[%X] : 0x%X\n", Index, > CpuPidTestConfig->PbmPsysPl2MmioPcs[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : PbmPkgPl1Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->PbmPkgPl1Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : > PbmPkgPl1MmioPcs[%X] : 0x%X\n", Index, > CpuPidTestConfig->PbmPkgPl1MmioPcs[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : PbmPkgPl2Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->PbmPkgPl2Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : > PbmPkgPl2MmioPcs[%X] : 0x%X\n", Index, > CpuPidTestConfig->PbmPkgPl2MmioPcs[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : DdrPl1Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->DdrPl1Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : DdrPl1MmioPcs[%X] : > 0x%X\n", Index, CpuPidTestConfig->DdrPl1MmioPcs[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : DdrPl2Msr[%X] : > 0x%X\n", Index, CpuPidTestConfig->DdrPl2Msr[Index])); > + DEBUG ((DEBUG_INFO, " CPU_PID_TEST_CONFIG : DdrPl2MmioPcs[%X] : > 0x%X\n", Index, CpuPidTestConfig->DdrPl2MmioPcs[Index])); > + } > + } > +} > + > +/** > + Print CPU_POWER_MGMT_TEST_CONFIG and serial out. > + > + @param[in] CpuPowerMgmtTestConfig Pointer to a > CPU_POWER_MGMT_TEST_CONFIG > +**/ > +VOID > +CpuPowerMgmtTestConfigPrint ( > + IN CONST CPU_POWER_MGMT_TEST_CONFIG > *CpuPowerMgmtTestConfig > + ) > +{ > + CPU_GENERATION CpuGeneration; > + CpuGeneration =3D GetCpuGeneration(); > + DEBUG ((DEBUG_INFO, "------------------ CPU Power Mgmt Test Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: Eist : 0x%x\n", > CpuPowerMgmtTestConfig->Eist)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > EnergyEfficientPState : 0x%x\n", > CpuPowerMgmtTestConfig->EnergyEfficientPState)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > EnergyEfficientTurbo : 0x%x\n", > CpuPowerMgmtTestConfig->EnergyEfficientTurbo)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: TStates : > 0x%x\n", CpuPowerMgmtTestConfig->TStates)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: BiProcHot : > 0x%x\n", CpuPowerMgmtTestConfig->BiProcHot)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > DisableProcHotOut : 0x%x\n", > CpuPowerMgmtTestConfig->DisableProcHotOut)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > ProcHotResponse : 0x%x\n", CpuPowerMgmtTestConfig->ProcHotResponse)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > DisableVrThermalAlert : 0x%x\n", > CpuPowerMgmtTestConfig->DisableVrThermalAlert)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > AutoThermalReporting : 0x%x\n", > CpuPowerMgmtTestConfig->AutoThermalReporting)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > ThermalMonitor : 0x%x\n", CpuPowerMgmtTestConfig->ThermalMonitor)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: Cx : 0x%x\n", > CpuPowerMgmtTestConfig->Cx)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > PmgCstCfgCtrlLock : 0x%x\n", > CpuPowerMgmtTestConfig->PmgCstCfgCtrlLock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: C1e : 0x%x\n", > CpuPowerMgmtTestConfig->C1e)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > C1Autodemotion : 0x%x\n", CpuPowerMgmtTestConfig->C1AutoDemotion)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > C1Undemotion : 0x%x\n", CpuPowerMgmtTestConfig->C1UnDemotion)); > + if(CpuGeneration =3D=3D EnumCflCpu){ > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > C3AutoDemotion : 0x%x\n", CpuPowerMgmtTestConfig->C3AutoDemotion)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > C3UnDemotion : 0x%x\n", CpuPowerMgmtTestConfig->C3UnDemotion)); > + } > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: PkgCState > Demotion : 0x%x\n", CpuPowerMgmtTestConfig->PkgCStateDemotion)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > PkgCstateUndemotion : 0x%x\n", > CpuPowerMgmtTestConfig->PkgCStateUnDemotion)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CStatePreWake : 0x%x\n", CpuPowerMgmtTestConfig->CStatePreWake)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: TimedMwait : > 0x%x\n", CpuPowerMgmtTestConfig->TimedMwait)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstCfgCtrIoMwaitRedirection : 0x%x\n", > CpuPowerMgmtTestConfig->CstCfgCtrIoMwaitRedirection)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: ProcHotLock : > 0x%x\n", CpuPowerMgmtTestConfig->ProcHotLock)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > ConfigTdpLevel : 0x%x\n", CpuPowerMgmtTestConfig->ConfigTdpLevel)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: RaceToHalt : > 0x%x\n", CpuPowerMgmtTestConfig->RaceToHalt)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl0Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl0Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl0TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl0TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl1Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl1Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl2Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl2Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl3Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl3Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl4Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl4Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl5Irtl : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl5Irtl)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > PkgCStateLimit : 0x%x\n", CpuPowerMgmtTestConfig->PkgCStateLimit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl1TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl1TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl2TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl2TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl3TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl3TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl4TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl4TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CstateLatencyControl5TimeUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CstateLatencyControl5TimeUnit)); > + DEBUG ((DEBUG_INFO, " CPU_POWER_MGMT_TEST_CONFIG: > CustomPowerUnit : 0x%x\n", > CpuPowerMgmtTestConfig->CustomPowerUnit)); > + DEBUG ((DEBUG_INFO, " PpmIrmSetting : 0x%x\n", > CpuPowerMgmtTestConfig->PpmIrmSetting)); > +} > +/** > + Print whole CPU config blocks of SI_POLICY_PPI and serial out in PostM= em. > + > + @param[in] SiPolicyPpi The SI Policy PPI instance > +**/ > +VOID > +CpuPrintPolicy ( > + IN SI_POLICY_PPI *SiPolicyPpi > + ) > +{ > +DEBUG_CODE_BEGIN(); > + EFI_STATUS Status; > + CPU_CONFIG *CpuConfig; > + CPU_POWER_MGMT_BASIC_CONFIG *CpuPowerMgmtBasicConfig; > + CPU_POWER_MGMT_CUSTOM_CONFIG > *CpuPowerMgmtCustomConfig; > + CPU_TEST_CONFIG *CpuTestConfig; > + CPU_PID_TEST_CONFIG *CpuPidTestConfig; > + CPU_POWER_MGMT_TEST_CONFIG *CpuPowerMgmtTestConfig; > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuConfigGuid, (VOI= D *) > &CpuConfig); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, > &gCpuPowerMgmtBasicConfigGuid, (VOID *) &CpuPowerMgmtBasicConfig); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, > &gCpuPowerMgmtCustomConfigGuid, (VOID *) > &CpuPowerMgmtCustomConfig); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuTestConfigGuid, = (VOID > *) &CpuTestConfig); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, &gCpuPidTestConfigGui= d, > (VOID *) &CpuPidTestConfig); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D GetConfigBlock ((VOID *) SiPolicyPpi, > &gCpuPowerMgmtTestConfigGuid, (VOID *) &CpuPowerMgmtTestConfig); > + ASSERT_EFI_ERROR (Status); > + > + DEBUG ((DEBUG_INFO, "\n ------------------------ SiCpuPolicy Print Beg= in in > PostMem----------------- \n")); > + DEBUG ((DEBUG_INFO, " Revision=3D %x\n", > SiPolicyPpi->TableHeader.Header.Revision)); > + > + CpuConfigPrint(CpuConfig); > + CpuPowerMgmtBasicConfigPrint(CpuPowerMgmtBasicConfig); > + CpuPowerMgmtCustomConfigPrint(CpuPowerMgmtCustomConfig); > + CpuTestConfigPrint(CpuTestConfig); > + CpuPidTestConfigPrint(CpuPidTestConfig); > + CpuPowerMgmtTestConfigPrint(CpuPowerMgmtTestConfig); > + DEBUG ((DEBUG_INFO, "\n ------------------------ SiCpuPolicy Print End= in > PostMem ----------------- \n\n")); > +DEBUG_CODE_END(); > +} > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicyPreMem.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicyPreMem.c > new file mode 100644 > index 0000000000..0bcb34c99c > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/CpuPrint= P > olicyPreMem.c > @@ -0,0 +1,108 @@ > +/** @file > + This file is PeiCpuPolicy library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiCpuPolicyLibrary.h" > +#include > + > +/** > + Print CPU_CONFIG_LIB_PREMEM_CONFIG and serial out. > + > + @param[in] CpuConfigLibPreMemConfig Pointer to a > CPU_CONFIG_LIB_PREMEM_CONFIG > + > +**/ > +VOID > +CpuConfigLibPreMemConfigPrint ( > + IN CONST CPU_CONFIG_LIB_PREMEM_CONFIG > *CpuConfigLibPreMemConfig > + ) > +{ > + CPU_GENERATION CpuGeneration; > + CpuGeneration =3D GetCpuGeneration(); > + DEBUG ((DEBUG_INFO, "------------------ CPU Config Lib PreMem Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > HyperThreading =3D 0x%x\n", CpuConfigLibPreMemConfig->HyperThreading)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > BootFrequency =3D 0x%x\n", CpuConfigLibPreMemConfig->BootFrequency)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > ActiveCoreCount =3D 0x%x\n", CpuConfigLibPreMemConfig->ActiveCoreCount)); > + if(CpuGeneration =3D=3D EnumCflCpu){ > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > FClkFrequency =3D 0x%x\n", CpuConfigLibPreMemConfig->FClkFrequency)); > + } > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > JtagC10PowerGateDisable =3D 0x%x\n", > CpuConfigLibPreMemConfig->JtagC10PowerGateDisable)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : BistOnReset > =3D 0x%x\n", CpuConfigLibPreMemConfig->BistOnReset)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : VmxEnable =3D > 0x%x\n", CpuConfigLibPreMemConfig->VmxEnable)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : CpuRatio =3D > 0x%x\n", CpuConfigLibPreMemConfig->CpuRatio)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : PeciSxReset > =3D 0x%x\n", CpuConfigLibPreMemConfig->PeciSxReset)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > PeciC10Reset =3D 0x%x\n", CpuConfigLibPreMemConfig->PeciC10Reset)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : SkipMpInit =3D > 0x%x\n", CpuConfigLibPreMemConfig->SkipMpInit)); > + DEBUG ((DEBUG_INFO, "CPU_CONFIG_LIB_PREMEM_CONFIG : > DpSscMarginEnable =3D 0x%x\n", > CpuConfigLibPreMemConfig->DpSscMarginEnable)); > +} > + > +/** > + Print CPU_OVERCLOCKING_PREMEM_CONFIG and serial out. > + > + @param[in] CpuOverClockingConfig Pointer to a > CPU_OVERCLOCKING_CONFIG > +**/ > +VOID > +CpuOverClockingPreMemConfigPrint ( > + IN CONST CPU_OVERCLOCKING_PREMEM_CONFIG > *CpuOverClockingPreMemConfig > + ) > +{ > + DEBUG ((DEBUG_INFO, "------------------ CPU OverClocking Config > ------------------\n")); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > OcSupport : 0x%X\n", CpuOverClockingPreMemConfig->OcSupport)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: OcLock : > 0x%X\n", CpuOverClockingPreMemConfig->OcLock)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CoreVoltageMode : 0x%X\n", > CpuOverClockingPreMemConfig->CoreVoltageMode)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CoreMaxOcRatio : 0x%X\n", > CpuOverClockingPreMemConfig->CoreMaxOcRatio)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CoreVoltageOverride : 0x%X\n", > CpuOverClockingPreMemConfig->CoreVoltageOverride)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CoreVoltageAdaptive : 0x%X\n", > CpuOverClockingPreMemConfig->CoreVoltageAdaptive)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CoreVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->CoreVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingVoltageMode : 0x%X\n", > CpuOverClockingPreMemConfig->RingVoltageMode)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingVoltageOverride : 0x%X\n", > CpuOverClockingPreMemConfig->RingVoltageOverride)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingVoltageAdaptive : 0x%X\n", > CpuOverClockingPreMemConfig->RingVoltageAdaptive)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->RingVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingMaxOcRatio : 0x%X\n", > CpuOverClockingPreMemConfig->RingMaxOcRatio)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingDownBin : 0x%X\n", CpuOverClockingPreMemConfig->RingDownBin)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > Avx2RatioOffset : 0x%X\n", > CpuOverClockingPreMemConfig->Avx2RatioOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > Avx3RatioOffset : 0x%X\n", > CpuOverClockingPreMemConfig->Avx3RatioOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > BclkAdaptiveVoltage : 0x%X\n", > CpuOverClockingPreMemConfig->BclkAdaptiveVoltage)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > CorePllVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->CorePllVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > GtPllVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->GtPllVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > RingPllVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->RingPllVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > SaPllVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->SaPllVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > McPllVoltageOffset : 0x%X\n", > CpuOverClockingPreMemConfig->McPllVoltageOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > TjMaxOffset : 0x%X\n", > CpuOverClockingPreMemConfig->TjMaxOffset)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > TvbRatioClipping : 0x%X\n", > CpuOverClockingPreMemConfig->TvbRatioClipping)); > + DEBUG ((DEBUG_INFO, " CPU_OVERCLOCKING_PREMEM_CONFIG:: > TvbVoltageOptimization : 0x%X\n", > CpuOverClockingPreMemConfig->TvbVoltageOptimization)); > +} > + > + > +/** > + Print whole CPU Config blocks of SI_PREMEM_POLICY_PPI and serial out i= n > PreMem. > + > + @param[in] SiPreMemPolicyPpi The SI Pre-Mem Policy PPI instance > +**/ > +VOID > +CpuPreMemPrintPolicy ( > + IN SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi > + ) > +{ > +DEBUG_CODE_BEGIN(); > + EFI_STATUS Status; > + CPU_CONFIG_LIB_PREMEM_CONFIG *CpuConfigLibPreMemConfig; > + CPU_OVERCLOCKING_PREMEM_CONFIG > *CpuOverclockingPreMemConfig; > + > + DEBUG ((DEBUG_INFO, "\n------------------------ CPU - SiPreMemPolicyPp= i Print > Begin in PreMem -----------------\n")); > + > + DEBUG ((DEBUG_INFO, " Revision=3D %x\n", > SiPreMemPolicyPpi->TableHeader.Header.Revision)); > + > + Status =3D GetConfigBlock ((VOID *) SiPreMemPolicyPpi, > &gCpuConfigLibPreMemConfigGuid, (VOID *) &CpuConfigLibPreMemConfig); > + ASSERT_EFI_ERROR (Status); > + Status =3D GetConfigBlock ((VOID *) SiPreMemPolicyPpi, > &gCpuOverclockingPreMemConfigGuid, (VOID *) > &CpuOverclockingPreMemConfig); > + ASSERT_EFI_ERROR (Status); > + CpuConfigLibPreMemConfigPrint(CpuConfigLibPreMemConfig); > + CpuOverClockingPreMemConfigPrint(CpuOverclockingPreMemConfig); > + > + DEBUG ((DEBUG_INFO, "\n------------------------ CPU - SiPreMemPolicyPp= i Print > End -----------------\n\n")); > +DEBUG_CODE_END(); > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.c > new file mode 100644 > index 0000000000..181b72fec5 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLib.c > @@ -0,0 +1,434 @@ > +/** @file > + This file is PeiCpuPolicy library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiCpuPolicyLibrary.h" > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#ifndef FSP_FLAG > +/** > + Get the next microcode patch pointer. > + > + @param[in, out] MicrocodeData - Input is a pointer to the last microco= de > patch address found, > + and output points to the next patch ad= dress found. > + > + @retval EFI_SUCCESS - Patch found. > + @retval EFI_NOT_FOUND - Patch not found. > +**/ > +EFI_STATUS > +EFIAPI > +RetrieveMicrocode ( > + IN OUT CPU_MICROCODE_HEADER **MicrocodeData > + ) > +{ > + UINTN MicrocodeStart; > + UINTN MicrocodeEnd; > + UINTN TotalSize; > + > + if ((FixedPcdGet32 (PcdFlashMicrocodeFvBase) =3D=3D 0) || (FixedPcdGet= 32 > (PcdFlashMicrocodeFvSize) =3D=3D 0)) { > + return EFI_NOT_FOUND; > + } > + > + /// > + /// Microcode binary in SEC > + /// > + MicrocodeStart =3D (UINTN) FixedPcdGet32 (PcdFlashMicrocodeFvBase) + > + ((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FixedPcdGet32 > (PcdFlashMicrocodeFvBase))->HeaderLength + > + sizeof (EFI_FFS_FILE_HEADER); > + > + MicrocodeEnd =3D (UINTN) FixedPcdGet32 (PcdFlashMicrocodeFvBase) + > (UINTN) FixedPcdGet32 (PcdFlashMicrocodeFvSize); > + > + if (*MicrocodeData =3D=3D NULL) { > + *MicrocodeData =3D (CPU_MICROCODE_HEADER *) (UINTN) > MicrocodeStart; > + } else { > + if (*MicrocodeData < (CPU_MICROCODE_HEADER *) (UINTN) > MicrocodeStart) { > + DEBUG ((DEBUG_INFO, "[CpuPolicy]*MicrocodeData < MicrocodeStart > \n")); > + return EFI_NOT_FOUND; > + } > + > + TotalSize =3D (UINTN) ((*MicrocodeData)->TotalSize); > + if (TotalSize =3D=3D 0) { > + TotalSize =3D 2048; > + } > + > + *MicrocodeData =3D (CPU_MICROCODE_HEADER *) > ((UINTN)*MicrocodeData + TotalSize); > + if (*MicrocodeData >=3D (CPU_MICROCODE_HEADER *) (UINTN) > (MicrocodeEnd) || (*MicrocodeData)->TotalSize =3D=3D (UINT32) -1) { > + DEBUG ((DEBUG_INFO, "[CpuPolicy]*MicrocodeData >=3D MicrocodeEnd > \n")); > + return EFI_NOT_FOUND; > + } > + } > + return EFI_SUCCESS; > +} > + > +/** > + Get the microcode patch pointer. > + > + @retval EFI_PHYSICAL_ADDRESS - Address of the microcode patch, or NULL > if not found. > +**/ > +EFI_PHYSICAL_ADDRESS > +PlatformCpuLocateMicrocodePatch ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + CPU_MICROCODE_HEADER *MicrocodeData; > + EFI_CPUID_REGISTER Cpuid; > + UINT32 UcodeRevision; > + UINTN MicrocodeBufferSize; > + VOID *MicrocodeBuffer =3D NULL; > + > + AsmCpuid ( > + CPUID_VERSION_INFO, > + &Cpuid.RegEax, > + &Cpuid.RegEbx, > + &Cpuid.RegEcx, > + &Cpuid.RegEdx > + ); > + > + UcodeRevision =3D GetCpuUcodeRevision (); > + MicrocodeData =3D NULL; > + while (TRUE) { > + /// > + /// Find the next patch address > + /// > + Status =3D RetrieveMicrocode (&MicrocodeData); > + DEBUG ((DEBUG_INFO, "MicrocodeData =3D %x\n", MicrocodeData)); > + > + if (Status !=3D EFI_SUCCESS) { > + break; > + } else if (CheckMicrocode (Cpuid.RegEax, MicrocodeData, > &UcodeRevision)) { > + break; > + } > + } > + > + if (EFI_ERROR (Status)) { > + return (EFI_PHYSICAL_ADDRESS) (UINTN) NULL; > + } > + > + /// > + /// Check that microcode patch size is <=3D 128K max size, > + /// then copy the patch from FV to temp buffer for faster access. > + /// > + MicrocodeBufferSize =3D (UINTN) MicrocodeData->TotalSize; > + > + if (MicrocodeBufferSize <=3D MAX_MICROCODE_PATCH_SIZE) { > + MicrocodeBuffer =3D AllocatePages (EFI_SIZE_TO_PAGES > (MicrocodeBufferSize)); > + if (MicrocodeBuffer !=3D NULL) { > + DEBUG(( DEBUG_INFO, "Copying Microcode to temp buffer.\n")); > + CopyMem (MicrocodeBuffer, MicrocodeData, MicrocodeBufferSize); > + > + return (EFI_PHYSICAL_ADDRESS) (UINTN) MicrocodeBuffer; > + } else { > + DEBUG(( DEBUG_ERROR, "Failed to allocate enough memory for > Microcode Patch.\n")); > + } > + } else { > + DEBUG(( DEBUG_ERROR, "Microcode patch size is greater than max > allowed size of 128K.\n")); > + } > + return (EFI_PHYSICAL_ADDRESS) (UINTN) NULL; > +} > +#endif > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_CONFIG *CpuConfig; > + CpuConfig =3D ConfigBlockPointer; > + > + DEBUG ((DEBUG_INFO, "CpuConfig->Header.GuidHob.Name =3D %g\n", > &CpuConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, "CpuConfig->Header.GuidHob.Header.HobLength =3D > 0x%x\n", CpuConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU configuration > + ********************************/ > + CpuConfig->AesEnable =3D CPU_FEATURE_ENABLE; > +#ifndef FSP_FLAG > + CpuConfig->MicrocodePatchAddress =3D PlatformCpuLocateMicrocodePatch > (); > +#endif //FSP_FLAG > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuSgxConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + > + /******************************** > + CPU SGX configuration > + ********************************/ > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuPowerMgmtBasicConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_POWER_MGMT_BASIC_CONFIG *CpuPowerMgmtBasicConfig; > + CPU_SKU CpuSku; > + MSR_REGISTER TempMsr; > + > + CpuPowerMgmtBasicConfig =3D ConfigBlockPointer; > + CpuSku =3D GetCpuSku(); > + > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtBasicConfig->Header.GuidHob.Name =3D %g\n", > &CpuPowerMgmtBasicConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtBasicConfig->Header.GuidHob.Header.HobLength =3D 0x%x\n", > CpuPowerMgmtBasicConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU Power Management Basic configuration > + ********************************/ > + CpuPowerMgmtBasicConfig->Hwp =3D TRUE; > + CpuPowerMgmtBasicConfig->HdcControl =3D TRUE; > + CpuPowerMgmtBasicConfig->PowerLimit2 =3D TRUE; > + CpuPowerMgmtBasicConfig->PowerLimit3Lock =3D TRUE; > + CpuPowerMgmtBasicConfig->TccOffsetLock =3D FALSE; > + CpuPowerMgmtBasicConfig->EnableItbm =3D TRUE; > + CpuPowerMgmtBasicConfig->EnableItbmDriver =3D FALSE; > + > + /// > + /// Initialize RATL (Runtime Average Temperature Limit) Config for ULX= . > + /// > + if (CpuSku =3D=3D EnumCpuUlx) { > + CpuPowerMgmtBasicConfig->TccActivationOffset =3D 15; > + CpuPowerMgmtBasicConfig->TccOffsetTimeWindowForRatl =3D 5000; // 5 > sec > + CpuPowerMgmtBasicConfig->TccOffsetClamp =3D > CPU_FEATURE_ENABLE; > + } > + CpuPowerMgmtBasicConfig->TurboMode =3D TRUE; > + > + TempMsr.Qword =3D AsmReadMsr64 (MSR_TURBO_RATIO_LIMIT); > + CpuPowerMgmtBasicConfig->OneCoreRatioLimit =3D > TempMsr.Bytes.FirstByte; > + CpuPowerMgmtBasicConfig->TwoCoreRatioLimit =3D > TempMsr.Bytes.SecondByte; > + CpuPowerMgmtBasicConfig->ThreeCoreRatioLimit =3D > TempMsr.Bytes.ThirdByte; > + CpuPowerMgmtBasicConfig->FourCoreRatioLimit =3D > TempMsr.Bytes.FouthByte; > + CpuPowerMgmtBasicConfig->FiveCoreRatioLimit =3D > TempMsr.Bytes.FifthByte; > + CpuPowerMgmtBasicConfig->SixCoreRatioLimit =3D > TempMsr.Bytes.SixthByte; > + CpuPowerMgmtBasicConfig->SevenCoreRatioLimit =3D > TempMsr.Bytes.SeventhByte; > + CpuPowerMgmtBasicConfig->EightCoreRatioLimit =3D > TempMsr.Bytes.EighthByte; > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuPowerMgmtCustomConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_POWER_MGMT_CUSTOM_CONFIG *CpuPowerMgmtCustomConfig; > + CpuPowerMgmtCustomConfig =3D ConfigBlockPointer; > + > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtCustomConfig->Header.GuidHob.Name =3D %g\n", > &CpuPowerMgmtCustomConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtCustomConfig->Header.GuidHob.Header.HobLength =3D > 0x%x\n", > CpuPowerMgmtCustomConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU Power Management Custom configuration > + ********************************/ > + CpuPowerMgmtCustomConfig->CustomRatioTable.Cpuid =3D (UINT16) > ((GetCpuFamily() | GetCpuStepping()) & (0x0FFF)); > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuTestConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_TEST_CONFIG *CpuTestConfig; > + CPU_SKU CpuSku; > + CpuTestConfig =3D ConfigBlockPointer; > + > + DEBUG ((DEBUG_INFO, "CpuTestConfig->Header.GuidHob.Name =3D %g\n", > &CpuTestConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuTestConfig->Header.GuidHob.Header.HobLength =3D 0x%x\n", > CpuTestConfig->Header.GuidHob.Header.HobLength)); > + > + CpuSku =3D GetCpuSku(); > + /******************************** > + CPU Test configuration > + ********************************/ > + > + CpuTestConfig->MlcStreamerPrefetcher =3D CPU_FEATURE_ENABLE; > + CpuTestConfig->MlcSpatialPrefetcher =3D CPU_FEATURE_ENABLE; > + CpuTestConfig->MonitorMwaitEnable =3D CPU_FEATURE_ENABLE; > + CpuTestConfig->MachineCheckEnable =3D CPU_FEATURE_ENABLE; > + CpuTestConfig->DebugInterfaceLockEnable =3D CPU_FEATURE_ENABLE; > + > + if ((CpuSku =3D=3D EnumCpuUlx) || (CpuSku =3D=3D EnumCpuUlt)){ > + /** > + This policy should be used to enable or disable Voltage Optimization > feature. Recommended defaults: > + Enable - For Mobile SKUs(U/Y) > + Disable - Rest of all SKUs other than Mobile. > + **/ > + CpuTestConfig->VoltageOptimization =3D CPU_FEATURE_ENABLE; > + } > + else { > + CpuTestConfig->VoltageOptimization =3D CPU_FEATURE_DISABLE; > + } > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuPidTestConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_PID_TEST_CONFIG *CpuPidTestConfig; > + CpuPidTestConfig =3D ConfigBlockPointer; > + > + DEBUG ((DEBUG_INFO, "CpuPidTestConfig->Header.GuidHob.Name =3D %g\n", > &CpuPidTestConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuPidTestConfig->Header.GuidHob.Header.HobLength =3D 0x%x\n", > CpuPidTestConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU PID Test configuration > + ********************************/ > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuPowerMgmtTestConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_POWER_MGMT_TEST_CONFIG *CpuPowerMgmtTestConfig; > + CPU_GENERATION CpuGeneration; > + UINT16 CpuDid; > + > + CpuPowerMgmtTestConfig =3D ConfigBlockPointer; > + CpuDid =3D PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS > (SA_SEG_NUM, SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, > R_SA_MC_DEVICE_ID)); > + > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtTestConfig->Header.GuidHob.Name =3D %g\n", > &CpuPowerMgmtTestConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuPowerMgmtTestConfig->Header.GuidHob.Header.HobLength =3D 0x%x\n", > CpuPowerMgmtTestConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU Power Management Test configuration > + ********************************/ > + CpuPowerMgmtTestConfig->Eist =3D TRUE; > + CpuPowerMgmtTestConfig->EnergyEfficientPState =3D TRUE; > + CpuPowerMgmtTestConfig->EnergyEfficientTurbo =3D TRUE; > + if ((CpuDid =3D=3D V_SA_DEVICE_ID_CFL_DT_1) || (CpuDid =3D=3D > V_SA_DEVICE_ID_CFL_DT_2) > + || (CpuDid =3D=3D V_SA_DEVICE_ID_CFL_DT_3) || (CpuDid =3D=3D > V_SA_DEVICE_ID_CFL_DT_4)) { > + /// > + /// CFL-S 6+2, CFL S 8+2, CFl S 4+2, CFL S 2+2 > + /// > + CpuPowerMgmtTestConfig->EnergyEfficientTurbo =3D FALSE; > + } > + CpuPowerMgmtTestConfig->BiProcHot =3D TRUE; > + CpuPowerMgmtTestConfig->DisableProcHotOut =3D TRUE; > + CpuPowerMgmtTestConfig->AutoThermalReporting =3D TRUE; > + CpuPowerMgmtTestConfig->ThermalMonitor =3D TRUE; > + CpuPowerMgmtTestConfig->Cx =3D TRUE; > + CpuPowerMgmtTestConfig->PmgCstCfgCtrlLock =3D TRUE; > + CpuPowerMgmtTestConfig->C1e =3D TRUE; > + CpuPowerMgmtTestConfig->C1AutoDemotion =3D TRUE; > + CpuPowerMgmtTestConfig->C1UnDemotion =3D TRUE; > + CpuGeneration =3D GetCpuGeneration(); > + if(CpuGeneration =3D=3D EnumCflCpu){ > + CpuPowerMgmtTestConfig->C3AutoDemotion =3D TRUE; > + CpuPowerMgmtTestConfig->C3UnDemotion =3D TRUE; > + } > + > + CpuPowerMgmtTestConfig->CStatePreWake =3D TRUE; > + CpuPowerMgmtTestConfig->RaceToHalt =3D TRUE; > + CpuPowerMgmtTestConfig->CstateLatencyControl0TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl1TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl2TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl3TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl4TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl5TimeUnit =3D > TimeUnit1024ns; > + CpuPowerMgmtTestConfig->CstateLatencyControl0Irtl =3D C3_LATENCY; > + CpuPowerMgmtTestConfig->CstateLatencyControl1Irtl =3D > C6_C7_SHORT_LATENCY; > + CpuPowerMgmtTestConfig->CstateLatencyControl2Irtl =3D > C6_C7_LONG_LATENCY; > + CpuPowerMgmtTestConfig->CstateLatencyControl3Irtl =3D C8_LATENCY; > + CpuPowerMgmtTestConfig->CstateLatencyControl4Irtl =3D C9_LATENCY; > + CpuPowerMgmtTestConfig->CstateLatencyControl5Irtl =3D C10_LATENCY; > + > + CpuPowerMgmtTestConfig->PkgCStateLimit =3D PkgAuto; > + CpuPowerMgmtTestConfig->CustomPowerUnit =3D > PowerUnit125MilliWatts; > + CpuPowerMgmtTestConfig->PpmIrmSetting =3D > PpmIrmPairFixedPriority; > +} > + > +static COMPONENT_BLOCK_ENTRY mCpuIpBlocks [] =3D { > + {&gCpuConfigGuid, sizeof (CPU_CONFIG), > CPU_CONFIG_REVISION, LoadCpuConfigDefault}, > + {&gCpuPowerMgmtBasicConfigGuid, sizeof > (CPU_POWER_MGMT_BASIC_CONFIG), > CPU_POWER_MGMT_BASIC_CONFIG_REVISION, > LoadCpuPowerMgmtBasicConfigDefault}, > + {&gCpuPowerMgmtCustomConfigGuid, sizeof > (CPU_POWER_MGMT_CUSTOM_CONFIG), > CPU_POWER_MGMT_CUSTOM_CONFIG_REVISION, > LoadCpuPowerMgmtCustomConfigDefault}, > + {&gCpuTestConfigGuid, sizeof (CPU_TEST_CONFIG), > CPU_TEST_CONFIG_REVISION, LoadCpuTestConfigDefault}, > + {&gCpuPidTestConfigGuid, sizeof (CPU_PID_TEST_CONFIG), > CPU_PID_TEST_CONFIG_REVISION, LoadCpuPidTestConfigDefault}, > + {&gCpuPowerMgmtTestConfigGuid, sizeof > (CPU_POWER_MGMT_TEST_CONFIG), > CPU_POWER_MGMT_TEST_CONFIG_REVISION, > LoadCpuPowerMgmtTestConfigDefault}, > +}; > + > +/** > + Get CPU config block table total size. > + > + @retval Size of CPU config block table > +**/ > +UINT16 > +EFIAPI > +CpuGetConfigBlockTotalSize ( > + VOID > + ) > +{ > + return GetComponentConfigBlockTotalSize (&mCpuIpBlocks[0], sizeof > (mCpuIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY)); > +} > + > +/** > + CpuAddConfigBlocks add all Cpu config blocks. > + > + @param[in] ConfigBlockTableAddress The pointer to add CPU config > blocks > + > + @retval EFI_SUCCESS The policy default is initialize= d. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create > buffer > +**/ > +EFI_STATUS > +EFIAPI > +CpuAddConfigBlocks ( > + IN VOID *ConfigBlockTableAddress > + ) > +{ > + EFI_STATUS Status; > + DEBUG((DEBUG_INFO, "CPU Post-Mem Entry \n")); > + PostCode (0xC00); > + > + Status =3D AddComponentConfigBlocks (ConfigBlockTableAddress, > &mCpuIpBlocks[0], sizeof (mCpuIpBlocks) / sizeof > (COMPONENT_BLOCK_ENTRY)); > + DEBUG ((DEBUG_INFO, "CpuAddConfigBlocks Done \n")); > + PostCode (0xC09); > + > + return Status; > +} > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.c > new file mode 100644 > index 0000000000..7d45e10236 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiCpuPolicyLib/PeiCpuPo= li > cyLibPreMem.c > @@ -0,0 +1,160 @@ > +/** @file > + This file is PeiCpuPolicyLibPreMem library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiCpuPolicyLibrary.h" > +#include > +#include > +#include > +#include > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuSecurityPreMemConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + > +} > + > +/** > + Load Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuConfigLibPreMemConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_GENERATION CpuGeneration; > + CPU_CONFIG_LIB_PREMEM_CONFIG *CpuConfigLibPreMemConfig; > + CPU_FAMILY CpuFamily; > + CPU_SKU CpuSku; > + BOOLEAN PegDisabled; > + UINT64 MchBar; > + UINT64 SaPciBase; > + > + CpuConfigLibPreMemConfig =3D ConfigBlockPointer; > + CpuFamily =3D GetCpuFamily(); > + CpuSku =3D GetCpuSku(); > + > + DEBUG ((DEBUG_INFO, > "CpuConfigLibPreMemConfig->Header.GuidHob.Name =3D %g\n", > &CpuConfigLibPreMemConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuConfigLibPreMemConfig->Header.GuidHob.Header.HobLength =3D 0x%x\n", > CpuConfigLibPreMemConfig->Header.GuidHob.Header.HobLength)); > + > + /******************************** > + CPU Config Lib PreMem configuration > + ********************************/ > + CpuConfigLibPreMemConfig->HyperThreading =3D > CPU_FEATURE_ENABLE; > + CpuConfigLibPreMemConfig->BootFrequency =3D 1; // Maximum > non-turbo Performance > + CpuConfigLibPreMemConfig->ActiveCoreCount =3D 0; // All cor= es > active > + CpuConfigLibPreMemConfig->JtagC10PowerGateDisable =3D > CPU_FEATURE_DISABLE; > + CpuConfigLibPreMemConfig->BistOnReset =3D > CPU_FEATURE_DISABLE; > + CpuConfigLibPreMemConfig->VmxEnable =3D > CPU_FEATURE_ENABLE; > + CpuConfigLibPreMemConfig->CpuRatio =3D (RShiftU64 (AsmReadMsr64 > (MSR_PLATFORM_INFO), N_PLATFORM_INFO_MAX_RATIO) & > B_PLATFORM_INFO_RATIO_MASK); > + > + CpuGeneration =3D GetCpuGeneration(); > + if(CpuGeneration =3D=3D EnumCflCpu){ > + /// > + /// FCLK Frequency > + /// > + > + SaPciBase =3D PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, > SA_MC_DEV, SA_MC_FUN, 0); > + PciSegmentReadBuffer (SaPciBase + R_SA_MCHBAR, sizeof (MchBar), > &MchBar); > + MchBar &=3D ((UINT64) ~BIT0); > + if (IsPchLinkDmi (CpuFamily) && (PciSegmentRead16 > (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_PEG_BUS_NUM, > SA_PEG_DEV_NUM, SA_PEG0_FUN_NUM, PCI_VENDOR_ID_OFFSET)) !=3D > 0xFFFF)) { > + PegDisabled =3D MmioRead32 ((UINTN) MchBar + > R_SA_MCHBAR_BIOS_RESET_CPL_OFFSET) & BIT3; > + } else { > + PegDisabled =3D 1; > + } > + > + /// > + /// DT/Halo FCLK =3D 1GHz > + /// Ulx/Ult FCLK =3D 800MHz > + /// > + if (((CpuSku =3D=3D EnumCpuHalo) && (!PegDisabled)) || (CpuSku =3D= =3D > EnumCpuTrad)) { > + CpuConfigLibPreMemConfig->FClkFrequency =3D 1; // 1Ghz > + } > + else { > + CpuConfigLibPreMemConfig->FClkFrequency =3D 0; // 800MHz > + } > + /// > + /// Disable Peci Reset on C10 exit on CFL based CPU's > + /// Setting to 1 will activate the message that disables peci reset. > + /// > + CpuConfigLibPreMemConfig->PeciC10Reset =3D 1; > + } > +} > + > +/** > + Load Overclocking pre-mem Config block default > + > + @param[in] ConfigBlockPointer Pointer to config block > +**/ > +VOID > +LoadCpuOverclockingPreMemConfigDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + CPU_OVERCLOCKING_PREMEM_CONFIG > *CpuOverclockingPreMemConfig; > + CpuOverclockingPreMemConfig =3D ConfigBlockPointer; > + > + /******************************** > + CPU Overclocking PreMem configuration > + ********************************/ > + DEBUG ((DEBUG_INFO, > "CpuOverclockingPreMemConfig->Header.GuidHob.Name =3D %g\n", > &CpuOverclockingPreMemConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, > "CpuOverclockingPreMemConfig->Header.GuidHob.Header.HobLength =3D > 0x%x\n", > CpuOverclockingPreMemConfig->Header.GuidHob.Header.HobLength)); > +} > + > +static COMPONENT_BLOCK_ENTRY mCpuIpBlocksPreMem [] =3D { > + {&gCpuConfigLibPreMemConfigGuid, sizeof > (CPU_CONFIG_LIB_PREMEM_CONFIG), > CPU_CONFIG_LIB_PREMEM_CONFIG_REVISION, > LoadCpuConfigLibPreMemConfigDefault}, > + {&gCpuOverclockingPreMemConfigGuid, sizeof > (CPU_OVERCLOCKING_PREMEM_CONFIG), > CPU_OVERCLOCKING_CONFIG_REVISION, > LoadCpuOverclockingPreMemConfigDefault}, > +}; > + > +/** > + Get CPU PREMEM config block table total size. > + > + @retval Size of CPU PREMEM config block table > +**/ > +UINT16 > +EFIAPI > +CpuGetPreMemConfigBlockTotalSize ( > + VOID > + ) > +{ > + return GetComponentConfigBlockTotalSize (&mCpuIpBlocksPreMem[0], > sizeof (mCpuIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY)); > +} > + > +/** > + CpuAddPreMemConfigBlocks add all CPU PREMEM config blocks. > + > + @param[in] ConfigBlockTableAddress The pointer to add CPU PREMEM > config blocks > + > + @retval EFI_SUCCESS The policy default is initialize= d. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create > buffer > +**/ > +EFI_STATUS > +EFIAPI > +CpuAddPreMemConfigBlocks ( > + IN VOID *ConfigBlockTableAddress > + ) > +{ > + EFI_STATUS Status; > + DEBUG((DEBUG_INFO, "CPU Pre-Mem Entry \n")); > + PostCode (0xC00); > + > + Status =3D AddComponentConfigBlocks (ConfigBlockTableAddress, > &mCpuIpBlocksPreMem[0], sizeof (mCpuIpBlocksPreMem) / sizeof > (COMPONENT_BLOCK_ENTRY)); > + DEBUG((DEBUG_INFO, "CpuAddPreMemConfigBlocks Done \n")); > + PostCode (0xC0F); > + > + return Status; > +} > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.c > new file mode 100644 > index 0000000000..18f2028fa9 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Cpu/Library/PeiDxeSmmCpuPlatformLib > /CpuPlatformLibrary.c > @@ -0,0 +1,415 @@ > +/** @file > + CPU Platform Lib implementation. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "CpuPlatformLibrary.h" > +#include > +#include > + > +#define SKIP_MICROCODE_CHECKSUM_CHECK 1 > +#define C6DRAM_ENABLE 1 > +#define C6DRAM_DISABLE 0 > + > +/** > + Return CPU Family ID > + > + @retval CPU_FAMILY CPU Family ID > +**/ > +CPU_FAMILY > +EFIAPI > +GetCpuFamily ( > + VOID > + ) > +{ > + EFI_CPUID_REGISTER Cpuid; > + /// > + /// Read the CPUID information > + /// > + AsmCpuid (CPUID_VERSION_INFO, &Cpuid.RegEax, &Cpuid.RegEbx, > &Cpuid.RegEcx, &Cpuid.RegEdx); > + return ((CPU_FAMILY) (Cpuid.RegEax & CPUID_FULL_FAMILY_MODEL)); > +} > + > +/** > + Return Cpu stepping type > + > + @retval UINT8 Cpu stepping type > +**/ > +CPU_STEPPING > +EFIAPI > +GetCpuStepping ( > + VOID > + ) > +{ > + EFI_CPUID_REGISTER Cpuid; > + /// > + /// Read the CPUID information > + /// > + AsmCpuid (CPUID_VERSION_INFO, &Cpuid.RegEax, &Cpuid.RegEbx, > &Cpuid.RegEcx, &Cpuid.RegEdx); > + return ((CPU_STEPPING) (Cpuid.RegEax & CPUID_FULL_STEPPING)); > +} > + > +/** > + Return CPU Sku > + > + @retval UINT8 CPU Sku > +**/ > +UINT8 > +EFIAPI > +GetCpuSku ( > + VOID > + ) > +{ > + UINT8 CpuType; > + UINT16 CpuDid; > + UINT32 CpuFamilyModel; > + EFI_CPUID_REGISTER Cpuid; > + BOOLEAN SkuFound; > + > + SkuFound =3D TRUE; > + CpuType =3D EnumCpuUnknown; > + > + /// > + /// Read the CPUID & DID information > + /// > + AsmCpuid (CPUID_VERSION_INFO, &Cpuid.RegEax, &Cpuid.RegEbx, > &Cpuid.RegEcx, &Cpuid.RegEdx); > + CpuFamilyModel =3D Cpuid.RegEax & CPUID_FULL_FAMILY_MODEL; > + CpuDid =3D PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, > SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, R_SA_MC_DEVICE_ID)); > + > + switch (CpuFamilyModel) { > + case CPUID_FULL_FAMILY_MODEL_COFFEELAKE_ULT_ULX: > + switch (CpuDid) { > + case V_SA_DEVICE_ID_KBL_MB_ULT_1: // KBL ULT OPI > + case V_SA_DEVICE_ID_CFL_ULT_1: // CFL ULT > + case V_SA_DEVICE_ID_CFL_ULT_2: // CFL ULT > + case V_SA_DEVICE_ID_CFL_ULT_3: // CFL ULT > + case V_SA_DEVICE_ID_CFL_ULT_4: // CFL ULT > + CpuType =3D EnumCpuUlt; > + break; > + > + default: > + SkuFound =3D FALSE; > + break; > + } > + break; > + > + case CPUID_FULL_FAMILY_MODEL_COFFEELAKE_DT_HALO: > + switch (CpuDid) { > + > + case V_SA_DEVICE_ID_KBL_DT_2: // DT > + case V_SA_DEVICE_ID_KBL_SVR_2: // Server > + case V_SA_DEVICE_ID_CFL_DT_1: // DT > + case V_SA_DEVICE_ID_CFL_DT_2: // DT > + case V_SA_DEVICE_ID_CFL_DT_3: // DT > + case V_SA_DEVICE_ID_CFL_DT_4: // DT > + case V_SA_DEVICE_ID_CFL_WS_1: // WorkStation > + case V_SA_DEVICE_ID_CFL_WS_2: // Workstation > + case V_SA_DEVICE_ID_CFL_WS_3: // Workstation > + case V_SA_DEVICE_ID_CFL_SVR_1: // Server > + case V_SA_DEVICE_ID_CFL_SVR_2: // Server > + case V_SA_DEVICE_ID_CFL_SVR_3: // Server > + CpuType =3D EnumCpuTrad; > + break; > + > + case V_SA_DEVICE_ID_KBL_HALO_2: // Halo > + case V_SA_DEVICE_ID_CFL_HALO_1: // Halo > + case V_SA_DEVICE_ID_CFL_HALO_2: // Halo > + case V_SA_DEVICE_ID_CFL_HALO_3: // Halo > + CpuType =3D EnumCpuHalo; > + break; > + > + default: > + SkuFound =3D FALSE; > + break; > + } > + break; > + > + default: > + SkuFound =3D FALSE; > + break; > + } > +#ifdef CFL_SIMICS > + CpuType =3D EnumCpuTrad; > +#else > + if (!SkuFound) { > + DEBUG ((DEBUG_ERROR, "Unsupported CPU SKU, Device ID: 0x%02X, > CPUID: 0x%08X!\n", CpuDid, CpuFamilyModel)); > + ASSERT (FALSE); > + } > +#endif > + > + return CpuType; > +} > + > +/** > + Returns the processor microcode revision of the processor installed in= the > system. > + > + @retval Processor Microcode Revision > +**/ > +UINT32 > +GetCpuUcodeRevision ( > + VOID > + ) > +{ > + AsmWriteMsr64 (MSR_IA32_BIOS_SIGN_ID, 0); > + AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, NULL); > + return (UINT32) RShiftU64 (AsmReadMsr64 (MSR_IA32_BIOS_SIGN_ID), 32); > +} > + > +/** > + Verify the DWORD type checksum > + > + @param[in] ChecksumAddr - The start address to be checkumed > + @param[in] ChecksumLen - The length of data to be checksumed > + > + @retval EFI_SUCCESS - Checksum correct > + @retval EFI_CRC_ERROR - Checksum incorrect > +**/ > +EFI_STATUS > +Checksum32Verify ( > + IN UINT32 *ChecksumAddr, > + IN UINT32 ChecksumLen > + ) > +{ > +#if SKIP_MICROCODE_CHECKSUM_CHECK > + return EFI_SUCCESS; > +#else > + UINT32 Checksum; > + UINT32 Index; > + > + Checksum =3D 0; > + > + for (Index =3D 0; Index < ChecksumLen; Index++) { > + Checksum +=3D ChecksumAddr[Index]; > + } > + > + return (Checksum =3D=3D 0) ? EFI_SUCCESS : EFI_CRC_ERROR; > +#endif > +} > + > +/** > + This function checks the MCU revision to decide if BIOS needs to load > + microcode. > + > + @param[in] MicrocodePointer - Microcode in memory > + @param[in] Revision - Current CPU microcode revision > + > + @retval EFI_SUCCESS - BIOS needs to load microcode > + @retval EFI_ABORTED - Don't need to update microcode > +**/ > +EFI_STATUS > +CheckMcuRevision ( > + IN CPU_MICROCODE_HEADER *MicrocodePointer, > + IN UINT32 Revision > + ) > +{ > + EFI_STATUS Status; > + Status =3D EFI_ABORTED; > + > + if ((MicrocodePointer->UpdateRevision & 0x80000000) || > + (MicrocodePointer->UpdateRevision > Revision) || > + (Revision =3D=3D 0)) { > + Status =3D EFI_SUCCESS; > + } > + > + return Status; > +} > + > +/** > + Check if this microcode is correct one for processor > + > + @param[in] Cpuid - processor CPUID > + @param[in] MicrocodeEntryPoint - entry point of microcode > + @param[in] Revision - revision of microcode > + > + @retval CorrectMicrocode if this microcode is correct > +**/ > +BOOLEAN > +CheckMicrocode ( > + IN UINT32 Cpuid, > + IN CPU_MICROCODE_HEADER *MicrocodeEntryPoint, > + IN UINT32 *Revision > + ) > +{ > + EFI_STATUS Status; > + UINT8 ExtendedIndex; > + MSR_IA32_PLATFORM_ID_REGISTER Msr; > + UINT32 ExtendedTableLength; > + UINT32 ExtendedTableCount; > + BOOLEAN CorrectMicrocode; > + CPU_MICROCODE_EXTENDED_TABLE *ExtendedTable; > + CPU_MICROCODE_EXTENDED_TABLE_HEADER *ExtendedTableHeader; > + > + Status =3D EFI_NOT_FOUND; > + ExtendedTableLength =3D 0; > + CorrectMicrocode =3D FALSE; > + > + if (MicrocodeEntryPoint =3D=3D NULL) { > + return FALSE; > + } > + > + Msr.Uint64 =3D AsmReadMsr64 (MSR_IA32_PLATFORM_ID); > + > + /// > + /// Check if the microcode is for the Cpu and the version is newer > + /// and the update can be processed on the platform > + /// > + if ((MicrocodeEntryPoint->HeaderVersion =3D=3D 0x00000001) && > + !EFI_ERROR (CheckMcuRevision (MicrocodeEntryPoint, *Revision)) > + ) { > + if ((MicrocodeEntryPoint->ProcessorId =3D=3D Cpuid) && > (MicrocodeEntryPoint->ProcessorFlags & (1 << (UINT8) Msr.Bits.PlatformId)= )) { > + if (MicrocodeEntryPoint->DataSize =3D=3D 0) { > + Status =3D Checksum32Verify ((UINT32 *) MicrocodeEntryPoint, 204= 8 / > sizeof (UINT32)); > + } else { > + Status =3D Checksum32Verify ( > + (UINT32 *) MicrocodeEntryPoint, > + (MicrocodeEntryPoint->DataSize + sizeof > (CPU_MICROCODE_HEADER)) / sizeof (UINT32) > + ); > + } > + > + if (!EFI_ERROR (Status)) { > + CorrectMicrocode =3D TRUE; > + } > + } else if ((MicrocodeEntryPoint->DataSize !=3D 0)) { > + /// > + /// Check the Extended Signature if the entended signature exist > + /// Only the data size !=3D 0 the extended signature may exist > + /// > + ExtendedTableLength =3D MicrocodeEntryPoint->TotalSize - > (MicrocodeEntryPoint->DataSize + sizeof (CPU_MICROCODE_HEADER)); > + if (ExtendedTableLength !=3D 0) { > + /// > + /// Extended Table exist, check if the CPU in support list > + /// > + ExtendedTableHeader =3D > (CPU_MICROCODE_EXTENDED_TABLE_HEADER *) ((UINT8 *) > (MicrocodeEntryPoint) + MicrocodeEntryPoint->DataSize + 48); > + /// > + /// Calulate Extended Checksum > + /// > + if ((ExtendedTableLength % 4) =3D=3D 0) { > + Status =3D Checksum32Verify ((UINT32 *) ExtendedTableHeader, > ExtendedTableLength / sizeof (UINT32)); > + if (!EFI_ERROR (Status)) { > + /// > + /// Checksum correct > + /// > + ExtendedTableCount =3D > ExtendedTableHeader->ExtendedSignatureCount; > + ExtendedTable =3D (CPU_MICROCODE_EXTENDED_TABLE *) > (ExtendedTableHeader + 1); > + for (ExtendedIndex =3D 0; ExtendedIndex < ExtendedTableCount= ; > ExtendedIndex++) { > + /// > + /// Verify Header > + /// > + if ((ExtendedTable->ProcessorSignature =3D=3D Cpuid) && > (ExtendedTable->ProcessorFlag & (1 << (UINT8) Msr.Bits.PlatformId))) { > + Status =3D Checksum32Verify ( > + (UINT32 *) ExtendedTable, > + sizeof (CPU_MICROCODE_EXTENDED_TABLE) / sizeo= f > (UINT32) > + ); > + if (!EFI_ERROR (Status)) { > + /// > + /// Find one > + /// > + CorrectMicrocode =3D TRUE; > + break; > + } > + } > + > + ExtendedTable++; > + } > + } > + } > + } > + } > + } > + > + return CorrectMicrocode; > +} > + > +/** > + Check on the processor if SGX is supported. > + > + @retval TRUE if SGX supported > + @retval FALSE if SGX is not supported > +**/ > +BOOLEAN > +IsSgxSupported ( > + VOID > + ) > +{ > + EFI_CPUID_REGISTER CpuidRegs; > + > + // > + // Processor support SGX feature by reading CPUID.(EAX=3D7,ECX=3D0):EB= X[2] > + // > + AsmCpuidEx (CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, 0, > &CpuidRegs.RegEax,&CpuidRegs.RegEbx,&CpuidRegs.RegEcx,&CpuidRegs.Re > gEdx); > + > + /// > + /// SGX feature is supported with CPUID.(EAX=3D7,ECX=3D0):EBX[2]=3D1 > + /// PRMRR configuration enabled, MSR IA32_MTRRCAP (FEh) [12] =3D=3D 1 > + /// > + if (((CpuidRegs.RegEbx & BIT2)) && (AsmReadMsr64 (MSR_IA32_MTRRCAP) > & BIT12)) { > + return TRUE; > + } > + return FALSE; > +} > + > +/** > + Get processor generation > + > + @retval CPU_GENERATION Returns the executing thread's processor > generation. > +**/ > +CPU_GENERATION > +GetCpuGeneration ( > + VOID > + ) > +{ > + EFI_CPUID_REGISTER Cpuid; > + CPU_FAMILY CpuFamilyModel; > + CPU_GENERATION CpuGeneration; > + > + CpuGeneration =3D EnumCflCpu; > + /// > + /// Read the CPUID information > + /// > + AsmCpuid (CPUID_VERSION_INFO, &Cpuid.RegEax, &Cpuid.RegEbx, > &Cpuid.RegEcx, &Cpuid.RegEdx); > + CpuFamilyModel =3D (CPU_FAMILY) (Cpuid.RegEax & > CPUID_FULL_FAMILY_MODEL); > + > + switch (CpuFamilyModel) { > + case EnumCpuCflUltUlx: > + case EnumCpuCflDtHalo: > + CpuGeneration =3D EnumCflCpu; > + break; > + > + default: > + CpuGeneration =3D EnumCpuUnknownGeneration; > + ASSERT (FALSE); > + break; > + } > + > + return CpuGeneration; > +} > + > +/** > + Is Whiskey Lake CPU. > + > + @retval TRUE The CPUID corresponds with a Whiskey Lake CPU > + @retval FALSE The CPUID does not correspond with a Whiskey Lake CPU > +**/ > +BOOLEAN > +IsWhlCpu ( > + VOID > + ) > +{ > + CPU_FAMILY CpuFamily; > + CPU_STEPPING CpuStepping; > + > + CpuFamily =3D GetCpuFamily (); > + CpuStepping =3D GetCpuStepping (); > + > + // > + // Check if it is Whiskey Lake CPU > + // > + if ((CpuFamily =3D=3D EnumCpuCflUltUlx) && ((CpuStepping =3D=3D EnumCf= lW0) || > (CpuStepping =3D=3D EnumCflV0))) { > + return TRUE; > + } > + > + return FALSE; > +} > -- > 2.16.2.windows.1