Reviewed-by: Chasel Chiu <chasel.c...@intel.com>
> -----Original Message----- > From: Kubacki, Michael A > Sent: Saturday, August 17, 2019 8:16 AM > To: devel@edk2.groups.io > Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Chiu, Chasel > <chasel.c...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Gao, Liming <liming....@intel.com>; > Kinney, Michael D <michael.d.kin...@intel.com>; Sinha, Ankit > <ankit.si...@intel.com> > Subject: [edk2-platforms][PATCH V1 14/37] CoffeelakeSiliconPkg: Add package > common library instances > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2082 > > Adds package-level library class instances. > > * BaseConfigBlockLib - Library functions for config block management. > * BaseSiConfigBlockLib - Library functions for managing component > config blocks. > * DxeAslUpdateLib - Services to update ACPI tables. > * PeiDxeSmmMmPciLib - Services to manage PCI Express addresses. > * PeiStallPpiLib - Installs an instance of EFI_PEI_STALL_PPI. > * PeiSiPolicyLib - Installs an instance of the Silicon Policy PPI. > Prints the Silicon Policy PPI values when DEBUG prints are enabled. > > Cc: Sai Chaganty <rangasai.v.chaga...@intel.com> > Cc: Chasel Chiu <chasel.c...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Liming Gao <liming....@intel.com> > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Ankit Sinha <ankit.si...@intel.com> > Signed-off-by: Michael Kubacki <michael.a.kuba...@intel.com> > --- > > Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigBlo > ckLib.inf | 29 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfig > BlockLib.inf | 33 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib > .inf | 40 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUpdat > eLibNull.inf | 30 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSmm > MmPciLib.inf | 35 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLib. > inf | 31 ++ > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.inf > | 51 +++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibrary.h > | 35 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigBlo > ckLib.c | 146 +++++++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfig > BlockLib.c | 87 +++++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib > .c | 403 ++++++++++++++++++++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUpdat > eLibNull.c | 126 ++++++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSmm > MmPciLib.c | 32 ++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLib. > c | 78 ++++ > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.c > | 214 +++++++++++ > > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibPreMe > m.c | 122 ++++++ > Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/SiPrintPolicy.c > | 36 ++ > 17 files changed, 1528 insertions(+) > > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.inf > new file mode 100644 > index 0000000000..a7def2481d > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.inf > @@ -0,0 +1,29 @@ > +## @file > +# Component INF file for the BaseConfigBlock library. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = BaseConfigBlockLib > +FILE_GUID = 1EC07EA8-7808-4e06-9D79-309AE331D2D5 > +VERSION_STRING = 1.0 > +MODULE_TYPE = BASE > +LIBRARY_CLASS = ConfigBlockLib > + > + > +[Packages] > +MdePkg/MdePkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > +[Sources] > +BaseConfigBlockLib.c > + > +[LibraryClasses] > +DebugLib > +BaseMemoryLib > +MemoryAllocationLib > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.inf > new file mode 100644 > index 0000000000..b04dc3cfa4 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.inf > @@ -0,0 +1,33 @@ > +## @file > +# Component description file for the BaseSiConfigBlockLib library. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = BaseSiConfigBlockLib > +FILE_GUID = 6C068D0F-F48E-48CB-B369-433E507AF4A2 > +VERSION_STRING = 1.0 > +MODULE_TYPE = BASE > +LIBRARY_CLASS = SiConfigBlockLib > + > + > +[LibraryClasses] > +DebugLib > +IoLib > +ConfigBlockLib > + > + > +[Packages] > +MdePkg/MdePkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > + > +[Sources] > +BaseSiConfigBlockLib.c > + > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.inf > new file mode 100644 > index 0000000000..658caccb43 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.inf > @@ -0,0 +1,40 @@ > +## @file > +# Provides services to update ASL tables. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = DxeAslUpdateLib > +FILE_GUID = 8621697D-4E3A-4bf2-ADB0-3E2FF06559CA > +VERSION_STRING = 1.0 > +MODULE_TYPE = BASE > +LIBRARY_CLASS = AslUpdateLib > + > + > +[LibraryClasses] > +BaseLib > +IoLib > +DebugLib > +PcdLib > +BaseMemoryLib > +UefiLib > +MemoryAllocationLib > + > + > +[Packages] > +MdePkg/MdePkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > + > +[Sources] > +DxeAslUpdateLib.c > + > + > +[Protocols] > +gEfiAcpiTableProtocolGuid ## CONSUMES > +gEfiAcpiSdtProtocolGuid ## CONSUMES > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.inf > new file mode 100644 > index 0000000000..ae78a8e8f9 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.inf > @@ -0,0 +1,30 @@ > +## @file > +# Provides services to update ASL tables. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = DxeAslUpdateLibNull > +FILE_GUID = C7A3725F-6146-4FAB-B2EF-B4CED222DA52 > +VERSION_STRING = 1.0 > +MODULE_TYPE = BASE > +LIBRARY_CLASS = AslUpdateLib > + > + > + > + > +[Packages] > +MdePkg/MdePkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > + > +[Sources] > +DxeAslUpdateLibNull.c > + > + > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.inf > new file mode 100644 > index 0000000000..fdf376bc70 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.inf > @@ -0,0 +1,35 @@ > +## @file > +# Component description file for the PeiDxeSmmMmPciLib > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = PeiDxeSmmMmPciLib > +FILE_GUID = D03D6670-A032-11E2-9E96-0800200C9A66 > +VERSION_STRING = 1.0 > +MODULE_TYPE = BASE > +LIBRARY_CLASS = MmPciLib > +# > +# The following information is for reference only and not required by the > build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC > +# > + > +[LibraryClasses] > +BaseLib > +PcdLib > +DebugLib > + > +[Packages] > +MdePkg/MdePkg.dec > + > +[Pcd] > +gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress > + > +[Sources] > +PeiDxeSmmMmPciLib.c > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.inf > new file mode 100644 > index 0000000000..2e07a90406 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.inf > @@ -0,0 +1,31 @@ > +## @file > +# Library description file for Stall Ppi installation > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = PeiStallPpiLib > +FILE_GUID = 73E3DD0E-B2C1-4429-B0B8-F8C2BD64F8CE > +VERSION_STRING = 1.0 > +MODULE_TYPE = PEIM > +LIBRARY_CLASS = StallPpiLib > + > +[Sources] > +PeiStallPpiLib.c > + > +[LibraryClasses] > +BaseLib > +DebugLib > +TimerLib > +PeiServicesLib > + > +[Packages] > +MdePkg/MdePkg.dec > + > +[Ppis] > +gEfiPeiStallPpiGuid ## PRODUCES > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.inf > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.inf > new file mode 100644 > index 0000000000..c5945c3129 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.inf > @@ -0,0 +1,51 @@ > +## @file > +# Component description file for the PeiSiPolicyLib library. > +# > +# Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > +INF_VERSION = 0x00010017 > +BASE_NAME = PeiSiPolicyLib > +FILE_GUID = 97584FAE-9299-4202-9889-2D339E4BFA5B > +VERSION_STRING = 1.0 > +MODULE_TYPE = PEIM > +LIBRARY_CLASS = SiPolicyLib > + > + > +[LibraryClasses] > +DebugLib > +IoLib > +PeiServicesLib > +BaseMemoryLib > +MemoryAllocationLib > +ConfigBlockLib > +CpuPolicyLib > +PchPolicyLib > +PeiSaPolicyLib > +PeiMePolicyLib > +PcdLib > + > +[Packages] > +MdePkg/MdePkg.dec > +CoffeelakeSiliconPkg/SiPkg.dec > + > + > +[Sources] > +PeiSiPolicyLib.c > +PeiSiPolicyLibrary.h > +SiPrintPolicy.c > +PeiSiPolicyLibPreMem.c > + > + > +[Guids] > +gSiConfigGuid ## CONSUMES > + > + > +[Ppis] > +gSiPolicyPpiGuid ## PRODUCES > +gSiPreMemPolicyPpiGuid ## PRODUCES > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibrary. > h > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibrary. > h > new file mode 100644 > index 0000000000..cb6b14fdd1 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibrary. > h > @@ -0,0 +1,35 @@ > +/** @file > + Header file for the PeiSiPolicyLib library. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef _PEI_SI_POLICY_LIBRARY_H_ > +#define _PEI_SI_POLICY_LIBRARY_H_ > + > +#include <Library/DebugLib.h> > +#include <Library/IoLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/PeiServicesLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/ConfigBlockLib.h> > +#include <Ppi/SiPolicy.h> > +#include <Library/SiPolicyLib.h> > +#include <Library/PchPolicyLib.h> > +#include <Library/PeiMePolicyLib.h> > +#include <Library/PeiSaPolicyLib.h> > +#include <PchAccess.h> > +#include <Library/CpuPolicyLib.h> > + > +#define TEMP_MEM_BASE_ADDRESS 0xFE600000 > +#define TEMP_IO_BASE_ADDRESS 0xD000 > + > +// > +// IO/MMIO resource limits > +// > +#define TEMP_MEM_SIZE V_PCH_XDCI_MEM_LENGTH > +#define TEMP_IO_SIZE 0x10 > + > +#endif // _PEI_SI_POLICY_LIBRARY_H_ > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.c > new file mode 100644 > index 0000000000..369dab97ee > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseConfigBlockLib/BaseConfigB > lockLib.c > @@ -0,0 +1,146 @@ > +/** @file > + Library functions for Config Block management. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <ConfigBlock.h> > +#include <Library/ConfigBlockLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/DebugLib.h> > + > +/** > + Create config block table > + > + @param[in] TotalSize - Max size to be allocated for > the > Config Block Table > + @param[out] ConfigBlockTableAddress - On return, points to a > pointer to the beginning of Config Block Table Address > + > + @retval EFI_INVALID_PARAMETER - Invalid Parameter > + @retval EFI_OUT_OF_RESOURCES - Out of resources > + @retval EFI_SUCCESS - Successfully created Config Block Table at > ConfigBlockTableAddress > +**/ > +EFI_STATUS > +EFIAPI > +CreateConfigBlockTable ( > + IN UINT16 TotalSize, > + OUT VOID **ConfigBlockTableAddress > + ) > +{ > + CONFIG_BLOCK_TABLE_HEADER *ConfigBlkTblAddrPtr; > + UINT32 ConfigBlkTblHdrSize; > + > + ConfigBlkTblHdrSize = (UINT32)(sizeof (CONFIG_BLOCK_TABLE_HEADER)); > + > + if (TotalSize <= (ConfigBlkTblHdrSize + sizeof (CONFIG_BLOCK_HEADER))) { > + DEBUG ((DEBUG_ERROR, "Invalid Parameter\n")); > + return EFI_INVALID_PARAMETER; > + } > + > + ConfigBlkTblAddrPtr = (CONFIG_BLOCK_TABLE_HEADER *)AllocateZeroPool > (TotalSize); > + if (ConfigBlkTblAddrPtr == NULL) { > + DEBUG ((DEBUG_ERROR, "Could not allocate memory.\n")); > + return EFI_OUT_OF_RESOURCES; > + } > + ConfigBlkTblAddrPtr->NumberOfBlocks = 0; > + ConfigBlkTblAddrPtr->Header.GuidHob.Header.HobLength = TotalSize; > + ConfigBlkTblAddrPtr->AvailableSize = TotalSize - ConfigBlkTblHdrSize; > + > + *ConfigBlockTableAddress = (VOID *)ConfigBlkTblAddrPtr; > + > + return EFI_SUCCESS; > +} > + > +/** > + Add config block into config block table structure > + > + @param[in] ConfigBlockTableAddress - A pointer to the beginning of > Config Block Table Address > + @param[out] ConfigBlockAddress - On return, points to a > pointer > to the beginning of Config Block Address > + > + @retval EFI_OUT_OF_RESOURCES - Config Block Table is full and cannot add > new Config Block or > + Config Block Offset Table is full and > cannot add new > Config Block. > + @retval EFI_SUCCESS - Successfully added Config Block > +**/ > +EFI_STATUS > +EFIAPI > +AddConfigBlock ( > + IN VOID *ConfigBlockTableAddress, > + OUT VOID **ConfigBlockAddress > + ) > +{ > + CONFIG_BLOCK *TempConfigBlk; > + CONFIG_BLOCK_TABLE_HEADER *ConfigBlkTblAddrPtr; > + CONFIG_BLOCK *ConfigBlkAddrPtr; > + UINT16 ConfigBlkSize; > + > + ConfigBlkTblAddrPtr = (CONFIG_BLOCK_TABLE_HEADER > *)ConfigBlockTableAddress; > + ConfigBlkAddrPtr = (CONFIG_BLOCK *)(*ConfigBlockAddress); > + ConfigBlkSize = ConfigBlkAddrPtr->Header.GuidHob.Header.HobLength; > + DEBUG ((DEBUG_INFO, "Config Block GUID: %g / Config Block Size: 0x%x > bytes\n", &(ConfigBlkAddrPtr->Header.GuidHob.Name), ConfigBlkSize)); > + if ((ConfigBlkSize % 4) != 0) { > + DEBUG ((DEBUG_ERROR, "Config Block must be multiples of 4 bytes\n")); > + return EFI_INVALID_PARAMETER; > + } > + if (ConfigBlkTblAddrPtr->AvailableSize < ConfigBlkSize) { > + DEBUG ((DEBUG_ERROR, "Config Block Table is full and cannot add new > Config Block.\n")); > + DEBUG ((DEBUG_ERROR, "Available Config Block Size: 0x%x bytes / > Requested Config Block Size: 0x%x bytes\n", > ConfigBlkTblAddrPtr->AvailableSize, ConfigBlkSize)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + TempConfigBlk = (CONFIG_BLOCK *)((UINTN)ConfigBlkTblAddrPtr + > (UINTN)(ConfigBlkTblAddrPtr->Header.GuidHob.Header.HobLength - > ConfigBlkTblAddrPtr->AvailableSize)); > + CopyMem (&TempConfigBlk->Header, &ConfigBlkAddrPtr->Header, > sizeof(CONFIG_BLOCK_HEADER)); > + > + ConfigBlkTblAddrPtr->NumberOfBlocks++; > + ConfigBlkTblAddrPtr->AvailableSize = ConfigBlkTblAddrPtr->AvailableSize - > ConfigBlkSize; > + > + *ConfigBlockAddress = (VOID *) TempConfigBlk; > + DEBUG ((DEBUG_INFO, "Config Block Address: 0x%x / Available Config Block > Size: 0x%x bytes\n", (UINT32)(UINTN)*ConfigBlockAddress, > ConfigBlkTblAddrPtr->AvailableSize)); > + return EFI_SUCCESS; > +} > + > +/** > + Retrieve a specific Config Block data by GUID > + > + @param[in] ConfigBlockTableAddress - A pointer to the beginning > of Config Block Table Address > + @param[in] ConfigBlockGuid - A pointer to the GUID uses > to > search specific Config Block > + @param[out] ConfigBlockAddress - On return, points to a > pointer to the beginning of Config Block Address > + > + @retval EFI_NOT_FOUND - Could not find the Config Block > + @retval EFI_SUCCESS - Config Block found and return > +**/ > +EFI_STATUS > +EFIAPI > +GetConfigBlock ( > + IN VOID *ConfigBlockTableAddress, > + IN EFI_GUID *ConfigBlockGuid, > + OUT VOID **ConfigBlockAddress > + ) > +{ > + UINT16 OffsetIndex; > + CONFIG_BLOCK *TempConfigBlk; > + CONFIG_BLOCK_TABLE_HEADER *ConfigBlkTblAddrPtr; > + UINT32 ConfigBlkTblHdrSize; > + UINT32 ConfigBlkOffset; > + UINT16 NumOfBlocks; > + > + ConfigBlkTblHdrSize = (UINT32)(sizeof (CONFIG_BLOCK_TABLE_HEADER)); > + ConfigBlkTblAddrPtr = (CONFIG_BLOCK_TABLE_HEADER > *)ConfigBlockTableAddress; > + NumOfBlocks = ConfigBlkTblAddrPtr->NumberOfBlocks; > + > + ConfigBlkOffset = 0; > + for (OffsetIndex = 0; OffsetIndex < NumOfBlocks; OffsetIndex++) { > + if ((ConfigBlkTblHdrSize + ConfigBlkOffset) > > (ConfigBlkTblAddrPtr->Header.GuidHob.Header.HobLength)) { > + break; > + } > + TempConfigBlk = (CONFIG_BLOCK *)((UINTN)ConfigBlkTblAddrPtr + > (UINTN)ConfigBlkTblHdrSize + (UINTN)ConfigBlkOffset); > + if (CompareGuid (&(TempConfigBlk->Header.GuidHob.Name), > ConfigBlockGuid)) { > + *ConfigBlockAddress = (VOID *)TempConfigBlk; > + return EFI_SUCCESS; > + } > + ConfigBlkOffset = ConfigBlkOffset + > TempConfigBlk->Header.GuidHob.Header.HobLength; > + } > + DEBUG ((DEBUG_ERROR, "Could not find the config block.\n")); > + return EFI_NOT_FOUND; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.c > new file mode 100644 > index 0000000000..16a14b3245 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiCon > figBlockLib.c > @@ -0,0 +1,87 @@ > +/** @file > + This file is BaseSiConfigBlockLib library is used to add config blocks > + to config block header. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <ConfigBlock.h> > +#include <Library/DebugLib.h> > +#include <Library/IoLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/ConfigBlockLib.h> > +#include <Library/SiConfigBlockLib.h> > + > + > +/** > + GetComponentConfigBlockTotalSize get config block table total size. > + > + @param[in] ComponentBlocks Component blocks array > + @param[in] TotalBlockCount Number of blocks > + > + @retval Size of config block table > +**/ > +UINT16 > +EFIAPI > +GetComponentConfigBlockTotalSize ( > + IN COMPONENT_BLOCK_ENTRY *ComponentBlocks, > + IN UINT16 TotalBlockCount > + ) > +{ > + UINT16 TotalBlockSize; > + UINT16 BlockCount; > + > + TotalBlockSize = 0; > + for (BlockCount = 0 ; BlockCount < TotalBlockCount; BlockCount++) { > + TotalBlockSize += (UINT32) ComponentBlocks[BlockCount].Size; > + DEBUG ((DEBUG_INFO, "TotalBlockSize after adding Block[0x%x]= 0x%x\n", > BlockCount, TotalBlockSize)); > + } > + > + return TotalBlockSize; > +} > + > +/** > + AddComponentConfigBlocks add all config blocks. > + > + @param[in] ConfigBlockTableAddress The pointer to add config blocks > + @param[in] ComponentBlocks Config blocks array > + @param[in] TotalBlockCount Number of blocks > + > + @retval EFI_SUCCESS The policy default is initialized. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create > buffer > +**/ > +EFI_STATUS > +EFIAPI > +AddComponentConfigBlocks ( > + IN VOID *ConfigBlockTableAddress, > + IN COMPONENT_BLOCK_ENTRY *ComponentBlocks, > + IN UINT16 TotalBlockCount > + ) > +{ > + UINT16 BlockCount; > + VOID *ConfigBlockPointer; > + CONFIG_BLOCK ConfigBlockBuf; > + EFI_STATUS Status; > + > + Status = EFI_SUCCESS; > + > + // > + // Initialize ConfigBlockPointer to NULL > + // > + ConfigBlockPointer = NULL; > + // > + // Loop to identify each config block from ComponentBlocks[] Table and add > each of them > + // > + for (BlockCount = 0 ; BlockCount < TotalBlockCount; BlockCount++) { > + CopyMem (&(ConfigBlockBuf.Header.GuidHob.Name), > ComponentBlocks[BlockCount].Guid, sizeof (EFI_GUID)); > + ConfigBlockBuf.Header.GuidHob.Header.HobLength = > ComponentBlocks[BlockCount].Size; > + ConfigBlockBuf.Header.Revision = > ComponentBlocks[BlockCount].Revision; > + ConfigBlockPointer = (VOID *)&ConfigBlockBuf; > + Status = AddConfigBlock ((VOID *)ConfigBlockTableAddress, (VOID > *)&ConfigBlockPointer); > + ASSERT_EFI_ERROR (Status); > + ComponentBlocks[BlockCount].LoadDefault (ConfigBlockPointer); > + } > + return Status; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.c > new file mode 100644 > index 0000000000..04cf66fd2f > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdate > Lib.c > @@ -0,0 +1,403 @@ > +/** @file > + Boot service DXE ASL update library implementation. > + > + These functions in this file can be called during DXE and cannot be called > during runtime > + or in SMM which should use a RT or SMM library. > + > + This library uses the ACPI Support protocol. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <Base.h> > +#include <Uefi/UefiBaseType.h> > +#include <Uefi/UefiSpec.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > + > +#include <Library/AslUpdateLib.h> > + > +// > +// Function implemenations > +// > +static EFI_ACPI_SDT_PROTOCOL *mAcpiSdt = NULL; > +static EFI_ACPI_TABLE_PROTOCOL *mAcpiTable = NULL; > + > +/** > + Initialize the ASL update library state. > + This must be called prior to invoking other library functions. > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +InitializeAslUpdateLib ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + > + /// > + /// Locate ACPI tables > + /// > + Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **) > &mAcpiSdt); > + ASSERT_EFI_ERROR (Status); > + Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) > &mAcpiTable); > + ASSERT_EFI_ERROR (Status); > + return Status; > +} > + > + > +/** > + This procedure will update immediate value assigned to a Name > + > + @param[in] AslSignature - The signature of Operation Region that we > want to update. > + @param[in] Buffer - source of data to be written over original > aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFI_STATUS > +UpdateNameAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DESCRIPTION_HEADER *Table; > + UINT8 *CurrPtr; > + UINT32 *Signature; > + UINT8 *DsdtPointer; > + UINTN Handle; > + UINT8 DataSize; > + > + if (mAcpiTable == NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiTable == NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Handle = 0; > + Status = LocateAcpiTableBySignature ( > + > EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + (EFI_ACPI_DESCRIPTION_HEADER **) &Table, > + &Handle > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /// > + /// Point to the beginning of the DSDT table > + /// > + CurrPtr = (UINT8 *) Table; > + if (CurrPtr == NULL) { > + return EFI_NOT_FOUND; > + } > + > + /// > + /// Loop through the ASL looking for values that we must fix up. > + /// > + for (DsdtPointer = CurrPtr; DsdtPointer < (CurrPtr + > ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length); DsdtPointer++) { > + /// > + /// Get a pointer to compare for signature > + /// > + Signature = (UINT32 *) DsdtPointer; > + /// > + /// Check if this is the Device Object signature we are looking for > + /// > + if ((*Signature) == AslSignature) { > + /// > + /// Look for Name Encoding > + /// > + if (*(DsdtPointer-1) == AML_NAME_OP) { > + /// > + /// Check if size of new and old data is the same > + /// > + DataSize = *(DsdtPointer+4); > + if ((Length == 1 && DataSize == 0xA) || > + (Length == 2 && DataSize == 0xB) || > + (Length == 4 && DataSize == 0xC)) { > + CopyMem (DsdtPointer+5, Buffer, Length); > + } else if (Length == 1 && ((*(UINT8*) Buffer) == 0 || (*(UINT8*) > Buffer) == > 1) && (DataSize == 0 || DataSize == 1)) { > + CopyMem (DsdtPointer+4, Buffer, Length); > + } else { > + FreePool (Table); > + return EFI_BAD_BUFFER_SIZE; > + } > + Status = mAcpiTable->UninstallAcpiTable ( > + mAcpiTable, > + Handle > + ); > + Handle = 0; > + Status = mAcpiTable->InstallAcpiTable ( > + mAcpiTable, > + Table, > + Table->Length, > + &Handle > + ); > + FreePool (Table); > + return Status; > + } > + } > + } > + return EFI_NOT_FOUND; > +} > + > +/** > + This procedure will update the name of ASL Method > + > + @param[in] AslSignature - The signature of Operation Region that we > want to update. > + @param[in] Buffer - source of data to be written over original > aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFI_STATUS > +UpdateMethodAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DESCRIPTION_HEADER *Table; > + UINT8 *CurrPtr; > + UINT32 *Signature; > + UINT8 *DsdtPointer; > + UINTN Handle; > + > + if (mAcpiTable == NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiTable == NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Handle = 0; > + Status = LocateAcpiTableBySignature ( > + > EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + (EFI_ACPI_DESCRIPTION_HEADER **) &Table, > + &Handle > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /// > + /// Point to the beginning of the DSDT table > + /// > + CurrPtr = (UINT8 *) Table; > + if (CurrPtr == NULL) { > + return EFI_NOT_FOUND; > + } > + > + /// > + /// Loop through the ASL looking for values that we must fix up. > + /// > + for (DsdtPointer = CurrPtr; DsdtPointer < (CurrPtr + > ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length); DsdtPointer++) { > + /// > + /// Get a pointer to compare for signature > + /// > + Signature = (UINT32 *) DsdtPointer; > + /// > + /// Check if this is the Device Object signature we are looking for > + /// > + if ((*Signature) == AslSignature) { > + /// > + /// Look for Name Encoding > + /// > + if ((*(DsdtPointer-3) == AML_METHOD_OP) > + || (*(DsdtPointer-2) == AML_METHOD_OP) > + ) > + { > + CopyMem (DsdtPointer, Buffer, Length); > + Status = mAcpiTable->UninstallAcpiTable ( > + mAcpiTable, > + Handle > + ); > + Handle = 0; > + Status = mAcpiTable->InstallAcpiTable ( > + mAcpiTable, > + Table, > + Table->Length, > + &Handle > + ); > + FreePool (Table); > + return Status; > + } > + } > + } > + return EFI_NOT_FOUND; > +} > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI table. > + It is really only useful for finding tables that only have a single > instance, > + e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc. > + > + @param[in] Signature - Pointer to an ASCII string containing the > OEM Table ID from the ACPI table header > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for the > table found > + @param[in, out] Version - The version of the table desired > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +LocateAcpiTableBySignature ( > + IN UINT32 Signature, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + EFI_STATUS Status; > + INTN Index; > + EFI_ACPI_TABLE_VERSION Version; > + EFI_ACPI_DESCRIPTION_HEADER *OrgTable; > + > + if (mAcpiSdt == NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiSdt == NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Version = 0; > + Index = 0; > + do { > + Status = mAcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER > **)&OrgTable, &Version, Handle); > + if (Status == EFI_NOT_FOUND) { > + break; > + } > + ASSERT_EFI_ERROR (Status); > + Index++; > + } while (OrgTable->Signature != Signature); > + > + if (Status != EFI_NOT_FOUND) { > + *Table = AllocateCopyPool (OrgTable->Length, OrgTable); > + ASSERT (*Table); > + } > + > + /// > + /// If we found the table, there will be no error. > + /// > + return Status; > +} > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI SSDT table. > + > + @param[in] TableId - Pointer to an ASCII string containing the > OEM > Table ID from the ACPI table header > + @param[in] TableIdSize - Length of the TableId to match. Table ID > are > 8 bytes long, this function > + will consider it a match if the first > TableIdSize bytes > match > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for the > table found > + @param[in, out] Version - See AcpiSupport protocol, GetAcpiTable > function for use > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +LocateAcpiTableByOemTableId ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + EFI_STATUS Status; > + INTN Index; > + EFI_ACPI_TABLE_VERSION Version; > + EFI_ACPI_DESCRIPTION_HEADER *OrgTable; > + > + if (mAcpiSdt == NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiSdt == NULL) { > + return EFI_NOT_READY; > + } > + } > + /// > + /// Locate table with matching ID > + /// > + Version = 0; > + Index = 0; > + do { > + Status = mAcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER > **)&OrgTable, &Version, Handle); > + if (Status == EFI_NOT_FOUND) { > + break; > + } > + ASSERT_EFI_ERROR (Status); > + Index++; > + } while (CompareMem (&(OrgTable->OemTableId), TableId, TableIdSize)); > + > + if (Status != EFI_NOT_FOUND) { > + *Table = AllocateCopyPool (OrgTable->Length, OrgTable); > + ASSERT (*Table); > + } > + > + /// > + /// If we found the table, there will be no error. > + /// > + return Status; > +} > + > +/** > + This function calculates and updates an UINT8 checksum. > + > + @param[in] Buffer Pointer to buffer to checksum > + @param[in] Size Number of bytes to checksum > + @param[in] ChecksumOffset Offset to place the checksum result in > + > + @retval EFI_SUCCESS The function completed successfully. > +**/ > +EFI_STATUS > +AcpiChecksum ( > + IN VOID *Buffer, > + IN UINTN Size, > + IN UINTN ChecksumOffset > + ) > +{ > + UINT8 Sum; > + UINT8 *Ptr; > + > + Sum = 0; > + /// > + /// Initialize pointer > + /// > + Ptr = Buffer; > + > + /// > + /// set checksum to 0 first > + /// > + Ptr[ChecksumOffset] = 0; > + > + /// > + /// add all content of buffer > + /// > + while (Size--) { > + Sum = (UINT8) (Sum + (*Ptr++)); > + } > + /// > + /// set checksum > + /// > + Ptr = Buffer; > + Ptr[ChecksumOffset] = (UINT8) (0xff - Sum + 1); > + > + return EFI_SUCCESS; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.c > new file mode 100644 > index 0000000000..a7ce92b7c3 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/DxeAslUpdateLibNull/DxeAslUp > dateLibNull.c > @@ -0,0 +1,126 @@ > +/** @file > + Boot service DXE ASL update library implementation. > + > + These functions in this file can be called during DXE and cannot be called > during runtime > + or in SMM which should use a RT or SMM library. > + > + This library uses the ACPI Support protocol. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <Base.h> > +#include <Uefi/UefiBaseType.h> > +#include <Uefi/UefiSpec.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > + > +#include <Library/AslUpdateLib.h> > + > +// > +// Function implemenations > +// > + > +/** > + Initialize the ASL update library state. > + This must be called prior to invoking other library functions. > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +InitializeAslUpdateLib ( > + VOID > + ) > +{ > + return EFI_SUCCESS; > +} > + > + > +/** > + This procedure will update immediate value assigned to a Name > + > + @param[in] AslSignature - The signature of Operation Region that we > want to update. > + @param[in] Buffer - source of data to be written over original > aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +UpdateNameAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + return EFI_SUCCESS; > +} > + > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI table. > + It is really only useful for finding tables that only have a single > instance, > + e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc. > + > + @param[in] Signature - Pointer to an ASCII string containing the > OEM Table ID from the ACPI table header > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for the > table found > + @param[in, out] Version - The version of the table desired > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +LocateAcpiTableBySignature ( > + IN UINT32 Signature, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI SSDT table. > + > + @param[in] TableId - Pointer to an ASCII string containing the > OEM > Table ID from the ACPI table header > + @param[in] TableIdSize - Length of the TableId to match. Table ID > are > 8 bytes long, this function > + will consider it a match if the first > TableIdSize bytes > match > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for the > table found > + @param[in, out] Version - See AcpiSupport protocol, GetAcpiTable > function for use > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +LocateAcpiTableByOemTableId ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/** > + This function calculates and updates an UINT8 checksum. > + > + @param[in] Buffer Pointer to buffer to checksum > + @param[in] Size Number of bytes to checksum > + @param[in] ChecksumOffset Offset to place the checksum result in > + > + @retval EFI_SUCCESS The function completed successfully. > +**/ > +EFI_STATUS > +AcpiChecksum ( > + IN VOID *Buffer, > + IN UINTN Size, > + IN UINTN ChecksumOffset > + ) > +{ > + return EFI_SUCCESS; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.c > new file mode 100644 > index 0000000000..5085f29d6d > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm > mMmPciLib.c > @@ -0,0 +1,32 @@ > +/** @file > + This file contains routines that get PCI Express Address > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <Library/BaseLib.h> > +#include <Library/PcdLib.h> > +#include <Library/DebugLib.h> > + > +/** > + This procedure will get PCIE address > + > + @param[in] Bus Pci Bus Number > + @param[in] Device Pci Device Number > + @param[in] Function Pci Function Number > + > + @retval PCIE address > +**/ > +UINTN > +MmPciBase ( > + IN UINT32 Bus, > + IN UINT32 Device, > + IN UINT32 Function > + ) > +{ > + ASSERT ((Bus <= 0xFF) && (Device <= 0x1F) && (Function <= 0x7)); > + > + return ((UINTN) PcdGet64 (PcdPciExpressBaseAddress) + (UINTN) (Bus << 20) > + (UINTN) (Device << 15) + (UINTN) (Function << 12)); > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.c > new file mode 100644 > index 0000000000..d462aef407 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiInstallStallPpiLib/PeiStallPpiLi > b.c > @@ -0,0 +1,78 @@ > +/** @file > + Library to install StallPpi. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <Ppi/Stall.h> > +#include <Library/BaseLib.h> > +#include <Library/DebugLib.h> > +#include <Library/TimerLib.h> > +#include <Library/PeiServicesLib.h> > + > +#define PEI_STALL_RESOLUTION 1 > + > +/** > + This function provides a blocking stall for reset at least the given > number of > microseconds > + stipulated in the final argument. > + > + @param PeiServices General purpose services available to every PEIM. > + @param this Pointer to the local data for the interface. > + @param Microseconds number of microseconds for which to stall. > + > + @retval EFI_SUCCESS the function provided at least the required stall. > +**/ > +EFI_STATUS > +EFIAPI > +Stall ( > + IN CONST EFI_PEI_SERVICES **PeiServices, > + IN CONST EFI_PEI_STALL_PPI *This, > + IN UINTN Microseconds > + ); > + > + > +EFI_PEI_STALL_PPI mStallPpi = { > + PEI_STALL_RESOLUTION, > + Stall > +}; > + > +EFI_PEI_PPI_DESCRIPTOR mPeiInstallStallPpi = { > + (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gEfiPeiStallPpiGuid, > + &mStallPpi > +}; > + > +EFI_STATUS > +EFIAPI > +Stall ( > + IN CONST EFI_PEI_SERVICES **PeiServices, > + IN CONST EFI_PEI_STALL_PPI *This, > + IN UINTN Microseconds > + ) > +{ > + MicroSecondDelay (Microseconds); > + return EFI_SUCCESS; > +} > + > +/** > + This function will install the StallPpi. > + > + @retval EFI_SUCCESS if StallPpi is installed successfully. > +**/ > +EFI_STATUS > +EFIAPI > +InstallStallPpi ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + > + DEBUG((DEBUG_INFO, "Installing StallPpi \n")); > + > + Status = PeiServicesInstallPpi (&mPeiInstallStallPpi); > + ASSERT_EFI_ERROR (Status); > + > + return Status; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.c > new file mode 100644 > index 0000000000..de8d9745d3 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLib.c > @@ -0,0 +1,214 @@ > +/** @file > + This file is PeiSiPolicyLib library creates default settings of RC > + Policy and installs RC Policy PPI. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiSiPolicyLibrary.h" > +#include <Library/PcdLib.h> > + > +/** > + Get Si config block table total size. > + > + @retval Size of PCH config block table > +**/ > +UINT16 > +EFIAPI > +SiGetConfigBlockTotalSize ( > + VOID > + ) > +{ > + return (UINT16) sizeof (SI_CONFIG); > +} > + > +EFI_STATUS > +EFIAPI > +LoadSiConfigBlockDefault ( > + IN VOID *ConfigBlockPointer > + ) > +{ > + SI_CONFIG *SiConfig; > + > + SiConfig = ConfigBlockPointer; > + > + DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", > &SiConfig->Header.GuidHob.Name)); > + DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Header.HobLength = > 0x%x\n", SiConfig->Header.GuidHob.Header.HobLength)); > + > + SiConfig->Header.Revision = SI_CONFIG_REVISION; > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS > +EFIAPI > +SiAddConfigBlocks ( > + IN VOID *ConfigBlockTableAddress > + ) > +{ > + VOID *ConfigBlockPointer; > + EFI_STATUS Status; > + CONFIG_BLOCK_HEADER SiBlock; > + > + // > + // Initalize SiBlock > + // > + CopyMem (&(SiBlock.GuidHob.Name), &gSiConfigGuid, sizeof (EFI_GUID)); > + SiBlock.GuidHob.Header.HobLength = sizeof (SI_CONFIG); > + SiBlock.Revision = SI_CONFIG_REVISION; > + // > + // Initialize ConfigBlockPointer > + // > + ConfigBlockPointer = (VOID *)&SiBlock; > + // > + // Add config block fro SiBlock > + // > + DEBUG ((DEBUG_INFO, "gSiConfigGuid = %g\n", &gSiConfigGuid)); > + DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", > &(SiBlock.GuidHob.Name))); > + Status = AddConfigBlock (ConfigBlockTableAddress, (VOID *) > &ConfigBlockPointer); > + ASSERT_EFI_ERROR (Status); > + > + LoadSiConfigBlockDefault ((VOID *) ConfigBlockPointer); > + > + return Status; > +} > + > +/** > + SiCreateConfigBlocks creates the config blocksg of Silicon Policy. > + It allocates and zero out buffer, and fills in the Intel default settings. > + > + @param[out] SiPolicyPpi The pointer to get Silicon Policy PPI > instance > + > + @retval EFI_SUCCESS The policy default is initialized. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer > +**/ > +EFI_STATUS > +EFIAPI > +SiCreateConfigBlocks ( > + OUT SI_POLICY_PPI **SiPolicyPpi > + ) > +{ > + UINT16 TotalBlockSize; > + EFI_STATUS Status; > + SI_POLICY_PPI *SiPolicy; > + UINT16 RequiredSize; > + > + SiPolicy = NULL; > + // > + // TotalBlockSize = Si, Pch, ME, SA and CPU config block size. > + // > + TotalBlockSize = SiGetConfigBlockTotalSize () + > + PchGetConfigBlockTotalSize () + > + MeGetConfigBlockTotalSize () + > + SaGetConfigBlockTotalSize () + > + CpuGetConfigBlockTotalSize (); > + DEBUG ((DEBUG_INFO, "TotalBlockSize = 0x%x\n", TotalBlockSize)); > + > + RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize; > + > + Status = CreateConfigBlockTable (RequiredSize, (VOID *) &SiPolicy); > + ASSERT_EFI_ERROR (Status); > + > + // > + // General initialization > + // > + SiPolicy->TableHeader.Header.Revision = SI_POLICY_REVISION; > + // > + // Add config blocks. > + // > + Status = SiAddConfigBlocks ((VOID *) SiPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = PchAddConfigBlocks ((VOID *) SiPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = MeAddConfigBlocks ((VOID *) SiPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = SaAddConfigBlocks ((VOID *) SiPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = CpuAddConfigBlocks ((VOID *) SiPolicy); > + ASSERT_EFI_ERROR (Status); > + > + // > + // Assignment for returning SaInitPolicy config block base address > + // > + *SiPolicyPpi = SiPolicy; > + return Status; > +} > + > +/** > + Print out all silicon policy information. > + > + @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance > + > + @retval none > +**/ > +VOID > +DumpSiPolicy ( > + IN SI_POLICY_PPI *SiPolicyPpi > + ) > +{ > + // > + // Print SI config blocks and serial out. > + // > + SiPrintPolicyPpi (SiPolicyPpi); > + // > + // Print PCH config blocks and serial out. > + // > + PchPrintPolicyPpi (SiPolicyPpi); > + // > + // Print ME config blocks and serial out. > + // > + MePrintPolicyPpi (SiPolicyPpi); > + // > + // Print SA config blocks and serial out. > + // > + SaPrintPolicyPpi (SiPolicyPpi); > + // > + // Print CPU config block and serial out. > + // > + CpuPrintPolicy (SiPolicyPpi); > +} > + > +/** > + SiInstallPolicyPpi installs SiPolicyPpi. > + While installed, RC assumes the Policy is ready and finalized. So please > update and override > + any setting before calling this function. > + > + @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance > + > + @retval EFI_SUCCESS The policy is installed. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer > +**/ > +EFI_STATUS > +EFIAPI > +SiInstallPolicyPpi ( > + IN SI_POLICY_PPI *SiPolicyPpi > + ) > +{ > + EFI_STATUS Status; > + EFI_PEI_PPI_DESCRIPTOR *SiPolicyPpiDesc; > + SI_CONFIG *SiConfig; > + > + SiPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof > (EFI_PEI_PPI_DESCRIPTOR)); > + if (SiPolicyPpiDesc == NULL) { > + ASSERT (FALSE); > + return EFI_OUT_OF_RESOURCES; > + } > + > + SiPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; > + SiPolicyPpiDesc->Guid = &gSiPolicyPpiGuid; > + SiPolicyPpiDesc->Ppi = SiPolicyPpi; > + Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSiConfigGuid, (VOID *) > &SiConfig); > + ASSERT_EFI_ERROR (Status); > + > + DEBUG ((DEBUG_INFO, "Dump Silicon Policy update by Platform...\n")); > + DumpSiPolicy (SiPolicyPpi); > + > + // > + // Install Silicon Policy PPI > + // > + Status = PeiServicesInstallPpi (SiPolicyPpiDesc); > + ASSERT_EFI_ERROR (Status); > + return Status; > +} > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibPre > Mem.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibPre > Mem.c > new file mode 100644 > index 0000000000..499f895e8e > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/PeiSiPolicyLibPre > Mem.c > @@ -0,0 +1,122 @@ > +/** @file > + This file is PeiSiPolicyLib library creates default settings of RC > + Policy and installs RC Policy PPI. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiSiPolicyLibrary.h" > +#include <Base.h> > + > +/** > + SiCreatePreMemConfigBlocks creates the config blocksg of Silicon PREMEM > Policy. > + It allocates and zero out buffer, and fills in the Intel default settings. > + > + @param[out] SiPreMemPolicyPpi The pointer to get Silicon Policy PPI > instance > + > + @retval EFI_SUCCESS The policy default is initialized. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer > +**/ > +EFI_STATUS > +EFIAPI > +SiCreatePreMemConfigBlocks ( > + OUT SI_PREMEM_POLICY_PPI **SiPreMemPolicyPpi > + ) > +{ > + UINT16 TotalBlockSize; > + EFI_STATUS Status; > + SI_PREMEM_POLICY_PPI *SiPreMemPolicy; > + UINT16 RequiredSize; > + > + SiPreMemPolicy = NULL; > + // > + // TotalBlockSize = Pch , SA, ME and CPU config block size. > + // > + TotalBlockSize = PchGetPreMemConfigBlockTotalSize () + > + MeGetConfigBlockTotalSizePreMem () + > + SaGetConfigBlockTotalSizePreMem () + > + CpuGetPreMemConfigBlockTotalSize (); > + DEBUG ((DEBUG_INFO, "TotalBlockSize = 0x%x\n", TotalBlockSize)); > + > + RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize; > + > + Status = CreateConfigBlockTable (RequiredSize, (VOID *)&SiPreMemPolicy); > + ASSERT_EFI_ERROR (Status); > + > + // > + // General initialization > + // > + SiPreMemPolicy->TableHeader.Header.Revision = > SI_PREMEM_POLICY_REVISION; > + // > + // Add config blocks. > + // > + Status = PchAddPreMemConfigBlocks ((VOID *) SiPreMemPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = MeAddConfigBlocksPreMem ((VOID *) SiPreMemPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = SaAddConfigBlocksPreMem ((VOID *) SiPreMemPolicy); > + ASSERT_EFI_ERROR (Status); > + Status = CpuAddPreMemConfigBlocks ((VOID *) SiPreMemPolicy); > + ASSERT_EFI_ERROR (Status); > + // > + // Assignment for returning SaInitPolicy config block base address > + // > + *SiPreMemPolicyPpi = SiPreMemPolicy; > + return Status; > +} > + > +/** > + SiPreMemInstallPolicyPpi installs SiPreMemPolicyPpi. > + While installed, RC assumes the Policy is ready and finalized. So please > update and override > + any setting before calling this function. > + > + @param[in] SiPreMemPolicyPpi The pointer to Silicon Policy PPI instance > + > + @retval EFI_SUCCESS The policy is installed. > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer > +**/ > +EFI_STATUS > +EFIAPI > +SiPreMemInstallPolicyPpi ( > + IN SI_PREMEM_POLICY_PPI *SiPolicyPreMemPpi > + ) > +{ > + EFI_STATUS Status; > + EFI_PEI_PPI_DESCRIPTOR *SiPolicyPreMemPpiDesc; > + > + SiPolicyPreMemPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool > (sizeof (EFI_PEI_PPI_DESCRIPTOR)); > + if (SiPolicyPreMemPpiDesc == NULL) { > + ASSERT (FALSE); > + return EFI_OUT_OF_RESOURCES; > + } > + > + SiPolicyPreMemPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; > + SiPolicyPreMemPpiDesc->Guid = &gSiPreMemPolicyPpiGuid; > + SiPolicyPreMemPpiDesc->Ppi = SiPolicyPreMemPpi; > + > + // > + // Print whole PCH_POLICY_PPI and serial out. > + // > + PchPreMemPrintPolicyPpi (SiPolicyPreMemPpi); > + // > + // Print ME config blocks and serial out. > + // > + MePrintPolicyPpiPreMem (SiPolicyPreMemPpi); > + // > + // Print whole SI_POLICY_PPI and serial out. > + // > + SaPrintPolicyPpiPreMem (SiPolicyPreMemPpi); > + // > + // Print whole CPU of SI_PREMEM_POLICY_PPI and serial out. > + // > + CpuPreMemPrintPolicy (SiPolicyPreMemPpi); > + // > + // Install Silicon Policy PPI > + // > + Status = PeiServicesInstallPpi (SiPolicyPreMemPpiDesc); > + ASSERT_EFI_ERROR (Status); > + return Status; > +} > + > diff --git > a/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/SiPrintPolicy.c > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/SiPrintPolicy.c > new file mode 100644 > index 0000000000..cf7e1b2308 > --- /dev/null > +++ > b/Silicon/Intel/CoffeelakeSiliconPkg/Library/PeiSiPolicyLib/SiPrintPolicy.c > @@ -0,0 +1,36 @@ > +/** @file > + This file is PeiSiPolicyLib library for printing Policy settings. > + > + Copyright (c) 2019 Intel Corporation. All rights reserved. <BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "PeiSiPolicyLibrary.h" > + > +/** > + Print whole SI_POLICY_PPI and serial out. > + > + @param[in] SiPolicyPpi The RC Policy PPI instance > +**/ > +VOID > +EFIAPI > +SiPrintPolicyPpi ( > + IN SI_POLICY_PPI *SiPolicyPpi > + ) > +{ > + DEBUG_CODE_BEGIN (); > + SI_CONFIG *SiConfig; > + EFI_STATUS Status; > + > + Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSiConfigGuid, (VOID *) > &SiConfig); > + ASSERT_EFI_ERROR (Status); > + > + DEBUG ((DEBUG_INFO, "------------------------ Silicon Print Policy Start > ------------------------\n")); > + DEBUG ((DEBUG_INFO, " CsmFlag= %x\n", SiConfig->CsmFlag)); > + DEBUG ((DEBUG_INFO, " TraceHubMemBase = 0x%08x\n", > SiConfig->TraceHubMemBase)); > + > + DEBUG ((DEBUG_INFO, "------------------------ Silicon Print Policy End > --------------------------\n")); > + DEBUG_CODE_END (); > +} > + > -- > 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#45977): https://edk2.groups.io/g/devel/message/45977 Mute This Topic: https://groups.io/mt/32918183/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-