/** @file
This file is PeiSiPolicyLib library creates default settings of RC
Policy and installs RC Policy PPI.
Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PeiSiPolicyLibrary.h"
#include
#include
/**
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;
}