]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspWrapperPkg/FspInitPei/FspInitPeiV1.c
IntelFspWrapperPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / IntelFspWrapperPkg / FspInitPei / FspInitPeiV1.c
CommitLineData
d8043ce9
JY
1/** @file\r
2 In FSP API V1 mode, it will be invoked twice by pei core. In 1st entry, it will\r
3 call FspInit API. In 2nd entry, it will parse the hoblist from fsp and report\r
4 them into pei core.\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 FSP Init continuation function.\r
16 Control will be returned to this callback function after FspInit API call.\r
17\r
18 @param[in] Status Status of the FSP INIT API\r
19 @param[in] HobListPtr Pointer to the HOB data structure defined in the PI specification.\r
20\r
21**/\r
22VOID\r
23ContinuationFunc (\r
24 IN EFI_STATUS Status,\r
25 IN VOID *HobListPtr\r
26 )\r
27{\r
28 EFI_BOOT_MODE BootMode;\r
29 UINT64 StackSize;\r
30 EFI_PHYSICAL_ADDRESS StackBase;\r
31\r
32 DEBUG ((DEBUG_INFO, "ContinuationFunc - %r\n", Status));\r
33 DEBUG ((DEBUG_INFO, "HobListPtr - 0x%x\n", HobListPtr));\r
34\r
35 if (Status != EFI_SUCCESS) {\r
36 CpuDeadLoop ();\r
37 }\r
38\r
39 //\r
40 // Can not call any PeiServices\r
41 //\r
42 BootMode = GetBootMode ();\r
43\r
dd4e2bcf 44 GetStackInfo (BootMode, TRUE, &StackSize, &StackBase);\r
d8043ce9
JY
45 DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
46 DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
47 CallPeiCoreEntryPoint (\r
48 HobListPtr,\r
49 (VOID *)(UINTN)StackBase,\r
50 (VOID *)(UINTN)(StackBase + StackSize)\r
51 );\r
52}\r
53\r
54/**\r
55 Call FspInit API.\r
56\r
57 @param[in] FspHeader FSP header pointer.\r
58**/\r
59VOID\r
60PeiFspInit (\r
61 IN FSP_INFO_HEADER *FspHeader\r
62 )\r
63{\r
64 FSP_INIT_PARAMS FspInitParams;\r
65 FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;\r
66 UINT8 FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];\r
67 UINT32 UpdRegionSize;\r
68 EFI_BOOT_MODE BootMode;\r
69 UINT64 StackSize;\r
70 EFI_PHYSICAL_ADDRESS StackBase;\r
71 EFI_STATUS Status;\r
72\r
73 DEBUG ((DEBUG_INFO, "PeiFspInit enter\n"));\r
74\r
75 PeiServicesGetBootMode (&BootMode);\r
76 DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));\r
77\r
dd4e2bcf 78 GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);\r
d8043ce9
JY
79 DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
80 DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
81\r
82 ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));\r
83 FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);\r
84\r
85 FspRtBuffer.BootMode = BootMode;\r
86\r
87 /* Platform override any UPD configs */\r
88 UpdRegionSize = GetUpdRegionSize();\r
89 DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));\r
90 DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));\r
91 ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);\r
92 ZeroMem (FspUpdRgn, UpdRegionSize);\r
93 FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);\r
88a539ca 94 FspRtBuffer.BootLoaderTolumSize = 0;\r
d8043ce9
JY
95\r
96 ZeroMem (&FspInitParams, sizeof(FspInitParams));\r
97 FspInitParams.NvsBufferPtr = GetNvsBuffer ();\r
98 DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspInitParams.NvsBufferPtr));\r
99 FspInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;\r
100 FspInitParams.ContinuationFunc = (CONTINUATION_PROC)ContinuationFunc;\r
101\r
102 SaveSecContext (GetPeiServicesTablePointer ());\r
103\r
104 DEBUG ((DEBUG_INFO, "FspInitParams - 0x%x\n", &FspInitParams));\r
105 DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspInitParams.NvsBufferPtr));\r
106 DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspInitParams.RtBufferPtr));\r
107 DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));\r
108 DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));\r
109 DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));\r
110 DEBUG ((DEBUG_INFO, " ContinuationFunc - 0x%x\n", FspInitParams.ContinuationFunc));\r
111\r
112 Status = CallFspInit (FspHeader, &FspInitParams);\r
113 //\r
114 // Should never return\r
115 //\r
116 DEBUG((DEBUG_ERROR, "FSP Init failed, status: 0x%x\n", Status));\r
117 CpuDeadLoop ();\r
118}\r
119\r
120/**\r
121 Do FSP initialization based on FspApi version 1.\r
122\r
123 @param[in] FspHeader FSP header pointer.\r
124\r
125 @return FSP initialization status.\r
126**/\r
127EFI_STATUS\r
128PeiFspInitV1 (\r
129 IN FSP_INFO_HEADER *FspHeader\r
130 )\r
131{\r
132 EFI_STATUS Status;\r
133 FSP_INIT_DONE_PPI *FspInitDone;\r
134 VOID *FspHobList;\r
135 EFI_BOOT_MODE BootMode;\r
136 \r
137 Status = PeiServicesLocatePpi (\r
138 &gFspInitDonePpiGuid,\r
139 0,\r
140 NULL,\r
141 (VOID **) &FspInitDone\r
142 );\r
143 if (EFI_ERROR (Status)) {\r
144 //\r
145 // 1st entry\r
146 //\r
147 DEBUG ((DEBUG_INFO, "1st entry\n"));\r
148\r
149 PeiFspInit (FspHeader);\r
150 //\r
151 // Never return here, for FspApi version 1.\r
152 //\r
153 CpuDeadLoop ();\r
154 } else {\r
155 //\r
156 // 2nd entry for FspApi version 1 only.\r
157 //\r
158 DEBUG ((DEBUG_INFO, "2nd entry\n"));\r
159\r
160 Status = FspInitDone->GetFspHobList (GetPeiServicesTablePointer (), FspInitDone, &FspHobList);\r
161 ASSERT_EFI_ERROR (Status);\r
162 DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));\r
163 FspHobProcess (FspHobList);\r
164 \r
165 //\r
166 // Register EndOfPei Notify for S3 to run FspNotifyPhase\r
167 //\r
168 PeiServicesGetBootMode (&BootMode);\r
169 if (BootMode == BOOT_ON_S3_RESUME) {\r
170 Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);\r
171 ASSERT_EFI_ERROR (Status);\r
172 }\r
173 }\r
174\r
175 return EFI_SUCCESS;\r
176}