2 Provide FSP API related function.
4 Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Library/FspWrapperApiLib.h>
12 #include <Library/BaseLib.h>
13 #include <Library/BaseMemoryLib.h>
16 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
19 @param[in] Function The 32bit code entry to be executed.
20 @param[in] Param1 The first parameter to pass to 32bit code.
21 @param[in] Param2 The second parameter to pass to 32bit code.
33 Wrapper to execute 64-bit code directly from long mode.
35 @param[in] Function The 64bit code entry to be executed.
36 @param[in] Param1 The first parameter to pass to 64bit code.
37 @param[in] Param2 The second parameter to pass to 64bit code.
49 Find FSP header pointer.
51 @param[in] FlashFvFspBase Flash address of FSP FV.
53 @return FSP header pointer.
58 IN EFI_PHYSICAL_ADDRESS FlashFvFspBase
63 CheckPointer
= (UINT8
*)(UINTN
)FlashFvFspBase
;
65 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->Signature
!= EFI_FVH_SIGNATURE
) {
69 if (((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
!= 0) {
70 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->ExtHeaderOffset
;
71 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_EXT_HEADER
*)CheckPointer
)->ExtHeaderSize
;
72 CheckPointer
= (UINT8
*)ALIGN_POINTER (CheckPointer
, 8);
74 CheckPointer
= CheckPointer
+ ((EFI_FIRMWARE_VOLUME_HEADER
*)CheckPointer
)->HeaderLength
;
77 CheckPointer
= CheckPointer
+ sizeof (EFI_FFS_FILE_HEADER
);
79 if (((EFI_RAW_SECTION
*)CheckPointer
)->Type
!= EFI_SECTION_RAW
) {
83 CheckPointer
= CheckPointer
+ sizeof (EFI_RAW_SECTION
);
85 return (FSP_INFO_HEADER
*)CheckPointer
;
89 Call FSP API - FspNotifyPhase.
91 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.
93 @return EFI status returned by FspNotifyPhase API.
98 IN NOTIFY_PHASE_PARAMS
*NotifyPhaseParams
101 FSP_INFO_HEADER
*FspHeader
;
102 FSP_NOTIFY_PHASE NotifyPhaseApi
;
104 BOOLEAN InterruptState
;
106 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
107 if (FspHeader
== NULL
) {
108 return EFI_DEVICE_ERROR
;
111 NotifyPhaseApi
= (FSP_NOTIFY_PHASE
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->NotifyPhaseEntryOffset
);
112 InterruptState
= SaveAndDisableInterrupts ();
113 if ((FspHeader
->ImageAttribute
& IMAGE_ATTRIBUTE_64BIT_MODE_SUPPORT
) == FSP_IA32
) {
114 Status
= Execute32BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
, (UINTN
)NULL
);
116 Status
= Execute64BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
, (UINTN
)NULL
);
119 SetInterruptState (InterruptState
);
125 Call FSP API - FspMemoryInit.
127 @param[in] FspmUpdDataPtr Address pointer to the FSP_MEMORY_INIT_PARAMS structure.
128 @param[out] HobListPtr Address of the HobList pointer.
130 @return EFI status returned by FspMemoryInit API.
135 IN VOID
*FspmUpdDataPtr
,
136 OUT VOID
**HobListPtr
139 FSP_INFO_HEADER
*FspHeader
;
140 FSP_MEMORY_INIT FspMemoryInitApi
;
142 BOOLEAN InterruptState
;
144 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
145 if (FspHeader
== NULL
) {
146 return EFI_DEVICE_ERROR
;
149 FspMemoryInitApi
= (FSP_MEMORY_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspMemoryInitEntryOffset
);
150 InterruptState
= SaveAndDisableInterrupts ();
151 if ((FspHeader
->ImageAttribute
& IMAGE_ATTRIBUTE_64BIT_MODE_SUPPORT
) == FSP_IA32
) {
152 Status
= Execute32BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspmUpdDataPtr
, (UINTN
)HobListPtr
);
154 Status
= Execute64BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspmUpdDataPtr
, (UINTN
)HobListPtr
);
157 SetInterruptState (InterruptState
);
163 Call FSP API - TempRamExit.
165 @param[in] TempRamExitParam Address pointer to the TempRamExit parameters structure.
167 @return EFI status returned by TempRamExit API.
172 IN VOID
*TempRamExitParam
175 FSP_INFO_HEADER
*FspHeader
;
176 FSP_TEMP_RAM_EXIT TempRamExitApi
;
178 BOOLEAN InterruptState
;
180 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
181 if (FspHeader
== NULL
) {
182 return EFI_DEVICE_ERROR
;
185 TempRamExitApi
= (FSP_TEMP_RAM_EXIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->TempRamExitEntryOffset
);
186 InterruptState
= SaveAndDisableInterrupts ();
187 if ((FspHeader
->ImageAttribute
& IMAGE_ATTRIBUTE_64BIT_MODE_SUPPORT
) == FSP_IA32
) {
188 Status
= Execute32BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
, (UINTN
)NULL
);
190 Status
= Execute64BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
, (UINTN
)NULL
);
193 SetInterruptState (InterruptState
);
199 Call FSP API - FspSiliconInit.
201 @param[in] FspsUpdDataPtr Address pointer to the Silicon Init parameters structure.
203 @return EFI status returned by FspSiliconInit API.
208 IN VOID
*FspsUpdDataPtr
211 FSP_INFO_HEADER
*FspHeader
;
212 FSP_SILICON_INIT FspSiliconInitApi
;
214 BOOLEAN InterruptState
;
216 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
217 if (FspHeader
== NULL
) {
218 return EFI_DEVICE_ERROR
;
221 FspSiliconInitApi
= (FSP_SILICON_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspSiliconInitEntryOffset
);
222 InterruptState
= SaveAndDisableInterrupts ();
223 if ((FspHeader
->ImageAttribute
& IMAGE_ATTRIBUTE_64BIT_MODE_SUPPORT
) == FSP_IA32
) {
224 Status
= Execute32BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspsUpdDataPtr
, (UINTN
)NULL
);
226 Status
= Execute64BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspsUpdDataPtr
, (UINTN
)NULL
);
229 SetInterruptState (InterruptState
);