3 Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Library/BaseLib.h>
10 #include <Library/DebugLib.h>
11 #include <Library/PcdLib.h>
12 #include <FspGlobalData.h>
18 // Cont Func Parameter 2 +0x3C
19 // Cont Func Parameter 1 +0x38
21 // API Parameter +0x34
22 // API return address +0x30
24 // push FspInfoHeader +0x2C
29 // sidt fword ptr [esp]
49 #define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x
54 This function sets the FSP global data pointer.
56 @param[in] FspData Fsp global data pointer.
61 SetFspGlobalDataPointer (
62 IN FSP_GLOBAL_DATA
*FspData
65 ASSERT (FspData
!= NULL
);
66 *((volatile UINT32
*)(UINTN
)PcdGet32(PcdGlobalDataPointerAddress
)) = (UINT32
)(UINTN
)FspData
;
70 This function gets the FSP global data pointer.
75 GetFspGlobalDataPointer (
79 FSP_GLOBAL_DATA
*FspData
;
81 FspData
= *(FSP_GLOBAL_DATA
**)(UINTN
)PcdGet32(PcdGlobalDataPointerAddress
);
86 This function gets back the FSP API parameter passed by the bootlaoder.
88 @retval ApiParameter FSP API parameter passed by the bootlaoder.
96 FSP_GLOBAL_DATA
*FspData
;
98 FspData
= GetFspGlobalDataPointer ();
99 return *(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(ApiParam
));
103 This function sets the FSP API parameter in the stack.
105 @param[in] Value New parameter value.
114 FSP_GLOBAL_DATA
*FspData
;
116 FspData
= GetFspGlobalDataPointer ();
117 *(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(ApiParam
)) = Value
;
121 This function sets the FSP continuation function parameters in the stack.
123 @param[in] Value New parameter value to set.
124 @param[in] Index Parameter index.
128 SetFspContinuationFuncParameter (
133 FSP_GLOBAL_DATA
*FspData
;
135 FspData
= GetFspGlobalDataPointer ();
136 *(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(ApiParam
) + (Index
+ 1) * sizeof(UINT32
)) = Value
;
141 This function changes the BootLoader return address in stack.
143 @param[in] ReturnAddress Address to return.
148 SetFspApiReturnAddress (
149 IN UINT32 ReturnAddress
152 FSP_GLOBAL_DATA
*FspData
;
154 FspData
= GetFspGlobalDataPointer ();
155 *(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(ApiRet
)) = ReturnAddress
;
159 This function set the API status code returned to the BootLoader.
161 @param[in] ReturnStatus Status code to return.
166 SetFspApiReturnStatus (
167 IN UINT32 ReturnStatus
170 FSP_GLOBAL_DATA
*FspData
;
172 FspData
= GetFspGlobalDataPointer ();
173 *(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(Eax
)) = ReturnStatus
;
177 This function sets the context switching stack to a new stack frame.
179 @param[in] NewStackTop New core stack to be set.
184 SetFspCoreStackPointer (
188 FSP_GLOBAL_DATA
*FspData
;
191 UINT32 StackContextLen
;
193 FspData
= GetFspGlobalDataPointer ();
194 StackContextLen
= sizeof(CONTEXT_STACK
) / sizeof(UINT32
);
197 // Reserve space for the ContinuationFunc two parameters
199 OldStack
= (UINT32
*)FspData
->CoreStack
;
200 NewStack
= (UINT32
*)NewStackTop
- StackContextLen
- 2;
201 FspData
->CoreStack
= (UINT32
)NewStack
;
202 while (StackContextLen
-- != 0) {
203 *NewStack
++ = *OldStack
++;
208 This function sets the platform specific data pointer.
210 @param[in] PlatformData Fsp platform specific data pointer.
215 SetFspPlatformDataPointer (
216 IN VOID
*PlatformData
219 FSP_GLOBAL_DATA
*FspData
;
221 FspData
= GetFspGlobalDataPointer ();
222 FspData
->PlatformData
.DataPtr
= PlatformData
;
227 This function gets the platform specific data pointer.
229 @param[in] PlatformData Fsp platform specific data pointer.
234 GetFspPlatformDataPointer (
238 FSP_GLOBAL_DATA
*FspData
;
240 FspData
= GetFspGlobalDataPointer ();
241 return FspData
->PlatformData
.DataPtr
;
246 This function sets the UPD data pointer.
248 @param[in] UpdDataRgnPtr UPD data pointer.
252 SetFspUpdDataPointer (
253 IN VOID
*UpdDataRgnPtr
256 FSP_GLOBAL_DATA
*FspData
;
259 // Get the Fsp Global Data Pointer
261 FspData
= GetFspGlobalDataPointer ();
264 // Set the UPD pointer.
266 FspData
->UpdDataRgnPtr
= UpdDataRgnPtr
;
270 This function gets the UPD data pointer.
272 @return UpdDataRgnPtr UPD data pointer.
276 GetFspUpdDataPointer (
280 FSP_GLOBAL_DATA
*FspData
;
282 FspData
= GetFspGlobalDataPointer ();
283 return FspData
->UpdDataRgnPtr
;
288 This function sets the memory init UPD data pointer.
290 @param[in] MemoryInitUpdPtr memory init UPD data pointer.
294 SetFspMemoryInitUpdDataPointer (
295 IN VOID
*MemoryInitUpdPtr
298 FSP_GLOBAL_DATA
*FspData
;
301 // Get the Fsp Global Data Pointer
303 FspData
= GetFspGlobalDataPointer ();
306 // Set the memory init UPD pointer.
308 FspData
->MemoryInitUpdPtr
= MemoryInitUpdPtr
;
312 This function gets the memory init UPD data pointer.
314 @return memory init UPD data pointer.
318 GetFspMemoryInitUpdDataPointer (
322 FSP_GLOBAL_DATA
*FspData
;
324 FspData
= GetFspGlobalDataPointer ();
325 return FspData
->MemoryInitUpdPtr
;
330 This function sets the silicon init UPD data pointer.
332 @param[in] SiliconInitUpdPtr silicon init UPD data pointer.
336 SetFspSiliconInitUpdDataPointer (
337 IN VOID
*SiliconInitUpdPtr
340 FSP_GLOBAL_DATA
*FspData
;
343 // Get the Fsp Global Data Pointer
345 FspData
= GetFspGlobalDataPointer ();
348 // Set the silicon init UPD data pointer.
350 FspData
->SiliconInitUpdPtr
= SiliconInitUpdPtr
;
354 This function gets the silicon init UPD data pointer.
356 @return silicon init UPD data pointer.
360 GetFspSiliconInitUpdDataPointer (
364 FSP_GLOBAL_DATA
*FspData
;
366 FspData
= GetFspGlobalDataPointer ();
367 return FspData
->SiliconInitUpdPtr
;
372 Set FSP measurement point timestamp.
374 @param[in] Id Measurement point ID.
376 @return performance timestamp.
384 FSP_GLOBAL_DATA
*FspData
;
387 // Bit [55: 0] will be the timestamp
388 // Bit [63:56] will be the ID
390 FspData
= GetFspGlobalDataPointer ();
391 if (FspData
->PerfIdx
< sizeof(FspData
->PerfData
) / sizeof(FspData
->PerfData
[0])) {
392 FspData
->PerfData
[FspData
->PerfIdx
] = AsmReadTsc ();
393 ((UINT8
*)(&FspData
->PerfData
[FspData
->PerfIdx
]))[7] = Id
;
396 return FspData
->PerfData
[(FspData
->PerfIdx
)++];
400 This function gets the FSP info header pointer.
402 @retval FspInfoHeader FSP info header pointer
410 return GetFspGlobalDataPointer()->FspInfoHeader
;
414 This function gets the FSP info header pointer using the API stack context.
416 @retval FspInfoHeader FSP info header pointer using the API stack context
420 GetFspInfoHeaderFromApiContext (
424 FSP_GLOBAL_DATA
*FspData
;
426 FspData
= GetFspGlobalDataPointer ();
427 return (FSP_INFO_HEADER
*)(*(UINT32
*)(UINTN
)(FspData
->CoreStack
+ CONTEXT_STACK_OFFSET(FspInfoHeader
)));
431 This function gets the VPD data pointer.
433 @return VpdDataRgnPtr VPD data pointer.
437 GetFspVpdDataPointer (
441 FSP_INFO_HEADER
*FspInfoHeader
;
443 FspInfoHeader
= GetFspInfoHeader ();
444 return (VOID
*)(FspInfoHeader
->ImageBase
+ FspInfoHeader
->CfgRegionOffset
);
448 This function gets FSP API calling mode.
450 @retval API calling mode
454 GetFspApiCallingMode (
458 return GetFspGlobalDataPointer()->ApiMode
;
462 This function sets FSP API calling mode.
464 @param[in] Mode API calling mode
468 SetFspApiCallingMode (
472 FSP_GLOBAL_DATA
*FspData
;
474 FspData
= GetFspGlobalDataPointer ();
475 FspData
->ApiMode
= Mode
;