]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c
Update IntelFspWrapperPkg according to 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
167\r
168 ZeroMem (&FspMemoryInitParams, sizeof(FspMemoryInitParams));\r
169 FspMemoryInitParams.NvsBufferPtr = GetNvsBuffer ();\r
170 DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
171 FspMemoryInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;\r
172 FspMemoryInitParams.HobListPtr = &FspHobList;\r
173\r
174 DEBUG ((DEBUG_INFO, "FspMemoryInitParams - 0x%x\n", &FspMemoryInitParams));\r
175 DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
176 DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspMemoryInitParams.RtBufferPtr));\r
177 DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));\r
178 DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));\r
179 DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));\r
180 DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", FspMemoryInitParams.HobListPtr));\r
181\r
182 Status = CallFspMemoryInit (FspHeader, &FspMemoryInitParams);\r
183 DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));\r
184 ASSERT_EFI_ERROR (Status);\r
185\r
186 DEBUG ((DEBUG_INFO, " HobListPtr (returned) - 0x%x\n", FspHobList));\r
187\r
188 FspHobProcessForMemoryResource (FspHobList);\r
189\r
190 //\r
191 // FspHobList is not complete at this moment.\r
192 // Save FspHobList pointer to hob, so that it can be got later\r
193 //\r
194 HobData = BuildGuidHob (\r
195 &gFspInitDonePpiGuid,\r
196 sizeof (VOID *)\r
197 );\r
198 ASSERT (HobData != NULL);\r
199 CopyMem (HobData, &FspHobList, sizeof (FspHobList));\r
200\r
201 return Status;\r
202}\r
203\r
204/**\r
205 TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked\r
206 by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.\r
207\r
208 @retval EFI_SUCCESS Use of Temporary RAM was disabled.\r
209 @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.\r
210\r
211**/\r
212EFI_STATUS\r
213EFIAPI\r
214PeiTemporaryRamDone (\r
215 VOID\r
216 )\r
217{\r
218 EFI_STATUS Status;\r
219 VOID *TempRamExitParam;\r
220 FSP_INFO_HEADER *FspHeader;\r
221\r
222 FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
223 if (FspHeader == NULL) {\r
224 return EFI_DEVICE_ERROR;\r
225 }\r
226 \r
227 DEBUG ((DEBUG_INFO, "PeiTemporaryRamDone enter\n"));\r
228 \r
229 TempRamExitParam = GetTempRamExitParam ();\r
230 Status = CallTempRamExit (FspHeader, TempRamExitParam);\r
231 DEBUG((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status));\r
232 ASSERT_EFI_ERROR (Status);\r
233\r
234 return EFI_SUCCESS;\r
235}\r
236\r
237/**\r
238 This function is called after PEI core discover memory and finish migration.\r
239\r
240 @param[in] PeiServices Pointer to PEI Services Table.\r
241 @param[in] NotifyDesc Pointer to the descriptor for the Notification event that\r
242 caused this function to execute.\r
243 @param[in] Ppi Pointer to the PPI data associated with this function.\r
244\r
245 @retval EFI_STATUS Always return EFI_SUCCESS\r
246**/\r
247EFI_STATUS\r
248EFIAPI\r
249PeiMemoryDiscoveredNotify (\r
250 IN EFI_PEI_SERVICES **PeiServices,\r
251 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
252 IN VOID *Ppi\r
253 )\r
254{\r
255 EFI_STATUS Status;\r
256 VOID *FspSiliconInitParam;\r
257 FSP_INFO_HEADER *FspHeader;\r
258 VOID *FspHobList;\r
259 EFI_HOB_GUID_TYPE *GuidHob;\r
260\r
261 FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
262 if (FspHeader == NULL) {\r
263 return EFI_DEVICE_ERROR;\r
264 }\r
265 \r
266 DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));\r
267 \r
268 FspSiliconInitParam = GetFspSiliconInitParam ();\r
269 Status = CallFspSiliconInit (FspHeader, FspSiliconInitParam);\r
270 DEBUG((DEBUG_ERROR, "FspSiliconInit status: 0x%x\n", Status));\r
271 ASSERT_EFI_ERROR (Status);\r
272 \r
273 //\r
274 // Now FspHobList complete, process it\r
275 //\r
276 GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);\r
277 ASSERT (GuidHob != NULL);\r
278 FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);\r
279 DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));\r
280 FspHobProcessForOtherData (FspHobList);\r
281\r
282 //\r
283 // Install FspInitDonePpi so that any other driver can consume this info.\r
284 //\r
285 Status = PeiServicesInstallPpi (&mPeiFspInitDonePpiV2);\r
286 ASSERT_EFI_ERROR(Status);\r
287\r
288 return EFI_SUCCESS;\r
289}\r
290\r
291/**\r
292 Do FSP initialization based on FspApi version 2.\r
293\r
294 @param[in] FspHeader FSP header pointer.\r
295\r
296 @return FSP initialization status.\r
297**/\r
298EFI_STATUS\r
299PeiFspInitV2 (\r
300 IN FSP_INFO_HEADER *FspHeader\r
301 )\r
302{\r
303 EFI_STATUS Status;\r
304 EFI_BOOT_MODE BootMode;\r
305\r
306 Status = PeiFspMemoryInit (FspHeader);\r
307 ASSERT_EFI_ERROR (Status);\r
308\r
309 //\r
310 // Install TempramDonePpi to run TempRamExit\r
311 //\r
312 Status = PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc);\r
313 ASSERT_EFI_ERROR(Status);\r
314\r
315 //\r
316 // Register MemoryDiscovered Nofity to run FspSiliconInit\r
317 //\r
318 Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);\r
319 ASSERT_EFI_ERROR (Status);\r
320 \r
321 //\r
322 // Register EndOfPei Notify for S3 to run FspNotifyPhase\r
323 //\r
324 PeiServicesGetBootMode (&BootMode);\r
325 if (BootMode == BOOT_ON_S3_RESUME) {\r
326 Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);\r
327 ASSERT_EFI_ERROR (Status);\r
328 }\r
329\r
330 return EFI_SUCCESS;\r
331}