PeiPchPreMemPolicyLib.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /** @file
  2. This file is PeiPchPreMemPolicy library.
  3. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved. <BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "PeiPchPolicyLibrary.h"
  7. #include <Library/CpuPlatformLib.h>
  8. #include <Library/ConfigBlockLib.h>
  9. /**
  10. Load Config block default
  11. @param[in] ConfigBlockPointer Pointer to config block
  12. **/
  13. VOID
  14. LoadPchGeneralPreMemConfigDefault (
  15. IN VOID *ConfigBlockPointer
  16. )
  17. {
  18. PCH_GENERAL_PREMEM_CONFIG *PchGeneralPreMemConfig;
  19. PchGeneralPreMemConfig = ConfigBlockPointer;
  20. DEBUG ((DEBUG_INFO, "PchGeneralPreMemConfig->Header.GuidHob.Name = %g\n", &PchGeneralPreMemConfig->Header.GuidHob.Name));
  21. DEBUG ((DEBUG_INFO, "PchGeneralPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", PchGeneralPreMemConfig->Header.GuidHob.Header.HobLength));
  22. /********************************
  23. PCH general premem configuration
  24. ********************************/
  25. }
  26. /**
  27. Load Config block default
  28. @param[in] ConfigBlockPointer Pointer to config block
  29. **/
  30. VOID
  31. LoadDciPreMemConfigDefault (
  32. IN VOID *ConfigBlockPointer
  33. )
  34. {
  35. PCH_DCI_PREMEM_CONFIG *DciPreMemConfig;
  36. DciPreMemConfig = ConfigBlockPointer;
  37. DEBUG ((DEBUG_INFO, "DciPreMemConfig->Header.GuidHob.Name = %g\n", &DciPreMemConfig->Header.GuidHob.Name));
  38. DEBUG ((DEBUG_INFO, "DciPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", DciPreMemConfig->Header.GuidHob.Header.HobLength));
  39. /********************************
  40. DCI Configuration
  41. ********************************/
  42. }
  43. /**
  44. Load Config block default
  45. @param[in] ConfigBlockPointer Pointer to config block
  46. **/
  47. VOID
  48. LoadWatchDogPreMemConfigDefault (
  49. IN VOID *ConfigBlockPointer
  50. )
  51. {
  52. PCH_WDT_PREMEM_CONFIG *WdtPreMemConfig;
  53. WdtPreMemConfig = ConfigBlockPointer;
  54. DEBUG ((DEBUG_INFO, "WdtPreMemConfig->Header.GuidHob.Name = %g\n", &WdtPreMemConfig->Header.GuidHob.Name));
  55. DEBUG ((DEBUG_INFO, "WdtPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", WdtPreMemConfig->Header.GuidHob.Header.HobLength));
  56. }
  57. /**
  58. Load Config block default
  59. @param[in] ConfigBlockPointer Pointer to config block
  60. **/
  61. VOID
  62. LoadPchTraceHubPreMemConfigDefault (
  63. IN VOID *ConfigBlockPointer
  64. )
  65. {
  66. PCH_TRACE_HUB_PREMEM_CONFIG *PchTraceHubPreMemConfig;
  67. PchTraceHubPreMemConfig = ConfigBlockPointer;
  68. DEBUG ((DEBUG_INFO, "PchTraceHubPreMemConfig->Header.GuidHob.Name = %g\n", &PchTraceHubPreMemConfig->Header.GuidHob.Name));
  69. DEBUG ((DEBUG_INFO, "PchTraceHubPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", PchTraceHubPreMemConfig->Header.GuidHob.Header.HobLength));
  70. }
  71. GLOBAL_REMOVE_IF_UNREFERENCED UINT8 mSmbusRsvdAddresses[] = {
  72. 0xA0,
  73. 0xA2,
  74. 0xA4,
  75. 0xA6
  76. };
  77. /**
  78. Load Config block default
  79. @param[in] ConfigBlockPointer Pointer to config block
  80. **/
  81. VOID
  82. LoadSmbusPreMemConfigDefault (
  83. IN VOID *ConfigBlockPointer
  84. )
  85. {
  86. PCH_SMBUS_PREMEM_CONFIG *SmbusPreMemConfig;
  87. SmbusPreMemConfig = ConfigBlockPointer;
  88. DEBUG ((DEBUG_INFO, "SmbusPreMemConfig->Header.GuidHob.Name = %g\n", &SmbusPreMemConfig->Header.GuidHob.Name));
  89. DEBUG ((DEBUG_INFO, "SmbusPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", SmbusPreMemConfig->Header.GuidHob.Header.HobLength));
  90. /********************************
  91. SMBus configuration
  92. ********************************/
  93. SmbusPreMemConfig->Enable = TRUE;
  94. SmbusPreMemConfig->DynamicPowerGating = TRUE;
  95. SmbusPreMemConfig->SpdWriteDisable = TRUE;
  96. SmbusPreMemConfig->SmbusIoBase = PcdGet16 (PcdSmbusBaseAddress);
  97. ASSERT (sizeof (mSmbusRsvdAddresses) <= PCH_MAX_SMBUS_RESERVED_ADDRESS);
  98. SmbusPreMemConfig->NumRsvdSmbusAddresses = sizeof (mSmbusRsvdAddresses);
  99. CopyMem (
  100. SmbusPreMemConfig->RsvdSmbusAddressTable,
  101. mSmbusRsvdAddresses,
  102. sizeof (mSmbusRsvdAddresses)
  103. );
  104. }
  105. /**
  106. Load Config block default
  107. @param[in] ConfigBlockPointer Pointer to config block
  108. **/
  109. VOID
  110. LoadLpcPreMemConfigDefault (
  111. IN VOID *ConfigBlockPointer
  112. )
  113. {
  114. PCH_LPC_PREMEM_CONFIG *LpcPreMemConfig;
  115. LpcPreMemConfig = ConfigBlockPointer;
  116. DEBUG ((DEBUG_INFO, "LpcPreMemConfig->Header.GuidHob.Name = %g\n", &LpcPreMemConfig->Header.GuidHob.Name));
  117. DEBUG ((DEBUG_INFO, "LpcPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", LpcPreMemConfig->Header.GuidHob.Header.HobLength));
  118. /********************************
  119. LPC Configuration
  120. ********************************/
  121. LpcPreMemConfig->EnhancePort8xhDecoding = TRUE;
  122. }
  123. /**
  124. Load Config block default
  125. @param[in] ConfigBlockPointer Pointer to config block
  126. **/
  127. VOID
  128. LoadHsioPciePreMemConfigDefault (
  129. IN VOID *ConfigBlockPointer
  130. )
  131. {
  132. PCH_HSIO_PCIE_PREMEM_CONFIG *HsioPciePreMemConfig;
  133. HsioPciePreMemConfig = ConfigBlockPointer;
  134. DEBUG ((DEBUG_INFO, "HsioPciePreMemConfig->Header.GuidHob.Name = %g\n", &HsioPciePreMemConfig->Header.GuidHob.Name));
  135. DEBUG ((DEBUG_INFO, "HsioPciePreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", HsioPciePreMemConfig->Header.GuidHob.Header.HobLength));
  136. }
  137. /**
  138. Load Config block default
  139. @param[in] ConfigBlockPointer Pointer to config block
  140. **/
  141. VOID
  142. LoadHsioSataPreMemConfigDefault (
  143. IN VOID *ConfigBlockPointer
  144. )
  145. {
  146. PCH_HSIO_SATA_PREMEM_CONFIG *HsioSataPreMemConfig;
  147. HsioSataPreMemConfig = ConfigBlockPointer;
  148. DEBUG ((DEBUG_INFO, "HsioSataPreMemConfig->Header.GuidHob.Name = %g\n", &HsioSataPreMemConfig->Header.GuidHob.Name));
  149. DEBUG ((DEBUG_INFO, "HsioSataPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", HsioSataPreMemConfig->Header.GuidHob.Header.HobLength));
  150. }
  151. /**
  152. Get Hsio Sata Pre Mem Config Policy
  153. @param[in] SiPolicy The RC Policy PPI instance
  154. @param[in] SataCtrlIndex SATA controller index
  155. @retval Pointer to Hsio Sata Pre Mem Config Policy
  156. **/
  157. PCH_HSIO_SATA_PREMEM_CONFIG *
  158. GetPchHsioSataPreMemConfig (
  159. IN SI_PREMEM_POLICY_PPI *SiPreMemPolicy,
  160. IN UINT32 SataCtrlIndex
  161. )
  162. {
  163. PCH_HSIO_SATA_PREMEM_CONFIG *HsioSataPreMemConfig;
  164. EFI_STATUS Status;
  165. ASSERT (SataCtrlIndex < GetPchMaxSataControllerNum ());
  166. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gHsioSataPreMemConfigGuid, (VOID *) &HsioSataPreMemConfig);
  167. ASSERT_EFI_ERROR (Status);
  168. HsioSataPreMemConfig += SataCtrlIndex;
  169. return HsioSataPreMemConfig;
  170. }
  171. /**
  172. Load Config block default
  173. @param[in] ConfigBlockPointer Pointer to config block
  174. **/
  175. VOID
  176. LoadPcieRpPreMemConfigDefault (
  177. IN VOID *ConfigBlockPointer
  178. )
  179. {
  180. PCH_PCIE_RP_PREMEM_CONFIG *PcieRpPreMemConfig;
  181. UINT32 RpIndex;
  182. PcieRpPreMemConfig = ConfigBlockPointer;
  183. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Name = %g\n", &PcieRpPreMemConfig->Header.GuidHob.Name));
  184. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", PcieRpPreMemConfig->Header.GuidHob.Header.HobLength));
  185. for (RpIndex = 0; RpIndex < GetPchMaxPciePortNum (); RpIndex ++) {
  186. PcieRpPreMemConfig->RpEnabledMask |= (UINT32) (1 << RpIndex);
  187. }
  188. }
  189. /**
  190. Load Config block default
  191. @param[in] ConfigBlockPointer Pointer to config block
  192. **/
  193. VOID
  194. LoadHdAudioPreMemConfigDefault (
  195. IN VOID *ConfigBlockPointer
  196. )
  197. {
  198. PCH_HDAUDIO_PREMEM_CONFIG *HdaPreMemConfig;
  199. HdaPreMemConfig = ConfigBlockPointer;
  200. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Name = %g\n", &HdaPreMemConfig->Header.GuidHob.Name));
  201. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", HdaPreMemConfig->Header.GuidHob.Header.HobLength));
  202. HdaPreMemConfig->Enable = 1;
  203. }
  204. /**
  205. Load Config block default
  206. @param[in] ConfigBlockPointer Pointer to config block
  207. **/
  208. VOID
  209. LoadIshPreMemConfigDefault (
  210. IN VOID *ConfigBlockPointer
  211. )
  212. {
  213. PCH_ISH_PREMEM_CONFIG *IshPreMemConfig;
  214. IshPreMemConfig = ConfigBlockPointer;
  215. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Name = %g\n", &IshPreMemConfig->Header.GuidHob.Name));
  216. DEBUG ((DEBUG_INFO, "PcieRpPreMemConfig->Header.GuidHob.Header.HobLength = 0x%x\n", IshPreMemConfig->Header.GuidHob.Header.HobLength));
  217. //Enable ISH controller for Non-Desktop sku platforms
  218. if (GetCpuSku () != EnumCpuTrad) {
  219. IshPreMemConfig->Enable = TRUE;
  220. }
  221. }
  222. GLOBAL_REMOVE_IF_UNREFERENCED COMPONENT_BLOCK_ENTRY mPchIpBlocksPreMem [] = {
  223. {&gPchGeneralPreMemConfigGuid, sizeof (PCH_GENERAL_PREMEM_CONFIG), PCH_GENERAL_PREMEM_CONFIG_REVISION, LoadPchGeneralPreMemConfigDefault},
  224. {&gDciPreMemConfigGuid, sizeof (PCH_DCI_PREMEM_CONFIG), DCI_PREMEM_CONFIG_REVISION, LoadDciPreMemConfigDefault},
  225. {&gWatchDogPreMemConfigGuid, sizeof (PCH_WDT_PREMEM_CONFIG), WATCH_DOG_PREMEM_CONFIG_REVISION, LoadWatchDogPreMemConfigDefault},
  226. {&gPchTraceHubPreMemConfigGuid, sizeof (PCH_TRACE_HUB_PREMEM_CONFIG), PCH_TRACEHUB_PREMEM_CONFIG_REVISION, LoadPchTraceHubPreMemConfigDefault},
  227. {&gSmbusPreMemConfigGuid, sizeof (PCH_SMBUS_PREMEM_CONFIG), SMBUS_PREMEM_CONFIG_REVISION, LoadSmbusPreMemConfigDefault},
  228. {&gLpcPreMemConfigGuid, sizeof (PCH_LPC_PREMEM_CONFIG), LPC_PREMEM_CONFIG_REVISION, LoadLpcPreMemConfigDefault},
  229. {&gHsioPciePreMemConfigGuid, sizeof (PCH_HSIO_PCIE_PREMEM_CONFIG), HSIO_PCIE_PREMEM_CONFIG_REVISION, LoadHsioPciePreMemConfigDefault},
  230. {&gHsioSataPreMemConfigGuid, sizeof (PCH_HSIO_SATA_PREMEM_CONFIG), HSIO_SATA_PREMEM_CONFIG_REVISION, LoadHsioSataPreMemConfigDefault},
  231. {&gPcieRpPreMemConfigGuid, sizeof (PCH_PCIE_RP_PREMEM_CONFIG), PCIE_RP_PREMEM_CONFIG_REVISION, LoadPcieRpPreMemConfigDefault},
  232. {&gHdAudioPreMemConfigGuid, sizeof (PCH_HDAUDIO_PREMEM_CONFIG), HDAUDIO_PREMEM_CONFIG_REVISION, LoadHdAudioPreMemConfigDefault},
  233. {&gIshPreMemConfigGuid, sizeof (PCH_ISH_PREMEM_CONFIG), ISH_PREMEM_CONFIG_REVISION, LoadIshPreMemConfigDefault},
  234. };
  235. /**
  236. Get PCH PREMEM config block table total size.
  237. @retval Size of PCH PREMEM config block table
  238. **/
  239. UINT16
  240. EFIAPI
  241. PchGetPreMemConfigBlockTotalSize (
  242. VOID
  243. )
  244. {
  245. return GetComponentConfigBlockTotalSize (&mPchIpBlocksPreMem[0], sizeof (mPchIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY));
  246. }
  247. /**
  248. PchAddPreMemConfigBlocks add all PCH PREMEM config blocks.
  249. @param[in] ConfigBlockTableAddress The pointer to add PCH PREMEM config blocks
  250. @retval EFI_SUCCESS The policy default is initialized.
  251. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
  252. **/
  253. EFI_STATUS
  254. EFIAPI
  255. PchAddPreMemConfigBlocks (
  256. IN VOID *ConfigBlockTableAddress
  257. )
  258. {
  259. DEBUG ((DEBUG_INFO, "PCH AddPreMemConfigBlocks\n"));
  260. return AddComponentConfigBlocks (ConfigBlockTableAddress, &mPchIpBlocksPreMem[0], sizeof (mPchIpBlocksPreMem) / sizeof (COMPONENT_BLOCK_ENTRY));
  261. }