PeiSiPolicyLibPreMem.c 4.9 KB

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