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