]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c
IntelFspWrapperPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / IntelFspWrapperPkg / FspInitPei / FspInitPeiV2.c
CommitLineData
d8043ce9
JY
1/** @file\r
2 In FSP API V2 mode, it 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
6 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
19486360 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
d8043ce9
JY
8\r
9**/\r
10\r
11\r
12#include "FspInitPei.h"\r
13\r
14/**\r
15 Return Hob list produced by FSP.\r
16\r
17 @param[in] PeiServices The pointer to the PEI Services Table.\r
18 @param[in] This The pointer to this instance of this PPI.\r
19 @param[out] FspHobList The pointer to Hob list produced by FSP.\r
20\r
21 @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
22**/\r
23EFI_STATUS\r
24EFIAPI\r
25FspInitDoneGetFspHobListV2 (\r
26 IN CONST EFI_PEI_SERVICES **PeiServices,\r
27 IN FSP_INIT_DONE_PPI *This,\r
28 OUT VOID **FspHobList\r
29 );\r
30\r
31FSP_INIT_DONE_PPI mFspInitDonePpiV2 = {\r
32 FspInitDoneGetFspHobListV2\r
33};\r
34\r
35EFI_PEI_PPI_DESCRIPTOR mPeiFspInitDonePpiV2 = {\r
36 EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
37 &gFspInitDonePpiGuid,\r
38 &mFspInitDonePpiV2\r
39};\r
40\r
41/**\r
42 This function is called after PEI core discover memory and finish migration.\r
43\r
44 @param[in] PeiServices Pointer to PEI Services Table.\r
45 @param[in] NotifyDesc Pointer to the descriptor for the Notification event that\r
46 caused this function to execute.\r
47 @param[in] Ppi Pointer to the PPI data associated with this function.\r
48\r
49 @retval EFI_STATUS Always return EFI_SUCCESS\r
50**/\r
51EFI_STATUS\r
52EFIAPI\r
53PeiMemoryDiscoveredNotify (\r
54 IN EFI_PEI_SERVICES **PeiServices,\r
55 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
56 IN VOID *Ppi\r
57 );\r
58\r
59EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {\r
60 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
61 &gEfiPeiMemoryDiscoveredPpiGuid,\r
62 PeiMemoryDiscoveredNotify\r
63};\r
64\r
65/**\r
66 TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked\r
67 by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.\r
68\r
69 @retval EFI_SUCCESS Use of Temporary RAM was disabled.\r
70 @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.\r
71\r
72**/\r
73EFI_STATUS\r
74EFIAPI\r
75PeiTemporaryRamDone (\r
76 VOID\r
77 );\r
78\r
79EFI_PEI_TEMPORARY_RAM_DONE_PPI mPeiTemporaryRamDonePpi = {\r
80 PeiTemporaryRamDone\r
81};\r
82\r
83EFI_PEI_PPI_DESCRIPTOR mPeiTemporaryRamDoneDesc = {\r
84 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
85 &gEfiTemporaryRamDonePpiGuid,\r
86 &mPeiTemporaryRamDonePpi\r
87};\r
88\r
89/**\r
90 Return Hob list produced by FSP.\r
91\r
92 @param[in] PeiServices The pointer to the PEI Services Table.\r
93 @param[in] This The pointer to this instance of this PPI.\r
94 @param[out] FspHobList The pointer to Hob list produced by FSP.\r
95\r
96 @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
97**/\r
98EFI_STATUS\r
99EFIAPI\r
100FspInitDoneGetFspHobListV2 (\r
101 IN CONST EFI_PEI_SERVICES **PeiServices,\r
102 IN FSP_INIT_DONE_PPI *This,\r
103 OUT VOID **FspHobList\r
104 )\r
105{\r
106 EFI_HOB_GUID_TYPE *GuidHob;\r
107\r
108 GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);\r
109 if (GuidHob != NULL) {\r
110 *FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);\r
111 return EFI_SUCCESS;\r
112 } else {\r
113 return EFI_NOT_FOUND;\r
114 }\r
115}\r
116\r
117/**\r
118 Call FspMemoryInit API.\r
119\r
120 @param[in] FspHeader FSP header pointer.\r
121\r
122 @return Status returned by FspMemoryInit API.\r
123**/\r
124EFI_STATUS\r
125PeiFspMemoryInit (\r
126 IN FSP_INFO_HEADER *FspHeader\r
127 )\r
128{\r
129 FSP_MEMORY_INIT_PARAMS FspMemoryInitParams;\r
130 FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;\r
131 UINT8 FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];\r
132 UINT32 UpdRegionSize;\r
133 EFI_BOOT_MODE BootMode;\r
134 UINT64 StackSize;\r
135 EFI_PHYSICAL_ADDRESS StackBase;\r
136 EFI_STATUS Status;\r
137 VOID *FspHobList;\r
138 VOID *HobData;\r
139\r
140 DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));\r
141\r
142 PeiServicesGetBootMode (&BootMode);\r
143 DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));\r
144\r
dd4e2bcf 145 GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);\r
d8043ce9
JY
146 DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
147 DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
148\r
149 ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));\r
150 FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);\r
151\r
152 FspRtBuffer.BootMode = BootMode;\r
153\r
154 /* Platform override any UPD configs */\r
155 UpdRegionSize = GetUpdRegionSize();\r
156 DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));\r
157 DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));\r
158 ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);\r
159 ZeroMem (FspUpdRgn, UpdRegionSize);\r
160 FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);\r
88a539ca 161 FspRtBuffer.BootLoaderTolumSize = GetBootLoaderTolumSize ();\r
d8043ce9
JY
162\r
163 ZeroMem (&FspMemoryInitParams, sizeof(FspMemoryInitParams));\r
164 FspMemoryInitParams.NvsBufferPtr = GetNvsBuffer ();\r
165 DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
166 FspMemoryInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;\r
95c95ac0 167 FspHobList = NULL;\r
d8043ce9
JY
168 FspMemoryInitParams.HobListPtr = &FspHobList;\r
169\r
170 DEBUG ((DEBUG_INFO, "FspMemoryInitParams - 0x%x\n", &FspMemoryInitParams));\r
171 DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
172 DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspMemoryInitParams.RtBufferPtr));\r
173 DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));\r
174 DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));\r
175 DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));\r
176 DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", FspMemoryInitParams.HobListPtr));\r
177\r
178 Status = CallFspMemoryInit (FspHeader, &FspMemoryInitParams);\r
179 DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));\r
180 ASSERT_EFI_ERROR (Status);\r
181\r
182 DEBUG ((DEBUG_INFO, " HobListPtr (returned) - 0x%x\n", FspHobList));\r
95c95ac0 183 ASSERT (FspHobList != NULL);\r
d8043ce9
JY
184\r
185 FspHobProcessForMemoryResource (FspHobList);\r
186\r
187 //\r
188 // FspHobList is not complete at this moment.\r
189 // Save FspHobList pointer to hob, so that it can be got later\r
190 //\r
191 HobData = BuildGuidHob (\r
192 &gFspInitDonePpiGuid,\r
193 sizeof (VOID *)\r
194 );\r
195 ASSERT (HobData != NULL);\r
196 CopyMem (HobData, &FspHobList, sizeof (FspHobList));\r
197\r
198 return Status;\r
199}\r
200\r
201/**\r
202 TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked\r
203 by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.\r
204\r
205 @retval EFI_SUCCESS Use of Temporary RAM was disabled.\r
206 @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.\r
207\r
208**/\r
209EFI_STATUS\r
210EFIAPI\r
211PeiTemporaryRamDone (\r
212 VOID\r
213 )\r
214{\r
215 EFI_STATUS Status;\r
216 VOID *TempRamExitParam;\r
217 FSP_INFO_HEADER *FspHeader;\r
218\r
219 FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
220 if (FspHeader == NULL) {\r
221 return EFI_DEVICE_ERROR;\r
222 }\r
223 \r
224 DEBUG ((DEBUG_INFO, "PeiTemporaryRamDone enter\n"));\r
225 \r
226 TempRamExitParam = GetTempRamExitParam ();\r
227 Status = CallTempRamExit (FspHeader, TempRamExitParam);\r
228 DEBUG((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status));\r
229 ASSERT_EFI_ERROR (Status);\r
230\r
231 return EFI_SUCCESS;\r
232}\r
233\r
234/**\r
235 This function is called after PEI core discover memory and finish migration.\r
236\r
237 @param[in] PeiServices Pointer to PEI Services Table.\r
238 @param[in] NotifyDesc Pointer to the descriptor for the Notification event that\r
239 caused this function to execute.\r
240 @param[in] Ppi Pointer to the PPI data associated with this function.\r
241\r
242 @retval EFI_STATUS Always return EFI_SUCCESS\r
243**/\r
244EFI_STATUS\r
245EFIAPI\r
246PeiMemoryDiscoveredNotify (\r
247 IN EFI_PEI_SERVICES **PeiServices,\r
248 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
249 IN VOID *Ppi\r
250 )\r
251{\r
252 EFI_STATUS Status;\r
253 VOID *FspSiliconInitParam;\r
254 FSP_INFO_HEADER *FspHeader;\r
255 VOID *FspHobList;\r
256 EFI_HOB_GUID_TYPE *GuidHob;\r
257\r
5c7c41f8
MM
258 if (PcdGet32 (PcdFlashFvSecondFspBase) == 0) {\r
259 FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
260 } else {\r
261 FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvSecondFspBase));\r
262 }\r
d8043ce9
JY
263 if (FspHeader == NULL) {\r
264 return EFI_DEVICE_ERROR;\r
265 }\r
266 \r
267 DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));\r
268 \r
269 FspSiliconInitParam = GetFspSiliconInitParam ();\r
270 Status = CallFspSiliconInit (FspHeader, FspSiliconInitParam);\r
271 DEBUG((DEBUG_ERROR, "FspSiliconInit status: 0x%x\n", Status));\r
272 ASSERT_EFI_ERROR (Status);\r
273 \r
274 //\r
275 // Now FspHobList complete, process it\r
276 //\r
277 GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);\r
278 ASSERT (GuidHob != NULL);\r
279 FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);\r
280 DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));\r
281 FspHobProcessForOtherData (FspHobList);\r
282\r
283 //\r
284 // Install FspInitDonePpi so that any other driver can consume this info.\r
285 //\r
286 Status = PeiServicesInstallPpi (&mPeiFspInitDonePpiV2);\r
287 ASSERT_EFI_ERROR(Status);\r
288\r
289 return EFI_SUCCESS;\r
290}\r
291\r
292/**\r
293 Do FSP initialization based on FspApi version 2.\r
294\r
295 @param[in] FspHeader FSP header pointer.\r
296\r
297 @return FSP initialization status.\r
298**/\r
299EFI_STATUS\r
300PeiFspInitV2 (\r
301 IN FSP_INFO_HEADER *FspHeader\r
302 )\r
303{\r
304 EFI_STATUS Status;\r
305 EFI_BOOT_MODE BootMode;\r
306\r
307 Status = PeiFspMemoryInit (FspHeader);\r
308 ASSERT_EFI_ERROR (Status);\r
309\r
310 //\r
311 // Install TempramDonePpi to run TempRamExit\r
312 //\r
313 Status = PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc);\r
314 ASSERT_EFI_ERROR(Status);\r
315\r
316 //\r
317 // Register MemoryDiscovered Nofity to run FspSiliconInit\r
318 //\r
319 Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);\r
320 ASSERT_EFI_ERROR (Status);\r
321 \r
322 //\r
323 // Register EndOfPei Notify for S3 to run FspNotifyPhase\r
324 //\r
325 PeiServicesGetBootMode (&BootMode);\r
326 if (BootMode == BOOT_ON_S3_RESUME) {\r
327 Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);\r
328 ASSERT_EFI_ERROR (Status);\r
329 }\r
330\r
331 return EFI_SUCCESS;\r
332}