PcdData.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /** @file
  2. @copyright
  3. Copyright 2018 - 2021 Intel Corporation. <BR>
  4. Copyright (c) 2021, American Megatrends International LLC. <BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include "PeiBoardInit.h"
  8. #include <ImonVrSvid.h>
  9. #include <Library/MemVrSvidMapLib.h>
  10. #include <Guid/PlatformInfo.h>
  11. #include <Library/UbaPcdUpdateLib.h>
  12. #include <Library/PcdLib.h>
  13. #include <UncoreCommonIncludes.h>
  14. #include <Ppi/DynamicSiLibraryPpi.h>
  15. #include <CpuAndRevisionDefines.h>
  16. #define GPIO_SKL_H_GPP_B20 0x01010014
  17. VOID TypeJunctionCityPlatformUpdateVrIdAddress (VOID);
  18. /**
  19. Update JunctionCity IMON SVID Information
  20. retval N/A
  21. **/
  22. VOID
  23. TypeJunctionCityPlatformUpdateImonAddress (
  24. VOID
  25. )
  26. {
  27. VCC_IMON *VccImon = NULL;
  28. UINTN Size = 0;
  29. Size = sizeof (VCC_IMON);
  30. VccImon = (VCC_IMON *) PcdGetPtr (PcdImonAddr);
  31. if (VccImon == NULL) {
  32. DEBUG ((DEBUG_ERROR, "UpdateImonAddress() - PcdImonAddr == NULL\n"));
  33. return;
  34. }
  35. VccImon->VrSvid[0] = PcdGet8 (PcdWilsonCitySvidVrP1V8);
  36. VccImon->VrSvid[1] = PcdGet8 (PcdWilsonCitySvidVrVccAna);
  37. VccImon->VrSvid[2] = IMON_ADDR_LIST_END; // End array with 0xFF
  38. PcdSetPtrS (PcdImonAddr, &Size, (VOID *) VccImon);
  39. }
  40. /**
  41. Update WilsonCity VR ID SVID Information
  42. retval N/A
  43. **/
  44. VOID
  45. TypeJunctionCityPlatformUpdateVrIdAddress (
  46. VOID
  47. )
  48. {
  49. MEM_SVID_MAP *MemSvidMap = NULL;
  50. UINTN Size = 0;
  51. Size = sizeof (MEM_SVID_MAP);
  52. MemSvidMap = (MEM_SVID_MAP *) PcdGetPtr (PcdMemSrvidMap);
  53. if (MemSvidMap == NULL) {
  54. DEBUG ((DEBUG_ERROR, "UpdateVrIdAddress() - PcdMemSrvidMap == NULL\n"));
  55. return;
  56. }
  57. /*
  58. Map VR ID Address to Memory controller
  59. The mailbox command can support up to 4 DDR VR ID's, 0x10, 0x12, 0x14, and 0x16.
  60. Whitley PHAS indicates that Whitley (like Purley) only connects 2 VRs (VR ID's 0x10 and 0x12).
  61. Those are typically shared such that MC0/MC2 share the same DDR VR (as they are on the same side of the CPU)
  62. and MC1/MC3 share the other. Depending on motherboard layout and other design constraints, this could change
  63. BIT 4 => 0 or 1, SVID BUS\Interface 0 or 1 respectively
  64. BIT 0:3 => SVID ADDRESS
  65. */
  66. MemSvidMap->Socket[0].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  67. MemSvidMap->Socket[0].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  68. MemSvidMap->Socket[1].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  69. MemSvidMap->Socket[1].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  70. MemSvidMap->Socket[2].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  71. MemSvidMap->Socket[2].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  72. MemSvidMap->Socket[3].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  73. MemSvidMap->Socket[3].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  74. MemSvidMap->Socket[4].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  75. MemSvidMap->Socket[4].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  76. MemSvidMap->Socket[5].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  77. MemSvidMap->Socket[5].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  78. MemSvidMap->Socket[6].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  79. MemSvidMap->Socket[6].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  80. MemSvidMap->Socket[7].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
  81. MemSvidMap->Socket[7].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
  82. PcdSetPtrS (PcdMemSrvidMap, &Size, (VOID *) MemSvidMap);
  83. }
  84. EFI_STATUS
  85. TypeJunctionCityPlatformPcdUpdateCallback (
  86. VOID
  87. )
  88. {
  89. CHAR8 FamilyName[] = "Whitley";
  90. CHAR8 BoardName[] = "EPRP";
  91. UINT32 Data32;
  92. UINTN Size;
  93. UINTN PlatformFeatureFlag = 0;
  94. CHAR16 PlatformName[] = L"TypeJunctionCity";
  95. UINTN PlatformNameSize = 0;
  96. EFI_STATUS Status;
  97. //#Integer for BoardID, must match the SKU number and be unique.
  98. Status = PcdSet16S (PcdOemSkuBoardID , TypeJunctionCity);
  99. ASSERT_EFI_ERROR(Status);
  100. if (EFI_ERROR(Status)) {
  101. return Status;
  102. }
  103. Status = PcdSet16S (PcdOemSkuBoardFamily , 0x30);
  104. ASSERT_EFI_ERROR(Status);
  105. if (EFI_ERROR(Status)) {
  106. return Status;
  107. }
  108. // Number of Sockets on Board.
  109. Status = PcdSet32S (PcdOemSkuBoardSocketCount, 2);
  110. ASSERT_EFI_ERROR(Status);
  111. if (EFI_ERROR(Status)) {
  112. return Status;
  113. }
  114. // Max channel and max DIMM
  115. Status = PcdSet32S (PcdOemSkuMaxChannel , 8);
  116. ASSERT_EFI_ERROR(Status);
  117. if (EFI_ERROR(Status)) {
  118. return Status;
  119. }
  120. Status = PcdSet32S (PcdOemSkuMaxDimmPerChannel , 2);
  121. ASSERT_EFI_ERROR(Status);
  122. if (EFI_ERROR(Status)) {
  123. return Status;
  124. }
  125. Status = PcdSetBoolS (PcdOemSkuDimmLayout, TRUE);
  126. ASSERT_EFI_ERROR(Status);
  127. if (EFI_ERROR(Status)) {
  128. return Status;
  129. }
  130. //Update Onboard Video Controller PCI Ven_id, Dev_id
  131. Status = PcdSet16S (PcdOnboardVideoPciVendorId, 0x1A03);
  132. ASSERT_EFI_ERROR(Status);
  133. if (EFI_ERROR(Status)) {
  134. return Status;
  135. }
  136. Status = PcdSet16S (PcdOnboardVideoPciDeviceId, 0x2000);
  137. ASSERT_EFI_ERROR(Status);
  138. if (EFI_ERROR(Status)) {
  139. return Status;
  140. }
  141. //#
  142. //# Misc.
  143. //#
  144. //# V_PCIE_PORT_PXPSLOTCTRL_ATNLED_OFF
  145. Status = PcdSet16S (PcdOemSkuMrlAttnLed , 0xc0);
  146. ASSERT_EFI_ERROR(Status);
  147. if (EFI_ERROR(Status)) {
  148. return Status;
  149. }
  150. //SDP Active Flag
  151. Status = PcdSet8S (PcdOemSkuSdpActiveFlag , 0x0);
  152. ASSERT_EFI_ERROR(Status);
  153. if (EFI_ERROR(Status)) {
  154. return Status;
  155. }
  156. //# Zero terminated string to ID family
  157. Size = AsciiStrSize (FamilyName);
  158. Status = PcdSetPtrS (PcdOemSkuFamilyName , &Size, FamilyName);
  159. ASSERT_EFI_ERROR(Status);
  160. if (EFI_ERROR(Status)) {
  161. return Status;
  162. }
  163. //# Zero terminated string to Board Name
  164. Size = AsciiStrSize (BoardName);
  165. Status = PcdSetPtrS (PcdOemSkuBoardName , &Size, BoardName);
  166. ASSERT_EFI_ERROR(Status);
  167. if (EFI_ERROR(Status)) {
  168. return Status;
  169. }
  170. PlatformNameSize = sizeof (PlatformName);
  171. Status = PcdSet32S (PcdOemSkuPlatformNameSize , (UINT32)PlatformNameSize);
  172. ASSERT_EFI_ERROR(Status);
  173. if (EFI_ERROR(Status)) {
  174. return Status;
  175. }
  176. Status = PcdSetPtrS (PcdOemSkuPlatformName , &PlatformNameSize, PlatformName);
  177. ASSERT_EFI_ERROR(Status);
  178. if (EFI_ERROR(Status)) {
  179. return Status;
  180. }
  181. //# FeaturesBasedOnPlatform
  182. Status = PcdSet32S (PcdOemSkuPlatformFeatureFlag , (UINT32)PlatformFeatureFlag);
  183. ASSERT_EFI_ERROR(Status);
  184. if (EFI_ERROR(Status)) {
  185. return Status;
  186. }
  187. //# Assert GPIO
  188. Data32 = 0;
  189. Status = PcdSet32S (PcdOemSkuAssertPostGPIOValue, Data32);
  190. ASSERT_EFI_ERROR(Status);
  191. if (EFI_ERROR(Status)) {
  192. return Status;
  193. }
  194. Status = PcdSet32S (PcdOemSkuAssertPostGPIO, GPIO_SKL_H_GPP_B20);
  195. ASSERT_EFI_ERROR(Status);
  196. if (EFI_ERROR(Status)) {
  197. return Status;
  198. }
  199. //# UplinkPortIndex
  200. Status = PcdSet8S (PcdOemSkuUplinkPortIndex, 5);
  201. if (EFI_ERROR(Status)) {
  202. return Status;
  203. }
  204. DEBUG ((DEBUG_INFO, "Uba Callback: PlatformPcdUpdateCallback is called!\n"));
  205. Status = TypeJunctionCityPlatformUpdateAcpiTablePcds ();
  206. //# BMC Pcie Port Number
  207. PcdSet8S (PcdOemSkuBmcPciePortNumber, 5);
  208. ASSERT_EFI_ERROR(Status);
  209. //# Board Type Bit Mask
  210. PcdSet32S (PcdBoardTypeBitmask, CPU_TYPE_F_MASK | (CPU_TYPE_F_MASK << 4));
  211. ASSERT_EFI_ERROR(Status);
  212. //Update IMON Address
  213. TypeJunctionCityPlatformUpdateImonAddress ();
  214. return Status;
  215. }
  216. PLATFORM_PCD_UPDATE_TABLE TypeJunctionCityPcdUpdateTable =
  217. {
  218. PLATFORM_PCD_UPDATE_SIGNATURE,
  219. PLATFORM_PCD_UPDATE_VERSION,
  220. TypeJunctionCityPlatformPcdUpdateCallback
  221. };
  222. EFI_STATUS
  223. TypeJunctionCityInstallPcdData (
  224. IN UBA_CONFIG_DATABASE_PPI *UbaConfigPpi
  225. )
  226. {
  227. EFI_STATUS Status;
  228. Status = UbaConfigPpi->AddData (
  229. UbaConfigPpi,
  230. &gPlatformPcdConfigDataGuid,
  231. &TypeJunctionCityPcdUpdateTable,
  232. sizeof(TypeJunctionCityPcdUpdateTable)
  233. );
  234. return Status;
  235. }