/** @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;
}