2 In FSP API V2 mode, it 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.
6 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php.
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "FspInitPei.h"
21 Return Hob list produced by FSP.
23 @param[in] PeiServices The pointer to the PEI Services Table.
24 @param[in] This The pointer to this instance of this PPI.
25 @param[out] FspHobList The pointer to Hob list produced by FSP.
27 @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
31 FspInitDoneGetFspHobListV2 (
32 IN CONST EFI_PEI_SERVICES
**PeiServices
,
33 IN FSP_INIT_DONE_PPI
*This
,
37 FSP_INIT_DONE_PPI mFspInitDonePpiV2
= {
38 FspInitDoneGetFspHobListV2
41 EFI_PEI_PPI_DESCRIPTOR mPeiFspInitDonePpiV2
= {
42 EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
,
48 This function is called after PEI core discover memory and finish migration.
50 @param[in] PeiServices Pointer to PEI Services Table.
51 @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
52 caused this function to execute.
53 @param[in] Ppi Pointer to the PPI data associated with this function.
55 @retval EFI_STATUS Always return EFI_SUCCESS
59 PeiMemoryDiscoveredNotify (
60 IN EFI_PEI_SERVICES
**PeiServices
,
61 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDesc
,
65 EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc
= {
66 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
67 &gEfiPeiMemoryDiscoveredPpiGuid
,
68 PeiMemoryDiscoveredNotify
72 TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked
73 by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.
75 @retval EFI_SUCCESS Use of Temporary RAM was disabled.
76 @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.
85 EFI_PEI_TEMPORARY_RAM_DONE_PPI mPeiTemporaryRamDonePpi
= {
89 EFI_PEI_PPI_DESCRIPTOR mPeiTemporaryRamDoneDesc
= {
90 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
91 &gEfiTemporaryRamDonePpiGuid
,
92 &mPeiTemporaryRamDonePpi
96 Return Hob list produced by FSP.
98 @param[in] PeiServices The pointer to the PEI Services Table.
99 @param[in] This The pointer to this instance of this PPI.
100 @param[out] FspHobList The pointer to Hob list produced by FSP.
102 @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
106 FspInitDoneGetFspHobListV2 (
107 IN CONST EFI_PEI_SERVICES
**PeiServices
,
108 IN FSP_INIT_DONE_PPI
*This
,
109 OUT VOID
**FspHobList
112 EFI_HOB_GUID_TYPE
*GuidHob
;
114 GuidHob
= GetFirstGuidHob (&gFspInitDonePpiGuid
);
115 if (GuidHob
!= NULL
) {
116 *FspHobList
= *(VOID
**)GET_GUID_HOB_DATA (GuidHob
);
119 return EFI_NOT_FOUND
;
124 Call FspMemoryInit API.
126 @param[in] FspHeader FSP header pointer.
128 @return Status returned by FspMemoryInit API.
132 IN FSP_INFO_HEADER
*FspHeader
135 FSP_MEMORY_INIT_PARAMS FspMemoryInitParams
;
136 FSP_INIT_RT_COMMON_BUFFER FspRtBuffer
;
137 UINT8 FspUpdRgn
[FixedPcdGet32 (PcdMaxUpdRegionSize
)];
138 UINT32 UpdRegionSize
;
139 EFI_BOOT_MODE BootMode
;
141 EFI_PHYSICAL_ADDRESS StackBase
;
146 DEBUG ((DEBUG_INFO
, "PeiFspMemoryInit enter\n"));
148 PeiServicesGetBootMode (&BootMode
);
149 DEBUG ((DEBUG_INFO
, "BootMode - 0x%x\n", BootMode
));
151 GetStackInfo (BootMode
, FALSE
, &StackSize
, &StackBase
);
152 DEBUG ((DEBUG_INFO
, "StackBase - 0x%x\n", StackBase
));
153 DEBUG ((DEBUG_INFO
, "StackSize - 0x%x\n", StackSize
));
155 ZeroMem (&FspRtBuffer
, sizeof(FspRtBuffer
));
156 FspRtBuffer
.StackTop
= (UINT32
*)(UINTN
)(StackBase
+ StackSize
);
158 FspRtBuffer
.BootMode
= BootMode
;
160 /* Platform override any UPD configs */
161 UpdRegionSize
= GetUpdRegionSize();
162 DEBUG ((DEBUG_INFO
, "UpdRegionSize - 0x%x\n", UpdRegionSize
));
163 DEBUG ((DEBUG_INFO
, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn
)));
164 ASSERT(sizeof(FspUpdRgn
) >= UpdRegionSize
);
165 ZeroMem (FspUpdRgn
, UpdRegionSize
);
166 FspRtBuffer
.UpdDataRgnPtr
= UpdateFspUpdConfigs (FspUpdRgn
);
167 FspRtBuffer
.BootLoaderTolumSize
= GetBootLoaderTolumSize ();
169 ZeroMem (&FspMemoryInitParams
, sizeof(FspMemoryInitParams
));
170 FspMemoryInitParams
.NvsBufferPtr
= GetNvsBuffer ();
171 DEBUG ((DEBUG_INFO
, "NvsBufferPtr - 0x%x\n", FspMemoryInitParams
.NvsBufferPtr
));
172 FspMemoryInitParams
.RtBufferPtr
= (VOID
*)&FspRtBuffer
;
174 FspMemoryInitParams
.HobListPtr
= &FspHobList
;
176 DEBUG ((DEBUG_INFO
, "FspMemoryInitParams - 0x%x\n", &FspMemoryInitParams
));
177 DEBUG ((DEBUG_INFO
, " NvsBufferPtr - 0x%x\n", FspMemoryInitParams
.NvsBufferPtr
));
178 DEBUG ((DEBUG_INFO
, " RtBufferPtr - 0x%x\n", FspMemoryInitParams
.RtBufferPtr
));
179 DEBUG ((DEBUG_INFO
, " StackTop - 0x%x\n", FspRtBuffer
.StackTop
));
180 DEBUG ((DEBUG_INFO
, " BootMode - 0x%x\n", FspRtBuffer
.BootMode
));
181 DEBUG ((DEBUG_INFO
, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer
.UpdDataRgnPtr
));
182 DEBUG ((DEBUG_INFO
, " HobListPtr - 0x%x\n", FspMemoryInitParams
.HobListPtr
));
184 Status
= CallFspMemoryInit (FspHeader
, &FspMemoryInitParams
);
185 DEBUG((DEBUG_INFO
, "FspMemoryInit status: 0x%x\n", Status
));
186 ASSERT_EFI_ERROR (Status
);
188 DEBUG ((DEBUG_INFO
, " HobListPtr (returned) - 0x%x\n", FspHobList
));
189 ASSERT (FspHobList
!= NULL
);
191 FspHobProcessForMemoryResource (FspHobList
);
194 // FspHobList is not complete at this moment.
195 // Save FspHobList pointer to hob, so that it can be got later
197 HobData
= BuildGuidHob (
198 &gFspInitDonePpiGuid
,
201 ASSERT (HobData
!= NULL
);
202 CopyMem (HobData
, &FspHobList
, sizeof (FspHobList
));
208 TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked
209 by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.
211 @retval EFI_SUCCESS Use of Temporary RAM was disabled.
212 @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.
217 PeiTemporaryRamDone (
222 VOID
*TempRamExitParam
;
223 FSP_INFO_HEADER
*FspHeader
;
225 FspHeader
= FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase
));
226 if (FspHeader
== NULL
) {
227 return EFI_DEVICE_ERROR
;
230 DEBUG ((DEBUG_INFO
, "PeiTemporaryRamDone enter\n"));
232 TempRamExitParam
= GetTempRamExitParam ();
233 Status
= CallTempRamExit (FspHeader
, TempRamExitParam
);
234 DEBUG((DEBUG_INFO
, "TempRamExit status: 0x%x\n", Status
));
235 ASSERT_EFI_ERROR (Status
);
241 This function is called after PEI core discover memory and finish migration.
243 @param[in] PeiServices Pointer to PEI Services Table.
244 @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
245 caused this function to execute.
246 @param[in] Ppi Pointer to the PPI data associated with this function.
248 @retval EFI_STATUS Always return EFI_SUCCESS
252 PeiMemoryDiscoveredNotify (
253 IN EFI_PEI_SERVICES
**PeiServices
,
254 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDesc
,
259 VOID
*FspSiliconInitParam
;
260 FSP_INFO_HEADER
*FspHeader
;
262 EFI_HOB_GUID_TYPE
*GuidHob
;
264 if (PcdGet32 (PcdFlashFvSecondFspBase
) == 0) {
265 FspHeader
= FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase
));
267 FspHeader
= FspFindFspHeader (PcdGet32 (PcdFlashFvSecondFspBase
));
269 if (FspHeader
== NULL
) {
270 return EFI_DEVICE_ERROR
;
273 DEBUG ((DEBUG_INFO
, "PeiMemoryDiscoveredNotify enter\n"));
275 FspSiliconInitParam
= GetFspSiliconInitParam ();
276 Status
= CallFspSiliconInit (FspHeader
, FspSiliconInitParam
);
277 DEBUG((DEBUG_ERROR
, "FspSiliconInit status: 0x%x\n", Status
));
278 ASSERT_EFI_ERROR (Status
);
281 // Now FspHobList complete, process it
283 GuidHob
= GetFirstGuidHob (&gFspInitDonePpiGuid
);
284 ASSERT (GuidHob
!= NULL
);
285 FspHobList
= *(VOID
**)GET_GUID_HOB_DATA (GuidHob
);
286 DEBUG ((DEBUG_INFO
, "FspHobList - 0x%x\n", FspHobList
));
287 FspHobProcessForOtherData (FspHobList
);
290 // Install FspInitDonePpi so that any other driver can consume this info.
292 Status
= PeiServicesInstallPpi (&mPeiFspInitDonePpiV2
);
293 ASSERT_EFI_ERROR(Status
);
299 Do FSP initialization based on FspApi version 2.
301 @param[in] FspHeader FSP header pointer.
303 @return FSP initialization status.
307 IN FSP_INFO_HEADER
*FspHeader
311 EFI_BOOT_MODE BootMode
;
313 Status
= PeiFspMemoryInit (FspHeader
);
314 ASSERT_EFI_ERROR (Status
);
317 // Install TempramDonePpi to run TempRamExit
319 Status
= PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc
);
320 ASSERT_EFI_ERROR(Status
);
323 // Register MemoryDiscovered Nofity to run FspSiliconInit
325 Status
= PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc
);
326 ASSERT_EFI_ERROR (Status
);
329 // Register EndOfPei Notify for S3 to run FspNotifyPhase
331 PeiServicesGetBootMode (&BootMode
);
332 if (BootMode
== BOOT_ON_S3_RESUME
) {
333 Status
= PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc
);
334 ASSERT_EFI_ERROR (Status
);