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