2 In FSP API V1 mode, it will be invoked twice by pei core. In 1st entry, it will
3 call FspInit API. In 2nd entry, it will parse the hoblist from fsp and report
6 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include "FspInitPei.h"
15 FSP Init continuation function.
16 Control will be returned to this callback function after FspInit API call.
18 @param[in] Status Status of the FSP INIT API
19 @param[in] HobListPtr Pointer to the HOB data structure defined in the PI specification.
28 EFI_BOOT_MODE BootMode
;
30 EFI_PHYSICAL_ADDRESS StackBase
;
32 DEBUG ((DEBUG_INFO
, "ContinuationFunc - %r\n", Status
));
33 DEBUG ((DEBUG_INFO
, "HobListPtr - 0x%x\n", HobListPtr
));
35 if (Status
!= EFI_SUCCESS
) {
40 // Can not call any PeiServices
42 BootMode
= GetBootMode ();
44 GetStackInfo (BootMode
, TRUE
, &StackSize
, &StackBase
);
45 DEBUG ((DEBUG_INFO
, "StackBase - 0x%x\n", StackBase
));
46 DEBUG ((DEBUG_INFO
, "StackSize - 0x%x\n", StackSize
));
47 CallPeiCoreEntryPoint (
49 (VOID
*)(UINTN
)StackBase
,
50 (VOID
*)(UINTN
)(StackBase
+ StackSize
)
57 @param[in] FspHeader FSP header pointer.
61 IN FSP_INFO_HEADER
*FspHeader
64 FSP_INIT_PARAMS FspInitParams
;
65 FSP_INIT_RT_COMMON_BUFFER FspRtBuffer
;
66 UINT8 FspUpdRgn
[FixedPcdGet32 (PcdMaxUpdRegionSize
)];
68 EFI_BOOT_MODE BootMode
;
70 EFI_PHYSICAL_ADDRESS StackBase
;
73 DEBUG ((DEBUG_INFO
, "PeiFspInit enter\n"));
75 PeiServicesGetBootMode (&BootMode
);
76 DEBUG ((DEBUG_INFO
, "BootMode - 0x%x\n", BootMode
));
78 GetStackInfo (BootMode
, FALSE
, &StackSize
, &StackBase
);
79 DEBUG ((DEBUG_INFO
, "StackBase - 0x%x\n", StackBase
));
80 DEBUG ((DEBUG_INFO
, "StackSize - 0x%x\n", StackSize
));
82 ZeroMem (&FspRtBuffer
, sizeof(FspRtBuffer
));
83 FspRtBuffer
.StackTop
= (UINT32
*)(UINTN
)(StackBase
+ StackSize
);
85 FspRtBuffer
.BootMode
= BootMode
;
87 /* Platform override any UPD configs */
88 UpdRegionSize
= GetUpdRegionSize();
89 DEBUG ((DEBUG_INFO
, "UpdRegionSize - 0x%x\n", UpdRegionSize
));
90 DEBUG ((DEBUG_INFO
, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn
)));
91 ASSERT(sizeof(FspUpdRgn
) >= UpdRegionSize
);
92 ZeroMem (FspUpdRgn
, UpdRegionSize
);
93 FspRtBuffer
.UpdDataRgnPtr
= UpdateFspUpdConfigs (FspUpdRgn
);
94 FspRtBuffer
.BootLoaderTolumSize
= 0;
96 ZeroMem (&FspInitParams
, sizeof(FspInitParams
));
97 FspInitParams
.NvsBufferPtr
= GetNvsBuffer ();
98 DEBUG ((DEBUG_INFO
, "NvsBufferPtr - 0x%x\n", FspInitParams
.NvsBufferPtr
));
99 FspInitParams
.RtBufferPtr
= (VOID
*)&FspRtBuffer
;
100 FspInitParams
.ContinuationFunc
= (CONTINUATION_PROC
)ContinuationFunc
;
102 SaveSecContext (GetPeiServicesTablePointer ());
104 DEBUG ((DEBUG_INFO
, "FspInitParams - 0x%x\n", &FspInitParams
));
105 DEBUG ((DEBUG_INFO
, " NvsBufferPtr - 0x%x\n", FspInitParams
.NvsBufferPtr
));
106 DEBUG ((DEBUG_INFO
, " RtBufferPtr - 0x%x\n", FspInitParams
.RtBufferPtr
));
107 DEBUG ((DEBUG_INFO
, " StackTop - 0x%x\n", FspRtBuffer
.StackTop
));
108 DEBUG ((DEBUG_INFO
, " BootMode - 0x%x\n", FspRtBuffer
.BootMode
));
109 DEBUG ((DEBUG_INFO
, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer
.UpdDataRgnPtr
));
110 DEBUG ((DEBUG_INFO
, " ContinuationFunc - 0x%x\n", FspInitParams
.ContinuationFunc
));
112 Status
= CallFspInit (FspHeader
, &FspInitParams
);
114 // Should never return
116 DEBUG((DEBUG_ERROR
, "FSP Init failed, status: 0x%x\n", Status
));
121 Do FSP initialization based on FspApi version 1.
123 @param[in] FspHeader FSP header pointer.
125 @return FSP initialization status.
129 IN FSP_INFO_HEADER
*FspHeader
133 FSP_INIT_DONE_PPI
*FspInitDone
;
135 EFI_BOOT_MODE BootMode
;
137 Status
= PeiServicesLocatePpi (
138 &gFspInitDonePpiGuid
,
141 (VOID
**) &FspInitDone
143 if (EFI_ERROR (Status
)) {
147 DEBUG ((DEBUG_INFO
, "1st entry\n"));
149 PeiFspInit (FspHeader
);
151 // Never return here, for FspApi version 1.
156 // 2nd entry for FspApi version 1 only.
158 DEBUG ((DEBUG_INFO
, "2nd entry\n"));
160 Status
= FspInitDone
->GetFspHobList (GetPeiServicesTablePointer (), FspInitDone
, &FspHobList
);
161 ASSERT_EFI_ERROR (Status
);
162 DEBUG ((DEBUG_INFO
, "FspHobList - 0x%x\n", FspHobList
));
163 FspHobProcess (FspHobList
);
166 // Register EndOfPei Notify for S3 to run FspNotifyPhase
168 PeiServicesGetBootMode (&BootMode
);
169 if (BootMode
== BOOT_ON_S3_RESUME
) {
170 Status
= PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc
);
171 ASSERT_EFI_ERROR (Status
);