2 Provide FSP API related function.
4 Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include <Guid/FspHeaderFile.h>
19 #include <Library/FspApiLib.h>
20 #include <Library/BaseLib.h>
21 #include <Library/BaseMemoryLib.h>
24 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
27 @param[in] Function The 32bit code entry to be executed.
28 @param[in] Param1 The first parameter to pass to 32bit code.
39 Find FSP header pointer.
41 @param[in] FlashFvFspBase Flash address of FSP FV.
43 @return FSP header pointer.
48 IN EFI_PHYSICAL_ADDRESS FlashFvFspBase
53 CheckPointer
= (UINT8
*) (UINTN
) FlashFvFspBase
;
55 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->Signature
!= EFI_FVH_SIGNATURE
) {
59 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
!= 0) {
60 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
;
61 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_EXT_HEADER
*)CheckPointer
)->ExtHeaderSize
;
62 CheckPointer
= (UINT8
*) ALIGN_POINTER (CheckPointer
, 8);
64 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->HeaderLength
;
67 if (!CompareGuid (&((EFI_FFS_FILE_HEADER
*)CheckPointer
)->Name
, &gFspHeaderFileGuid
)) {
71 CheckPointer
= CheckPointer
+ sizeof (EFI_FFS_FILE_HEADER
);
73 if (((EFI_RAW_SECTION
*)CheckPointer
)->Type
!= EFI_SECTION_RAW
) {
77 CheckPointer
= CheckPointer
+ sizeof (EFI_RAW_SECTION
);
79 return (FSP_INFO_HEADER
*)CheckPointer
;
83 Call FSP API - FspInit.
85 @param[in] FspHeader FSP header pointer.
86 @param[in] FspInitParams Address pointer to the FSP_INIT_PARAMS structure.
88 @return EFI status returned by FspInit API.
93 IN FSP_INFO_HEADER
*FspHeader
,
94 IN FSP_INIT_PARAMS
*FspInitParams
99 BOOLEAN InterruptState
;
101 FspInitApi
= (FSP_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspInitEntryOffset
);
102 InterruptState
= SaveAndDisableInterrupts ();
103 Status
= Execute32BitCode ((UINTN
)FspInitApi
, (UINTN
)FspInitParams
);
104 SetInterruptState (InterruptState
);
110 Call FSP API - FspNotifyPhase.
112 @param[in] FspHeader FSP header pointer.
113 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.
115 @return EFI status returned by FspNotifyPhase API.
120 IN FSP_INFO_HEADER
*FspHeader
,
121 IN NOTIFY_PHASE_PARAMS
*NotifyPhaseParams
124 FSP_NOTIFY_PHASE NotifyPhaseApi
;
126 BOOLEAN InterruptState
;
128 NotifyPhaseApi
= (FSP_NOTIFY_PHASE
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->NotifyPhaseEntryOffset
);
129 InterruptState
= SaveAndDisableInterrupts ();
130 Status
= Execute32BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
);
131 SetInterruptState (InterruptState
);
137 Call FSP API - FspMemoryInit.
139 @param[in] FspHeader FSP header pointer.
140 @param[in,out] FspMemoryInitParams Address pointer to the FSP_MEMORY_INIT_PARAMS structure.
142 @return EFI status returned by FspMemoryInit API.
147 IN FSP_INFO_HEADER
*FspHeader
,
148 IN OUT FSP_MEMORY_INIT_PARAMS
*FspMemoryInitParams
151 FSP_MEMORY_INIT FspMemoryInitApi
;
153 BOOLEAN InterruptState
;
155 FspMemoryInitApi
= (FSP_MEMORY_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspMemoryInitEntryOffset
);
156 InterruptState
= SaveAndDisableInterrupts ();
157 Status
= Execute32BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspMemoryInitParams
);
158 SetInterruptState (InterruptState
);
164 Call FSP API - TempRamExit.
166 @param[in] FspHeader FSP header pointer.
167 @param[in,out] TempRamExitParam Address pointer to the TempRamExit parameters structure.
169 @return EFI status returned by TempRamExit API.
174 IN FSP_INFO_HEADER
*FspHeader
,
175 IN OUT VOID
*TempRamExitParam
178 FSP_TEMP_RAM_EXIT TempRamExitApi
;
180 BOOLEAN InterruptState
;
182 TempRamExitApi
= (FSP_TEMP_RAM_EXIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->TempRamExitEntryOffset
);
183 InterruptState
= SaveAndDisableInterrupts ();
184 Status
= Execute32BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
);
185 SetInterruptState (InterruptState
);
191 Call FSP API - FspSiliconInit.
193 @param[in] FspHeader FSP header pointer.
194 @param[in,out] FspSiliconInitParam Address pointer to the Silicon Init parameters structure.
196 @return EFI status returned by FspSiliconInit API.
201 IN FSP_INFO_HEADER
*FspHeader
,
202 IN OUT VOID
*FspSiliconInitParam
205 FSP_SILICON_INIT FspSiliconInitApi
;
207 BOOLEAN InterruptState
;
209 FspSiliconInitApi
= (FSP_SILICON_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspSiliconInitEntryOffset
);
210 InterruptState
= SaveAndDisableInterrupts ();
211 Status
= Execute32BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspSiliconInitParam
);
212 SetInterruptState (InterruptState
);