1 /** @file
2   Library class definition of Extended SAL Library.
3 
4 Copyright (c) 2007 - 2011, 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.
9 
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.
12 
13 **/
14 
15 #ifndef _EXTENDED_SAL_LIB_H__
16 #define _EXTENDED_SAL_LIB_H__
17 
18 #include <IndustryStandard/Sal.h>
19 
20 /**
21   Register ESAL Class and its associated global.
22 
23   This function Registers one or more Extended SAL services in a given
24   class along with the associated global context.
25   This function is only available prior to ExitBootServices().
26 
27   @param  ClassGuidLo          GUID of function class, lower 64-bits
28   @param  ClassGuidHi          GUID of function class, upper 64-bits
29   @param  ModuleGlobal         Module global for Function.
30   @param  ...                  List of Function/FunctionId pairs, ended by NULL
31 
32   @retval EFI_SUCCESS          The Extended SAL services were registered.
33   @retval EFI_UNSUPPORTED      This function was called after ExitBootServices().
34   @retval EFI_OUT_OF_RESOURCES There are not enough resources available to register one or more of the specified services.
35   @retval Other                ClassGuid could not be installed onto a new handle.
36 
37 **/
38 EFI_STATUS
39 EFIAPI
40 RegisterEsalClass (
41   IN  CONST UINT64    ClassGuidLo,
42   IN  CONST UINT64    ClassGuidHi,
43   IN  VOID            *ModuleGlobal,  OPTIONAL
44   ...
45   );
46 
47 /**
48   Calls an Extended SAL Class service that was previously registered with RegisterEsalClass().
49 
50   This function calls an Extended SAL Class service that was previously registered with RegisterEsalClass().
51 
52   @param  ClassGuidLo    GUID of function, lower 64-bits
53   @param  ClassGuidHi    GUID of function, upper 64-bits
54   @param  FunctionId     Function in ClassGuid to call
55   @param  Arg2           Argument 2 ClassGuid/FunctionId defined
56   @param  Arg3           Argument 3 ClassGuid/FunctionId defined
57   @param  Arg4           Argument 4 ClassGuid/FunctionId defined
58   @param  Arg5           Argument 5 ClassGuid/FunctionId defined
59   @param  Arg6           Argument 6 ClassGuid/FunctionId defined
60   @param  Arg7           Argument 7 ClassGuid/FunctionId defined
61   @param  Arg8           Argument 8 ClassGuid/FunctionId defined
62 
63   @retval EFI_SAL_ERROR  The address of ExtendedSalProc() can not be determined
64                          for the current CPU execution mode.
65   @retval Other          See the return status from ExtendedSalProc() in the
66                          EXTENDED_SAL_BOOT_SERVICE_PROTOCOL.
67 
68 **/
69 SAL_RETURN_REGS
70 EFIAPI
71 EsalCall (
72   IN UINT64  ClassGuidLo,
73   IN UINT64  ClassGuidHi,
74   IN UINT64  FunctionId,
75   IN UINT64  Arg2,
76   IN UINT64  Arg3,
77   IN UINT64  Arg4,
78   IN UINT64  Arg5,
79   IN UINT64  Arg6,
80   IN UINT64  Arg7,
81   IN UINT64  Arg8
82   );
83 
84 /**
85   Wrapper for the EsalStallFunctionId service of Extended SAL Stall Services Class.
86 
87   This function is a wrapper for the EsalStallFunctionId service of Extended SAL
88   Stall Services Class. See EsalStallFunctionId of Extended SAL Specification.
89 
90   @param  Microseconds                  The number of microseconds to delay.
91 
92   @retval EFI_SAL_SUCCESS               Call completed without error.
93   @retval EFI_SAL_INVALID_ARGUMENT      Invalid argument.
94   @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR Virtual address not registered
95 
96 **/
97 SAL_RETURN_REGS
98 EFIAPI
99 EsalStall (
100   IN UINTN  Microseconds
101   );
102 
103 /**
104   Wrapper for the EsalSetNewPalEntryFunctionId service of Extended SAL PAL Services Services Class.
105 
106   This function is a wrapper for the EsalSetNewPalEntryFunctionId service of Extended SAL
107   PAL Services Services Class. See EsalSetNewPalEntryFunctionId of Extended SAL Specification.
108 
109   @param  PhysicalAddress                If TRUE, then PalEntryPoint is a physical address.
110                                          If FALSE, then PalEntryPoint is a virtual address.
111   @param  PalEntryPoint                  The PAL Entry Point being set.
112 
113   @retval EFI_SAL_SUCCESS                The PAL Entry Point was set.
114   @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR  This function was called in virtual mode before
115                                          virtual mappings for the specified Extended SAL
116                                          Procedure are available.
117 
118 **/
119 SAL_RETURN_REGS
120 EFIAPI
121 EsalSetNewPalEntry (
122   IN BOOLEAN  PhysicalAddress,
123   IN UINT64   PalEntryPoint
124   );
125 
126 /**
127   Wrapper for the EsalGetNewPalEntryFunctionId service of Extended SAL PAL Services Services Class.
128 
129   This function is a wrapper for the EsalGetNewPalEntryFunctionId service of Extended SAL
130   PAL Services Services Class. See EsalGetNewPalEntryFunctionId of Extended SAL Specification.
131 
132   @param  PhysicalAddress                If TRUE, then PalEntryPoint is a physical address.
133                                          If FALSE, then PalEntryPoint is a virtual address.
134 
135   @retval EFI_SAL_SUCCESS                The PAL Entry Point was retrieved and returned in
136                                          SAL_RETURN_REGS.r9.
137   @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR  This function was called in virtual mode before
138                                          virtual mappings for the specified Extended SAL
139                                          Procedure are available.
140   @return r9                             PAL entry point retrieved.
141 
142 **/
143 SAL_RETURN_REGS
144 EFIAPI
145 EsalGetNewPalEntry (
146   IN BOOLEAN  PhysicalAddress
147   );
148 
149 /**
150   Wrapper for the EsalGetStateBufferFunctionId service of Extended SAL MCA Log Services Class.
151 
152   This function is a wrapper for the EsalGetStateBufferFunctionId service of Extended SAL
153   MCA Log Services Class. See EsalGetStateBufferFunctionId of Extended SAL Specification.
154 
155   @param  McaType               See type parameter of SAL Procedure SAL_GET_STATE_INFO.
156   @param  McaBuffer             A pointer to the base address of the returned buffer.
157                                 Copied from SAL_RETURN_REGS.r9.
158   @param  BufferSize            A pointer to the size, in bytes, of the returned buffer.
159                                 Copied from SAL_RETURN_REGS.r10.
160 
161   @retval EFI_SAL_SUCCESS       The memory buffer to store error records was returned in r9 and r10.
162   @retval EFI_OUT_OF_RESOURCES  A memory buffer for string error records in not available
163   @return r9                    Base address of the returned buffer
164   @return r10                   Size of the returned buffer in bytes
165 
166 **/
167 SAL_RETURN_REGS
168 EFIAPI
169 EsalGetStateBuffer (
170   IN  UINT64  McaType,
171   OUT UINT8   **McaBuffer,
172   OUT UINTN   *BufferSize
173   );
174 
175 /**
176   Wrapper for the EsalSaveStateBufferFunctionId service of Extended SAL MCA Log Services Class.
177 
178   This function is a wrapper for the EsalSaveStateBufferFunctionId service of Extended SAL
179   MCA Log Services Class. See EsalSaveStateBufferFunctionId of Extended SAL Specification.
180 
181   @param  McaType      See type parameter of SAL Procedure SAL_GET_STATE_INFO.
182 
183   @retval EFI_SUCCESS  The memory buffer containing the error record was written to nonvolatile storage.
184 
185 **/
186 SAL_RETURN_REGS
187 EFIAPI
188 EsalSaveStateBuffer (
189   IN  UINT64  McaType
190   );
191 
192 /**
193   Wrapper for the EsalGetVectorsFunctionId service of Extended SAL Base Services Class.
194 
195   This function is a wrapper for the EsalGetVectorsFunctionId service of Extended SAL
196   Base Services Class. See EsalGetVectorsFunctionId of Extended SAL Specification.
197 
198   @param  VectorType               The vector type to retrieve.
199                                    0 - MCA, 1 - BSP INIT, 2 - BOOT_RENDEZ, 3 - AP INIT.
200 
201   @retval EFI_SAL_SUCCESS          Call completed without error.
202   @retval EFI_SAL_INVALID_ARGUMENT Invalid argument.
203   @retval EFI_SAL_NO_INFORMATION   The requested vector has not been registered
204                                    with the SAL Procedure SAL_SET_VECTORS.
205 
206 **/
207 SAL_RETURN_REGS
208 EFIAPI
209 EsalGetVectors (
210   IN  UINT64  VectorType
211   );
212 
213 /**
214   Wrapper for the EsalMcGetParamsFunctionId service of Extended SAL Base Services Class.
215 
216   This function is a wrapper for the EsalMcGetParamsFunctionId service of Extended SAL
217   Base Services Class. See EsalMcGetParamsFunctionId of Extended SAL Specification.
218 
219   @param  ParamInfoType            The parameter type to retrieve.
220                                    1 - rendezvous interrupt
221                                    2 - wake up
222                                    3 - Corrected Platform Error Vector.
223 
224   @retval EFI_SAL_SUCCESS          Call completed without error.
225   @retval EFI_SAL_INVALID_ARGUMENT Invalid argument.
226   @retval EFI_SAL_NO_INFORMATION   The requested vector has not been registered
227                                    with the SAL Procedure SAL_MC_SET_PARAMS.
228 
229 **/
230 SAL_RETURN_REGS
231 EFIAPI
232 EsalMcGetParams (
233   IN  UINT64  ParamInfoType
234   );
235 
236 /**
237   Wrapper for the EsalMcGetParamsFunctionId service of Extended SAL Base Services Class.
238 
239   This function is a wrapper for the EsalMcGetParamsFunctionId service of Extended SAL
240   Base Services Class. See EsalMcGetParamsFunctionId of Extended SAL Specification.
241 
242   @retval EFI_SAL_SUCCESS          Call completed without error.
243   @retval EFI_SAL_NO_INFORMATION   The requested vector has not been registered
244                                    with the SAL Procedure SAL_MC_SET_PARAMS.
245 
246 **/
247 SAL_RETURN_REGS
248 EFIAPI
249 EsalMcGetMcParams (
250   VOID
251   );
252 
253 /**
254   Wrapper for the EsalGetMcCheckinFlagsFunctionId service of Extended SAL Base Services Class.
255 
256   This function is a wrapper for the EsalGetMcCheckinFlagsFunctionId service of Extended SAL
257   Base Services Class. See EsalGetMcCheckinFlagsFunctionId of Extended SAL Specification.
258 
259   @param  CpuIndex         The index of the CPU of set of enabled CPUs to check.
260 
261   @retval EFI_SAL_SUCCESS  The checkin status of the requested CPU was returned.
262 
263 **/
264 SAL_RETURN_REGS
265 EFIAPI
266 EsalGetMcCheckinFlags (
267   IN  UINT64  CpuIndex
268   );
269 
270 /**
271   Wrapper for the EsalAddCpuDataFunctionId service of Extended SAL MP Services Class.
272 
273   This function is a wrapper for the EsalAddCpuDataFunctionId service of Extended SAL
274   MP Services Class. See EsalAddCpuDataFunctionId of Extended SAL Specification.
275 
276   @param  CpuGlobalId                 The Global ID for the CPU being added.
277   @param  Enabled                     The enable flag for the CPU being added.
278                                       TRUE means the CPU is enabled.
279                                       FALSE means the CPU is disabled.
280   @param  PalCompatibility            The PAL Compatibility value for the CPU being added.
281 
282   @retval EFI_SAL_SUCCESS             The CPU was added to the database.
283   @retval EFI_SAL_NOT_ENOUGH_SCRATCH  There are not enough resource available to add the CPU.
284 
285 **/
286 SAL_RETURN_REGS
287 EFIAPI
288 EsalAddCpuData (
289   IN UINT64   CpuGlobalId,
290   IN BOOLEAN  Enabled,
291   IN UINT64   PalCompatibility
292   );
293 
294 /**
295   Wrapper for the EsalRemoveCpuDataFunctionId service of Extended SAL MP Services Class.
296 
297   This function is a wrapper for the EsalRemoveCpuDataFunctionId service of Extended SAL
298   MP Services Class. See EsalRemoveCpuDataFunctionId of Extended SAL Specification.
299 
300   @param  CpuGlobalId             The Global ID for the CPU being removed.
301 
302   @retval EFI_SAL_SUCCESS         The CPU was removed from the database.
303   @retval EFI_SAL_NO_INFORMATION  The specified CPU is not in the database.
304 
305 **/
306 SAL_RETURN_REGS
307 EFIAPI
308 EsalRemoveCpuData (
309   IN UINT64  CpuGlobalId
310   );
311 
312 /**
313   Wrapper for the EsalModifyCpuDataFunctionId service of Extended SAL MP Services Class.
314 
315   This function is a wrapper for the EsalModifyCpuDataFunctionId service of Extended SAL
316   MP Services Class. See EsalModifyCpuDataFunctionId of Extended SAL Specification.
317 
318   @param  CpuGlobalId             The Global ID for the CPU being modified.
319   @param  Enabled                 The enable flag for the CPU being modified.
320                                   TRUE means the CPU is enabled.
321                                   FALSE means the CPU is disabled.
322   @param  PalCompatibility        The PAL Compatibility value for the CPU being modified.
323 
324   @retval EFI_SAL_SUCCESS         The CPU database was updated.
325   @retval EFI_SAL_NO_INFORMATION  The specified CPU is not in the database.
326 
327 **/
328 SAL_RETURN_REGS
329 EFIAPI
330 EsalModifyCpuData (
331   IN UINT64   CpuGlobalId,
332   IN BOOLEAN  Enabled,
333   IN UINT64   PalCompatibility
334   );
335 
336 /**
337   Wrapper for the EsalGetCpuDataByIdFunctionId service of Extended SAL MP Services Class.
338 
339   This function is a wrapper for the EsalGetCpuDataByIdFunctionId service of Extended SAL
340   MP Services Class. See EsalGetCpuDataByIdFunctionId of Extended SAL Specification.
341 
342   @param  CpuGlobalId             The Global ID for the CPU being looked up.
343   @param  IndexByEnabledCpu       If TRUE, then the index of set of enabled CPUs of database is returned.
344                                   If FALSE, then the index of set of all CPUs of database is returned.
345 
346   @retval EFI_SAL_SUCCESS         The information on the specified CPU was returned.
347   @retval EFI_SAL_NO_INFORMATION  The specified CPU is not in the database.
348 
349 **/
350 SAL_RETURN_REGS
351 EFIAPI
352 EsalGetCpuDataById (
353   IN UINT64   CpuGlobalId,
354   IN BOOLEAN  IndexByEnabledCpu
355   );
356 
357 /**
358   Wrapper for the EsalGetCpuDataByIndexFunctionId service of Extended SAL MP Services Class.
359 
360   This function is a wrapper for the EsalGetCpuDataByIndexFunctionId service of Extended SAL
361   MP Services Class. See EsalGetCpuDataByIndexFunctionId of Extended SAL Specification.
362 
363   @param  Index                   The Global ID for the CPU being modified.
364   @param  IndexByEnabledCpu       If TRUE, then the index of set of enabled CPUs of database is returned.
365                                   If FALSE, then the index of set of all CPUs of database is returned.
366 
367   @retval EFI_SAL_SUCCESS         The information on the specified CPU was returned.
368   @retval EFI_SAL_NO_INFORMATION  The specified CPU is not in the database.
369 
370 **/
371 SAL_RETURN_REGS
372 EFIAPI
373 EsalGetCpuDataByIndex (
374   IN UINT64   Index,
375   IN BOOLEAN  IndexByEnabledCpu
376   );
377 
378 /**
379   Wrapper for the EsalWhoAmIFunctionId service of Extended SAL MP Services Class.
380 
381   This function is a wrapper for the EsalWhoAmIFunctionId service of Extended SAL
382   MP Services Class. See EsalWhoAmIFunctionId of Extended SAL Specification.
383 
384   @param  IndexByEnabledCpu       If TRUE, then the index of set of enabled CPUs of database is returned.
385                                   If FALSE, then the index of set of all CPUs of database is returned.
386 
387   @retval EFI_SAL_SUCCESS         The Global ID for the calling CPU was returned.
388   @retval EFI_SAL_NO_INFORMATION  The calling CPU is not in the database.
389 
390 **/
391 SAL_RETURN_REGS
392 EFIAPI
393 EsalWhoAmI (
394   IN BOOLEAN  IndexByEnabledCpu
395   );
396 
397 /**
398   Wrapper for the EsalNumProcessors service of Extended SAL MP Services Class.
399 
400   This function is a wrapper for the EsalNumProcessors service of Extended SAL
401   MP Services Class. See EsalNumProcessors of Extended SAL Specification.
402 
403   @retval EFI_SAL_SUCCESS    The information on the number of CPUs in the platform
404                              was returned.
405 
406 **/
407 SAL_RETURN_REGS
408 EFIAPI
409 EsalNumProcessors (
410   VOID
411   );
412 
413 /**
414   Wrapper for the EsalSetMinStateFnctionId service of Extended SAL MP Services Class.
415 
416   This function is a wrapper for the EsalSetMinStateFnctionId service of Extended SAL
417   MP Services Class. See EsalSetMinStateFnctionId of Extended SAL Specification.
418 
419   @param  CpuGlobalId              The Global ID for the CPU whose MINSTATE pointer is being set.
420   @param  MinStatePointer          The physical address of the MINSTATE buffer for the CPU
421                                    specified by CpuGlobalId.
422 
423   @retval EFI_SAL_SUCCESS          The MINSTATE pointer was set for the specified CPU.
424   @retval EFI_SAL_NO_INFORMATION   The specified CPU is not in the database.
425 
426 **/
427 SAL_RETURN_REGS
428 EFIAPI
429 EsalSetMinState (
430   IN UINT64                CpuGlobalId,
431   IN EFI_PHYSICAL_ADDRESS  MinStatePointer
432   );
433 
434 /**
435   Wrapper for the EsalGetMinStateFunctionId service of Extended SAL MP Services Class.
436 
437   This function is a wrapper for the EsalGetMinStateFunctionId service of Extended SAL
438   MP Services Class. See EsalGetMinStateFunctionId of Extended SAL Specification.
439 
440   @param  CpuGlobalId            The Global ID for the CPU whose MINSTATE pointer is being retrieved.
441 
442   @retval EFI_SAL_SUCCESS        The MINSTATE pointer for the specified CPU was retrieved.
443   @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.
444 
445 **/
446 SAL_RETURN_REGS
447 EFIAPI
448 EsalGetMinState (
449   IN UINT64  CpuGlobalId
450   );
451 
452 /**
453   Wrapper for the EsalMcsGetStateInfoFunctionId service of Extended SAL MCA Services Class.
454 
455   This function is a wrapper for the EsalMcsGetStateInfoFunctionId service of Extended SAL
456   MCA Services Class. See EsalMcsGetStateInfoFunctionId of Extended SAL Specification.
457 
458   @param  CpuGlobalId               The Global ID for the CPU whose MCA state buffer is being retrieved.
459   @param  StateBufferPointer        A pointer to the returned MCA state buffer.
460   @param  RequiredStateBufferSize   A pointer to the size, in bytes, of the returned MCA state buffer.
461 
462   @retval EFI_SUCCESS               MINSTATE successfully got and size calculated.
463   @retval EFI_SAL_NO_INFORMATION    Fail to get MINSTATE.
464 
465 **/
466 SAL_RETURN_REGS
467 EFIAPI
468 EsalMcaGetStateInfo (
469   IN  UINT64                CpuGlobalId,
470   OUT EFI_PHYSICAL_ADDRESS  *StateBufferPointer,
471   OUT UINT64                *RequiredStateBufferSize
472   );
473 
474 /**
475   Wrapper for the EsalMcaRegisterCpuFunctionId service of Extended SAL MCA Services Class.
476 
477   This function is a wrapper for the EsalMcaRegisterCpuFunctionId service of Extended SAL
478   MCA Services Class. See EsalMcaRegisterCpuFunctionId of Extended SAL Specification.
479 
480   @param  CpuGlobalId              The Global ID for the CPU whose MCA state buffer is being set.
481   @param  StateBufferPointer       A pointer to the MCA state buffer.
482 
483   @retval EFI_SAL_NO_INFORMATION   Cannot get the processor info with the CpuId
484   @retval EFI_SUCCESS              Save the processor's state info successfully
485 
486 **/
487 SAL_RETURN_REGS
488 EFIAPI
489 EsalMcaRegisterCpu (
490   IN UINT64                CpuGlobalId,
491   IN EFI_PHYSICAL_ADDRESS  StateBufferPointer
492   );
493 
494 #endif
495