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