PeiFspMiscUpdUpdateLib.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /** @file
  2. Implementation of Fsp Misc UPD Initialization.
  3. Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <PiPei.h>
  7. #include <Library/DebugLib.h>
  8. #include <Library/PeiLib.h>
  9. #include <Library/ConfigBlockLib.h>
  10. #include <Library/PeiServicesLib.h>
  11. #include <FspEas.h>
  12. #include <FspmUpd.h>
  13. #include <FspsUpd.h>
  14. #include <Library/MemoryAllocationLib.h>
  15. #include <Library/DebugLib.h>
  16. #include <Library/DebugPrintErrorLevelLib.h>
  17. #include <Library/PciLib.h>
  18. #include <Ppi/ReadOnlyVariable2.h>
  19. #include <Guid/MemoryOverwriteControl.h>
  20. #include <PchAccess.h>
  21. #include "PeiMiscPolicyUpdate.h"
  22. /**
  23. Performs FSP Misc UPD initialization.
  24. @param[in,out] FspmUpd Pointer to FSPM_UPD Data.
  25. @retval EFI_SUCCESS FSP UPD Data is updated.
  26. @retval EFI_NOT_FOUND An instance of gEfiPeiReadOnlyVariable2PpiGuid
  27. could not be located.
  28. @retval EFI_OUT_OF_RESOURCES Insufficent resources to allocate a memory buffer.
  29. **/
  30. EFI_STATUS
  31. EFIAPI
  32. PeiFspMiscUpdUpdatePreMem (
  33. IN OUT FSPM_UPD *FspmUpd
  34. )
  35. {
  36. EFI_STATUS Status;
  37. EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices;
  38. UINTN VariableSize;
  39. VOID *MemorySavedData;
  40. Status = PeiServicesLocatePpi (
  41. &gEfiPeiReadOnlyVariable2PpiGuid,
  42. 0,
  43. NULL,
  44. (VOID **) &VariableServices
  45. );
  46. if (EFI_ERROR (Status)) {
  47. ASSERT_EFI_ERROR (Status);
  48. return Status;
  49. }
  50. VariableSize = 0;
  51. MemorySavedData = NULL;
  52. Status = VariableServices->GetVariable (
  53. VariableServices,
  54. L"MemoryConfig",
  55. &gFspNonVolatileStorageHobGuid,
  56. NULL,
  57. &VariableSize,
  58. MemorySavedData
  59. );
  60. if (Status == EFI_BUFFER_TOO_SMALL) {
  61. MemorySavedData = AllocatePool (VariableSize);
  62. if (MemorySavedData == NULL) {
  63. ASSERT (MemorySavedData != NULL);
  64. return EFI_OUT_OF_RESOURCES;
  65. }
  66. DEBUG ((DEBUG_INFO, "VariableSize is 0x%x\n", VariableSize));
  67. Status = VariableServices->GetVariable (
  68. VariableServices,
  69. L"MemoryConfig",
  70. &gFspNonVolatileStorageHobGuid,
  71. NULL,
  72. &VariableSize,
  73. MemorySavedData
  74. );
  75. if (Status == EFI_SUCCESS) {
  76. FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData;
  77. } else {
  78. DEBUG ((DEBUG_ERROR, "Fail to retrieve Variable:\"MemoryConfig\" gMemoryConfigVariableGuid, Status = %r\n", Status));
  79. ASSERT_EFI_ERROR (Status);
  80. }
  81. }
  82. FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData;
  83. return EFI_SUCCESS;
  84. }