]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspWrapperPkg/Library/BaseFspApiLib/FspApiLib.c
IntelFspWrapperPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / IntelFspWrapperPkg / Library / BaseFspApiLib / FspApiLib.c
CommitLineData
a33a2f62
JY
1/** @file\r
2 Provide FSP API related function.\r
3\r
bcee1b9f 4 Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>\r
19486360 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a33a2f62
JY
6\r
7**/\r
8\r
9#include <PiPei.h>\r
10\r
11#include <Guid/FspHeaderFile.h>\r
12\r
13#include <Library/FspApiLib.h>\r
d8043ce9 14#include <Library/BaseLib.h>\r
a33a2f62
JY
15#include <Library/BaseMemoryLib.h>\r
16\r
17/**\r
18 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to\r
19 long mode.\r
20\r
21 @param[in] Function The 32bit code entry to be executed.\r
22 @param[in] Param1 The first parameter to pass to 32bit code.\r
23\r
d8043ce9 24 @return EFI_STATUS.\r
a33a2f62 25**/\r
d8043ce9 26EFI_STATUS\r
a33a2f62
JY
27Execute32BitCode (\r
28 IN UINT64 Function,\r
29 IN UINT64 Param1\r
30 );\r
31\r
32/**\r
33 Find FSP header pointer.\r
34\r
35 @param[in] FlashFvFspBase Flash address of FSP FV.\r
36\r
37 @return FSP header pointer.\r
38**/\r
39FSP_INFO_HEADER *\r
40EFIAPI\r
41FspFindFspHeader (\r
42 IN EFI_PHYSICAL_ADDRESS FlashFvFspBase\r
43 )\r
44{\r
45 UINT8 *CheckPointer;\r
46\r
47 CheckPointer = (UINT8 *) (UINTN) FlashFvFspBase;\r
48\r
49 if (((EFI_FIRMWARE_VOLUME_HEADER *)CheckPointer)->Signature != EFI_FVH_SIGNATURE) {\r
50 return NULL;\r
51 }\r
52\r
53 if (((EFI_FIRMWARE_VOLUME_HEADER *)CheckPointer)->ExtHeaderOffset != 0) {\r
54 CheckPointer = CheckPointer + ((EFI_FIRMWARE_VOLUME_HEADER *)CheckPointer)->ExtHeaderOffset;\r
55 CheckPointer = CheckPointer + ((EFI_FIRMWARE_VOLUME_EXT_HEADER *)CheckPointer)->ExtHeaderSize;\r
56 CheckPointer = (UINT8 *) ALIGN_POINTER (CheckPointer, 8);\r
57 } else {\r
58 CheckPointer = CheckPointer + ((EFI_FIRMWARE_VOLUME_HEADER *)CheckPointer)->HeaderLength;\r
59 }\r
60\r
61 if (!CompareGuid (&((EFI_FFS_FILE_HEADER *)CheckPointer)->Name, &gFspHeaderFileGuid)) {\r
62 return NULL;\r
63 }\r
64\r
65 CheckPointer = CheckPointer + sizeof (EFI_FFS_FILE_HEADER);\r
66\r
67 if (((EFI_RAW_SECTION *)CheckPointer)->Type != EFI_SECTION_RAW) {\r
68 return NULL;\r
69 }\r
70\r
71 CheckPointer = CheckPointer + sizeof (EFI_RAW_SECTION);\r
72\r
73 return (FSP_INFO_HEADER *)CheckPointer;\r
74}\r
75\r
76/**\r
77 Call FSP API - FspInit.\r
78\r
79 @param[in] FspHeader FSP header pointer.\r
80 @param[in] FspInitParams Address pointer to the FSP_INIT_PARAMS structure.\r
81\r
d8043ce9 82 @return EFI status returned by FspInit API.\r
a33a2f62 83**/\r
d8043ce9 84EFI_STATUS\r
a33a2f62
JY
85EFIAPI\r
86CallFspInit (\r
87 IN FSP_INFO_HEADER *FspHeader,\r
88 IN FSP_INIT_PARAMS *FspInitParams\r
89 )\r
90{\r
d8043ce9
JY
91 FSP_INIT FspInitApi;\r
92 EFI_STATUS Status;\r
93 BOOLEAN InterruptState;\r
a33a2f62 94\r
bcee1b9f 95 FspInitApi = (FSP_INIT)((UINTN)FspHeader->ImageBase + FspHeader->FspInitEntryOffset);\r
d8043ce9
JY
96 InterruptState = SaveAndDisableInterrupts ();\r
97 Status = Execute32BitCode ((UINTN)FspInitApi, (UINTN)FspInitParams);\r
98 SetInterruptState (InterruptState);\r
a33a2f62 99\r
d8043ce9 100 return Status;\r
a33a2f62
JY
101}\r
102\r
103/**\r
104 Call FSP API - FspNotifyPhase.\r
105\r
106 @param[in] FspHeader FSP header pointer.\r
107 @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure.\r
108\r
d8043ce9 109 @return EFI status returned by FspNotifyPhase API.\r
a33a2f62 110**/\r
d8043ce9 111EFI_STATUS\r
a33a2f62
JY
112EFIAPI\r
113CallFspNotifyPhase (\r
114 IN FSP_INFO_HEADER *FspHeader,\r
115 IN NOTIFY_PHASE_PARAMS *NotifyPhaseParams\r
116 )\r
117{\r
8e89d9ce 118 FSP_NOTIFY_PHASE NotifyPhaseApi;\r
d8043ce9
JY
119 EFI_STATUS Status;\r
120 BOOLEAN InterruptState;\r
a33a2f62 121\r
bcee1b9f 122 NotifyPhaseApi = (FSP_NOTIFY_PHASE)((UINTN)FspHeader->ImageBase + FspHeader->NotifyPhaseEntryOffset);\r
d8043ce9
JY
123 InterruptState = SaveAndDisableInterrupts ();\r
124 Status = Execute32BitCode ((UINTN)NotifyPhaseApi, (UINTN)NotifyPhaseParams);\r
125 SetInterruptState (InterruptState);\r
a33a2f62 126\r
d8043ce9
JY
127 return Status;\r
128}\r
129\r
130/**\r
131 Call FSP API - FspMemoryInit.\r
132\r
133 @param[in] FspHeader FSP header pointer.\r
134 @param[in,out] FspMemoryInitParams Address pointer to the FSP_MEMORY_INIT_PARAMS structure.\r
135\r
136 @return EFI status returned by FspMemoryInit API.\r
137**/\r
138EFI_STATUS\r
139EFIAPI\r
140CallFspMemoryInit (\r
141 IN FSP_INFO_HEADER *FspHeader,\r
142 IN OUT FSP_MEMORY_INIT_PARAMS *FspMemoryInitParams\r
143 )\r
144{\r
145 FSP_MEMORY_INIT FspMemoryInitApi;\r
146 EFI_STATUS Status;\r
147 BOOLEAN InterruptState;\r
148\r
bcee1b9f 149 FspMemoryInitApi = (FSP_MEMORY_INIT)((UINTN)FspHeader->ImageBase + FspHeader->FspMemoryInitEntryOffset);\r
d8043ce9
JY
150 InterruptState = SaveAndDisableInterrupts ();\r
151 Status = Execute32BitCode ((UINTN)FspMemoryInitApi, (UINTN)FspMemoryInitParams);\r
152 SetInterruptState (InterruptState);\r
153\r
154 return Status;\r
155}\r
156\r
157/**\r
158 Call FSP API - TempRamExit.\r
159\r
160 @param[in] FspHeader FSP header pointer.\r
161 @param[in,out] TempRamExitParam Address pointer to the TempRamExit parameters structure.\r
162\r
163 @return EFI status returned by TempRamExit API.\r
164**/\r
165EFI_STATUS\r
166EFIAPI\r
167CallTempRamExit (\r
168 IN FSP_INFO_HEADER *FspHeader,\r
169 IN OUT VOID *TempRamExitParam\r
170 )\r
171{\r
172 FSP_TEMP_RAM_EXIT TempRamExitApi;\r
173 EFI_STATUS Status;\r
174 BOOLEAN InterruptState;\r
175\r
bcee1b9f 176 TempRamExitApi = (FSP_TEMP_RAM_EXIT)((UINTN)FspHeader->ImageBase + FspHeader->TempRamExitEntryOffset);\r
d8043ce9
JY
177 InterruptState = SaveAndDisableInterrupts ();\r
178 Status = Execute32BitCode ((UINTN)TempRamExitApi, (UINTN)TempRamExitParam);\r
179 SetInterruptState (InterruptState);\r
180\r
181 return Status;\r
182}\r
183\r
184/**\r
185 Call FSP API - FspSiliconInit.\r
186\r
187 @param[in] FspHeader FSP header pointer.\r
188 @param[in,out] FspSiliconInitParam Address pointer to the Silicon Init parameters structure.\r
189\r
190 @return EFI status returned by FspSiliconInit API.\r
191**/\r
192EFI_STATUS\r
193EFIAPI\r
194CallFspSiliconInit (\r
195 IN FSP_INFO_HEADER *FspHeader,\r
196 IN OUT VOID *FspSiliconInitParam\r
197 )\r
198{\r
199 FSP_SILICON_INIT FspSiliconInitApi;\r
200 EFI_STATUS Status;\r
201 BOOLEAN InterruptState;\r
202\r
bcee1b9f 203 FspSiliconInitApi = (FSP_SILICON_INIT)((UINTN)FspHeader->ImageBase + FspHeader->FspSiliconInitEntryOffset);\r
d8043ce9
JY
204 InterruptState = SaveAndDisableInterrupts ();\r
205 Status = Execute32BitCode ((UINTN)FspSiliconInitApi, (UINTN)FspSiliconInitParam);\r
206 SetInterruptState (InterruptState);\r
207\r
208 return Status;\r
a33a2f62 209}\r