2 Provide FSP API related function.
4 Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Guid/FspHeaderFile.h>
13 #include <Library/FspApiLib.h>
14 #include <Library/BaseLib.h>
15 #include <Library/BaseMemoryLib.h>
18 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
21 @param[in] Function The 32bit code entry to be executed.
22 @param[in] Param1 The first parameter to pass to 32bit code.
33 Find FSP header pointer.
35 @param[in] FlashFvFspBase Flash address of FSP FV.
37 @return FSP header pointer.
42 IN EFI_PHYSICAL_ADDRESS FlashFvFspBase
47 CheckPointer
= (UINT8
*) (UINTN
) FlashFvFspBase
;
49 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->Signature
!= EFI_FVH_SIGNATURE
) {
53 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
!= 0) {
54 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
;
55 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_EXT_HEADER
*)CheckPointer
)->ExtHeaderSize
;
56 CheckPointer
= (UINT8
*) ALIGN_POINTER (CheckPointer
, 8);
58 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->HeaderLength
;
61 if (!CompareGuid (&((EFI_FFS_FILE_HEADER
*)CheckPointer
)->Name
, &gFspHeaderFileGuid
)) {
65 CheckPointer
= CheckPointer
+ sizeof (EFI_FFS_FILE_HEADER
);
67 if (((EFI_RAW_SECTION
*)CheckPointer
)->Type
!= EFI_SECTION_RAW
) {
71 CheckPointer
= CheckPointer
+ sizeof (EFI_RAW_SECTION
);
73 return (FSP_INFO_HEADER
*)CheckPointer
;
77 Call FSP API - FspInit.
79 @param[in] FspHeader FSP header pointer.
80 @param[in] FspInitParams Address pointer to the FSP_INIT_PARAMS structure.
82 @return EFI status returned by FspInit API.
87 IN FSP_INFO_HEADER
*FspHeader
,
88 IN FSP_INIT_PARAMS
*FspInitParams
93 BOOLEAN InterruptState
;
95 FspInitApi
= (FSP_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspInitEntryOffset
);
96 InterruptState
= SaveAndDisableInterrupts ();
97 Status
= Execute32BitCode ((UINTN
)FspInitApi
, (UINTN
)FspInitParams
);
98 SetInterruptState (InterruptState
);
104 Call FSP API - FspNotifyPhase.
106 @param[in] FspHeader FSP header pointer.
107 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.
109 @return EFI status returned by FspNotifyPhase API.
114 IN FSP_INFO_HEADER
*FspHeader
,
115 IN NOTIFY_PHASE_PARAMS
*NotifyPhaseParams
118 FSP_NOTIFY_PHASE NotifyPhaseApi
;
120 BOOLEAN InterruptState
;
122 NotifyPhaseApi
= (FSP_NOTIFY_PHASE
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->NotifyPhaseEntryOffset
);
123 InterruptState
= SaveAndDisableInterrupts ();
124 Status
= Execute32BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
);
125 SetInterruptState (InterruptState
);
131 Call FSP API - FspMemoryInit.
133 @param[in] FspHeader FSP header pointer.
134 @param[in,out] FspMemoryInitParams Address pointer to the FSP_MEMORY_INIT_PARAMS structure.
136 @return EFI status returned by FspMemoryInit API.
141 IN FSP_INFO_HEADER
*FspHeader
,
142 IN OUT FSP_MEMORY_INIT_PARAMS
*FspMemoryInitParams
145 FSP_MEMORY_INIT FspMemoryInitApi
;
147 BOOLEAN InterruptState
;
149 FspMemoryInitApi
= (FSP_MEMORY_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspMemoryInitEntryOffset
);
150 InterruptState
= SaveAndDisableInterrupts ();
151 Status
= Execute32BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspMemoryInitParams
);
152 SetInterruptState (InterruptState
);
158 Call FSP API - TempRamExit.
160 @param[in] FspHeader FSP header pointer.
161 @param[in,out] TempRamExitParam Address pointer to the TempRamExit parameters structure.
163 @return EFI status returned by TempRamExit API.
168 IN FSP_INFO_HEADER
*FspHeader
,
169 IN OUT VOID
*TempRamExitParam
172 FSP_TEMP_RAM_EXIT TempRamExitApi
;
174 BOOLEAN InterruptState
;
176 TempRamExitApi
= (FSP_TEMP_RAM_EXIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->TempRamExitEntryOffset
);
177 InterruptState
= SaveAndDisableInterrupts ();
178 Status
= Execute32BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
);
179 SetInterruptState (InterruptState
);
185 Call FSP API - FspSiliconInit.
187 @param[in] FspHeader FSP header pointer.
188 @param[in,out] FspSiliconInitParam Address pointer to the Silicon Init parameters structure.
190 @return EFI status returned by FspSiliconInit API.
195 IN FSP_INFO_HEADER
*FspHeader
,
196 IN OUT VOID
*FspSiliconInitParam
199 FSP_SILICON_INIT FspSiliconInitApi
;
201 BOOLEAN InterruptState
;
203 FspSiliconInitApi
= (FSP_SILICON_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspSiliconInitEntryOffset
);
204 InterruptState
= SaveAndDisableInterrupts ();
205 Status
= Execute32BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspSiliconInitParam
);
206 SetInterruptState (InterruptState
);