1 /** @file
2   This file declares UEFI PI Multi-processor PPI.
3   This PPI is installed by some platform or chipset-specific PEIM that abstracts
4   handling multiprocessor support.
5 
6   Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
7   SPDX-License-Identifier: BSD-2-Clause-Patent
8 
9   @par Revision Reference:
10   This PPI is introduced in PI Version 1.4.
11 
12 **/
13 
14 #ifndef __PEI_MP_SERVICES_PPI_H__
15 #define __PEI_MP_SERVICES_PPI_H__
16 
17 #include <Protocol/MpService.h>
18 
19 #define EFI_PEI_MP_SERVICES_PPI_GUID \
20   { \
21     0xee16160a, 0xe8be, 0x47a6, { 0x82, 0xa, 0xc6, 0x90, 0xd, 0xb0, 0x25, 0xa } \
22   }
23 
24 typedef struct _EFI_PEI_MP_SERVICES_PPI  EFI_PEI_MP_SERVICES_PPI ;
25 
26 /**
27   Get the number of CPU's.
28 
29   @param[in]  PeiServices         An indirect pointer to the PEI Services Table
30                                   published by the PEI Foundation.
31   @param[in]  This                Pointer to this instance of the PPI.
32   @param[out] NumberOfProcessors  Pointer to the total number of logical processors in
33                                   the system, including the BSP and disabled APs.
34   @param[out] NumberOfEnabledProcessors
35                                   Number of processors in the system that are enabled.
36 
37   @retval EFI_SUCCESS             The number of logical processors and enabled
38                                   logical processors was retrieved.
39   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
40   @retval EFI_INVALID_PARAMETER   NumberOfProcessors is NULL.
41                                   NumberOfEnabledProcessors is NULL.
42 **/
43 typedef
44 EFI_STATUS
45 (EFIAPI *EFI_PEI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS) (
46   IN  CONST EFI_PEI_SERVICES      **PeiServices,
47   IN  EFI_PEI_MP_SERVICES_PPI     *This,
48   OUT UINTN                       *NumberOfProcessors,
49   OUT UINTN                       *NumberOfEnabledProcessors
50   );
51 
52 /**
53   Get information on a specific CPU.
54 
55   @param[in]  PeiServices         An indirect pointer to the PEI Services Table
56                                   published by the PEI Foundation.
57   @param[in]  This                Pointer to this instance of the PPI.
58   @param[in]  ProcessorNumber     Pointer to the total number of logical processors in
59                                   the system, including the BSP and disabled APs.
60   @param[out] ProcessorInfoBuffer Number of processors in the system that are enabled.
61 
62   @retval EFI_SUCCESS             Processor information was returned.
63   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
64   @retval EFI_INVALID_PARAMETER   ProcessorInfoBuffer is NULL.
65   @retval EFI_NOT_FOUND           The processor with the handle specified by
66                                   ProcessorNumber does not exist in the platform.
67 **/
68 typedef
69 EFI_STATUS
70 (EFIAPI *EFI_PEI_MP_SERVICES_GET_PROCESSOR_INFO) (
71   IN  CONST EFI_PEI_SERVICES      **PeiServices,
72   IN  EFI_PEI_MP_SERVICES_PPI     *This,
73   IN  UINTN                       ProcessorNumber,
74   OUT EFI_PROCESSOR_INFORMATION   *ProcessorInfoBuffer
75   );
76 
77 /**
78   Activate all of the application proessors.
79 
80   @param[in] PeiServices          An indirect pointer to the PEI Services Table
81                                   published by the PEI Foundation.
82   @param[in] This                 A pointer to the EFI_PEI_MP_SERVICES_PPI instance.
83   @param[in] Procedure            A pointer to the function to be run on enabled APs of
84                                   the system.
85   @param[in] SingleThread         If TRUE, then all the enabled APs execute the function
86                                   specified by Procedure one by one, in ascending order
87                                   of processor handle number. If FALSE, then all the
88                                   enabled APs execute the function specified by Procedure
89                                   simultaneously.
90   @param[in] TimeoutInMicroSeconds
91                                   Indicates the time limit in microseconds for APs to
92                                   return from Procedure, for blocking mode only. Zero
93                                   means infinity. If the timeout expires before all APs
94                                   return from Procedure, then Procedure on the failed APs
95                                   is terminated. All enabled APs are available for next
96                                   function assigned by EFI_PEI_MP_SERVICES_PPI.StartupAllAPs()
97                                   or EFI_PEI_MP_SERVICES_PPI.StartupThisAP(). If the
98                                   timeout expires in blocking mode, BSP returns
99                                   EFI_TIMEOUT.
100   @param[in] ProcedureArgument    The parameter passed into Procedure for all APs.
101 
102   @retval EFI_SUCCESS             In blocking mode, all APs have finished before the
103                                   timeout expired.
104   @retval EFI_DEVICE_ERROR        Caller processor is AP.
105   @retval EFI_NOT_STARTED         No enabled APs exist in the system.
106   @retval EFI_NOT_READY           Any enabled APs are busy.
107   @retval EFI_TIMEOUT             In blocking mode, the timeout expired before all
108                                   enabled APs have finished.
109   @retval EFI_INVALID_PARAMETER   Procedure is NULL.
110 **/
111 typedef
112 EFI_STATUS
113 (EFIAPI *EFI_PEI_MP_SERVICES_STARTUP_ALL_APS) (
114   IN  CONST EFI_PEI_SERVICES      **PeiServices,
115   IN  EFI_PEI_MP_SERVICES_PPI     *This,
116   IN  EFI_AP_PROCEDURE            Procedure,
117   IN  BOOLEAN                     SingleThread,
118   IN  UINTN                       TimeoutInMicroSeconds,
119   IN  VOID                        *ProcedureArgument      OPTIONAL
120   );
121 
122 /**
123   Activate a specific application processor.
124 
125   @param[in] PeiServices          An indirect pointer to the PEI Services Table
126                                   published by the PEI Foundation.
127   @param[in] This                 A pointer to the EFI_PEI_MP_SERVICES_PPI instance.
128   @param[in] Procedure            A pointer to the function to be run on enabled APs of
129                                   the system.
130   @param[in] ProcessorNumber      The handle number of the AP. The range is from 0 to the
131                                   total number of logical processors minus 1. The total
132                                   number of logical processors can be retrieved by
133                                   EFI_PEI_MP_SERVICES_PPI.GetNumberOfProcessors().
134   @param[in] TimeoutInMicroSeconds
135                                   Indicates the time limit in microseconds for APs to
136                                   return from Procedure, for blocking mode only. Zero
137                                   means infinity. If the timeout expires before all APs
138                                   return from Procedure, then Procedure on the failed APs
139                                   is terminated. All enabled APs are available for next
140                                   function assigned by EFI_PEI_MP_SERVICES_PPI.StartupAllAPs()
141                                   or EFI_PEI_MP_SERVICES_PPI.StartupThisAP(). If the
142                                   timeout expires in blocking mode, BSP returns
143                                   EFI_TIMEOUT.
144   @param[in] ProcedureArgument    The parameter passed into Procedure for all APs.
145 
146   @retval EFI_SUCCESS             In blocking mode, specified AP finished before the
147                                   timeout expires.
148   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
149   @retval EFI_TIMEOUT             In blocking mode, the timeout expired before the
150                                   specified AP has finished.
151   @retval EFI_NOT_FOUND           The processor with the handle specified by
152                                   ProcessorNumber does not exist.
153   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the BSP or disabled AP.
154   @retval EFI_INVALID_PARAMETER   Procedure is NULL.
155 **/
156 typedef
157 EFI_STATUS
158 (EFIAPI *EFI_PEI_MP_SERVICES_STARTUP_THIS_AP) (
159   IN  CONST EFI_PEI_SERVICES      **PeiServices,
160   IN  EFI_PEI_MP_SERVICES_PPI     *This,
161   IN  EFI_AP_PROCEDURE            Procedure,
162   IN  UINTN                       ProcessorNumber,
163   IN  UINTN                       TimeoutInMicroseconds,
164   IN  VOID                        *ProcedureArgument      OPTIONAL
165   );
166 
167 /**
168   Switch the boot strap processor.
169 
170   @param[in] PeiServices          An indirect pointer to the PEI Services Table
171                                   published by the PEI Foundation.
172   @param[in] This                 A pointer to the EFI_PEI_MP_SERVICES_PPI instance.
173   @param[in] ProcessorNumber      The handle number of the AP. The range is from 0 to the
174                                   total number of logical processors minus 1. The total
175                                   number of logical processors can be retrieved by
176                                   EFI_PEI_MP_SERVICES_PPI.GetNumberOfProcessors().
177   @param[in] EnableOldBSP         If TRUE, then the old BSP will be listed as an enabled
178                                   AP. Otherwise, it will be disabled.
179 
180   @retval EFI_SUCCESS             BSP successfully switched.
181   @retval EFI_UNSUPPORTED         Switching the BSP cannot be completed prior to this
182                                   service returning.
183   @retval EFI_UNSUPPORTED         Switching the BSP is not supported.
184   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
185   @retval EFI_NOT_FOUND           The processor with the handle specified by
186                                   ProcessorNumber does not exist.
187   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the current BSP or a disabled
188                                   AP.
189   @retval EFI_NOT_READY           The specified AP is busy.
190 **/
191 typedef
192 EFI_STATUS
193 (EFIAPI *EFI_PEI_MP_SERVICES_SWITCH_BSP) (
194   IN  CONST EFI_PEI_SERVICES      **PeiServices,
195   IN  EFI_PEI_MP_SERVICES_PPI     *This,
196   IN  UINTN                       ProcessorNumber,
197   IN  BOOLEAN                     EnableOldBSP
198   );
199 
200 /**
201   Enable or disable an application processor.
202 
203   @param[in] PeiServices          An indirect pointer to the PEI Services Table
204                                   published by the PEI Foundation.
205   @param[in] This                 A pointer to the EFI_PEI_MP_SERVICES_PPI instance.
206   @param[in] ProcessorNumber      The handle number of the AP. The range is from 0 to the
207                                   total number of logical processors minus 1. The total
208                                   number of logical processors can be retrieved by
209                                   EFI_PEI_MP_SERVICES_PPI.GetNumberOfProcessors().
210   @param[in] EnableAP             Specifies the new state for the processor for enabled,
211                                   FALSE for disabled.
212   @param[in] HealthFlag           If not NULL, a pointer to a value that specifies the
213                                   new health status of the AP. This flag corresponds to
214                                   StatusFlag defined in EFI_PEI_MP_SERVICES_PPI.GetProcessorInfo().
215                                   Only the PROCESSOR_HEALTH_STATUS_BIT is used. All other
216                                   bits are ignored. If it is NULL, this parameter is
217                                   ignored.
218 
219   @retval EFI_SUCCESS             The specified AP was enabled or disabled successfully.
220   @retval EFI_UNSUPPORTED         Enabling or disabling an AP cannot be completed prior
221                                   to this service returning.
222   @retval EFI_UNSUPPORTED         Enabling or disabling an AP is not supported.
223   @retval EFI_DEVICE_ERROR        The calling processor is an AP.
224   @retval EFI_NOT_FOUND           Processor with the handle specified by ProcessorNumber
225                                   does not exist.
226   @retval EFI_INVALID_PARAMETER   ProcessorNumber specifies the BSP.
227 **/
228 typedef
229 EFI_STATUS
230 (EFIAPI *EFI_PEI_MP_SERVICES_ENABLEDISABLEAP) (
231   IN  CONST EFI_PEI_SERVICES      **PeiServices,
232   IN  EFI_PEI_MP_SERVICES_PPI     *This,
233   IN  UINTN                       ProcessorNumber,
234   IN  BOOLEAN                     EnableAP,
235   IN  UINT32                      *HealthFlag      OPTIONAL
236   );
237 
238 /**
239   Identify the currently executing processor.
240 
241   @param[in]  PeiServices         An indirect pointer to the PEI Services Table
242                                   published by the PEI Foundation.
243   @param[in]  This                A pointer to the EFI_PEI_MP_SERVICES_PPI instance.
244   @param[out] ProcessorNumber     The handle number of the AP. The range is from 0 to the
245                                   total number of logical processors minus 1. The total
246                                   number of logical processors can be retrieved by
247                                   EFI_PEI_MP_SERVICES_PPI.GetNumberOfProcessors().
248 
249   @retval EFI_SUCCESS             The current processor handle number was returned in
250                                   ProcessorNumber.
251   @retval EFI_INVALID_PARAMETER   ProcessorNumber is NULL.
252 **/
253 typedef
254 EFI_STATUS
255 (EFIAPI *EFI_PEI_MP_SERVICES_WHOAMI) (
256   IN  CONST EFI_PEI_SERVICES      **PeiServices,
257   IN  EFI_PEI_MP_SERVICES_PPI     *This,
258   OUT UINTN                       *ProcessorNumber
259   );
260 
261 ///
262 /// This PPI is installed by some platform or chipset-specific PEIM that abstracts
263 /// handling multiprocessor support.
264 ///
265 struct _EFI_PEI_MP_SERVICES_PPI {
266   EFI_PEI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS   GetNumberOfProcessors;
267   EFI_PEI_MP_SERVICES_GET_PROCESSOR_INFO         GetProcessorInfo;
268   EFI_PEI_MP_SERVICES_STARTUP_ALL_APS            StartupAllAPs;
269   EFI_PEI_MP_SERVICES_STARTUP_THIS_AP            StartupThisAP;
270   EFI_PEI_MP_SERVICES_SWITCH_BSP                 SwitchBSP;
271   EFI_PEI_MP_SERVICES_ENABLEDISABLEAP            EnableDisableAP;
272   EFI_PEI_MP_SERVICES_WHOAMI                     WhoAmI;
273 };
274 
275 extern EFI_GUID gEfiPeiMpServicesPpiGuid;
276 
277 #endif
278