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