]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c
BaseTools/BinToPcd: Fix Python 2.7.x compatibility issue
[mirror_edk2.git] / IntelFspPkg / Library / BaseFspCommonLib / FspCommonLib.c
CommitLineData
c8ec22a2
JY
1/** @file\r
2\r
d5fb1edf 3 Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
c8ec22a2
JY
4 This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php.\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include <PiPei.h>\r
15#include <Library/BaseLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/PcdLib.h>\r
18#include <FspGlobalData.h>\r
19#include <FspApi.h>\r
20\r
21#pragma pack(1)\r
22\r
23//\r
24// Cont Func Parameter 2 +0x3C\r
25// Cont Func Parameter 1 +0x38\r
26//\r
27// API Parameter +0x34\r
28// API return address +0x30\r
29//\r
3b17b245 30// push FspInfoHeader +0x2C\r
c8ec22a2
JY
31// pushfd +0x28\r
32// cli\r
33// pushad +0x24\r
34// sub esp, 8 +0x00\r
35// sidt fword ptr [esp]\r
36//\r
37typedef struct {\r
38 UINT16 IdtrLimit;\r
39 UINT32 IdtrBase;\r
40 UINT16 Reserved;\r
41 UINT32 Edi;\r
42 UINT32 Esi;\r
43 UINT32 Ebp;\r
44 UINT32 Esp;\r
45 UINT32 Ebx;\r
46 UINT32 Edx;\r
47 UINT32 Ecx;\r
48 UINT32 Eax;\r
49 UINT16 Flags[2];\r
3b17b245 50 UINT32 FspInfoHeader;\r
c8ec22a2
JY
51 UINT32 ApiRet;\r
52 UINT32 ApiParam;\r
53} CONTEXT_STACK;\r
54\r
55#define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x\r
56\r
57#pragma pack()\r
58\r
59/**\r
60 This function sets the FSP global data pointer.\r
61\r
62 @param[in] FspData Fsp global data pointer.\r
63\r
64**/\r
65VOID\r
66EFIAPI\r
67SetFspGlobalDataPointer (\r
68 IN FSP_GLOBAL_DATA *FspData\r
69 )\r
70{\r
71 ASSERT (FspData != NULL);\r
72 *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;\r
73}\r
74\r
75/**\r
76 This function gets the FSP global data pointer.\r
77\r
78**/\r
79FSP_GLOBAL_DATA *\r
80EFIAPI\r
81GetFspGlobalDataPointer (\r
82 VOID\r
83 )\r
84{\r
85 FSP_GLOBAL_DATA *FspData;\r
86\r
87 FspData = *(FSP_GLOBAL_DATA **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);\r
88 return FspData;\r
89}\r
90\r
91/**\r
13ca714c 92 This function gets back the FSP API parameter passed by the bootlaoder.\r
c8ec22a2 93\r
13ca714c 94 @retval ApiParameter FSP API parameter passed by the bootlaoder.\r
c8ec22a2
JY
95**/\r
96UINT32\r
97EFIAPI\r
98GetFspApiParameter (\r
99 VOID\r
100 )\r
101{\r
102 FSP_GLOBAL_DATA *FspData;\r
103\r
104 FspData = GetFspGlobalDataPointer ();\r
105 return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam));\r
106}\r
107\r
108/**\r
13ca714c 109 This function sets the FSP API parameter in the stack.\r
c8ec22a2
JY
110\r
111 @param[in] Value New parameter value.\r
112\r
113**/\r
114VOID\r
115EFIAPI\r
116SetFspApiParameter (\r
117 IN UINT32 Value\r
118 )\r
119{\r
120 FSP_GLOBAL_DATA *FspData;\r
121\r
122 FspData = GetFspGlobalDataPointer ();\r
123 *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;\r
124}\r
125\r
126/**\r
127 This function sets the FSP continuation function parameters in the stack.\r
128\r
129 @param[in] Value New parameter value to set.\r
130 @param[in] Index Parameter index.\r
131**/\r
132VOID\r
133EFIAPI\r
134SetFspContinuationFuncParameter (\r
135 IN UINT32 Value,\r
136 IN UINT32 Index\r
137 )\r
138{\r
139 FSP_GLOBAL_DATA *FspData;\r
140\r
141 FspData = GetFspGlobalDataPointer ();\r
142 *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value;\r
143}\r
144\r
145\r
146/**\r
9da59186 147 This function changes the BootLoader return address in stack.\r
c8ec22a2
JY
148\r
149 @param[in] ReturnAddress Address to return.\r
150\r
151**/\r
152VOID\r
153EFIAPI\r
154SetFspApiReturnAddress (\r
155 IN UINT32 ReturnAddress\r
156 )\r
157{\r
158 FSP_GLOBAL_DATA *FspData;\r
159\r
160 FspData = GetFspGlobalDataPointer ();\r
161 *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress;\r
162}\r
163\r
164/**\r
9da59186 165 This function set the API status code returned to the BootLoader.\r
c8ec22a2
JY
166\r
167 @param[in] ReturnStatus Status code to return.\r
168\r
169**/\r
170VOID\r
171EFIAPI\r
172SetFspApiReturnStatus (\r
173 IN UINT32 ReturnStatus\r
174 )\r
175{\r
176 FSP_GLOBAL_DATA *FspData;\r
177\r
178 FspData = GetFspGlobalDataPointer ();\r
179 *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;\r
180}\r
181\r
182/**\r
183 This function sets the context switching stack to a new stack frame.\r
184\r
185 @param[in] NewStackTop New core stack to be set.\r
186\r
187**/\r
188VOID\r
189EFIAPI\r
190SetFspCoreStackPointer (\r
191 IN VOID *NewStackTop\r
192 )\r
193{\r
194 FSP_GLOBAL_DATA *FspData;\r
195 UINT32 *OldStack;\r
196 UINT32 *NewStack;\r
197 UINT32 StackContextLen;\r
198\r
199 FspData = GetFspGlobalDataPointer ();\r
200 StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);\r
201\r
202 //\r
203 // Reserve space for the ContinuationFunc two parameters\r
204 //\r
205 OldStack = (UINT32 *)FspData->CoreStack;\r
206 NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;\r
207 FspData->CoreStack = (UINT32)NewStack;\r
208 while (StackContextLen-- != 0) {\r
209 *NewStack++ = *OldStack++;\r
210 }\r
211}\r
212\r
213/**\r
214 This function sets the platform specific data pointer.\r
215\r
216 @param[in] PlatformData Fsp platform specific data pointer.\r
217\r
218**/\r
219VOID\r
220EFIAPI\r
221SetFspPlatformDataPointer (\r
222 IN VOID *PlatformData\r
223 )\r
224{\r
225 FSP_GLOBAL_DATA *FspData;\r
226\r
227 FspData = GetFspGlobalDataPointer ();\r
228 FspData->PlatformData.DataPtr = PlatformData;\r
229}\r
230\r
231\r
232/**\r
233 This function gets the platform specific data pointer.\r
234\r
235 @param[in] PlatformData Fsp platform specific data pointer.\r
236\r
237**/\r
238VOID *\r
239EFIAPI\r
240GetFspPlatformDataPointer (\r
241 VOID\r
242 )\r
243{\r
244 FSP_GLOBAL_DATA *FspData;\r
245\r
246 FspData = GetFspGlobalDataPointer ();\r
247 return FspData->PlatformData.DataPtr;\r
248}\r
249\r
250\r
251/**\r
252 This function sets the UPD data pointer.\r
253\r
254 @param[in] UpdDataRgnPtr UPD data pointer.\r
255**/\r
256VOID\r
257EFIAPI\r
258SetFspUpdDataPointer (\r
259 IN VOID *UpdDataRgnPtr\r
260 )\r
261{\r
262 FSP_GLOBAL_DATA *FspData;\r
263\r
264 //\r
265 // Get the Fsp Global Data Pointer\r
266 //\r
267 FspData = GetFspGlobalDataPointer ();\r
268\r
269 //\r
270 // Set the UPD pointer.\r
271 //\r
272 FspData->UpdDataRgnPtr = UpdDataRgnPtr;\r
273}\r
274\r
275/**\r
276 This function gets the UPD data pointer.\r
277\r
278 @return UpdDataRgnPtr UPD data pointer.\r
279**/\r
280VOID *\r
281EFIAPI\r
282GetFspUpdDataPointer (\r
283 VOID\r
284 )\r
285{\r
286 FSP_GLOBAL_DATA *FspData;\r
287\r
288 FspData = GetFspGlobalDataPointer ();\r
289 return FspData->UpdDataRgnPtr;\r
290}\r
291\r
b2344187
JY
292\r
293/**\r
294 This function sets the memory init UPD data pointer.\r
295\r
296 @param[in] MemoryInitUpdPtr memory init UPD data pointer.\r
297**/\r
298VOID\r
299EFIAPI\r
300SetFspMemoryInitUpdDataPointer (\r
301 IN VOID *MemoryInitUpdPtr\r
302 )\r
303{\r
304 FSP_GLOBAL_DATA *FspData;\r
305\r
306 //\r
307 // Get the Fsp Global Data Pointer\r
308 //\r
309 FspData = GetFspGlobalDataPointer ();\r
310\r
311 //\r
312 // Set the memory init UPD pointer.\r
313 //\r
314 FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;\r
315}\r
316\r
317/**\r
318 This function gets the memory init UPD data pointer.\r
319\r
320 @return memory init UPD data pointer.\r
321**/\r
322VOID *\r
323EFIAPI\r
324GetFspMemoryInitUpdDataPointer (\r
325 VOID\r
326 )\r
327{\r
328 FSP_GLOBAL_DATA *FspData;\r
329\r
330 FspData = GetFspGlobalDataPointer ();\r
331 return FspData->MemoryInitUpdPtr;\r
332}\r
333\r
334\r
335/**\r
336 This function sets the silicon init UPD data pointer.\r
337\r
338 @param[in] SiliconInitUpdPtr silicon init UPD data pointer.\r
339**/\r
340VOID\r
341EFIAPI\r
342SetFspSiliconInitUpdDataPointer (\r
343 IN VOID *SiliconInitUpdPtr\r
344 )\r
345{\r
346 FSP_GLOBAL_DATA *FspData;\r
347\r
348 //\r
349 // Get the Fsp Global Data Pointer\r
350 //\r
351 FspData = GetFspGlobalDataPointer ();\r
352\r
353 //\r
354 // Set the silicon init UPD data pointer.\r
355 //\r
356 FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;\r
357}\r
358\r
359/**\r
360 This function gets the silicon init UPD data pointer.\r
361\r
362 @return silicon init UPD data pointer.\r
363**/\r
364VOID *\r
365EFIAPI\r
366GetFspSiliconInitUpdDataPointer (\r
367 VOID\r
368 )\r
369{\r
370 FSP_GLOBAL_DATA *FspData;\r
371\r
372 FspData = GetFspGlobalDataPointer ();\r
373 return FspData->SiliconInitUpdPtr;\r
374}\r
375\r
376\r
c8ec22a2
JY
377/**\r
378 Set FSP measurement point timestamp.\r
379\r
380 @param[in] Id Measurement point ID.\r
381\r
382 @return performance timestamp.\r
383**/\r
384UINT64\r
385EFIAPI\r
386SetFspMeasurePoint (\r
387 IN UINT8 Id\r
388 )\r
389{\r
390 FSP_GLOBAL_DATA *FspData;\r
391\r
392 //\r
393 // Bit [55: 0] will be the timestamp\r
394 // Bit [63:56] will be the ID\r
395 //\r
396 FspData = GetFspGlobalDataPointer ();\r
397 if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {\r
398 FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();\r
399 ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;\r
400 }\r
401\r
402 return FspData->PerfData[(FspData->PerfIdx)++];\r
403}\r
d5fb1edf
JY
404\r
405/**\r
406 This function gets the FSP info header pointer.\r
407\r
408 @retval FspInfoHeader FSP info header pointer\r
409**/\r
410FSP_INFO_HEADER *\r
411EFIAPI\r
412GetFspInfoHeader (\r
413 VOID\r
414 )\r
415{\r
416 return GetFspGlobalDataPointer()->FspInfoHeader;\r
417}\r
418\r
3b17b245
MM
419/**\r
420 This function gets the FSP info header pointer using the API stack context.\r
421\r
422 @retval FspInfoHeader FSP info header pointer using the API stack context\r
423**/\r
424FSP_INFO_HEADER *\r
425EFIAPI\r
426GetFspInfoHeaderFromApiContext (\r
427 VOID\r
428 )\r
429{\r
430 FSP_GLOBAL_DATA *FspData;\r
431\r
432 FspData = GetFspGlobalDataPointer ();\r
433 return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));\r
434}\r
435\r
9da59186
JY
436/**\r
437 This function gets the VPD data pointer.\r
438\r
439 @return VpdDataRgnPtr VPD data pointer.\r
440**/\r
441VOID *\r
442EFIAPI\r
443GetFspVpdDataPointer (\r
444 VOID\r
445 )\r
446{\r
447 FSP_INFO_HEADER *FspInfoHeader;\r
448\r
449 FspInfoHeader = GetFspInfoHeader ();\r
450 return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);\r
451}\r
452\r
d5fb1edf 453/**\r
6ca9135a 454 This function gets FSP API calling mode.\r
d5fb1edf
JY
455\r
456 @retval API calling mode\r
457**/\r
458UINT8\r
459EFIAPI\r
460GetFspApiCallingMode (\r
461 VOID\r
462 )\r
463{\r
464 return GetFspGlobalDataPointer()->ApiMode;\r
465}\r
466\r
467/**\r
6ca9135a 468 This function sets FSP API calling mode.\r
d5fb1edf
JY
469\r
470 @param[in] Mode API calling mode\r
471**/\r
472VOID\r
473EFIAPI\r
474SetFspApiCallingMode (\r
475 UINT8 Mode\r
476 )\r
477{\r
478 FSP_GLOBAL_DATA *FspData;\r
479\r
480 FspData = GetFspGlobalDataPointer ();\r
481 FspData->ApiMode = Mode;\r
482}\r
483\r