PeiSiPolicyLib.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. #include <Library/PcdLib.h>
  9. /**
  10. Get Si config block table total size.
  11. @retval Size of PCH config block table
  12. **/
  13. UINT16
  14. EFIAPI
  15. SiGetConfigBlockTotalSize (
  16. VOID
  17. )
  18. {
  19. return (UINT16) sizeof (SI_CONFIG);
  20. }
  21. EFI_STATUS
  22. EFIAPI
  23. LoadSiConfigBlockDefault (
  24. IN VOID *ConfigBlockPointer
  25. )
  26. {
  27. SI_CONFIG *SiConfig;
  28. SiConfig = ConfigBlockPointer;
  29. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", &SiConfig->Header.GuidHob.Name));
  30. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Header.HobLength = 0x%x\n", SiConfig->Header.GuidHob.Header.HobLength));
  31. SiConfig->Header.Revision = SI_CONFIG_REVISION;
  32. //
  33. // Temporary Bus range for silicon initialization.
  34. //
  35. SiConfig->TempPciBusMin = 2;
  36. SiConfig->TempPciBusMax = 10;
  37. //
  38. // Temporary Memory Base Address for PCI devices to be used to initialize MMIO registers.
  39. // Minimum size is 2MB bytes.
  40. //
  41. SiConfig->TempMemBaseAddr = TEMP_MEM_BASE_ADDRESS;
  42. SiConfig->TempMemSize = TEMP_MEM_SIZE;
  43. //
  44. // Temporary IO Base Address for PCI devices to be used to initialize IO registers.
  45. // And size of temporary IO space.
  46. //
  47. SiConfig->TempIoBaseAddr = TEMP_IO_BASE_ADDRESS;
  48. SiConfig->TempIoSize = TEMP_IO_SIZE;
  49. //
  50. // Check PcdSiCsmEnable to set CSM flag.
  51. //
  52. if (PcdGetBool (PcdSiCsmEnable)) {
  53. SiConfig->CsmFlag = 1;
  54. } else {
  55. SiConfig->CsmFlag = 0;
  56. }
  57. return EFI_SUCCESS;
  58. }
  59. EFI_STATUS
  60. EFIAPI
  61. SiAddConfigBlocks (
  62. IN VOID *ConfigBlockTableAddress
  63. )
  64. {
  65. VOID *ConfigBlockPointer;
  66. EFI_STATUS Status;
  67. CONFIG_BLOCK_HEADER SiBlock;
  68. //
  69. // Initalize SiBlock
  70. //
  71. CopyMem (&(SiBlock.GuidHob.Name), &gSiConfigGuid, sizeof (EFI_GUID));
  72. SiBlock.GuidHob.Header.HobLength = sizeof (SI_CONFIG);
  73. SiBlock.Revision = SI_CONFIG_REVISION;
  74. //
  75. // Initialize ConfigBlockPointer
  76. //
  77. ConfigBlockPointer = (VOID *)&SiBlock;
  78. //
  79. // Add config block fro SiBlock
  80. //
  81. DEBUG ((DEBUG_INFO, "gSiConfigGuid = %g\n", &gSiConfigGuid));
  82. DEBUG ((DEBUG_INFO, "SiConfig->Header.GuidHob.Name = %g\n", &(SiBlock.GuidHob.Name)));
  83. Status = AddConfigBlock (ConfigBlockTableAddress, (VOID *) &ConfigBlockPointer);
  84. ASSERT_EFI_ERROR (Status);
  85. LoadSiConfigBlockDefault ((VOID *) ConfigBlockPointer);
  86. return Status;
  87. }
  88. /**
  89. SiCreateConfigBlocks creates the config blocksg of Silicon Policy.
  90. It allocates and zero out buffer, and fills in the Intel default settings.
  91. @param[out] SiPolicyPpi The pointer to get Silicon Policy PPI instance
  92. @retval EFI_SUCCESS The policy default is initialized.
  93. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  94. **/
  95. EFI_STATUS
  96. EFIAPI
  97. SiCreateConfigBlocks (
  98. OUT SI_POLICY_PPI **SiPolicyPpi
  99. )
  100. {
  101. UINT16 TotalBlockSize;
  102. EFI_STATUS Status;
  103. SI_POLICY_PPI *SiPolicy;
  104. UINT16 RequiredSize;
  105. SiPolicy = NULL;
  106. //
  107. // TotalBlockSize = Si, Pch, AMT, ME, SA and CPU config block size.
  108. //
  109. TotalBlockSize = SiGetConfigBlockTotalSize () +
  110. PchGetConfigBlockTotalSize () +
  111. MeGetConfigBlockTotalSize () +
  112. SaGetConfigBlockTotalSize () +
  113. CpuGetConfigBlockTotalSize ();
  114. DEBUG ((DEBUG_INFO, "TotalBlockSize = 0x%x\n", TotalBlockSize));
  115. RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize;
  116. Status = CreateConfigBlockTable (RequiredSize, (VOID *) &SiPolicy);
  117. ASSERT_EFI_ERROR (Status);
  118. //
  119. // General initialization
  120. //
  121. SiPolicy->TableHeader.Header.Revision = SI_POLICY_REVISION;
  122. //
  123. // Add config blocks.
  124. //
  125. Status = SiAddConfigBlocks ((VOID *) SiPolicy);
  126. ASSERT_EFI_ERROR (Status);
  127. Status = PchAddConfigBlocks ((VOID *) SiPolicy);
  128. ASSERT_EFI_ERROR (Status);
  129. Status = MeAddConfigBlocks ((VOID *) SiPolicy);
  130. ASSERT_EFI_ERROR (Status);
  131. Status = SaAddConfigBlocks ((VOID *) SiPolicy);
  132. ASSERT_EFI_ERROR (Status);
  133. Status = CpuAddConfigBlocks ((VOID *) SiPolicy);
  134. ASSERT_EFI_ERROR (Status);
  135. //
  136. // Assignment for returning SaInitPolicy config block base address
  137. //
  138. *SiPolicyPpi = SiPolicy;
  139. return Status;
  140. }
  141. /**
  142. Print out all silicon policy information.
  143. @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance
  144. **/
  145. VOID
  146. DumpSiPolicy (
  147. IN SI_POLICY_PPI *SiPolicyPpi
  148. )
  149. {
  150. //
  151. // Print SI config blocks and serial out.
  152. //
  153. SiPrintPolicyPpi (SiPolicyPpi);
  154. //
  155. // Print PCH config blocks and serial out.
  156. //
  157. PchPrintPolicyPpi (SiPolicyPpi);
  158. //
  159. // Print ME config blocks and serial out.
  160. //
  161. MePrintPolicyPpi (SiPolicyPpi);
  162. //
  163. // Print SA config blocks and serial out.
  164. //
  165. SaPrintPolicyPpi (SiPolicyPpi);
  166. //
  167. // Print CPU config block and serial out.
  168. //
  169. CpuPrintPolicy (SiPolicyPpi);
  170. }
  171. /**
  172. SiInstallPolicyPpi installs SiPolicyPpi.
  173. @param[in] SiPolicyPpi The pointer to Silicon Policy PPI instance
  174. @retval EFI_SUCCESS The policy is installed.
  175. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  176. **/
  177. EFI_STATUS
  178. EFIAPI
  179. SiInstallPolicyPpi (
  180. IN SI_POLICY_PPI *SiPolicyPpi
  181. )
  182. {
  183. EFI_STATUS Status;
  184. EFI_PEI_PPI_DESCRIPTOR *SiPolicyPpiDesc;
  185. SI_CONFIG *SiConfig;
  186. SiPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
  187. if (SiPolicyPpiDesc == NULL) {
  188. ASSERT (FALSE);
  189. return EFI_OUT_OF_RESOURCES;
  190. }
  191. SiPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  192. SiPolicyPpiDesc->Guid = &gSiPolicyPpiGuid;
  193. SiPolicyPpiDesc->Ppi = SiPolicyPpi;
  194. Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSiConfigGuid, (VOID *) &SiConfig);
  195. ASSERT_EFI_ERROR (Status);
  196. //
  197. // Install Silicon Policy PPI
  198. //
  199. Status = PeiServicesInstallPpi (SiPolicyPpiDesc);
  200. ASSERT_EFI_ERROR (Status);
  201. return Status;
  202. }
  203. /**
  204. SiInstallPolicyReadyPpi installs SiPolicyReadyPpi.
  205. While installed, RC assumes the Policy is ready and finalized. So please update and override
  206. any setting before calling this function.
  207. @retval EFI_SUCCESS The policy is installed.
  208. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  209. **/
  210. EFI_STATUS
  211. EFIAPI
  212. SiInstallPolicyReadyPpi (
  213. VOID
  214. )
  215. {
  216. EFI_STATUS Status;
  217. EFI_PEI_PPI_DESCRIPTOR *SiPolicyPpiDesc;
  218. SI_POLICY_PPI *SiPolicy;
  219. SiPolicyPpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
  220. if (SiPolicyPpiDesc == NULL) {
  221. ASSERT (FALSE);
  222. return EFI_OUT_OF_RESOURCES;
  223. }
  224. SiPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  225. SiPolicyPpiDesc->Guid = &gSiPolicyReadyPpiGuid;
  226. SiPolicyPpiDesc->Ppi = NULL;
  227. SiPolicy = NULL;
  228. Status = PeiServicesLocatePpi (
  229. &gSiPolicyPpiGuid,
  230. 0,
  231. NULL,
  232. (VOID **)&SiPolicy
  233. );
  234. ASSERT_EFI_ERROR(Status);
  235. DEBUG ((DEBUG_INFO, "Dump Silicon Policy update by Platform...\n"));
  236. DumpSiPolicy (SiPolicy);
  237. //
  238. // Install Silicon Policy Ready PPI
  239. //
  240. Status = PeiServicesInstallPpi (SiPolicyPpiDesc);
  241. ASSERT_EFI_ERROR (Status);
  242. return Status;
  243. }