FspmWrapperPeim.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /** @file
  2. This will be invoked only once. It will call FspMemoryInit API,
  3. register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi
  4. notify to call FspSiliconInit API.
  5. Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
  6. SPDX-License-Identifier: BSD-2-Clause-Patent
  7. **/
  8. #include <PiPei.h>
  9. #include <Library/PeimEntryPoint.h>
  10. #include <Library/PeiServicesLib.h>
  11. #include <Library/PeiServicesTablePointerLib.h>
  12. #include <Library/BaseLib.h>
  13. #include <Library/DebugLib.h>
  14. #include <Library/BaseMemoryLib.h>
  15. #include <Library/MemoryAllocationLib.h>
  16. #include <Library/HobLib.h>
  17. #include <Library/PcdLib.h>
  18. #include <Library/TimerLib.h>
  19. #include <Library/PerformanceLib.h>
  20. #include <Library/FspWrapperPlatformLib.h>
  21. #include <Library/FspWrapperHobProcessLib.h>
  22. #include <Library/FspWrapperMultiPhaseProcessLib.h>
  23. #include <Library/FspWrapperApiLib.h>
  24. #include <Library/FspMeasurementLib.h>
  25. #include <Ppi/FspSiliconInitDone.h>
  26. #include <Ppi/EndOfPeiPhase.h>
  27. #include <Ppi/MemoryDiscovered.h>
  28. #include <Ppi/SecPlatformInformation.h>
  29. #include <Ppi/Tcg.h>
  30. #include <Ppi/FirmwareVolumeInfoMeasurementExcluded.h>
  31. #include <Library/FspWrapperApiTestLib.h>
  32. #include <FspEas.h>
  33. #include <FspStatusCode.h>
  34. #include <FspGlobalData.h>
  35. #include <Library/FspCommonLib.h>
  36. extern EFI_GUID gFspHobGuid;
  37. /**
  38. Get the FSP M UPD Data address
  39. @return FSP-M UPD Data Address
  40. **/
  41. UINTN
  42. GetFspmUpdDataAddress (
  43. VOID
  44. )
  45. {
  46. if (PcdGet64 (PcdFspmUpdDataAddress64) != 0) {
  47. return (UINTN)PcdGet64 (PcdFspmUpdDataAddress64);
  48. } else {
  49. return (UINTN)PcdGet32 (PcdFspmUpdDataAddress);
  50. }
  51. }
  52. /**
  53. Call FspMemoryInit API.
  54. @return Status returned by FspMemoryInit API.
  55. **/
  56. EFI_STATUS
  57. PeiFspMemoryInit (
  58. VOID
  59. )
  60. {
  61. FSP_INFO_HEADER *FspmHeaderPtr;
  62. EFI_STATUS Status;
  63. UINT64 TimeStampCounterStart;
  64. VOID *FspHobListPtr;
  65. VOID *HobData;
  66. VOID *FspmUpdDataPtr;
  67. UINTN *SourceData;
  68. DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));
  69. FspHobListPtr = NULL;
  70. FspmUpdDataPtr = NULL;
  71. FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));
  72. DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr));
  73. if (FspmHeaderPtr == NULL) {
  74. return EFI_DEVICE_ERROR;
  75. }
  76. if ((GetFspmUpdDataAddress () == 0) && (FspmHeaderPtr->CfgRegionSize != 0) && (FspmHeaderPtr->CfgRegionOffset != 0)) {
  77. //
  78. // Copy default FSP-M UPD data from Flash
  79. //
  80. FspmUpdDataPtr = AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize);
  81. ASSERT (FspmUpdDataPtr != NULL);
  82. SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset);
  83. CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize);
  84. } else {
  85. //
  86. // External UPD is ready, get the buffer from PCD pointer.
  87. //
  88. FspmUpdDataPtr = (VOID *)GetFspmUpdDataAddress ();
  89. ASSERT (FspmUpdDataPtr != NULL);
  90. }
  91. DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n"));
  92. UpdateFspmUpdData (FspmUpdDataPtr);
  93. if (((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.Revision >= 3) {
  94. DEBUG ((DEBUG_INFO, " StackBase - 0x%lx\n", ((FSPM_UPD_COMMON_FSP24 *)FspmUpdDataPtr)->FspmArchUpd.StackBase));
  95. DEBUG ((DEBUG_INFO, " StackSize - 0x%lx\n", ((FSPM_UPD_COMMON_FSP24 *)FspmUpdDataPtr)->FspmArchUpd.StackSize));
  96. DEBUG ((DEBUG_INFO, " BootLoaderTolumSize - 0x%x\n", ((FSPM_UPD_COMMON_FSP24 *)FspmUpdDataPtr)->FspmArchUpd.BootLoaderTolumSize));
  97. DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", ((FSPM_UPD_COMMON_FSP24 *)FspmUpdDataPtr)->FspmArchUpd.BootMode));
  98. } else {
  99. DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", ((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.NvsBufferPtr));
  100. DEBUG ((DEBUG_INFO, " StackBase - 0x%x\n", ((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.StackBase));
  101. DEBUG ((DEBUG_INFO, " StackSize - 0x%x\n", ((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.StackSize));
  102. DEBUG ((DEBUG_INFO, " BootLoaderTolumSize - 0x%x\n", ((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.BootLoaderTolumSize));
  103. DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", ((FSPM_UPD_COMMON *)FspmUpdDataPtr)->FspmArchUpd.BootMode));
  104. }
  105. DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", &FspHobListPtr));
  106. TimeStampCounterStart = AsmReadTsc ();
  107. Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr);
  108. //
  109. // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status
  110. //
  111. if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) {
  112. DEBUG ((DEBUG_INFO, "FspMemoryInitApi requested reset %r\n", Status));
  113. CallFspWrapperResetSystem (Status);
  114. }
  115. if ((Status != FSP_STATUS_VARIABLE_REQUEST) && EFI_ERROR (Status)) {
  116. DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute FspMemoryInitApi(), Status = %r\n", Status));
  117. ASSERT_EFI_ERROR (Status);
  118. }
  119. DEBUG ((DEBUG_INFO, "FspMemoryInit status: %r\n", Status));
  120. if (Status == FSP_STATUS_VARIABLE_REQUEST) {
  121. //
  122. // call to Variable request handler
  123. //
  124. FspWrapperVariableRequestHandler (&FspHobListPtr, FspMultiPhaseMemInitApiIndex);
  125. }
  126. //
  127. // See if MultiPhase process is required or not
  128. //
  129. FspWrapperMultiPhaseHandler (&FspHobListPtr, FspMultiPhaseMemInitApiIndex); // FspM MultiPhase
  130. //
  131. // Create hobs after memory initialization and not in temp RAM. Hence passing the recorded timestamp here
  132. //
  133. PERF_START_EX (&gFspApiPerformanceGuid, "EventRec", NULL, TimeStampCounterStart, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);
  134. PERF_END_EX (&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);
  135. DEBUG ((DEBUG_INFO, "Total time spent executing FspMemoryInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - TimeStampCounterStart), 1000000)));
  136. Status = TestFspMemoryInitApiOutput (FspmUpdDataPtr, &FspHobListPtr);
  137. if (EFI_ERROR (Status)) {
  138. DEBUG ((DEBUG_ERROR, "ERROR - TestFspMemoryInitApiOutput () fail, Status = %r\n", Status));
  139. }
  140. DEBUG ((DEBUG_INFO, " FspHobListPtr (returned) - 0x%x\n", FspHobListPtr));
  141. ASSERT (FspHobListPtr != NULL);
  142. PostFspmHobProcess (FspHobListPtr);
  143. //
  144. // FspHobList is not complete at this moment.
  145. // Save FspHobList pointer to hob, so that it can be got later
  146. //
  147. HobData = BuildGuidHob (
  148. &gFspHobGuid,
  149. sizeof (VOID *)
  150. );
  151. ASSERT (HobData != NULL);
  152. CopyMem (HobData, &FspHobListPtr, sizeof (FspHobListPtr));
  153. return Status;
  154. }
  155. /**
  156. Do FSP initialization.
  157. @return FSP initialization status.
  158. **/
  159. EFI_STATUS
  160. EFIAPI
  161. FspmWrapperInit (
  162. VOID
  163. )
  164. {
  165. EFI_STATUS Status;
  166. EFI_PEI_FIRMWARE_VOLUME_INFO_MEASUREMENT_EXCLUDED_PPI *MeasurementExcludedFvPpi;
  167. EFI_PEI_PPI_DESCRIPTOR *MeasurementExcludedPpiList;
  168. MeasurementExcludedFvPpi = AllocatePool (sizeof (*MeasurementExcludedFvPpi));
  169. ASSERT (MeasurementExcludedFvPpi != NULL);
  170. MeasurementExcludedFvPpi->Count = 1;
  171. MeasurementExcludedFvPpi->Fv[0].FvBase = PcdGet32 (PcdFspmBaseAddress);
  172. MeasurementExcludedFvPpi->Fv[0].FvLength = ((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdFspmBaseAddress))->FvLength;
  173. MeasurementExcludedPpiList = AllocatePool (sizeof (*MeasurementExcludedPpiList));
  174. ASSERT (MeasurementExcludedPpiList != NULL);
  175. MeasurementExcludedPpiList->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
  176. MeasurementExcludedPpiList->Guid = &gEfiPeiFirmwareVolumeInfoMeasurementExcludedPpiGuid;
  177. MeasurementExcludedPpiList->Ppi = MeasurementExcludedFvPpi;
  178. Status = EFI_SUCCESS;
  179. if (PcdGet8 (PcdFspModeSelection) == 1) {
  180. Status = PeiFspMemoryInit ();
  181. ASSERT_EFI_ERROR (Status);
  182. } else {
  183. Status = PeiServicesInstallPpi (MeasurementExcludedPpiList);
  184. ASSERT_EFI_ERROR (Status);
  185. PeiServicesInstallFvInfoPpi (
  186. NULL,
  187. (VOID *)(UINTN)PcdGet32 (PcdFspmBaseAddress),
  188. (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdFspmBaseAddress))->FvLength,
  189. NULL,
  190. NULL
  191. );
  192. }
  193. return Status;
  194. }
  195. /**
  196. This function is called after TCG installed PPI.
  197. @param[in] PeiServices Pointer to PEI Services Table.
  198. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
  199. caused this function to execute.
  200. @param[in] Ppi Pointer to the PPI data associated with this function.
  201. @retval EFI_STATUS Always return EFI_SUCCESS
  202. **/
  203. EFI_STATUS
  204. EFIAPI
  205. TcgPpiNotify (
  206. IN EFI_PEI_SERVICES **PeiServices,
  207. IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
  208. IN VOID *Ppi
  209. );
  210. EFI_PEI_NOTIFY_DESCRIPTOR mTcgPpiNotifyDesc = {
  211. (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  212. &gEdkiiTcgPpiGuid,
  213. TcgPpiNotify
  214. };
  215. /**
  216. This function is called after TCG installed PPI.
  217. @param[in] PeiServices Pointer to PEI Services Table.
  218. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
  219. caused this function to execute.
  220. @param[in] Ppi Pointer to the PPI data associated with this function.
  221. @retval EFI_STATUS Always return EFI_SUCCESS
  222. **/
  223. EFI_STATUS
  224. EFIAPI
  225. TcgPpiNotify (
  226. IN EFI_PEI_SERVICES **PeiServices,
  227. IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
  228. IN VOID *Ppi
  229. )
  230. {
  231. UINT32 FspMeasureMask;
  232. DEBUG ((DEBUG_INFO, "TcgPpiNotify FSPM\n"));
  233. FspMeasureMask = PcdGet32 (PcdFspMeasurementConfig);
  234. if ((FspMeasureMask & FSP_MEASURE_FSPT) != 0) {
  235. MeasureFspFirmwareBlob (
  236. 0,
  237. "FSPT",
  238. PcdGet32 (PcdFsptBaseAddress),
  239. (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdFsptBaseAddress))->FvLength
  240. );
  241. }
  242. if ((FspMeasureMask & FSP_MEASURE_FSPM) != 0) {
  243. MeasureFspFirmwareBlob (
  244. 0,
  245. "FSPM",
  246. PcdGet32 (PcdFspmBaseAddress),
  247. (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdFspmBaseAddress))->FvLength
  248. );
  249. }
  250. return EFI_SUCCESS;
  251. }
  252. /**
  253. This is the entrypoint of PEIM
  254. @param[in] FileHandle Handle of the file being invoked.
  255. @param[in] PeiServices Describes the list of possible PEI Services.
  256. @retval EFI_SUCCESS if it completed successfully.
  257. **/
  258. EFI_STATUS
  259. EFIAPI
  260. FspmWrapperPeimEntryPoint (
  261. IN EFI_PEI_FILE_HANDLE FileHandle,
  262. IN CONST EFI_PEI_SERVICES **PeiServices
  263. )
  264. {
  265. EFI_STATUS Status;
  266. DEBUG ((DEBUG_INFO, "FspmWrapperPeimEntryPoint\n"));
  267. Status = PeiServicesNotifyPpi (&mTcgPpiNotifyDesc);
  268. ASSERT_EFI_ERROR (Status);
  269. FspmWrapperInit ();
  270. return EFI_SUCCESS;
  271. }