/** @file Instance of Fsp Policy Initialization Library. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include VOID EFIAPI FspPolicyInitPreMem( IN FSPM_UPD *FspmUpdDataPtr ); VOID * EFIAPI SiliconPolicyInitPreMem( IN OUT VOID *FspmUpd ) { DEBUG ((DEBUG_INFO, "FspmUpd - 0x%x\n", FspmUpd)); FspPolicyInitPreMem ((FSPM_UPD *) FspmUpd); return FspmUpd; } /** 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 *SiPolicyReadyPreMemPpiDesc; SiPolicyReadyPreMemPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (SiPolicyReadyPreMemPpiDesc == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } SiPolicyReadyPreMemPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; SiPolicyReadyPreMemPpiDesc->Guid = &gSiPreMemPolicyReadyPpiGuid; SiPolicyReadyPreMemPpiDesc->Ppi = NULL; // // Install PreMem Silicon Policy Ready PPI // Status = PeiServicesInstallPpi (SiPolicyReadyPreMemPpiDesc); ASSERT_EFI_ERROR (Status); return Status; } RETURN_STATUS EFIAPI SiliconPolicyDonePreMem( IN VOID *FspmUpd ) { EFI_STATUS Status; #if FixedPcdGet8(PcdFspModeSelection) == 0 FSPM_ARCH_CONFIG_PPI *FspmArchConfigPpi; EFI_PEI_PPI_DESCRIPTOR *FspmArchConfigPpiDesc; FspmArchConfigPpi = (FSPM_ARCH_CONFIG_PPI *) AllocateZeroPool (sizeof (FSPM_ARCH_CONFIG_PPI)); if (FspmArchConfigPpi == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } FspmArchConfigPpi->Revision = 1; FspmArchConfigPpi->NvsBufferPtr = NULL; FspmArchConfigPpi->BootLoaderTolumSize = 0; FspmArchConfigPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (FspmArchConfigPpiDesc == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } FspmArchConfigPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; FspmArchConfigPpiDesc->Guid = &gFspmArchConfigPpiGuid; FspmArchConfigPpiDesc->Ppi = FspmArchConfigPpi; // // Install FSP-M Arch Config PPI // Status = PeiServicesInstallPpi (FspmArchConfigPpiDesc); ASSERT_EFI_ERROR (Status); #endif // // Install Policy Ready PPI // While installed, RC assumes the Policy is ready and finalized. So please // update and override any setting before calling this function. // Status = SiPreMemInstallPolicyReadyPpi (); ASSERT_EFI_ERROR (Status); DEBUG ((DEBUG_INFO, "Silicon PEI Policy Initialization Done in Pre-Memory\n")); return Status; } /** Performs FSP PEI Policy Pre-memory initialization. @param[in] FspmUpdDataPtr Pointer to FSPM UPD data. **/ VOID EFIAPI FspPolicyInitPreMem ( IN FSPM_UPD *FspmUpdDataPtr ) { EFI_STATUS Status; // // PCH Pei Fsp Policy Initialization // Status = PeiFspPchPolicyInitPreMem (FspmUpdDataPtr); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - PCH Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status)); } // // Cpu Pei Fsp Policy Initialization // Status = PeiFspCpuPolicyInitPreMem (FspmUpdDataPtr); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - CPU Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status)); } // // Security Pei Fsp Policy Initialization // Status = PeiFspSecurityPolicyInitPreMem (FspmUpdDataPtr); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - Security Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status)); } // // ME Pei Fsp Policy Initialization // Status = PeiFspMePolicyInitPreMem (FspmUpdDataPtr); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - ME Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status)); } // // SystemAgent Pei Fsp Policy Initialization // Status = PeiFspSaPolicyInitPreMem (FspmUpdDataPtr); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - SystemAgent Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status)); } // // Other Upd Initialization // Status = PeiFspMiscUpdInitPreMem (FspmUpdDataPtr); } /** Performs FSP PEI Policy initialization. @param[in][out] FspsUpd Pointer UPD data region **/ VOID EFIAPI FspPolicyInit ( IN OUT FSPS_UPD *FspsUpd ) { EFI_STATUS Status; // // PCH Pei Fsp Policy Initialization // Status = PeiFspPchPolicyInit (FspsUpd); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - PCH Pei Fsp Policy iInitialization fail, Status = %r\n", Status)); } // // ME Pei Fsp Policy Initialization // Status = PeiFspMePolicyInit (FspsUpd); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - ME Pei Fsp Policy Initialization fail, Status = %r\n", Status)); } // // SystemAgent Pei Fsp Policy Initialization // Status = PeiFspSaPolicyInit (FspsUpd); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "ERROR - SystemAgent Pei Fsp Policy Initialization fail, Status = %r\n", Status)); } // // Security Pei Fsp Policy Initialization // Status = PeiFspSecurityPolicyInit(FspsUpd); if (EFI_ERROR(Status)) { DEBUG((DEBUG_ERROR, "ERROR - Security Pei Fsp Policy Initialization fail, Status = %r\n", Status)); } } /** Performs silicon post-mem policy initialization. The meaning of Policy is defined by silicon code. It could be the raw data, a handle, a PPI, etc. The returned data must be used as input data for SiliconPolicyDonePostMem(), and SiliconPolicyUpdateLib.SiliconPolicyUpdatePostMem(). 1) In FSP path, the input Policy should be FspsUpd. Value of FspsUpd has been initialized by FSP binary default value. Only a subset of FspsUpd needs to be updated for different silicon sku. The return data is same FspsUpd. 2) In non-FSP path, the input policy could be NULL. The return data is the initialized policy. @param[in, out] Policy Pointer to policy. @return the initialized policy. **/ VOID * EFIAPI SiliconPolicyInitPostMem( IN OUT VOID *FspsUpd ) { DEBUG ((DEBUG_INFO, "FspsUpd - 0x%x\n", FspsUpd)); FspPolicyInit ((FSPS_UPD *) FspsUpd); return FspsUpd; } /** SiInstallPolicyReadyPpi installs SiPolicyReadyPpi. 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 SiInstallPolicyReadyPpi ( VOID ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *SiPolicyReadyPpiDesc; SiPolicyReadyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); if (SiPolicyReadyPpiDesc == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } SiPolicyReadyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; SiPolicyReadyPpiDesc->Guid = &gSiPolicyReadyPpiGuid; SiPolicyReadyPpiDesc->Ppi = NULL; // // Install Silicon Policy Ready PPI // Status = PeiServicesInstallPpi (SiPolicyReadyPpiDesc); ASSERT_EFI_ERROR (Status); return Status; } /* The silicon post-mem policy is finalized. Silicon code can do initialization based upon the policy data. The input Policy must be returned by SiliconPolicyInitPostMem(). @param[in] Policy Pointer to policy. @retval EFI_SUCCESS The policy is handled consumed by silicon code. */ EFI_STATUS EFIAPI SiliconPolicyDonePostMem( IN OUT VOID *FspsUpd ) { SiInstallPolicyReadyPpi(); return EFI_SUCCESS; }