PeiSaPolicyUpdate.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /** @file
  2. Do Platform Stage System Agent initialization.
  3. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "PeiSaPolicyUpdate.h"
  7. #include <Protocol/GraphicsOutput.h>
  8. #include <IndustryStandard/Bmp.h>
  9. #include <Guid/MemoryTypeInformation.h>
  10. #include <Library/HobLib.h>
  11. #include <Platform.h>
  12. #include <Ppi/FirmwareVolume.h>
  13. #include <Pi/PiFirmwareFile.h>
  14. #include <Pi/PiPeiCis.h>
  15. #include <Core/Pei/PeiMain.h>
  16. #include <Library/BaseMemoryLib.h>
  17. #include <Library/MemoryAllocationLib.h>
  18. #include <Library/PeiSaPolicyLib.h>
  19. #include <GpioPinsCnlLp.h>
  20. #include <GpioPinsCnlH.h>
  21. #include <Library/ConfigBlockLib.h>
  22. /**
  23. UpdatePeiSaPolicy performs SA PEI Policy initialization
  24. @param[in out] SiPolicyPpi - SI_POLICY PPI
  25. @retval EFI_SUCCESS The policy is installed and initialized.
  26. **/
  27. EFI_STATUS
  28. UpdatePeiSaPolicy (
  29. IN OUT SI_POLICY_PPI *SiPolicyPpi
  30. )
  31. {
  32. EFI_STATUS Status;
  33. EFI_GUID FileGuid;
  34. VOID *Buffer;
  35. UINT8 SaDisplayConfigTable[9] = {0};
  36. VOID *MemBuffer;
  37. BMP_IMAGE_HEADER *BmpHeader;
  38. UINT64 BltBufferSize;
  39. UINT32 Size;
  40. GRAPHICS_PEI_CONFIG *GtConfig;
  41. GNA_CONFIG *GnaConfig;
  42. WDT_PPI *gWdtPei;
  43. PCIE_PEI_CONFIG *PciePeiConfig;
  44. SA_MISC_PEI_CONFIG *MiscPeiConfig;
  45. EFI_BOOT_MODE BootMode;
  46. DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n"));
  47. Size = 0;
  48. MemBuffer = NULL;
  49. BmpHeader = NULL;
  50. BltBufferSize = 0;
  51. GtConfig = NULL;
  52. GnaConfig = NULL;
  53. Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid, (VOID *)&GtConfig);
  54. ASSERT_EFI_ERROR(Status);
  55. Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGnaConfigGuid, (VOID *)&GnaConfig);
  56. ASSERT_EFI_ERROR(Status);
  57. Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaPciePeiConfigGuid, (VOID *)&PciePeiConfig);
  58. ASSERT_EFI_ERROR (Status);
  59. Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid, (VOID *)&MiscPeiConfig);
  60. ASSERT_EFI_ERROR (Status);
  61. //
  62. // Locate WDT_PPI (ICC WDT PPI)
  63. //
  64. gWdtPei = NULL;
  65. Status = PeiServicesLocatePpi(
  66. &gWdtPpiGuid,
  67. 0,
  68. NULL,
  69. (VOID **) &gWdtPei
  70. );
  71. Status = PeiServicesGetBootMode(&BootMode);
  72. ASSERT_EFI_ERROR(Status);
  73. if (!EFI_ERROR (Status)) {
  74. Buffer = NULL;
  75. CopyMem(&FileGuid, PcdGetPtr(PcdIntelGraphicsVbtFileGuid), sizeof(FileGuid));
  76. PeiGetSectionFromFv(FileGuid, &Buffer, &Size);
  77. if (Buffer == NULL) {
  78. DEBUG((DEBUG_ERROR, "Could not locate VBT\n"));
  79. }
  80. MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)Size));
  81. if ((MemBuffer != NULL) && (Buffer != NULL)) {
  82. CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
  83. GtConfig->GraphicsConfigPtr = MemBuffer;
  84. } else {
  85. DEBUG((DEBUG_WARN, "Error in locating / copying VBT.\n"));
  86. GtConfig->GraphicsConfigPtr = NULL;
  87. }
  88. GtConfig->PeiGraphicsPeimInit = 1;
  89. DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromFv is 0x%x\n", GtConfig->GraphicsConfigPtr));
  90. DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromFv is 0x%x\n", Size));
  91. PeiGetSectionFromFv (gTianoLogoGuid, &Buffer, &Size);
  92. if (Buffer == NULL) {
  93. DEBUG((DEBUG_WARN, "Could not locate Logo\n"));
  94. }
  95. MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)Size));
  96. if ((MemBuffer != NULL) && (Buffer != NULL)) {
  97. CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
  98. GtConfig->LogoPtr = MemBuffer;
  99. GtConfig->LogoSize = Size;
  100. //
  101. // Calculate the BltBuffer needed size.
  102. //
  103. BmpHeader = (BMP_IMAGE_HEADER *) GtConfig->LogoPtr;
  104. if (BmpHeader->CharB == 'B' && BmpHeader->CharM == 'M') {
  105. BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight);
  106. if (BltBufferSize < DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
  107. BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
  108. GtConfig->BltBufferSize = (UINT32) BltBufferSize;
  109. GtConfig->BltBufferAddress = (VOID *) AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)GtConfig->BltBufferSize));
  110. } else {
  111. DEBUG ((DEBUG_ERROR, "Blt Buffer Size overflow.\n"));
  112. ASSERT (FALSE);
  113. }
  114. } else {
  115. DEBUG ((DEBUG_ERROR, "Wrong Bmp Image Header.\n"));
  116. ASSERT (FALSE);
  117. }
  118. } else {
  119. DEBUG((DEBUG_WARN, "Error in locating / copying LogoPtr.\n"));
  120. GtConfig->LogoPtr = NULL;
  121. GtConfig->LogoSize = 0;
  122. }
  123. DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromFv is 0x%x\n", GtConfig->LogoPtr));
  124. DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromFv is 0x%x\n", GtConfig->LogoSize));
  125. //
  126. // Display DDI Initialization ( default Native GPIO as per board during AUTO case)
  127. //
  128. if (PcdGet32 (PcdSaDisplayConfigTable) != 0) {
  129. CopyMem (SaDisplayConfigTable, (VOID *) (UINTN) PcdGet32 (PcdSaDisplayConfigTable), (UINTN)PcdGet16 (PcdSaDisplayConfigTableSize));
  130. GtConfig->DdiConfiguration.DdiPortEdp = SaDisplayConfigTable[0];
  131. GtConfig->DdiConfiguration.DdiPortBHpd = SaDisplayConfigTable[1];
  132. GtConfig->DdiConfiguration.DdiPortCHpd = SaDisplayConfigTable[2];
  133. GtConfig->DdiConfiguration.DdiPortDHpd = SaDisplayConfigTable[3];
  134. GtConfig->DdiConfiguration.DdiPortFHpd = SaDisplayConfigTable[4];
  135. GtConfig->DdiConfiguration.DdiPortBDdc = SaDisplayConfigTable[5];
  136. GtConfig->DdiConfiguration.DdiPortCDdc = SaDisplayConfigTable[6];
  137. GtConfig->DdiConfiguration.DdiPortDDdc = SaDisplayConfigTable[7];
  138. GtConfig->DdiConfiguration.DdiPortFDdc = SaDisplayConfigTable[8];
  139. }
  140. }
  141. PciePeiConfig->DmiAspm = 0x3;
  142. return EFI_SUCCESS;
  143. }
  144. /**
  145. PeiGetSectionFromFv finds the file in FV and gets file Address and Size
  146. @param[in] NameGuid - File GUID
  147. @param[out] Address - Pointer to the File Address
  148. @param[out] Size - Pointer to File Size
  149. @retval EFI_SUCCESS Successfull in reading the section from FV
  150. **/
  151. EFI_STATUS
  152. EFIAPI
  153. PeiGetSectionFromFv (
  154. IN CONST EFI_GUID NameGuid,
  155. OUT VOID **Address,
  156. OUT UINT32 *Size
  157. )
  158. {
  159. EFI_STATUS Status;
  160. EFI_PEI_FIRMWARE_VOLUME_PPI *FvPpi;
  161. EFI_FV_FILE_INFO FvFileInfo;
  162. PEI_CORE_INSTANCE *PrivateData;
  163. UINTN CurrentFv;
  164. PEI_CORE_FV_HANDLE *CoreFvHandle;
  165. EFI_PEI_FILE_HANDLE VbtFileHandle;
  166. EFI_GUID *VbtGuid;
  167. EFI_COMMON_SECTION_HEADER *Section;
  168. CONST EFI_PEI_SERVICES **PeiServices;
  169. PeiServices = GetPeiServicesTablePointer();
  170. PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
  171. Status = PeiServicesLocatePpi(
  172. &gEfiFirmwareFileSystem2Guid,
  173. 0,
  174. NULL,
  175. (VOID **)&FvPpi
  176. );
  177. ASSERT_EFI_ERROR(Status);
  178. CurrentFv = PrivateData->CurrentPeimFvCount;
  179. CoreFvHandle = &(PrivateData->Fv[CurrentFv]);
  180. Status = FvPpi->FindFileByName(FvPpi, &NameGuid, &CoreFvHandle->FvHandle, &VbtFileHandle);
  181. if (!EFI_ERROR(Status) && VbtFileHandle != NULL) {
  182. DEBUG((DEBUG_INFO, "Find SectionByType \n"));
  183. Status = FvPpi->FindSectionByType(FvPpi, EFI_SECTION_RAW, VbtFileHandle, (VOID **)&VbtGuid);
  184. if (!EFI_ERROR(Status)) {
  185. DEBUG((DEBUG_INFO, "GetFileInfo \n"));
  186. Status = FvPpi->GetFileInfo(FvPpi, VbtFileHandle, &FvFileInfo);
  187. Section = (EFI_COMMON_SECTION_HEADER *)FvFileInfo.Buffer;
  188. if (IS_SECTION2(Section)) {
  189. ASSERT(SECTION2_SIZE(Section) > 0x00FFFFFF);
  190. *Size = SECTION2_SIZE(Section) - sizeof (EFI_COMMON_SECTION_HEADER2);
  191. *Address = ((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));
  192. } else {
  193. *Size = SECTION_SIZE(Section) - sizeof (EFI_COMMON_SECTION_HEADER);
  194. *Address = ((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER));
  195. }
  196. }
  197. }
  198. return EFI_SUCCESS;
  199. }