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