xref: /freebsd/sys/contrib/edk2/Include/Protocol/MpService.h (revision f439973d6726c3be929c8fb3b1545b8b1744abc3)
1*f439973dSWarner Losh /** @file
2*f439973dSWarner Losh   When installed, the MP Services Protocol produces a collection of services
3*f439973dSWarner Losh   that are needed for MP management.
4*f439973dSWarner Losh 
5*f439973dSWarner Losh   The MP Services Protocol provides a generalized way of performing following tasks:
6*f439973dSWarner Losh     - Retrieving information of multi-processor environment and MP-related status of
7*f439973dSWarner Losh       specific processors.
8*f439973dSWarner Losh     - Dispatching user-provided function to APs.
9*f439973dSWarner Losh     - Maintain MP-related processor status.
10*f439973dSWarner Losh 
11*f439973dSWarner Losh   The MP Services Protocol must be produced on any system with more than one logical
12*f439973dSWarner Losh   processor.
13*f439973dSWarner Losh 
14*f439973dSWarner Losh   The Protocol is available only during boot time.
15*f439973dSWarner Losh 
16*f439973dSWarner Losh   MP Services Protocol is hardware-independent. Most of the logic of this protocol
17*f439973dSWarner Losh   is architecturally neutral. It abstracts the multi-processor environment and
18*f439973dSWarner Losh   status of processors, and provides interfaces to retrieve information, maintain,
19*f439973dSWarner Losh   and dispatch.
20*f439973dSWarner Losh 
21*f439973dSWarner Losh   MP Services Protocol may be consumed by ACPI module. The ACPI module may use this
22*f439973dSWarner Losh   protocol to retrieve data that are needed for an MP platform and report them to OS.
23*f439973dSWarner Losh   MP Services Protocol may also be used to program and configure processors, such
24*f439973dSWarner Losh   as MTRR synchronization for memory space attributes setting in DXE Services.
25*f439973dSWarner Losh   MP Services Protocol may be used by non-CPU DXE drivers to speed up platform boot
26*f439973dSWarner Losh   by taking advantage of the processing capabilities of the APs, for example, using
27*f439973dSWarner Losh   APs to help test system memory in parallel with other device initialization.
28*f439973dSWarner Losh   Diagnostics applications may also use this protocol for multi-processor.
29*f439973dSWarner Losh 
30*f439973dSWarner Losh Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
31*f439973dSWarner Losh SPDX-License-Identifier: BSD-2-Clause-Patent
32*f439973dSWarner Losh 
33*f439973dSWarner Losh   @par Revision Reference:
34*f439973dSWarner Losh   This Protocol is defined in the UEFI Platform Initialization Specification 1.2,
35*f439973dSWarner Losh   Volume 2:Driver Execution Environment Core Interface.
36*f439973dSWarner Losh 
37*f439973dSWarner Losh **/
38*f439973dSWarner Losh 
39*f439973dSWarner Losh #ifndef _MP_SERVICE_PROTOCOL_H_
40*f439973dSWarner Losh #define _MP_SERVICE_PROTOCOL_H_
41*f439973dSWarner Losh 
42*f439973dSWarner Losh ///
43*f439973dSWarner Losh /// Global ID for the EFI_MP_SERVICES_PROTOCOL.
44*f439973dSWarner Losh ///
45*f439973dSWarner Losh #define EFI_MP_SERVICES_PROTOCOL_GUID \
46*f439973dSWarner Losh   { \
47*f439973dSWarner Losh     0x3fdda605, 0xa76e, 0x4f46, {0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08} \
48*f439973dSWarner Losh   }
49*f439973dSWarner Losh 
50*f439973dSWarner Losh ///
51*f439973dSWarner Losh /// Value used in the NumberProcessors parameter of the GetProcessorInfo function
52*f439973dSWarner Losh ///
53*f439973dSWarner Losh #define CPU_V2_EXTENDED_TOPOLOGY  BIT24
54*f439973dSWarner Losh 
55*f439973dSWarner Losh ///
56*f439973dSWarner Losh /// Forward declaration for the EFI_MP_SERVICES_PROTOCOL.
57*f439973dSWarner Losh ///
58*f439973dSWarner Losh typedef struct _EFI_MP_SERVICES_PROTOCOL EFI_MP_SERVICES_PROTOCOL;
59*f439973dSWarner Losh 
60*f439973dSWarner Losh ///
61*f439973dSWarner Losh /// Terminator for a list of failed CPUs returned by StartAllAPs().
62*f439973dSWarner Losh ///
63*f439973dSWarner Losh #define END_OF_CPU_LIST  0xffffffff
64*f439973dSWarner Losh 
65*f439973dSWarner Losh ///
66*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
67*f439973dSWarner Losh /// indicates whether the processor is playing the role of BSP. If the bit is 1,
68*f439973dSWarner Losh /// then the processor is BSP. Otherwise, it is AP.
69*f439973dSWarner Losh ///
70*f439973dSWarner Losh #define PROCESSOR_AS_BSP_BIT  0x00000001
71*f439973dSWarner Losh 
72*f439973dSWarner Losh ///
73*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
74*f439973dSWarner Losh /// indicates whether the processor is enabled. If the bit is 1, then the
75*f439973dSWarner Losh /// processor is enabled. Otherwise, it is disabled.
76*f439973dSWarner Losh ///
77*f439973dSWarner Losh #define PROCESSOR_ENABLED_BIT  0x00000002
78*f439973dSWarner Losh 
79*f439973dSWarner Losh ///
80*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
81*f439973dSWarner Losh /// indicates whether the processor is healthy. If the bit is 1, then the
82*f439973dSWarner Losh /// processor is healthy. Otherwise, some fault has been detected for the processor.
83*f439973dSWarner Losh ///
84*f439973dSWarner Losh #define PROCESSOR_HEALTH_STATUS_BIT  0x00000004
85*f439973dSWarner Losh 
86*f439973dSWarner Losh ///
87*f439973dSWarner Losh /// Structure that describes the pyhiscal location of a logical CPU.
88*f439973dSWarner Losh ///
89*f439973dSWarner Losh typedef struct {
90*f439973dSWarner Losh   ///
91*f439973dSWarner Losh   /// Zero-based physical package number that identifies the cartridge of the processor.
92*f439973dSWarner Losh   ///
93*f439973dSWarner Losh   UINT32    Package;
94*f439973dSWarner Losh   ///
95*f439973dSWarner Losh   /// Zero-based physical core number within package of the processor.
96*f439973dSWarner Losh   ///
97*f439973dSWarner Losh   UINT32    Core;
98*f439973dSWarner Losh   ///
99*f439973dSWarner Losh   /// Zero-based logical thread number within core of the processor.
100*f439973dSWarner Losh   ///
101*f439973dSWarner Losh   UINT32    Thread;
102*f439973dSWarner Losh } EFI_CPU_PHYSICAL_LOCATION;
103*f439973dSWarner Losh 
104*f439973dSWarner Losh ///
105*f439973dSWarner Losh ///  Structure that defines the 6-level physical location of the processor
106*f439973dSWarner Losh ///
107*f439973dSWarner Losh typedef struct {
108*f439973dSWarner Losh   ///
109*f439973dSWarner Losh   ///    Package     Zero-based physical package number that identifies the cartridge of the processor.
110*f439973dSWarner Losh   ///
111*f439973dSWarner Losh   UINT32    Package;
112*f439973dSWarner Losh   ///
113*f439973dSWarner Losh   ///    Module      Zero-based physical module number within package of the processor.
114*f439973dSWarner Losh   ///
115*f439973dSWarner Losh   UINT32    Module;
116*f439973dSWarner Losh   ///
117*f439973dSWarner Losh   ///    Tile        Zero-based physical tile number within module of the processor.
118*f439973dSWarner Losh   ///
119*f439973dSWarner Losh   UINT32    Tile;
120*f439973dSWarner Losh   ///
121*f439973dSWarner Losh   ///    Die         Zero-based physical die number within tile of the processor.
122*f439973dSWarner Losh   ///
123*f439973dSWarner Losh   UINT32    Die;
124*f439973dSWarner Losh   ///
125*f439973dSWarner Losh   ///     Core        Zero-based physical core number within die of the processor.
126*f439973dSWarner Losh   ///
127*f439973dSWarner Losh   UINT32    Core;
128*f439973dSWarner Losh   ///
129*f439973dSWarner Losh   ///     Thread      Zero-based logical thread number within core of the processor.
130*f439973dSWarner Losh   ///
131*f439973dSWarner Losh   UINT32    Thread;
132*f439973dSWarner Losh } EFI_CPU_PHYSICAL_LOCATION2;
133*f439973dSWarner Losh 
134*f439973dSWarner Losh typedef union {
135*f439973dSWarner Losh   /// The 6-level physical location of the processor, including the
136*f439973dSWarner Losh   /// physical package number that identifies the cartridge, the physical
137*f439973dSWarner Losh   /// module number within package, the physical tile number within the module,
138*f439973dSWarner Losh   /// the physical die number within the tile, the physical core number within
139*f439973dSWarner Losh   /// package, and logical thread number within core.
140*f439973dSWarner Losh   EFI_CPU_PHYSICAL_LOCATION2    Location2;
141*f439973dSWarner Losh } EXTENDED_PROCESSOR_INFORMATION;
142*f439973dSWarner Losh 
143*f439973dSWarner Losh ///
144*f439973dSWarner Losh /// Structure that describes information about a logical CPU.
145*f439973dSWarner Losh ///
146*f439973dSWarner Losh typedef struct {
147*f439973dSWarner Losh   ///
148*f439973dSWarner Losh   /// The unique processor ID determined by system hardware.  For IA32 and X64,
149*f439973dSWarner Losh   /// the processor ID is the same as the Local APIC ID. Only the lower 8 bits
150*f439973dSWarner Losh   /// are used, and higher bits are reserved.  For IPF, the lower 16 bits contains
151*f439973dSWarner Losh   /// id/eid, and higher bits are reserved.
152*f439973dSWarner Losh   ///
153*f439973dSWarner Losh   UINT64    ProcessorId;
154*f439973dSWarner Losh   ///
155*f439973dSWarner Losh   /// Flags indicating if the processor is BSP or AP, if the processor is enabled
156*f439973dSWarner Losh   /// or disabled, and if the processor is healthy. Bits 3..31 are reserved and
157*f439973dSWarner Losh   /// must be 0.
158*f439973dSWarner Losh   ///
159*f439973dSWarner Losh   /// <pre>
160*f439973dSWarner Losh   /// BSP  ENABLED  HEALTH  Description
161*f439973dSWarner Losh   /// ===  =======  ======  ===================================================
162*f439973dSWarner Losh   ///  0      0       0     Unhealthy Disabled AP.
163*f439973dSWarner Losh   ///  0      0       1     Healthy Disabled AP.
164*f439973dSWarner Losh   ///  0      1       0     Unhealthy Enabled AP.
165*f439973dSWarner Losh   ///  0      1       1     Healthy Enabled AP.
166*f439973dSWarner Losh   ///  1      0       0     Invalid. The BSP can never be in the disabled state.
167*f439973dSWarner Losh   ///  1      0       1     Invalid. The BSP can never be in the disabled state.
168*f439973dSWarner Losh   ///  1      1       0     Unhealthy Enabled BSP.
169*f439973dSWarner Losh   ///  1      1       1     Healthy Enabled BSP.
170*f439973dSWarner Losh   /// </pre>
171*f439973dSWarner Losh   ///
172*f439973dSWarner Losh   UINT32                            StatusFlag;
173*f439973dSWarner Losh   ///
174*f439973dSWarner Losh   /// The physical location of the processor, including the physical package number
175*f439973dSWarner Losh   /// that identifies the cartridge, the physical core number within package, and
176*f439973dSWarner Losh   /// logical thread number within core.
177*f439973dSWarner Losh   ///
178*f439973dSWarner Losh   EFI_CPU_PHYSICAL_LOCATION         Location;
179*f439973dSWarner Losh   ///
180*f439973dSWarner Losh   /// The extended information of the processor. This field is filled only when
181*f439973dSWarner Losh   /// CPU_V2_EXTENDED_TOPOLOGY is set in parameter ProcessorNumber.
182*f439973dSWarner Losh   EXTENDED_PROCESSOR_INFORMATION    ExtendedInformation;
183*f439973dSWarner Losh } EFI_PROCESSOR_INFORMATION;
184*f439973dSWarner Losh 
185*f439973dSWarner Losh /**
186*f439973dSWarner Losh   This service retrieves the number of logical processor in the platform
187*f439973dSWarner Losh   and the number of those logical processors that are enabled on this boot.
188*f439973dSWarner Losh   This service may only be called from the BSP.
189*f439973dSWarner Losh 
190*f439973dSWarner Losh   This function is used to retrieve the following information:
191*f439973dSWarner Losh     - The number of logical processors that are present in the system.
192*f439973dSWarner Losh     - The number of enabled logical processors in the system at the instant
193*f439973dSWarner Losh       this call is made.
194*f439973dSWarner Losh 
195*f439973dSWarner Losh   Because MP Service Protocol provides services to enable and disable processors
196*f439973dSWarner Losh   dynamically, the number of enabled logical processors may vary during the
197*f439973dSWarner Losh   course of a boot session.
198*f439973dSWarner Losh 
199*f439973dSWarner Losh   If this service is called from an AP, then EFI_DEVICE_ERROR is returned.
200*f439973dSWarner Losh   If NumberOfProcessors or NumberOfEnabledProcessors is NULL, then
201*f439973dSWarner Losh   EFI_INVALID_PARAMETER is returned. Otherwise, the total number of processors
202*f439973dSWarner Losh   is returned in NumberOfProcessors, the number of currently enabled processor
203*f439973dSWarner Losh   is returned in NumberOfEnabledProcessors, and EFI_SUCCESS is returned.
204*f439973dSWarner Losh 
205*f439973dSWarner Losh   @param[in]  This                        A pointer to the EFI_MP_SERVICES_PROTOCOL
206*f439973dSWarner Losh                                           instance.
207*f439973dSWarner Losh   @param[out] NumberOfProcessors          Pointer to the total number of logical
208*f439973dSWarner Losh                                           processors in the system, including the BSP
209*f439973dSWarner Losh                                           and disabled APs.
210*f439973dSWarner Losh   @param[out] NumberOfEnabledProcessors   Pointer to the number of enabled logical
211*f439973dSWarner Losh                                           processors that exist in system, including
212*f439973dSWarner Losh                                           the BSP.
213*f439973dSWarner Losh 
214*f439973dSWarner Losh   @retval EFI_SUCCESS             The number of logical processors and enabled
215*f439973dSWarner Losh                                   logical processors was retrieved.
216*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
217*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   NumberOfProcessors is NULL.
218*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   NumberOfEnabledProcessors is NULL.
219*f439973dSWarner Losh 
220*f439973dSWarner Losh **/
221*f439973dSWarner Losh typedef
222*f439973dSWarner Losh EFI_STATUS
223*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)(
224*f439973dSWarner Losh   IN  EFI_MP_SERVICES_PROTOCOL  *This,
225*f439973dSWarner Losh   OUT UINTN                     *NumberOfProcessors,
226*f439973dSWarner Losh   OUT UINTN                     *NumberOfEnabledProcessors
227*f439973dSWarner Losh   );
228*f439973dSWarner Losh 
229*f439973dSWarner Losh /**
230*f439973dSWarner Losh   Gets detailed MP-related information on the requested processor at the
231*f439973dSWarner Losh   instant this call is made. This service may only be called from the BSP.
232*f439973dSWarner Losh 
233*f439973dSWarner Losh   This service retrieves detailed MP-related information about any processor
234*f439973dSWarner Losh   on the platform. Note the following:
235*f439973dSWarner Losh     - The processor information may change during the course of a boot session.
236*f439973dSWarner Losh     - The information presented here is entirely MP related.
237*f439973dSWarner Losh 
238*f439973dSWarner Losh   Information regarding the number of caches and their sizes, frequency of operation,
239*f439973dSWarner Losh   slot numbers is all considered platform-related information and is not provided
240*f439973dSWarner Losh   by this service.
241*f439973dSWarner Losh 
242*f439973dSWarner Losh   @param[in]  This                  A pointer to the EFI_MP_SERVICES_PROTOCOL
243*f439973dSWarner Losh                                     instance.
244*f439973dSWarner Losh   @param[in]  ProcessorNumber       The handle number of processor.
245*f439973dSWarner Losh   @param[out] ProcessorInfoBuffer   A pointer to the buffer where information for
246*f439973dSWarner Losh                                     the requested processor is deposited.
247*f439973dSWarner Losh 
248*f439973dSWarner Losh   @retval EFI_SUCCESS             Processor information was returned.
249*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
250*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   ProcessorInfoBuffer is NULL.
251*f439973dSWarner Losh   @retval EFI_NOT_FOUND           The processor with the handle specified by
252*f439973dSWarner Losh                                   ProcessorNumber does not exist in the platform.
253*f439973dSWarner Losh 
254*f439973dSWarner Losh **/
255*f439973dSWarner Losh typedef
256*f439973dSWarner Losh EFI_STATUS
257*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_INFO)(
258*f439973dSWarner Losh   IN  EFI_MP_SERVICES_PROTOCOL   *This,
259*f439973dSWarner Losh   IN  UINTN                      ProcessorNumber,
260*f439973dSWarner Losh   OUT EFI_PROCESSOR_INFORMATION  *ProcessorInfoBuffer
261*f439973dSWarner Losh   );
262*f439973dSWarner Losh 
263*f439973dSWarner Losh /**
264*f439973dSWarner Losh   This service executes a caller provided function on all enabled APs. APs can
265*f439973dSWarner Losh   run either simultaneously or one at a time in sequence. This service supports
266*f439973dSWarner Losh   both blocking and non-blocking requests. The non-blocking requests use EFI
267*f439973dSWarner Losh   events so the BSP can detect when the APs have finished. This service may only
268*f439973dSWarner Losh   be called from the BSP.
269*f439973dSWarner Losh 
270*f439973dSWarner Losh   This function is used to dispatch all the enabled APs to the function specified
271*f439973dSWarner Losh   by Procedure.  If any enabled AP is busy, then EFI_NOT_READY is returned
272*f439973dSWarner Losh   immediately and Procedure is not started on any AP.
273*f439973dSWarner Losh 
274*f439973dSWarner Losh   If SingleThread is TRUE, all the enabled APs execute the function specified by
275*f439973dSWarner Losh   Procedure one by one, in ascending order of processor handle number. Otherwise,
276*f439973dSWarner Losh   all the enabled APs execute the function specified by Procedure simultaneously.
277*f439973dSWarner Losh 
278*f439973dSWarner Losh   If WaitEvent is NULL, execution is in blocking mode. The BSP waits until all
279*f439973dSWarner Losh   APs finish or TimeoutInMicroSecs expires. Otherwise, execution is in non-blocking
280*f439973dSWarner Losh   mode, and the BSP returns from this service without waiting for APs. If a
281*f439973dSWarner Losh   non-blocking mode is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT
282*f439973dSWarner Losh   is signaled, then EFI_UNSUPPORTED must be returned.
283*f439973dSWarner Losh 
284*f439973dSWarner Losh   If the timeout specified by TimeoutInMicroseconds expires before all APs return
285*f439973dSWarner Losh   from Procedure, then Procedure on the failed APs is terminated. All enabled APs
286*f439973dSWarner Losh   are always available for further calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs()
287*f439973dSWarner Losh   and EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). If FailedCpuList is not NULL, its
288*f439973dSWarner Losh   content points to the list of processor handle numbers in which Procedure was
289*f439973dSWarner Losh   terminated.
290*f439973dSWarner Losh 
291*f439973dSWarner Losh   Note: It is the responsibility of the consumer of the EFI_MP_SERVICES_PROTOCOL.StartupAllAPs()
292*f439973dSWarner Losh   to make sure that the nature of the code that is executed on the BSP and the
293*f439973dSWarner Losh   dispatched APs is well controlled. The MP Services Protocol does not guarantee
294*f439973dSWarner Losh   that the Procedure function is MP-safe. Hence, the tasks that can be run in
295*f439973dSWarner Losh   parallel are limited to certain independent tasks and well-controlled exclusive
296*f439973dSWarner Losh   code. EFI services and protocols may not be called by APs unless otherwise
297*f439973dSWarner Losh   specified.
298*f439973dSWarner Losh 
299*f439973dSWarner Losh   In blocking execution mode, BSP waits until all APs finish or
300*f439973dSWarner Losh   TimeoutInMicroSeconds expires.
301*f439973dSWarner Losh 
302*f439973dSWarner Losh   In non-blocking execution mode, BSP is freed to return to the caller and then
303*f439973dSWarner Losh   proceed to the next task without having to wait for APs. The following
304*f439973dSWarner Losh   sequence needs to occur in a non-blocking execution mode:
305*f439973dSWarner Losh 
306*f439973dSWarner Losh     -# The caller that intends to use this MP Services Protocol in non-blocking
307*f439973dSWarner Losh        mode creates WaitEvent by calling the EFI CreateEvent() service.  The caller
308*f439973dSWarner Losh        invokes EFI_MP_SERVICES_PROTOCOL.StartupAllAPs(). If the parameter WaitEvent
309*f439973dSWarner Losh        is not NULL, then StartupAllAPs() executes in non-blocking mode. It requests
310*f439973dSWarner Losh        the function specified by Procedure to be started on all the enabled APs,
311*f439973dSWarner Losh        and releases the BSP to continue with other tasks.
312*f439973dSWarner Losh     -# The caller can use the CheckEvent() and WaitForEvent() services to check
313*f439973dSWarner Losh        the state of the WaitEvent created in step 1.
314*f439973dSWarner Losh     -# When the APs complete their task or TimeoutInMicroSecondss expires, the MP
315*f439973dSWarner Losh        Service signals WaitEvent by calling the EFI SignalEvent() function. If
316*f439973dSWarner Losh        FailedCpuList is not NULL, its content is available when WaitEvent is
317*f439973dSWarner Losh        signaled. If all APs returned from Procedure prior to the timeout, then
318*f439973dSWarner Losh        FailedCpuList is set to NULL. If not all APs return from Procedure before
319*f439973dSWarner Losh        the timeout, then FailedCpuList is filled in with the list of the failed
320*f439973dSWarner Losh        APs. The buffer is allocated by MP Service Protocol using AllocatePool().
321*f439973dSWarner Losh        It is the caller's responsibility to free the buffer with FreePool() service.
322*f439973dSWarner Losh     -# This invocation of SignalEvent() function informs the caller that invoked
323*f439973dSWarner Losh        EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() that either all the APs completed
324*f439973dSWarner Losh        the specified task or a timeout occurred. The contents of FailedCpuList
325*f439973dSWarner Losh        can be examined to determine which APs did not complete the specified task
326*f439973dSWarner Losh        prior to the timeout.
327*f439973dSWarner Losh 
328*f439973dSWarner Losh   @param[in]  This                    A pointer to the EFI_MP_SERVICES_PROTOCOL
329*f439973dSWarner Losh                                       instance.
330*f439973dSWarner Losh   @param[in]  Procedure               A pointer to the function to be run on
331*f439973dSWarner Losh                                       enabled APs of the system. See type
332*f439973dSWarner Losh                                       EFI_AP_PROCEDURE.
333*f439973dSWarner Losh   @param[in]  SingleThread            If TRUE, then all the enabled APs execute
334*f439973dSWarner Losh                                       the function specified by Procedure one by
335*f439973dSWarner Losh                                       one, in ascending order of processor handle
336*f439973dSWarner Losh                                       number.  If FALSE, then all the enabled APs
337*f439973dSWarner Losh                                       execute the function specified by Procedure
338*f439973dSWarner Losh                                       simultaneously.
339*f439973dSWarner Losh   @param[in]  WaitEvent               The event created by the caller with CreateEvent()
340*f439973dSWarner Losh                                       service.  If it is NULL, then execute in
341*f439973dSWarner Losh                                       blocking mode. BSP waits until all APs finish
342*f439973dSWarner Losh                                       or TimeoutInMicroSeconds expires.  If it's
343*f439973dSWarner Losh                                       not NULL, then execute in non-blocking mode.
344*f439973dSWarner Losh                                       BSP requests the function specified by
345*f439973dSWarner Losh                                       Procedure to be started on all the enabled
346*f439973dSWarner Losh                                       APs, and go on executing immediately. If
347*f439973dSWarner Losh                                       all return from Procedure, or TimeoutInMicroSeconds
348*f439973dSWarner Losh                                       expires, this event is signaled. The BSP
349*f439973dSWarner Losh                                       can use the CheckEvent() or WaitForEvent()
350*f439973dSWarner Losh                                       services to check the state of event.  Type
351*f439973dSWarner Losh                                       EFI_EVENT is defined in CreateEvent() in
352*f439973dSWarner Losh                                       the Unified Extensible Firmware Interface
353*f439973dSWarner Losh                                       Specification.
354*f439973dSWarner Losh   @param[in]  TimeoutInMicrosecsond   Indicates the time limit in microseconds for
355*f439973dSWarner Losh                                       APs to return from Procedure, either for
356*f439973dSWarner Losh                                       blocking or non-blocking mode. Zero means
357*f439973dSWarner Losh                                       infinity.  If the timeout expires before
358*f439973dSWarner Losh                                       all APs return from Procedure, then Procedure
359*f439973dSWarner Losh                                       on the failed APs is terminated. All enabled
360*f439973dSWarner Losh                                       APs are available for next function assigned
361*f439973dSWarner Losh                                       by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs()
362*f439973dSWarner Losh                                       or EFI_MP_SERVICES_PROTOCOL.StartupThisAP().
363*f439973dSWarner Losh                                       If the timeout expires in blocking mode,
364*f439973dSWarner Losh                                       BSP returns EFI_TIMEOUT.  If the timeout
365*f439973dSWarner Losh                                       expires in non-blocking mode, WaitEvent
366*f439973dSWarner Losh                                       is signaled with SignalEvent().
367*f439973dSWarner Losh   @param[in]  ProcedureArgument       The parameter passed into Procedure for
368*f439973dSWarner Losh                                       all APs.
369*f439973dSWarner Losh   @param[out] FailedCpuList           If NULL, this parameter is ignored. Otherwise,
370*f439973dSWarner Losh                                       if all APs finish successfully, then its
371*f439973dSWarner Losh                                       content is set to NULL. If not all APs
372*f439973dSWarner Losh                                       finish before timeout expires, then its
373*f439973dSWarner Losh                                       content is set to address of the buffer
374*f439973dSWarner Losh                                       holding handle numbers of the failed APs.
375*f439973dSWarner Losh                                       The buffer is allocated by MP Service Protocol,
376*f439973dSWarner Losh                                       and it's the caller's responsibility to
377*f439973dSWarner Losh                                       free the buffer with FreePool() service.
378*f439973dSWarner Losh                                       In blocking mode, it is ready for consumption
379*f439973dSWarner Losh                                       when the call returns. In non-blocking mode,
380*f439973dSWarner Losh                                       it is ready when WaitEvent is signaled.  The
381*f439973dSWarner Losh                                       list of failed CPU is terminated by
382*f439973dSWarner Losh                                       END_OF_CPU_LIST.
383*f439973dSWarner Losh 
384*f439973dSWarner Losh   @retval EFI_SUCCESS             In blocking mode, all APs have finished before
385*f439973dSWarner Losh                                   the timeout expired.
386*f439973dSWarner Losh   @retval EFI_SUCCESS             In non-blocking mode, function has been dispatched
387*f439973dSWarner Losh                                   to all enabled APs.
388*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         A non-blocking mode request was made after the
389*f439973dSWarner Losh                                   UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was
390*f439973dSWarner Losh                                   signaled.
391*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        Caller processor is AP.
392*f439973dSWarner Losh   @retval EFI_NOT_STARTED         No enabled APs exist in the system.
393*f439973dSWarner Losh   @retval EFI_NOT_READY           Any enabled APs are busy.
394*f439973dSWarner Losh   @retval EFI_TIMEOUT             In blocking mode, the timeout expired before
395*f439973dSWarner Losh                                   all enabled APs have finished.
396*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   Procedure is NULL.
397*f439973dSWarner Losh 
398*f439973dSWarner Losh **/
399*f439973dSWarner Losh typedef
400*f439973dSWarner Losh EFI_STATUS
401*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_STARTUP_ALL_APS)(
402*f439973dSWarner Losh   IN  EFI_MP_SERVICES_PROTOCOL  *This,
403*f439973dSWarner Losh   IN  EFI_AP_PROCEDURE          Procedure,
404*f439973dSWarner Losh   IN  BOOLEAN                   SingleThread,
405*f439973dSWarner Losh   IN  EFI_EVENT                 WaitEvent               OPTIONAL,
406*f439973dSWarner Losh   IN  UINTN                     TimeoutInMicroSeconds,
407*f439973dSWarner Losh   IN  VOID                      *ProcedureArgument      OPTIONAL,
408*f439973dSWarner Losh   OUT UINTN                     **FailedCpuList         OPTIONAL
409*f439973dSWarner Losh   );
410*f439973dSWarner Losh 
411*f439973dSWarner Losh /**
412*f439973dSWarner Losh   This service lets the caller get one enabled AP to execute a caller-provided
413*f439973dSWarner Losh   function. The caller can request the BSP to either wait for the completion
414*f439973dSWarner Losh   of the AP or just proceed with the next task by using the EFI event mechanism.
415*f439973dSWarner Losh   See EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() for more details on non-blocking
416*f439973dSWarner Losh   execution support.  This service may only be called from the BSP.
417*f439973dSWarner Losh 
418*f439973dSWarner Losh   This function is used to dispatch one enabled AP to the function specified by
419*f439973dSWarner Losh   Procedure passing in the argument specified by ProcedureArgument.  If WaitEvent
420*f439973dSWarner Losh   is NULL, execution is in blocking mode. The BSP waits until the AP finishes or
421*f439973dSWarner Losh   TimeoutInMicroSecondss expires. Otherwise, execution is in non-blocking mode.
422*f439973dSWarner Losh   BSP proceeds to the next task without waiting for the AP. If a non-blocking mode
423*f439973dSWarner Losh   is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled,
424*f439973dSWarner Losh   then EFI_UNSUPPORTED must be returned.
425*f439973dSWarner Losh 
426*f439973dSWarner Losh   If the timeout specified by TimeoutInMicroseconds expires before the AP returns
427*f439973dSWarner Losh   from Procedure, then execution of Procedure by the AP is terminated. The AP is
428*f439973dSWarner Losh   available for subsequent calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() and
429*f439973dSWarner Losh   EFI_MP_SERVICES_PROTOCOL.StartupThisAP().
430*f439973dSWarner Losh 
431*f439973dSWarner Losh   @param[in]  This                    A pointer to the EFI_MP_SERVICES_PROTOCOL
432*f439973dSWarner Losh                                       instance.
433*f439973dSWarner Losh   @param[in]  Procedure               A pointer to the function to be run on the
434*f439973dSWarner Losh                                       designated AP of the system. See type
435*f439973dSWarner Losh                                       EFI_AP_PROCEDURE.
436*f439973dSWarner Losh   @param[in]  ProcessorNumber         The handle number of the AP. The range is
437*f439973dSWarner Losh                                       from 0 to the total number of logical
438*f439973dSWarner Losh                                       processors minus 1. The total number of
439*f439973dSWarner Losh                                       logical processors can be retrieved by
440*f439973dSWarner Losh                                       EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().
441*f439973dSWarner Losh   @param[in]  WaitEvent               The event created by the caller with CreateEvent()
442*f439973dSWarner Losh                                       service.  If it is NULL, then execute in
443*f439973dSWarner Losh                                       blocking mode. BSP waits until this AP finish
444*f439973dSWarner Losh                                       or TimeoutInMicroSeconds expires.  If it's
445*f439973dSWarner Losh                                       not NULL, then execute in non-blocking mode.
446*f439973dSWarner Losh                                       BSP requests the function specified by
447*f439973dSWarner Losh                                       Procedure to be started on this AP,
448*f439973dSWarner Losh                                       and go on executing immediately. If this AP
449*f439973dSWarner Losh                                       return from Procedure or TimeoutInMicroSeconds
450*f439973dSWarner Losh                                       expires, this event is signaled. The BSP
451*f439973dSWarner Losh                                       can use the CheckEvent() or WaitForEvent()
452*f439973dSWarner Losh                                       services to check the state of event.  Type
453*f439973dSWarner Losh                                       EFI_EVENT is defined in CreateEvent() in
454*f439973dSWarner Losh                                       the Unified Extensible Firmware Interface
455*f439973dSWarner Losh                                       Specification.
456*f439973dSWarner Losh   @param[in]  TimeoutInMicrosecsond   Indicates the time limit in microseconds for
457*f439973dSWarner Losh                                       this AP to finish this Procedure, either for
458*f439973dSWarner Losh                                       blocking or non-blocking mode. Zero means
459*f439973dSWarner Losh                                       infinity.  If the timeout expires before
460*f439973dSWarner Losh                                       this AP returns from Procedure, then Procedure
461*f439973dSWarner Losh                                       on the AP is terminated. The
462*f439973dSWarner Losh                                       AP is available for next function assigned
463*f439973dSWarner Losh                                       by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs()
464*f439973dSWarner Losh                                       or EFI_MP_SERVICES_PROTOCOL.StartupThisAP().
465*f439973dSWarner Losh                                       If the timeout expires in blocking mode,
466*f439973dSWarner Losh                                       BSP returns EFI_TIMEOUT.  If the timeout
467*f439973dSWarner Losh                                       expires in non-blocking mode, WaitEvent
468*f439973dSWarner Losh                                       is signaled with SignalEvent().
469*f439973dSWarner Losh   @param[in]  ProcedureArgument       The parameter passed into Procedure on the
470*f439973dSWarner Losh                                       specified AP.
471*f439973dSWarner Losh   @param[out] Finished                If NULL, this parameter is ignored.  In
472*f439973dSWarner Losh                                       blocking mode, this parameter is ignored.
473*f439973dSWarner Losh                                       In non-blocking mode, if AP returns from
474*f439973dSWarner Losh                                       Procedure before the timeout expires, its
475*f439973dSWarner Losh                                       content is set to TRUE. Otherwise, the
476*f439973dSWarner Losh                                       value is set to FALSE. The caller can
477*f439973dSWarner Losh                                       determine if the AP returned from Procedure
478*f439973dSWarner Losh                                       by evaluating this value.
479*f439973dSWarner Losh 
480*f439973dSWarner Losh   @retval EFI_SUCCESS             In blocking mode, specified AP finished before
481*f439973dSWarner Losh                                   the timeout expires.
482*f439973dSWarner Losh   @retval EFI_SUCCESS             In non-blocking mode, the function has been
483*f439973dSWarner Losh                                   dispatched to specified AP.
484*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         A non-blocking mode request was made after the
485*f439973dSWarner Losh                                   UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was
486*f439973dSWarner Losh                                   signaled.
487*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
488*f439973dSWarner Losh   @retval EFI_TIMEOUT             In blocking mode, the timeout expired before
489*f439973dSWarner Losh                                   the specified AP has finished.
490*f439973dSWarner Losh   @retval EFI_NOT_READY           The specified AP is busy.
491*f439973dSWarner Losh   @retval EFI_NOT_FOUND           The processor with the handle specified by
492*f439973dSWarner Losh                                   ProcessorNumber does not exist.
493*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the BSP or disabled AP.
494*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   Procedure is NULL.
495*f439973dSWarner Losh 
496*f439973dSWarner Losh **/
497*f439973dSWarner Losh typedef
498*f439973dSWarner Losh EFI_STATUS
499*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_STARTUP_THIS_AP)(
500*f439973dSWarner Losh   IN  EFI_MP_SERVICES_PROTOCOL  *This,
501*f439973dSWarner Losh   IN  EFI_AP_PROCEDURE          Procedure,
502*f439973dSWarner Losh   IN  UINTN                     ProcessorNumber,
503*f439973dSWarner Losh   IN  EFI_EVENT                 WaitEvent               OPTIONAL,
504*f439973dSWarner Losh   IN  UINTN                     TimeoutInMicroseconds,
505*f439973dSWarner Losh   IN  VOID                      *ProcedureArgument      OPTIONAL,
506*f439973dSWarner Losh   OUT BOOLEAN                   *Finished               OPTIONAL
507*f439973dSWarner Losh   );
508*f439973dSWarner Losh 
509*f439973dSWarner Losh /**
510*f439973dSWarner Losh   This service switches the requested AP to be the BSP from that point onward.
511*f439973dSWarner Losh   This service changes the BSP for all purposes.   This call can only be performed
512*f439973dSWarner Losh   by the current BSP.
513*f439973dSWarner Losh 
514*f439973dSWarner Losh   This service switches the requested AP to be the BSP from that point onward.
515*f439973dSWarner Losh   This service changes the BSP for all purposes. The new BSP can take over the
516*f439973dSWarner Losh   execution of the old BSP and continue seamlessly from where the old one left
517*f439973dSWarner Losh   off. This service may not be supported after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT
518*f439973dSWarner Losh   is signaled.
519*f439973dSWarner Losh 
520*f439973dSWarner Losh   If the BSP cannot be switched prior to the return from this service, then
521*f439973dSWarner Losh   EFI_UNSUPPORTED must be returned.
522*f439973dSWarner Losh 
523*f439973dSWarner Losh   @param[in] This              A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
524*f439973dSWarner Losh   @param[in] ProcessorNumber   The handle number of AP that is to become the new
525*f439973dSWarner Losh                                BSP. The range is from 0 to the total number of
526*f439973dSWarner Losh                                logical processors minus 1. The total number of
527*f439973dSWarner Losh                                logical processors can be retrieved by
528*f439973dSWarner Losh                                EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().
529*f439973dSWarner Losh   @param[in] EnableOldBSP      If TRUE, then the old BSP will be listed as an
530*f439973dSWarner Losh                                enabled AP. Otherwise, it will be disabled.
531*f439973dSWarner Losh 
532*f439973dSWarner Losh   @retval EFI_SUCCESS             BSP successfully switched.
533*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         Switching the BSP cannot be completed prior to
534*f439973dSWarner Losh                                   this service returning.
535*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         Switching the BSP is not supported.
536*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
537*f439973dSWarner Losh   @retval EFI_NOT_FOUND           The processor with the handle specified by
538*f439973dSWarner Losh                                   ProcessorNumber does not exist.
539*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the current BSP or
540*f439973dSWarner Losh                                   a disabled AP.
541*f439973dSWarner Losh   @retval EFI_NOT_READY           The specified AP is busy.
542*f439973dSWarner Losh 
543*f439973dSWarner Losh **/
544*f439973dSWarner Losh typedef
545*f439973dSWarner Losh EFI_STATUS
546*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_SWITCH_BSP)(
547*f439973dSWarner Losh   IN EFI_MP_SERVICES_PROTOCOL  *This,
548*f439973dSWarner Losh   IN  UINTN                    ProcessorNumber,
549*f439973dSWarner Losh   IN  BOOLEAN                  EnableOldBSP
550*f439973dSWarner Losh   );
551*f439973dSWarner Losh 
552*f439973dSWarner Losh /**
553*f439973dSWarner Losh   This service lets the caller enable or disable an AP from this point onward.
554*f439973dSWarner Losh   This service may only be called from the BSP.
555*f439973dSWarner Losh 
556*f439973dSWarner Losh   This service allows the caller enable or disable an AP from this point onward.
557*f439973dSWarner Losh   The caller can optionally specify the health status of the AP by Health. If
558*f439973dSWarner Losh   an AP is being disabled, then the state of the disabled AP is implementation
559*f439973dSWarner Losh   dependent. If an AP is enabled, then the implementation must guarantee that a
560*f439973dSWarner Losh   complete initialization sequence is performed on the AP, so the AP is in a state
561*f439973dSWarner Losh   that is compatible with an MP operating system. This service may not be supported
562*f439973dSWarner Losh   after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled.
563*f439973dSWarner Losh 
564*f439973dSWarner Losh   If the enable or disable AP operation cannot be completed prior to the return
565*f439973dSWarner Losh   from this service, then EFI_UNSUPPORTED must be returned.
566*f439973dSWarner Losh 
567*f439973dSWarner Losh   @param[in] This              A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
568*f439973dSWarner Losh   @param[in] ProcessorNumber   The handle number of AP.
569*f439973dSWarner Losh                                The range is from 0 to the total number of
570*f439973dSWarner Losh                                logical processors minus 1. The total number of
571*f439973dSWarner Losh                                logical processors can be retrieved by
572*f439973dSWarner Losh                                EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().
573*f439973dSWarner Losh   @param[in] EnableAP          Specifies the new state for the processor for
574*f439973dSWarner Losh                                enabled, FALSE for disabled.
575*f439973dSWarner Losh   @param[in] HealthFlag        If not NULL, a pointer to a value that specifies
576*f439973dSWarner Losh                                the new health status of the AP. This flag
577*f439973dSWarner Losh                                corresponds to StatusFlag defined in
578*f439973dSWarner Losh                                EFI_MP_SERVICES_PROTOCOL.GetProcessorInfo(). Only
579*f439973dSWarner Losh                                the PROCESSOR_HEALTH_STATUS_BIT is used. All other
580*f439973dSWarner Losh                                bits are ignored.  If it is NULL, this parameter
581*f439973dSWarner Losh                                is ignored.
582*f439973dSWarner Losh 
583*f439973dSWarner Losh   @retval EFI_SUCCESS             The specified AP was enabled or disabled successfully.
584*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         Enabling or disabling an AP cannot be completed
585*f439973dSWarner Losh                                   prior to this service returning.
586*f439973dSWarner Losh   @retval EFI_UNSUPPORTED         Enabling or disabling an AP is not supported.
587*f439973dSWarner Losh   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
588*f439973dSWarner Losh   @retval EFI_NOT_FOUND           Processor with the handle specified by ProcessorNumber
589*f439973dSWarner Losh                                   does not exist.
590*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the BSP.
591*f439973dSWarner Losh 
592*f439973dSWarner Losh **/
593*f439973dSWarner Losh typedef
594*f439973dSWarner Losh EFI_STATUS
595*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_ENABLEDISABLEAP)(
596*f439973dSWarner Losh   IN  EFI_MP_SERVICES_PROTOCOL  *This,
597*f439973dSWarner Losh   IN  UINTN                     ProcessorNumber,
598*f439973dSWarner Losh   IN  BOOLEAN                   EnableAP,
599*f439973dSWarner Losh   IN  UINT32                    *HealthFlag OPTIONAL
600*f439973dSWarner Losh   );
601*f439973dSWarner Losh 
602*f439973dSWarner Losh /**
603*f439973dSWarner Losh   This return the handle number for the calling processor.  This service may be
604*f439973dSWarner Losh   called from the BSP and APs.
605*f439973dSWarner Losh 
606*f439973dSWarner Losh   This service returns the processor handle number for the calling processor.
607*f439973dSWarner Losh   The returned value is in the range from 0 to the total number of logical
608*f439973dSWarner Losh   processors minus 1. The total number of logical processors can be retrieved
609*f439973dSWarner Losh   with EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). This service may be
610*f439973dSWarner Losh   called from the BSP and APs. If ProcessorNumber is NULL, then EFI_INVALID_PARAMETER
611*f439973dSWarner Losh   is returned. Otherwise, the current processors handle number is returned in
612*f439973dSWarner Losh   ProcessorNumber, and EFI_SUCCESS is returned.
613*f439973dSWarner Losh 
614*f439973dSWarner Losh   @param[in] This              A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
615*f439973dSWarner Losh   @param[in] ProcessorNumber   Pointer to the handle number of AP.
616*f439973dSWarner Losh                                The range is from 0 to the total number of
617*f439973dSWarner Losh                                logical processors minus 1. The total number of
618*f439973dSWarner Losh                                logical processors can be retrieved by
619*f439973dSWarner Losh                                EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().
620*f439973dSWarner Losh 
621*f439973dSWarner Losh   @retval EFI_SUCCESS             The current processor handle number was returned
622*f439973dSWarner Losh                                   in ProcessorNumber.
623*f439973dSWarner Losh   @retval EFI_INVALID_PARAMETER   ProcessorNumber is NULL.
624*f439973dSWarner Losh 
625*f439973dSWarner Losh **/
626*f439973dSWarner Losh typedef
627*f439973dSWarner Losh EFI_STATUS
628*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_WHOAMI)(
629*f439973dSWarner Losh   IN EFI_MP_SERVICES_PROTOCOL  *This,
630*f439973dSWarner Losh   OUT UINTN                    *ProcessorNumber
631*f439973dSWarner Losh   );
632*f439973dSWarner Losh 
633*f439973dSWarner Losh ///
634*f439973dSWarner Losh /// When installed, the MP Services Protocol produces a collection of services
635*f439973dSWarner Losh /// that are needed for MP management.
636*f439973dSWarner Losh ///
637*f439973dSWarner Losh /// Before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the module
638*f439973dSWarner Losh /// that produces this protocol is required to place all APs into an idle state
639*f439973dSWarner Losh /// whenever the APs are disabled or the APs are not executing code as requested
640*f439973dSWarner Losh /// through the StartupAllAPs() or StartupThisAP() services. The idle state of
641*f439973dSWarner Losh /// an AP before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled is
642*f439973dSWarner Losh /// implementation dependent.
643*f439973dSWarner Losh ///
644*f439973dSWarner Losh /// After the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, all the APs
645*f439973dSWarner Losh /// must be placed in the OS compatible CPU state as defined by the UEFI
646*f439973dSWarner Losh /// Specification. Implementations of this protocol may use the UEFI event
647*f439973dSWarner Losh /// EFI_EVENT_GROUP_READY_TO_BOOT to force APs into the OS compatible state as
648*f439973dSWarner Losh /// defined by the UEFI Specification. Modules that use this protocol must
649*f439973dSWarner Losh /// guarantee that all non-blocking mode requests on all APs have been completed
650*f439973dSWarner Losh /// before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled. Since the
651*f439973dSWarner Losh /// order that event notification functions in the same event group are executed
652*f439973dSWarner Losh /// is not deterministic, an event of type EFI_EVENT_GROUP_READY_TO_BOOT cannot
653*f439973dSWarner Losh /// be used to guarantee that APs have completed their non-blocking mode requests.
654*f439973dSWarner Losh ///
655*f439973dSWarner Losh /// When the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the StartAllAPs()
656*f439973dSWarner Losh /// and StartupThisAp() services must no longer support non-blocking mode requests.
657*f439973dSWarner Losh /// The support for SwitchBSP() and EnableDisableAP() may no longer be supported
658*f439973dSWarner Losh /// after this event is signaled. Since UEFI Applications and UEFI OS Loaders
659*f439973dSWarner Losh /// execute after the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, these
660*f439973dSWarner Losh /// UEFI images must be aware that the functionality of this protocol may be reduced.
661*f439973dSWarner Losh ///
662*f439973dSWarner Losh struct _EFI_MP_SERVICES_PROTOCOL {
663*f439973dSWarner Losh   EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS    GetNumberOfProcessors;
664*f439973dSWarner Losh   EFI_MP_SERVICES_GET_PROCESSOR_INFO          GetProcessorInfo;
665*f439973dSWarner Losh   EFI_MP_SERVICES_STARTUP_ALL_APS             StartupAllAPs;
666*f439973dSWarner Losh   EFI_MP_SERVICES_STARTUP_THIS_AP             StartupThisAP;
667*f439973dSWarner Losh   EFI_MP_SERVICES_SWITCH_BSP                  SwitchBSP;
668*f439973dSWarner Losh   EFI_MP_SERVICES_ENABLEDISABLEAP             EnableDisableAP;
669*f439973dSWarner Losh   EFI_MP_SERVICES_WHOAMI                      WhoAmI;
670*f439973dSWarner Losh };
671*f439973dSWarner Losh 
672*f439973dSWarner Losh extern EFI_GUID  gEfiMpServiceProtocolGuid;
673*f439973dSWarner Losh 
674*f439973dSWarner Losh #endif
675