PeiSiPolicyLibPreMem.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /** @file
  2. This file is PeiSiPolicyLib library creates default settings of RC
  3. Policy and installs RC Policy PPI.
  4. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved. <BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include "PeiSiPolicyLibrary.h"
  8. #include <Base.h>
  9. #include <Library/ConfigBlockLib.h>
  10. /**
  11. SiCreatePreMemConfigBlocks creates the config blocksg of Silicon PREMEM Policy.
  12. It allocates and zero out buffer, and fills in the Intel default settings.
  13. @param[out] SiPreMemPolicyPpi The pointer to get Silicon Policy PPI instance
  14. @retval EFI_SUCCESS The policy default is initialized.
  15. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  16. **/
  17. EFI_STATUS
  18. EFIAPI
  19. SiCreatePreMemConfigBlocks (
  20. OUT SI_PREMEM_POLICY_PPI **SiPreMemPolicyPpi
  21. )
  22. {
  23. UINT16 TotalBlockSize;
  24. EFI_STATUS Status;
  25. SI_PREMEM_POLICY_PPI *SiPreMemPolicy;
  26. UINT16 RequiredSize;
  27. SiPreMemPolicy = NULL;
  28. //
  29. // TotalBlockSize = Pch , SA, ME and CPU config block size.
  30. //
  31. TotalBlockSize = PchGetPreMemConfigBlockTotalSize () +
  32. MeGetConfigBlockTotalSizePreMem () +
  33. SaGetConfigBlockTotalSizePreMem () +
  34. CpuGetPreMemConfigBlockTotalSize ();
  35. DEBUG ((DEBUG_INFO, "TotalBlockSize = 0x%x\n", TotalBlockSize));
  36. RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize;
  37. Status = CreateConfigBlockTable (RequiredSize, (VOID *)&SiPreMemPolicy);
  38. ASSERT_EFI_ERROR (Status);
  39. //
  40. // General initialization
  41. //
  42. SiPreMemPolicy->TableHeader.Header.Revision = SI_PREMEM_POLICY_REVISION;
  43. //
  44. // Add config blocks.
  45. //
  46. Status = PchAddPreMemConfigBlocks ((VOID *) SiPreMemPolicy);
  47. ASSERT_EFI_ERROR (Status);
  48. Status = MeAddConfigBlocksPreMem ((VOID *) SiPreMemPolicy);
  49. ASSERT_EFI_ERROR (Status);
  50. Status = SaAddConfigBlocksPreMem ((VOID *) SiPreMemPolicy);
  51. ASSERT_EFI_ERROR (Status);
  52. Status = CpuAddPreMemConfigBlocks ((VOID *) SiPreMemPolicy);
  53. ASSERT_EFI_ERROR (Status);
  54. //
  55. // Assignment for returning SaInitPolicy config block base address
  56. //
  57. *SiPreMemPolicyPpi = SiPreMemPolicy;
  58. return Status;
  59. }
  60. /**
  61. SiPreMemInstallPolicyPpi installs SiPreMemPolicyPpi.
  62. While installed, RC assumes the Policy is ready and finalized. So please update and override
  63. any setting before calling this function.
  64. @param[in] SiPreMemPolicyPpi The pointer to Silicon Policy PPI instance
  65. @retval EFI_SUCCESS The policy is installed.
  66. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  67. **/
  68. EFI_STATUS
  69. EFIAPI
  70. SiPreMemInstallPolicyPpi (
  71. IN SI_PREMEM_POLICY_PPI *SiPolicyPreMemPpi
  72. )
  73. {
  74. EFI_STATUS Status;
  75. EFI_PEI_PPI_DESCRIPTOR *SiPolicyPreMemPpiDesc;
  76. SiPolicyPreMemPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
  77. if (SiPolicyPreMemPpiDesc == NULL) {
  78. ASSERT (FALSE);
  79. return EFI_OUT_OF_RESOURCES;
  80. }
  81. SiPolicyPreMemPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  82. SiPolicyPreMemPpiDesc->Guid = &gSiPreMemPolicyPpiGuid;
  83. SiPolicyPreMemPpiDesc->Ppi = SiPolicyPreMemPpi;
  84. //
  85. // Print whole PCH_POLICY_PPI and serial out.
  86. //
  87. PchPreMemPrintPolicyPpi (SiPolicyPreMemPpi);
  88. //
  89. // Print ME config blocks and serial out.
  90. //
  91. MePrintPolicyPpiPreMem (SiPolicyPreMemPpi);
  92. //
  93. // Print whole SI_POLICY_PPI and serial out.
  94. //
  95. SaPrintPolicyPpiPreMem (SiPolicyPreMemPpi);
  96. //
  97. // Print whole CPU of SI_PREMEM_POLICY_PPI and serial out.
  98. //
  99. CpuPreMemPrintPolicy (SiPolicyPreMemPpi);
  100. //
  101. // Install Silicon Policy PPI
  102. //
  103. Status = PeiServicesInstallPpi (SiPolicyPreMemPpiDesc);
  104. ASSERT_EFI_ERROR (Status);
  105. return Status;
  106. }