/** @file This file is PeiSiPolicyLib library creates default settings of RC Policy and installs RC Policy PPI. Copyright (c) 2017 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "PeiSiPolicyLibrary.h" #include /** 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. @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; // // Install Silicon Policy PPI // Status = PeiServicesInstallPpi (SiPolicyPreMemPpiDesc); ASSERT_EFI_ERROR (Status); return Status; } /** SiPreMemInstallPolicyReadyPpi installs SiPreMemPolicyReadyPpi. While installed, RC assumes the Policy is ready and finalized. So please update and override any setting before calling this function. @retval EFI_SUCCESS The policy is installed. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer **/ EFI_STATUS EFIAPI SiPreMemInstallPolicyReadyPpi ( VOID ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *SiPolicyPreMemPpiDesc; SI_PREMEM_POLICY_PPI *SiPolicyPreMemPpi; 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 = &gSiPreMemPolicyReadyPpiGuid; SiPolicyPreMemPpiDesc->Ppi = NULL; Status = PeiServicesLocatePpi ( &gSiPreMemPolicyPpiGuid, 0, NULL, (VOID **)&SiPolicyPreMemPpi ); ASSERT_EFI_ERROR (Status); // // 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 PreMem Silicon Policy Ready PPI // Status = PeiServicesInstallPpi (SiPolicyPreMemPpiDesc); ASSERT_EFI_ERROR (Status); return Status; }