1c8ec22a266cdd134ac99c3021003710130613a40jyao/** @file
2c8ec22a266cdd134ac99c3021003710130613a40jyao
3d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
4c8ec22a266cdd134ac99c3021003710130613a40jyao  This program and the accompanying materials
5c8ec22a266cdd134ac99c3021003710130613a40jyao  are licensed and made available under the terms and conditions of the BSD License
6c8ec22a266cdd134ac99c3021003710130613a40jyao  which accompanies this distribution.  The full text of the license may be found at
7c8ec22a266cdd134ac99c3021003710130613a40jyao  http://opensource.org/licenses/bsd-license.php.
8c8ec22a266cdd134ac99c3021003710130613a40jyao
9c8ec22a266cdd134ac99c3021003710130613a40jyao  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10c8ec22a266cdd134ac99c3021003710130613a40jyao  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11c8ec22a266cdd134ac99c3021003710130613a40jyao
12c8ec22a266cdd134ac99c3021003710130613a40jyao**/
13c8ec22a266cdd134ac99c3021003710130613a40jyao
14c8ec22a266cdd134ac99c3021003710130613a40jyao#include <PiPei.h>
15c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/BaseLib.h>
16c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/DebugLib.h>
17c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/PcdLib.h>
18c8ec22a266cdd134ac99c3021003710130613a40jyao#include <FspGlobalData.h>
19c8ec22a266cdd134ac99c3021003710130613a40jyao#include <FspApi.h>
20c8ec22a266cdd134ac99c3021003710130613a40jyao
21c8ec22a266cdd134ac99c3021003710130613a40jyao#pragma pack(1)
22c8ec22a266cdd134ac99c3021003710130613a40jyao
23c8ec22a266cdd134ac99c3021003710130613a40jyao//
24c8ec22a266cdd134ac99c3021003710130613a40jyao//   Cont Func Parameter 2        +0x3C
25c8ec22a266cdd134ac99c3021003710130613a40jyao//   Cont Func Parameter 1        +0x38
26c8ec22a266cdd134ac99c3021003710130613a40jyao//
27c8ec22a266cdd134ac99c3021003710130613a40jyao//   API Parameter                +0x34
28c8ec22a266cdd134ac99c3021003710130613a40jyao//   API return address           +0x30
29c8ec22a266cdd134ac99c3021003710130613a40jyao//
303b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice//   push    FspInfoHeader        +0x2C
31c8ec22a266cdd134ac99c3021003710130613a40jyao//   pushfd                       +0x28
32c8ec22a266cdd134ac99c3021003710130613a40jyao//   cli
33c8ec22a266cdd134ac99c3021003710130613a40jyao//   pushad                       +0x24
34c8ec22a266cdd134ac99c3021003710130613a40jyao//   sub     esp, 8               +0x00
35c8ec22a266cdd134ac99c3021003710130613a40jyao//   sidt    fword ptr [esp]
36c8ec22a266cdd134ac99c3021003710130613a40jyao//
37c8ec22a266cdd134ac99c3021003710130613a40jyaotypedef struct {
38c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT16    IdtrLimit;
39c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    IdtrBase;
40c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT16    Reserved;
41c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Edi;
42c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Esi;
43c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Ebp;
44c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Esp;
45c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Ebx;
46c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Edx;
47c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Ecx;
48c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    Eax;
49c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT16    Flags[2];
503b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  UINT32    FspInfoHeader;
51c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    ApiRet;
52c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32    ApiParam;
53c8ec22a266cdd134ac99c3021003710130613a40jyao} CONTEXT_STACK;
54c8ec22a266cdd134ac99c3021003710130613a40jyao
55c8ec22a266cdd134ac99c3021003710130613a40jyao#define CONTEXT_STACK_OFFSET(x)  (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x
56c8ec22a266cdd134ac99c3021003710130613a40jyao
57c8ec22a266cdd134ac99c3021003710130613a40jyao#pragma pack()
58c8ec22a266cdd134ac99c3021003710130613a40jyao
59c8ec22a266cdd134ac99c3021003710130613a40jyao/**
60c8ec22a266cdd134ac99c3021003710130613a40jyao  This function sets the FSP global data pointer.
61c8ec22a266cdd134ac99c3021003710130613a40jyao
62c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] FspData       Fsp global data pointer.
63c8ec22a266cdd134ac99c3021003710130613a40jyao
64c8ec22a266cdd134ac99c3021003710130613a40jyao**/
65c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
66c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
67c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspGlobalDataPointer (
68c8ec22a266cdd134ac99c3021003710130613a40jyao  IN FSP_GLOBAL_DATA   *FspData
69c8ec22a266cdd134ac99c3021003710130613a40jyao  )
70c8ec22a266cdd134ac99c3021003710130613a40jyao{
71c8ec22a266cdd134ac99c3021003710130613a40jyao  ASSERT (FspData != NULL);
72c8ec22a266cdd134ac99c3021003710130613a40jyao  *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;
73c8ec22a266cdd134ac99c3021003710130613a40jyao}
74c8ec22a266cdd134ac99c3021003710130613a40jyao
75c8ec22a266cdd134ac99c3021003710130613a40jyao/**
76c8ec22a266cdd134ac99c3021003710130613a40jyao  This function gets the FSP global data pointer.
77c8ec22a266cdd134ac99c3021003710130613a40jyao
78c8ec22a266cdd134ac99c3021003710130613a40jyao**/
79c8ec22a266cdd134ac99c3021003710130613a40jyaoFSP_GLOBAL_DATA *
80c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
81c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspGlobalDataPointer (
82c8ec22a266cdd134ac99c3021003710130613a40jyao  VOID
83c8ec22a266cdd134ac99c3021003710130613a40jyao  )
84c8ec22a266cdd134ac99c3021003710130613a40jyao{
85c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA   *FspData;
86c8ec22a266cdd134ac99c3021003710130613a40jyao
87c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData = *(FSP_GLOBAL_DATA  **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);
88c8ec22a266cdd134ac99c3021003710130613a40jyao  return FspData;
89c8ec22a266cdd134ac99c3021003710130613a40jyao}
90c8ec22a266cdd134ac99c3021003710130613a40jyao
91c8ec22a266cdd134ac99c3021003710130613a40jyao/**
9213ca714cd24830d42252fdbd012abf5a5f716246Gary Lin  This function gets back the FSP API parameter passed by the bootlaoder.
93c8ec22a266cdd134ac99c3021003710130613a40jyao
9413ca714cd24830d42252fdbd012abf5a5f716246Gary Lin  @retval ApiParameter FSP API parameter passed by the bootlaoder.
95c8ec22a266cdd134ac99c3021003710130613a40jyao**/
96c8ec22a266cdd134ac99c3021003710130613a40jyaoUINT32
97c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
98c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspApiParameter (
99c8ec22a266cdd134ac99c3021003710130613a40jyao  VOID
100c8ec22a266cdd134ac99c3021003710130613a40jyao  )
101c8ec22a266cdd134ac99c3021003710130613a40jyao{
102c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
103c8ec22a266cdd134ac99c3021003710130613a40jyao
104c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
105c8ec22a266cdd134ac99c3021003710130613a40jyao  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam));
106c8ec22a266cdd134ac99c3021003710130613a40jyao}
107c8ec22a266cdd134ac99c3021003710130613a40jyao
108c8ec22a266cdd134ac99c3021003710130613a40jyao/**
10913ca714cd24830d42252fdbd012abf5a5f716246Gary Lin  This function sets the FSP API parameter in the stack.
110c8ec22a266cdd134ac99c3021003710130613a40jyao
111c8ec22a266cdd134ac99c3021003710130613a40jyao   @param[in] Value       New parameter value.
112c8ec22a266cdd134ac99c3021003710130613a40jyao
113c8ec22a266cdd134ac99c3021003710130613a40jyao**/
114c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
115c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
116c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiParameter (
117c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT32      Value
118c8ec22a266cdd134ac99c3021003710130613a40jyao  )
119c8ec22a266cdd134ac99c3021003710130613a40jyao{
120c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
121c8ec22a266cdd134ac99c3021003710130613a40jyao
122c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
123c8ec22a266cdd134ac99c3021003710130613a40jyao  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;
124c8ec22a266cdd134ac99c3021003710130613a40jyao}
125c8ec22a266cdd134ac99c3021003710130613a40jyao
126c8ec22a266cdd134ac99c3021003710130613a40jyao/**
127c8ec22a266cdd134ac99c3021003710130613a40jyao  This function sets the FSP continuation function parameters in the stack.
128c8ec22a266cdd134ac99c3021003710130613a40jyao
129c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] Value             New parameter value to set.
130c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] Index             Parameter index.
131c8ec22a266cdd134ac99c3021003710130613a40jyao**/
132c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
133c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
134c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspContinuationFuncParameter (
135c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT32      Value,
136c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT32      Index
137c8ec22a266cdd134ac99c3021003710130613a40jyao  )
138c8ec22a266cdd134ac99c3021003710130613a40jyao{
139c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
140c8ec22a266cdd134ac99c3021003710130613a40jyao
141c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
142c8ec22a266cdd134ac99c3021003710130613a40jyao  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value;
143c8ec22a266cdd134ac99c3021003710130613a40jyao}
144c8ec22a266cdd134ac99c3021003710130613a40jyao
145c8ec22a266cdd134ac99c3021003710130613a40jyao
146c8ec22a266cdd134ac99c3021003710130613a40jyao/**
1479da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  This function changes the BootLoader return address in stack.
148c8ec22a266cdd134ac99c3021003710130613a40jyao
149c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] ReturnAddress       Address to return.
150c8ec22a266cdd134ac99c3021003710130613a40jyao
151c8ec22a266cdd134ac99c3021003710130613a40jyao**/
152c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
153c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
154c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiReturnAddress (
155c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT32  ReturnAddress
156c8ec22a266cdd134ac99c3021003710130613a40jyao  )
157c8ec22a266cdd134ac99c3021003710130613a40jyao{
158c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
159c8ec22a266cdd134ac99c3021003710130613a40jyao
160c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
161c8ec22a266cdd134ac99c3021003710130613a40jyao  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress;
162c8ec22a266cdd134ac99c3021003710130613a40jyao}
163c8ec22a266cdd134ac99c3021003710130613a40jyao
164c8ec22a266cdd134ac99c3021003710130613a40jyao/**
1659da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  This function set the API status code returned to the BootLoader.
166c8ec22a266cdd134ac99c3021003710130613a40jyao
167c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] ReturnStatus       Status code to return.
168c8ec22a266cdd134ac99c3021003710130613a40jyao
169c8ec22a266cdd134ac99c3021003710130613a40jyao**/
170c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
171c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
172c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiReturnStatus (
173c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT32  ReturnStatus
174c8ec22a266cdd134ac99c3021003710130613a40jyao  )
175c8ec22a266cdd134ac99c3021003710130613a40jyao{
176c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
177c8ec22a266cdd134ac99c3021003710130613a40jyao
178c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
179c8ec22a266cdd134ac99c3021003710130613a40jyao  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;
180c8ec22a266cdd134ac99c3021003710130613a40jyao}
181c8ec22a266cdd134ac99c3021003710130613a40jyao
182c8ec22a266cdd134ac99c3021003710130613a40jyao/**
183c8ec22a266cdd134ac99c3021003710130613a40jyao  This function sets the context switching stack to a new stack frame.
184c8ec22a266cdd134ac99c3021003710130613a40jyao
185c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] NewStackTop       New core stack to be set.
186c8ec22a266cdd134ac99c3021003710130613a40jyao
187c8ec22a266cdd134ac99c3021003710130613a40jyao**/
188c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
189c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
190c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspCoreStackPointer (
191c8ec22a266cdd134ac99c3021003710130613a40jyao  IN VOID   *NewStackTop
192c8ec22a266cdd134ac99c3021003710130613a40jyao  )
193c8ec22a266cdd134ac99c3021003710130613a40jyao{
194c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
195c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32           *OldStack;
196c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32           *NewStack;
197c8ec22a266cdd134ac99c3021003710130613a40jyao  UINT32           StackContextLen;
198c8ec22a266cdd134ac99c3021003710130613a40jyao
199c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
200c8ec22a266cdd134ac99c3021003710130613a40jyao  StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);
201c8ec22a266cdd134ac99c3021003710130613a40jyao
202c8ec22a266cdd134ac99c3021003710130613a40jyao  //
203c8ec22a266cdd134ac99c3021003710130613a40jyao  // Reserve space for the ContinuationFunc two parameters
204c8ec22a266cdd134ac99c3021003710130613a40jyao  //
205c8ec22a266cdd134ac99c3021003710130613a40jyao  OldStack = (UINT32 *)FspData->CoreStack;
206c8ec22a266cdd134ac99c3021003710130613a40jyao  NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;
207c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData->CoreStack = (UINT32)NewStack;
208c8ec22a266cdd134ac99c3021003710130613a40jyao  while (StackContextLen-- != 0) {
209c8ec22a266cdd134ac99c3021003710130613a40jyao    *NewStack++ = *OldStack++;
210c8ec22a266cdd134ac99c3021003710130613a40jyao  }
211c8ec22a266cdd134ac99c3021003710130613a40jyao}
212c8ec22a266cdd134ac99c3021003710130613a40jyao
213c8ec22a266cdd134ac99c3021003710130613a40jyao/**
214c8ec22a266cdd134ac99c3021003710130613a40jyao  This function sets the platform specific data pointer.
215c8ec22a266cdd134ac99c3021003710130613a40jyao
216c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] PlatformData       Fsp platform specific data pointer.
217c8ec22a266cdd134ac99c3021003710130613a40jyao
218c8ec22a266cdd134ac99c3021003710130613a40jyao**/
219c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
220c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
221c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspPlatformDataPointer (
222c8ec22a266cdd134ac99c3021003710130613a40jyao  IN VOID   *PlatformData
223c8ec22a266cdd134ac99c3021003710130613a40jyao  )
224c8ec22a266cdd134ac99c3021003710130613a40jyao{
225c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
226c8ec22a266cdd134ac99c3021003710130613a40jyao
227c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
228c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData->PlatformData.DataPtr = PlatformData;
229c8ec22a266cdd134ac99c3021003710130613a40jyao}
230c8ec22a266cdd134ac99c3021003710130613a40jyao
231c8ec22a266cdd134ac99c3021003710130613a40jyao
232c8ec22a266cdd134ac99c3021003710130613a40jyao/**
233c8ec22a266cdd134ac99c3021003710130613a40jyao  This function gets the platform specific data pointer.
234c8ec22a266cdd134ac99c3021003710130613a40jyao
235c8ec22a266cdd134ac99c3021003710130613a40jyao   @param[in] PlatformData       Fsp platform specific data pointer.
236c8ec22a266cdd134ac99c3021003710130613a40jyao
237c8ec22a266cdd134ac99c3021003710130613a40jyao**/
238c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID *
239c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
240c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspPlatformDataPointer (
241c8ec22a266cdd134ac99c3021003710130613a40jyao  VOID
242c8ec22a266cdd134ac99c3021003710130613a40jyao  )
243c8ec22a266cdd134ac99c3021003710130613a40jyao{
244c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
245c8ec22a266cdd134ac99c3021003710130613a40jyao
246c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
247c8ec22a266cdd134ac99c3021003710130613a40jyao  return FspData->PlatformData.DataPtr;
248c8ec22a266cdd134ac99c3021003710130613a40jyao}
249c8ec22a266cdd134ac99c3021003710130613a40jyao
250c8ec22a266cdd134ac99c3021003710130613a40jyao
251c8ec22a266cdd134ac99c3021003710130613a40jyao/**
252c8ec22a266cdd134ac99c3021003710130613a40jyao  This function sets the UPD data pointer.
253c8ec22a266cdd134ac99c3021003710130613a40jyao
254c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] UpdDataRgnPtr   UPD data pointer.
255c8ec22a266cdd134ac99c3021003710130613a40jyao**/
256c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID
257c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
258c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspUpdDataPointer (
259c8ec22a266cdd134ac99c3021003710130613a40jyao  IN VOID    *UpdDataRgnPtr
260c8ec22a266cdd134ac99c3021003710130613a40jyao  )
261c8ec22a266cdd134ac99c3021003710130613a40jyao{
262c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
263c8ec22a266cdd134ac99c3021003710130613a40jyao
264c8ec22a266cdd134ac99c3021003710130613a40jyao  //
265c8ec22a266cdd134ac99c3021003710130613a40jyao  // Get the Fsp Global Data Pointer
266c8ec22a266cdd134ac99c3021003710130613a40jyao  //
267c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
268c8ec22a266cdd134ac99c3021003710130613a40jyao
269c8ec22a266cdd134ac99c3021003710130613a40jyao  //
270c8ec22a266cdd134ac99c3021003710130613a40jyao  // Set the UPD pointer.
271c8ec22a266cdd134ac99c3021003710130613a40jyao  //
272c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData->UpdDataRgnPtr = UpdDataRgnPtr;
273c8ec22a266cdd134ac99c3021003710130613a40jyao}
274c8ec22a266cdd134ac99c3021003710130613a40jyao
275c8ec22a266cdd134ac99c3021003710130613a40jyao/**
276c8ec22a266cdd134ac99c3021003710130613a40jyao  This function gets the UPD data pointer.
277c8ec22a266cdd134ac99c3021003710130613a40jyao
278c8ec22a266cdd134ac99c3021003710130613a40jyao  @return UpdDataRgnPtr   UPD data pointer.
279c8ec22a266cdd134ac99c3021003710130613a40jyao**/
280c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID *
281c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
282c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspUpdDataPointer (
283c8ec22a266cdd134ac99c3021003710130613a40jyao  VOID
284c8ec22a266cdd134ac99c3021003710130613a40jyao  )
285c8ec22a266cdd134ac99c3021003710130613a40jyao{
286c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
287c8ec22a266cdd134ac99c3021003710130613a40jyao
288c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
289c8ec22a266cdd134ac99c3021003710130613a40jyao  return FspData->UpdDataRgnPtr;
290c8ec22a266cdd134ac99c3021003710130613a40jyao}
291c8ec22a266cdd134ac99c3021003710130613a40jyao
292b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
293b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/**
294b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  This function sets the memory init UPD data pointer.
295b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
296b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.
297b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/
298b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID
299b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI
300b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenSetFspMemoryInitUpdDataPointer (
301b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  IN VOID    *MemoryInitUpdPtr
302b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  )
303b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{
304b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FSP_GLOBAL_DATA  *FspData;
305b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
306b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
307b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  // Get the Fsp Global Data Pointer
308b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
309b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData  = GetFspGlobalDataPointer ();
310b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
311b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
312b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  // Set the memory init UPD pointer.
313b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
314b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;
315b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen}
316b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
317b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/**
318b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  This function gets the memory init UPD data pointer.
319b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
320b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  @return memory init UPD data pointer.
321b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/
322b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID *
323b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI
324b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenGetFspMemoryInitUpdDataPointer (
325b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  VOID
326b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  )
327b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{
328b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FSP_GLOBAL_DATA  *FspData;
329b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
330b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData  = GetFspGlobalDataPointer ();
331b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  return FspData->MemoryInitUpdPtr;
332b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen}
333b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
334b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
335b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/**
336b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  This function sets the silicon init UPD data pointer.
337b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
338b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.
339b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/
340b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID
341b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI
342b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenSetFspSiliconInitUpdDataPointer (
343b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  IN VOID    *SiliconInitUpdPtr
344b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  )
345b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{
346b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FSP_GLOBAL_DATA  *FspData;
347b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
348b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
349b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  // Get the Fsp Global Data Pointer
350b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
351b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData  = GetFspGlobalDataPointer ();
352b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
353b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
354b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  // Set the silicon init UPD data pointer.
355b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  //
356b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;
357b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen}
358b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
359b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/**
360b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  This function gets the silicon init UPD data pointer.
361b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
362b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  @return silicon init UPD data pointer.
363b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/
364b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID *
365b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI
366b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenGetFspSiliconInitUpdDataPointer (
367b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  VOID
368b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  )
369b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{
370b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FSP_GLOBAL_DATA  *FspData;
371b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
372b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  FspData  = GetFspGlobalDataPointer ();
373b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen  return FspData->SiliconInitUpdPtr;
374b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen}
375b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
376b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen
377c8ec22a266cdd134ac99c3021003710130613a40jyao/**
378c8ec22a266cdd134ac99c3021003710130613a40jyao  Set FSP measurement point timestamp.
379c8ec22a266cdd134ac99c3021003710130613a40jyao
380c8ec22a266cdd134ac99c3021003710130613a40jyao  @param[in] Id       Measurement point ID.
381c8ec22a266cdd134ac99c3021003710130613a40jyao
382c8ec22a266cdd134ac99c3021003710130613a40jyao  @return performance timestamp.
383c8ec22a266cdd134ac99c3021003710130613a40jyao**/
384c8ec22a266cdd134ac99c3021003710130613a40jyaoUINT64
385c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI
386c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspMeasurePoint (
387c8ec22a266cdd134ac99c3021003710130613a40jyao  IN UINT8  Id
388c8ec22a266cdd134ac99c3021003710130613a40jyao  )
389c8ec22a266cdd134ac99c3021003710130613a40jyao{
390c8ec22a266cdd134ac99c3021003710130613a40jyao  FSP_GLOBAL_DATA  *FspData;
391c8ec22a266cdd134ac99c3021003710130613a40jyao
392c8ec22a266cdd134ac99c3021003710130613a40jyao  //
393c8ec22a266cdd134ac99c3021003710130613a40jyao  // Bit [55: 0]  will be the timestamp
394c8ec22a266cdd134ac99c3021003710130613a40jyao  // Bit [63:56]  will be the ID
395c8ec22a266cdd134ac99c3021003710130613a40jyao  //
396c8ec22a266cdd134ac99c3021003710130613a40jyao  FspData  = GetFspGlobalDataPointer ();
397c8ec22a266cdd134ac99c3021003710130613a40jyao  if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {
398c8ec22a266cdd134ac99c3021003710130613a40jyao    FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();
399c8ec22a266cdd134ac99c3021003710130613a40jyao    ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;
400c8ec22a266cdd134ac99c3021003710130613a40jyao  }
401c8ec22a266cdd134ac99c3021003710130613a40jyao
402c8ec22a266cdd134ac99c3021003710130613a40jyao  return FspData->PerfData[(FspData->PerfIdx)++];
403c8ec22a266cdd134ac99c3021003710130613a40jyao}
404d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
405d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/**
406d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  This function gets the FSP info header pointer.
407d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
408d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  @retval FspInfoHeader   FSP info header pointer
409d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/
410d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenFSP_INFO_HEADER *
411d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI
412d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenGetFspInfoHeader (
413d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  VOID
414d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  )
415d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{
416d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  return  GetFspGlobalDataPointer()->FspInfoHeader;
417d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen}
418d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
419d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/**
4203b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  This function gets the FSP info header pointer using the API stack context.
4213b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice
4223b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  @retval FspInfoHeader   FSP info header pointer using the API stack context
4233b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice**/
4243b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceFSP_INFO_HEADER *
4253b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceEFIAPI
4263b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceGetFspInfoHeaderFromApiContext (
4273b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  VOID
4283b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  )
4293b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice{
4303b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  FSP_GLOBAL_DATA  *FspData;
4313b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice
4323b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  FspData  = GetFspGlobalDataPointer ();
4333b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice  return  (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));
4343b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice}
4353b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice
4363b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice/**
4379da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  This function gets the VPD data pointer.
4389da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen
4399da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  @return VpdDataRgnPtr   VPD data pointer.
4409da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen**/
4419da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenVOID *
4429da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenEFIAPI
4439da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenGetFspVpdDataPointer (
4449da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  VOID
4459da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  )
4469da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen{
4479da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  FSP_INFO_HEADER   *FspInfoHeader;
4489da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen
4499da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  FspInfoHeader = GetFspInfoHeader ();
4509da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen  return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);
4519da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen}
4529da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen
4539da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen/**
4546ca9135a654a658c9fbaa698cfa69a76c7719be1Yao, Jiewen  This function gets FSP API calling mode.
455d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
456d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  @retval API calling mode
457d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/
458d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenUINT8
459d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI
460d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenGetFspApiCallingMode (
461d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  VOID
462d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  )
463d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{
464d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  return  GetFspGlobalDataPointer()->ApiMode;
465d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen}
466d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
467d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/**
4686ca9135a654a658c9fbaa698cfa69a76c7719be1Yao, Jiewen  This function sets FSP API calling mode.
469d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
470d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  @param[in] Mode     API calling mode
471d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/
472d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenVOID
473d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI
474d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenSetFspApiCallingMode (
475d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  UINT8  Mode
476d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  )
477d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{
478d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  FSP_GLOBAL_DATA  *FspData;
479d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
480d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  FspData  = GetFspGlobalDataPointer ();
481d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen  FspData->ApiMode = Mode;
482d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen}
483d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen
484