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 <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 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
;
62 CheckPointer
= CheckPointer
+ sizeof (EFI_FFS_FILE_HEADER
);
64 if (((EFI_RAW_SECTION
*)CheckPointer
)->Type
!= EFI_SECTION_RAW
) {
68 CheckPointer
= CheckPointer
+ sizeof (EFI_RAW_SECTION
);
70 return (FSP_INFO_HEADER
*)CheckPointer
;
74 Call FSP API - FspNotifyPhase.
76 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.
78 @return EFI status returned by FspNotifyPhase API.
83 IN NOTIFY_PHASE_PARAMS
*NotifyPhaseParams
86 FSP_INFO_HEADER
*FspHeader
;
87 FSP_NOTIFY_PHASE NotifyPhaseApi
;
89 BOOLEAN InterruptState
;
91 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
92 if (FspHeader
== NULL
) {
93 return EFI_DEVICE_ERROR
;
96 NotifyPhaseApi
= (FSP_NOTIFY_PHASE
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->NotifyPhaseEntryOffset
);
97 InterruptState
= SaveAndDisableInterrupts ();
98 Status
= Execute32BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
, (UINTN
)NULL
);
99 SetInterruptState (InterruptState
);
105 Call FSP API - FspMemoryInit.
107 @param[in] FspmUpdDataPtr Address pointer to the FSP_MEMORY_INIT_PARAMS structure.
108 @param[out] HobListPtr Address of the HobList pointer.
110 @return EFI status returned by FspMemoryInit API.
115 IN VOID
*FspmUpdDataPtr
,
116 OUT VOID
**HobListPtr
119 FSP_INFO_HEADER
*FspHeader
;
120 FSP_MEMORY_INIT FspMemoryInitApi
;
122 BOOLEAN InterruptState
;
124 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
125 if (FspHeader
== NULL
) {
126 return EFI_DEVICE_ERROR
;
129 FspMemoryInitApi
= (FSP_MEMORY_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspMemoryInitEntryOffset
);
130 InterruptState
= SaveAndDisableInterrupts ();
131 Status
= Execute32BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspmUpdDataPtr
, (UINTN
)HobListPtr
);
132 SetInterruptState (InterruptState
);
138 Call FSP API - TempRamExit.
140 @param[in] TempRamExitParam Address pointer to the TempRamExit parameters structure.
142 @return EFI status returned by TempRamExit API.
147 IN VOID
*TempRamExitParam
150 FSP_INFO_HEADER
*FspHeader
;
151 FSP_TEMP_RAM_EXIT TempRamExitApi
;
153 BOOLEAN InterruptState
;
155 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
156 if (FspHeader
== NULL
) {
157 return EFI_DEVICE_ERROR
;
160 TempRamExitApi
= (FSP_TEMP_RAM_EXIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->TempRamExitEntryOffset
);
161 InterruptState
= SaveAndDisableInterrupts ();
162 Status
= Execute32BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
, (UINTN
)NULL
);
163 SetInterruptState (InterruptState
);
169 Call FSP API - FspSiliconInit.
171 @param[in] FspsUpdDataPtr Address pointer to the Silicon Init parameters structure.
173 @return EFI status returned by FspSiliconInit API.
178 IN VOID
*FspsUpdDataPtr
181 FSP_INFO_HEADER
*FspHeader
;
182 FSP_SILICON_INIT FspSiliconInitApi
;
184 BOOLEAN InterruptState
;
186 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
187 if (FspHeader
== NULL
) {
188 return EFI_DEVICE_ERROR
;
191 FspSiliconInitApi
= (FSP_SILICON_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspSiliconInitEntryOffset
);
192 InterruptState
= SaveAndDisableInterrupts ();
193 Status
= Execute32BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspsUpdDataPtr
, (UINTN
)NULL
);
194 SetInterruptState (InterruptState
);