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 <Library/FspWrapperApiLib.h>
18 #include <Library/BaseLib.h>
19 #include <Library/BaseMemoryLib.h>
22 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
25 @param[in] Function The 32bit code entry to be executed.
26 @param[in] Param1 The first parameter to pass to 32bit code.
27 @param[in] Param2 The second 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
;
68 CheckPointer
= CheckPointer
+ sizeof (EFI_FFS_FILE_HEADER
);
70 if (((EFI_RAW_SECTION
*)CheckPointer
)->Type
!= EFI_SECTION_RAW
) {
74 CheckPointer
= CheckPointer
+ sizeof (EFI_RAW_SECTION
);
76 return (FSP_INFO_HEADER
*)CheckPointer
;
80 Call FSP API - FspNotifyPhase.
82 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.
84 @return EFI status returned by FspNotifyPhase API.
89 IN NOTIFY_PHASE_PARAMS
*NotifyPhaseParams
92 FSP_INFO_HEADER
*FspHeader
;
93 FSP_NOTIFY_PHASE NotifyPhaseApi
;
95 BOOLEAN InterruptState
;
97 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
98 if (FspHeader
== NULL
) {
99 return EFI_DEVICE_ERROR
;
102 NotifyPhaseApi
= (FSP_NOTIFY_PHASE
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->NotifyPhaseEntryOffset
);
103 InterruptState
= SaveAndDisableInterrupts ();
104 Status
= Execute32BitCode ((UINTN
)NotifyPhaseApi
, (UINTN
)NotifyPhaseParams
, (UINTN
)NULL
);
105 SetInterruptState (InterruptState
);
111 Call FSP API - FspMemoryInit.
113 @param[in] FspmUpdDataPtr Address pointer to the FSP_MEMORY_INIT_PARAMS structure.
114 @param[out] HobListPtr Address of the HobList pointer.
116 @return EFI status returned by FspMemoryInit API.
121 IN VOID
*FspmUpdDataPtr
,
122 OUT VOID
**HobListPtr
125 FSP_INFO_HEADER
*FspHeader
;
126 FSP_MEMORY_INIT FspMemoryInitApi
;
128 BOOLEAN InterruptState
;
130 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
131 if (FspHeader
== NULL
) {
132 return EFI_DEVICE_ERROR
;
135 FspMemoryInitApi
= (FSP_MEMORY_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspMemoryInitEntryOffset
);
136 InterruptState
= SaveAndDisableInterrupts ();
137 Status
= Execute32BitCode ((UINTN
)FspMemoryInitApi
, (UINTN
)FspmUpdDataPtr
, (UINTN
)HobListPtr
);
138 SetInterruptState (InterruptState
);
144 Call FSP API - TempRamExit.
146 @param[in] TempRamExitParam Address pointer to the TempRamExit parameters structure.
148 @return EFI status returned by TempRamExit API.
153 IN VOID
*TempRamExitParam
156 FSP_INFO_HEADER
*FspHeader
;
157 FSP_TEMP_RAM_EXIT TempRamExitApi
;
159 BOOLEAN InterruptState
;
161 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress
));
162 if (FspHeader
== NULL
) {
163 return EFI_DEVICE_ERROR
;
166 TempRamExitApi
= (FSP_TEMP_RAM_EXIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->TempRamExitEntryOffset
);
167 InterruptState
= SaveAndDisableInterrupts ();
168 Status
= Execute32BitCode ((UINTN
)TempRamExitApi
, (UINTN
)TempRamExitParam
, (UINTN
)NULL
);
169 SetInterruptState (InterruptState
);
175 Call FSP API - FspSiliconInit.
177 @param[in] FspsUpdDataPtr Address pointer to the Silicon Init parameters structure.
179 @return EFI status returned by FspSiliconInit API.
184 IN VOID
*FspsUpdDataPtr
187 FSP_INFO_HEADER
*FspHeader
;
188 FSP_SILICON_INIT FspSiliconInitApi
;
190 BOOLEAN InterruptState
;
192 FspHeader
= (FSP_INFO_HEADER
*)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress
));
193 if (FspHeader
== NULL
) {
194 return EFI_DEVICE_ERROR
;
197 FspSiliconInitApi
= (FSP_SILICON_INIT
)((UINTN
)FspHeader
->ImageBase
+ FspHeader
->FspSiliconInitEntryOffset
);
198 InterruptState
= SaveAndDisableInterrupts ();
199 Status
= Execute32BitCode ((UINTN
)FspSiliconInitApi
, (UINTN
)FspsUpdDataPtr
, (UINTN
)NULL
);
200 SetInterruptState (InterruptState
);