PeiSiPolicyLib.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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 <Library/PcdLib.h>
  9. #include <Library/ConfigBlockLib.h>
  10. /**
  11. Get Si config block table total size.
  12. @retval Size of PCH config block table
  13. **/
  14. UINT16
  15. EFIAPI
  16. SiGetConfigBlockTotalSize (
  17. VOID
  18. )
  19. {
  20. return (UINT16) sizeof (SI_CONFIG);
  21. }
  22. EFI_STATUS
  23. EFIAPI
  24. LoadSiConfigBlockDefault (
  25. IN VOID *ConfigBlockPointer
  26. )
  27. {
  28. SI_CONFIG *SiConfig;
  29. SiConfig = ConfigBlockPointer;
  30. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", &SiConfig->Header.GuidHob.Name));
  31. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Header.HobLength = 0x%x\n", SiConfig->Header.GuidHob.Header.HobLength));
  32. SiConfig->Header.Revision = SI_CONFIG_REVISION;
  33. return EFI_SUCCESS;
  34. }
  35. EFI_STATUS
  36. EFIAPI
  37. SiAddConfigBlocks (
  38. IN VOID *ConfigBlockTableAddress
  39. )
  40. {
  41. VOID *ConfigBlockPointer;
  42. EFI_STATUS Status;
  43. CONFIG_BLOCK_HEADER SiBlock;
  44. //
  45. // Initalize SiBlock
  46. //
  47. CopyMem (&(SiBlock.GuidHob.Name), &gSiConfigGuid, sizeof (EFI_GUID));
  48. SiBlock.GuidHob.Header.HobLength = sizeof (SI_CONFIG);
  49. SiBlock.Revision = SI_CONFIG_REVISION;
  50. //
  51. // Initialize ConfigBlockPointer
  52. //
  53. ConfigBlockPointer = (VOID *)&SiBlock;
  54. //
  55. // Add config block fro SiBlock
  56. //
  57. DEBUG ((DEBUG_INFO, "gSiConfigGuid = %g\n", &gSiConfigGuid));
  58. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", &(SiBlock.GuidHob.Name)));
  59. Status = AddConfigBlock (ConfigBlockTableAddress, (VOID *) &ConfigBlockPointer);
  60. ASSERT_EFI_ERROR (Status);
  61. LoadSiConfigBlockDefault ((VOID *) ConfigBlockPointer);
  62. return Status;
  63. }
  64. /**
  65. SiCreateConfigBlocks creates the config blocksg of Silicon Policy.
  66. It allocates and zero out buffer, and fills in the Intel default settings.
  67. @param[out] SiPolicyPpi The pointer to get Silicon Policy PPI instance
  68. @retval EFI_SUCCESS The policy default is initialized.
  69. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  70. **/
  71. EFI_STATUS
  72. EFIAPI
  73. SiCreateConfigBlocks (
  74. OUT SI_POLICY_PPI **SiPolicyPpi
  75. )
  76. {
  77. UINT16 TotalBlockSize;
  78. EFI_STATUS Status;
  79. SI_POLICY_PPI *SiPolicy;
  80. UINT16 RequiredSize;
  81. SiPolicy = NULL;
  82. //
  83. // TotalBlockSize = Si, Pch, ME, SA and CPU config block size.
  84. //
  85. TotalBlockSize = SiGetConfigBlockTotalSize () +
  86. PchGetConfigBlockTotalSize () +
  87. MeGetConfigBlockTotalSize () +
  88. SaGetConfigBlockTotalSize () +
  89. CpuGetConfigBlockTotalSize ();
  90. DEBUG ((DEBUG_INFO, "TotalBlockSize = 0x%x\n", TotalBlockSize));
  91. RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize;
  92. Status = CreateConfigBlockTable (RequiredSize, (VOID *) &SiPolicy);
  93. ASSERT_EFI_ERROR (Status);
  94. //
  95. // General initialization
  96. //
  97. SiPolicy->TableHeader.Header.Revision = SI_POLICY_REVISION;
  98. //
  99. // Add config blocks.
  100. //
  101. Status = SiAddConfigBlocks ((VOID *) SiPolicy);
  102. ASSERT_EFI_ERROR (Status);
  103. Status = PchAddConfigBlocks ((VOID *) SiPolicy);
  104. ASSERT_EFI_ERROR (Status);
  105. Status = MeAddConfigBlocks ((VOID *) SiPolicy);
  106. ASSERT_EFI_ERROR (Status);
  107. Status = SaAddConfigBlocks ((VOID *) SiPolicy);
  108. ASSERT_EFI_ERROR (Status);
  109. Status = CpuAddConfigBlocks ((VOID *) SiPolicy);
  110. ASSERT_EFI_ERROR (Status);
  111. //
  112. // Assignment for returning SaInitPolicy config block base address
  113. //
  114. *SiPolicyPpi = SiPolicy;
  115. return Status;
  116. }
  117. /**
  118. Print out all silicon policy information.
  119. @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance
  120. @retval none
  121. **/
  122. VOID
  123. DumpSiPolicy (
  124. IN SI_POLICY_PPI *SiPolicyPpi
  125. )
  126. {
  127. //
  128. // Print SI config blocks and serial out.
  129. //
  130. SiPrintPolicyPpi (SiPolicyPpi);
  131. //
  132. // Print PCH config blocks and serial out.
  133. //
  134. PchPrintPolicyPpi (SiPolicyPpi);
  135. //
  136. // Print ME config blocks and serial out.
  137. //
  138. MePrintPolicyPpi (SiPolicyPpi);
  139. //
  140. // Print SA config blocks and serial out.
  141. //
  142. SaPrintPolicyPpi (SiPolicyPpi);
  143. //
  144. // Print CPU config block and serial out.
  145. //
  146. CpuPrintPolicy (SiPolicyPpi);
  147. }
  148. /**
  149. SiInstallPolicyPpi installs SiPolicyPpi.
  150. While installed, RC assumes the Policy is ready and finalized. So please update and override
  151. any setting before calling this function.
  152. @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance
  153. @retval EFI_SUCCESS The policy is installed.
  154. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  155. **/
  156. EFI_STATUS
  157. EFIAPI
  158. SiInstallPolicyPpi (
  159. IN SI_POLICY_PPI *SiPolicyPpi
  160. )
  161. {
  162. EFI_STATUS Status;
  163. EFI_PEI_PPI_DESCRIPTOR *SiPolicyPpiDesc;
  164. SI_CONFIG *SiConfig;
  165. SiPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
  166. if (SiPolicyPpiDesc == NULL) {
  167. ASSERT (FALSE);
  168. return EFI_OUT_OF_RESOURCES;
  169. }
  170. SiPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  171. SiPolicyPpiDesc->Guid = &gSiPolicyPpiGuid;
  172. SiPolicyPpiDesc->Ppi = SiPolicyPpi;
  173. Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSiConfigGuid, (VOID *) &SiConfig);
  174. ASSERT_EFI_ERROR (Status);
  175. DEBUG ((DEBUG_INFO, "Dump Silicon Policy update by Platform...\n"));
  176. DumpSiPolicy (SiPolicyPpi);
  177. //
  178. // Install Silicon Policy PPI
  179. //
  180. Status = PeiServicesInstallPpi (SiPolicyPpiDesc);
  181. ASSERT_EFI_ERROR (Status);
  182. return Status;
  183. }