/** @file Implementation of Fsp Misc UPD Initialization. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PeiMiscPolicyUpdate.h" /** Performs FSP Misc UPD initialization. @param[in,out] FspmUpd Pointer to FSPM_UPD Data. @retval EFI_SUCCESS FSP UPD Data is updated. @retval EFI_NOT_FOUND An instance of gEfiPeiReadOnlyVariable2PpiGuid could not be located. @retval EFI_OUT_OF_RESOURCES Insufficent resources to allocate a memory buffer. **/ EFI_STATUS EFIAPI PeiFspMiscUpdUpdatePreMem ( IN OUT FSPM_UPD *FspmUpd ) { EFI_STATUS Status; EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices; UINTN VariableSize; VOID *MemorySavedData; Status = PeiServicesLocatePpi ( &gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariableServices ); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return Status; } VariableSize = 0; MemorySavedData = NULL; Status = VariableServices->GetVariable ( VariableServices, L"MemoryConfig", &gFspNonVolatileStorageHobGuid, NULL, &VariableSize, MemorySavedData ); if (Status == EFI_BUFFER_TOO_SMALL) { MemorySavedData = AllocatePool (VariableSize); if (MemorySavedData == NULL) { ASSERT (MemorySavedData != NULL); return EFI_OUT_OF_RESOURCES; } DEBUG ((DEBUG_INFO, "VariableSize is 0x%x\n", VariableSize)); Status = VariableServices->GetVariable ( VariableServices, L"MemoryConfig", &gFspNonVolatileStorageHobGuid, NULL, &VariableSize, MemorySavedData ); if (Status == EFI_SUCCESS) { FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData; } else { DEBUG ((DEBUG_ERROR, "Fail to retrieve Variable:\"MemoryConfig\" gMemoryConfigVariableGuid, Status = %r\n", Status)); ASSERT_EFI_ERROR (Status); } } FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData; return EFI_SUCCESS; }