+/** @file\r
+ When installed, the Framework MP Services Protocol produces a collection of \r
+ services that are needed for MP management, such as initialization and management \r
+ of application processors. \r
+ \r
+ @par Note: \r
+ This protocol has been deprecated and has been replaced by the MP Services \r
+ Protocol from the UEFI Platform Initialization Specification 1.2, Volume 2:\r
+ Driver Execution Environment Core Interface.\r
+\r
+ The MP Services Protocol provides a generalized way of performing following tasks:\r
+ - Retrieving information of multi-processor environment and MP-related status of\r
+ specific processors.\r
+ - Dispatching user-provided function to APs.\r
+ - Maintain MP-related processor status.\r
+\r
+ The MP Services Protocol must be produced on any system with more than one logical\r
+ processor.\r
+\r
+ The Protocol is available only during boot time.\r
+\r
+ MP Services Protocol is hardware-independent. Most of the logic of this protocol\r
+ is architecturally neutral. It abstracts the multi-processor environment and \r
+ status of processors, and provides interfaces to retrieve information, maintain, \r
+ and dispatch.\r
+\r
+ MP Services Protocol may be consumed by ACPI module. The ACPI module may use this \r
+ protocol to retrieve data that are needed for an MP platform and report them to OS.\r
+ MP Services Protocol may also be used to program and configure processors, such \r
+ as MTRR synchronization for memory space attributes setting in DXE Services.\r
+ MP Services Protocol may be used by non-CPU DXE drivers to speed up platform boot \r
+ by taking advantage of the processing capabilities of the APs, for example, using \r
+ APs to help test system memory in parallel with other device initialization.\r
+ Diagnostics applications may also use this protocol for multi-processor.\r
+\r
+ Copyright (c) 1999 - 2002, 2009, Intel Corporation.<BR>\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at<BR>\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+--*/\r
+\r
+#ifndef _FRAMEWORK_MP_SERVICE_PROTOCOL_H_\r
+#define _FRAMEWORK_MP_SERVICE_PROTOCOL_H_\r
+\r
+///\r
+/// Global ID for the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+///\r
+#define FRAMEWORK_EFI_MP_SERVICES_PROTOCOL_GUID \\r
+ { \\r
+ 0xf33261e7, 0x23cb, 0x11d5, {0xbd, 0x5c, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \\r
+ }\r
+\r
+///\r
+/// Forward declaration for the EFI_MP_SERVICES_PROTOCOL\r
+///\r
+typedef struct _FRAMEWORK_EFI_MP_SERVICES_PROTOCOL FRAMEWORK_EFI_MP_SERVICES_PROTOCOL;\r
+\r
+///\r
+/// Fixed delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_FIXED 0x0\r
+\r
+///\r
+/// Lowest priority delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_LOWEST_PRIORITY 0x1\r
+\r
+///\r
+/// SMI delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_SMI 0x2\r
+\r
+///\r
+/// Remote read delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_REMOTE_READ 0x3\r
+\r
+///\r
+/// NMI delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_NMI 0x4\r
+\r
+///\r
+/// INIT delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_INIT 0x5\r
+\r
+///\r
+/// Startup IPI delivery mode that may be used as the DeliveryMode parameter in SendIpi() \r
+///\r
+#define DELIVERY_MODE_SIPI 0x6\r
+\r
+///\r
+/// The DeliveryMode parameter in SendIpi() bust be less than this maximum value\r
+///\r
+#define DELIVERY_MODE_MAX 0x7\r
+\r
+///\r
+/// IPF specific value for the state field of the Self Test State Parameter\r
+///\r
+#define EFI_MP_HEALTH_FLAGS_STATUS_HEALTHY 0x0\r
+\r
+///\r
+/// IPF specific value for the state field of the Self Test State Parameter\r
+///\r
+#define EFI_MP_HEALTH_FLAGS_STATUS_PERFORMANCE_RESTRICTED 0x1\r
+\r
+///\r
+/// IPF specific value for the state field of the Self Test State Parameter\r
+///\r
+#define EFI_MP_HEALTH_FLAGS_STATUS_FUNCTIONALLY_RESTRICTED 0x2\r
+\r
+typedef union {\r
+ ///\r
+ /// Bitfield structure for the IPF Self Test State Parameter \r
+ ///\r
+ struct {\r
+ UINT32 Status:2;\r
+ UINT32 Tested:1;\r
+ UINT32 Reserved1:13;\r
+ UINT32 VirtualMemoryUnavailable:1;\r
+ UINT32 Ia32ExecutionUnavailable:1;\r
+ UINT32 FloatingPointUnavailable:1;\r
+ UINT32 MiscFeaturesUnavailable:1;\r
+ UINT32 Reserved2:12;\r
+ } Bits;\r
+ ///\r
+ /// IA32 and X64 BIST data of the processor\r
+ ///\r
+ UINT32 Uint32;\r
+} EFI_MP_HEALTH_FLAGS;\r
+\r
+typedef struct {\r
+ ///\r
+ /// @par IA32, X64:\r
+ /// BIST (built-in self test) data of the processor.\r
+ ///\r
+ /// @par IPF:\r
+ /// Lower 32 bits of self test state parameter. For definition of self test \r
+ /// state parameter, please refer to Intel(R) Itanium(R) Architecture Software \r
+ /// Developer\92s Manual, Volume 2: System Architecture.\r
+ ///\r
+ EFI_MP_HEALTH_FLAGS Flags;\r
+ ///\r
+ /// @par IA32, X64:\r
+ /// Not used.\r
+ ///\r
+ /// @par IPF:\r
+ /// Higher 32 bits of self test state parameter.\r
+ ///\r
+ UINT32 TestStatus;\r
+} EFI_MP_HEALTH;\r
+\r
+typedef enum {\r
+ EfiCpuAP = 0, ///< The CPU is an AP (Application Processor)\r
+ EfiCpuBSP, ///< The CPU is the BSP (Boot-Strap Processor)\r
+ EfiCpuDesignationMaximum\r
+} EFI_CPU_DESIGNATION;\r
+\r
+typedef struct {\r
+ ///\r
+ /// @par IA32, X64:\r
+ /// The lower 8 bits contains local APIC ID, and higher bits are reserved.\r
+ ///\r
+ /// @par IPF:\r
+ /// The lower 16 bits contains id/eid as physical address of local SAPIC \r
+ /// unit, and higher bits are reserved.\r
+ ///\r
+ UINT32 ApicID;\r
+ ///\r
+ /// This field indicates whether the processor is enabled. If the value is \r
+ /// TRUE, then the processor is enabled. Otherwise, it is disabled.\r
+ ///\r
+ BOOLEAN Enabled;\r
+ ///\r
+ /// This field indicates whether the processor is playing the role of BSP.\r
+ /// If the value is EfiCpuAP, then the processor is AP. If the value is \r
+ /// EfiCpuBSP, then the processor is BSP.\r
+ ///\r
+ EFI_CPU_DESIGNATION Designation;\r
+ ///\r
+ /// @par IA32, X64:\r
+ /// The Flags field of this EFI_MP_HEALTH data structure holds BIST (built-in \r
+ /// self test) data of the processor. The TestStatus field is not used, and \r
+ /// the value is always zero.\r
+ ///\r
+ /// @par IPF:\r
+ /// Bit format of this field is the same as the definition of self-test state \r
+ /// parameter, in IntelĀ® ItaniumĀ® Architecture Software Developer\92s Manual, \r
+ /// Volume 2: System Architecture.\r
+ ///\r
+ EFI_MP_HEALTH Health;\r
+ ///\r
+ /// Zero-based physical package number that identifies the cartridge of the \r
+ /// processor.\r
+ ///\r
+ UINTN PackageNumber;\r
+ ///\r
+ /// Zero-based physical core number within package of the processor.\r
+ ///\r
+ UINTN NumberOfCores;\r
+ ///\r
+ /// Zero-based logical thread number within core of the processor.\r
+ ///\r
+ UINTN NumberOfThreads;\r
+ ///\r
+ /// This field is reserved.\r
+ ///\r
+ UINT64 ProcessorPALCompatibilityFlags;\r
+ ///\r
+ /// @par IA32, X64:\r
+ /// This field is not used, and the value is always zero.\r
+ ///\r
+ /// @par IPF:\r
+ /// This field is a mask number that is handed off by the PAL about which \r
+ /// processor tests are performed and which are masked.\r
+ ///\r
+ UINT64 ProcessorTestMask;\r
+} EFI_MP_PROC_CONTEXT;\r
+\r
+/**\r
+ This service retrieves general information of multiprocessors in the system.\r
+\r
+ This function is used to get the following information:\r
+ - Number of logical processors in system\r
+ - Maximal number of logical processors supported by system\r
+ - Number of enabled logical processors.\r
+ - Rendezvous interrupt number (IPF-specific)\r
+ - Length of the rendezvous procedure.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[out] NumberOfCPUs Pointer to the total number of logical processors \r
+ in the system, including the BSP and disabled \r
+ APs. If NULL, this parameter is ignored.\r
+ @param[out] MaximumNumberOfCPUs Pointer to the maximum number of processors \r
+ supported by the system. If NULL, this \r
+ parameter is ignored.\r
+ @param[out] NumberOfEnabledCPUs Pointer to the number of enabled logical \r
+ processors that exist in system, including \r
+ the BSP. If NULL, this parameter is ignored.\r
+ @param[out] RendezvousIntNumber This parameter is only meaningful for IPF.\r
+ - IA32, X64: The returned value is zero. \r
+ If NULL, this parameter is ignored.\r
+ - IPF: Pointer to the rendezvous interrupt \r
+ number that is used for AP wake-up.\r
+ @param[out] RendezvousProcLength Pointer to the length of rendezvous procedure. \r
+ - IA32, X64: The returned value is 0x1000. \r
+ If NULL, this parameter is ignored.\r
+ - IPF: The returned value is zero.\r
+\r
+ @retval EFI_SUCCESS Multiprocessor general information successfully retrieved.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_GET_GENERAL_MP_INFO)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ OUT UINTN *NumberOfCPUs OPTIONAL,\r
+ OUT UINTN *MaximumNumberOfCPUs OPTIONAL,\r
+ OUT UINTN *NumberOfEnabledCPUs OPTIONAL,\r
+ OUT UINTN *RendezvousIntNumber OPTIONAL,\r
+ OUT UINTN *RendezvousProcLength OPTIONAL\r
+ );\r
+\r
+/**\r
+ This service gets detailed MP-related information of the requested processor.\r
+\r
+ This service gets detailed MP-related information of the requested processor \r
+ at the instant this call is made. Note the following:\r
+ - The processor information may change during the course of a boot session. \r
+ - The data of information presented here is entirely MP related. \r
+ Information regarding the number of caches and their sizes, frequency of operation,\r
+ slot numbers is all considered platform-related information and will not be \r
+ presented here. \r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] ProcessorNumber The handle number of the processor. The range\r
+ is from 0 to the total number of logical \r
+ processors minus 1. The total number of \r
+ logical processors can be retrieved by \r
+ GetGeneralMPInfo().\r
+ @param[in,out] BufferLength On input, pointer to the size in bytes of \r
+ ProcessorContextBuffer. On output, if the \r
+ size of ProcessorContextBuffer is not large \r
+ enough, the value pointed by this parameter \r
+ is updated to size in bytes that is needed. \r
+ If the size of ProcessorContextBuffer is \r
+ sufficient, the value is not changed from \r
+ input.\r
+ @param[out] ProcessorContextBuffer Pointer to the buffer where the data of \r
+ requested processor will be deposited. \r
+ The buffer is allocated by caller. \r
+\r
+ @retval EFI_SUCCESS Processor information successfully returned.\r
+ @retval EFI_BUFFER_TOO_SMALL The size of ProcessorContextBuffer is too small. \r
+ Value pointed by BufferLength has been updated \r
+ to size in bytes that is needed.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64:BufferLength is NULL.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64:ProcessorContextBuffer is NULL.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64:Processor with the handle specified by \r
+ ProcessorNumber does not exist\r
+ @retval EFI_NOT_FOUND IPF: Processor with the handle specified by \r
+ ProcessorNumber does not exist\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN OUT UINTN *BufferLength,\r
+ OUT EFI_MP_PROC_CONTEXT *ProcessorContextBuffer\r
+ );\r
+\r
+/**\r
+ This function is used to dispatch all enabled APs to the function specified \r
+ by Procedure. APs can run either simultaneously or one by one. The caller can \r
+ also configure the BSP to either wait for APs or just proceed with the next \r
+ task. It is the responsibility of the caller of the StartupAllAPs() to make \r
+ sure that the nature of the code that will be run on the BSP and the dispatched \r
+ APs is well controlled. The MP Services Protocol does not guarantee that the \r
+ function that either processor is executing is MP-safe. Hence, the tasks that \r
+ can be run in parallel are limited to certain independent tasks and well-\r
+ controlled exclusive code. EFI services and protocols may not be called by APs \r
+ unless otherwise specified.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] Procedure A pointer to the function to be run on enabled \r
+ APs of the system. \r
+ @param[in] SingleThread Flag that requests APs to execute one at a \r
+ time or simultaneously.\r
+ - IA32, X64:\r
+ If TRUE, then all the enabled APs execute \r
+ the function specified by Procedure one by \r
+ one, in ascending order of processor handle \r
+ number. If FALSE, then all the enabled APs \r
+ execute the function specified by Procedure \r
+ simultaneously.\r
+ - IPF:\r
+ If TRUE, then all the enabled APs execute \r
+ the function specified by Procedure simultaneously.\r
+ If FALSE, then all the enabled APs execute the \r
+ function specified by Procedure one by one, in \r
+ ascending order of processor handle number. The \r
+ time interval of AP dispatching is determined \r
+ by WaitEvent and TimeoutInMicrosecs.\r
+ @param[in] WaitEvent Event to signal when APs have finished.\r
+ - IA32, X64:\r
+ If not NULL, when all APs finish after timeout \r
+ expires, the event will be signaled. If NULL, \r
+ the parameter is ignored.\r
+ - IPF:\r
+ If SingleThread is TRUE, this parameter \r
+ is ignored. If SingleThread is FALSE (i.e. \r
+ dispatch APs one by one), this parameter \r
+ determines whether the BSP waits after each \r
+ AP is dispatched. If it is NULL, the BSP \r
+ does not wait after each AP is dispatched. \r
+ If it is not NULL, the BSP waits after each \r
+ AP is dispatched, and the time interval is \r
+ determined by TimeoutInMicrosecs. Type \r
+ EFI_EVENT is defined in CreateEvent() in \r
+ the Unified Extensible Firmware Interface \r
+ Specification.\r
+ @param[in] TimeoutInMicrosecsond Time to wait for APs to finish.\r
+ - IA32, X64:\r
+ If the value is zero, it means no timeout \r
+ limit. The BSP waits until all APs finish. \r
+ If the value is not zero, the BSP waits \r
+ until all APs finish or timeout expires. \r
+ If timeout expires, EFI_TIMEOUT is returned,\r
+ and the BSP will then check APs\92 status \r
+ periodically, with time interval of 16 \r
+ microseconds.\r
+ - IPF:\r
+ If SingleThread is TRUE and FailedCPUList \r
+ is NULL, this parameter is ignored. If \r
+ SingleThread is TRUE and FailedCPUList is \r
+ not NULL, this parameter determines whether \r
+ the BSP waits until all APs finish their \r
+ procedure. If it is zero, the BSP does not \r
+ wait for APs. If it is non-zero, it waits \r
+ until all APs finish. If SingleThread is \r
+ FALSE and WaitEvent is NULL, this parameter \r
+ is ignored. If SingleThread is FALSE and \r
+ WaitEvent is not NULL, the BSP waits after \r
+ each AP is dispatched and this value \r
+ determines time interval. If the value is \r
+ zero, the length of time interval is 10ms. \r
+ If the value is non-zero, the BSP waits \r
+ until dispatched AP finishes and then \r
+ dispatch the next.\r
+ @param[in] ProcedureArgument Pointer to the optional parameter of the \r
+ function specified by Procedure.\r
+ @param[out] FailedCPUList List of APs that did not finish.\r
+ - IA32, X64:\r
+ If not NULL, it records handle numbers of \r
+ all logical processors that fail to accept \r
+ caller-provided function (busy or disabled).\r
+ If NULL, this parameter is ignored.\r
+ - IPF:\r
+ If not NULL, it records status of all \r
+ logical processors, with processor handle \r
+ number as index. If a logical processor \r
+ fails to accept caller-provided function \r
+ because it is busy, the status is EFI_NOT_READY. \r
+ If it fails to accept function due to other \r
+ reasons, the status is EFI_NOT_AVAILABLE_YET. \r
+ If timeout expires, the status is EFI_TIMEOUT.\r
+ Otherwise, the value is EFI_SUCCESS. If NULL, \r
+ this parameter is ignored.\r
+\r
+ @retval EFI_SUCCESS IA32, X64: All dispatched APs have finished \r
+ before the timeout expires.\r
+ @retval EFI_SUCCESS IA32, X64: Only 1 logical processor exists \r
+ in system.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Procedure is NULL.\r
+ @retval EFI_TIMEOUT IA32, X64: The timeout expires before all \r
+ dispatched APs have finished.\r
+ @retval EFI_SUCCESS IPF: This function always returns EFI_SUCCESS.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_STARTUP_ALL_APS)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_AP_PROCEDURE Procedure,\r
+ IN BOOLEAN SingleThread,\r
+ IN EFI_EVENT WaitEvent OPTIONAL,\r
+ IN UINTN TimeoutInMicroSecs, \r
+ IN VOID *ProcArguments OPTIONAL,\r
+ OUT UINTN *FailedCPUList OPTIONAL\r
+ );\r
+\r
+/**\r
+ This function is used to dispatch one enabled AP to the function provided by \r
+ the caller. The caller can request the BSP to either wait for the AP or just \r
+ proceed with the next task.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] Procedure A pointer to the function to be run on the \r
+ designated AP. \r
+ @param[in] ProcessorNumber The handle number of AP. The range is from \r
+ 0 to the total number of logical processors \r
+ minus 1. The total number of logical \r
+ processors can be retrieved by GetGeneralMPInfo().\r
+ @param[in] WaitEvent Event to signal when APs have finished.\r
+ - IA32, X64:\r
+ If not NULL, when the AP finishes after timeout \r
+ expires, the event will be signaled. If NULL, \r
+ the parameter is ignored.\r
+ - IPF:\r
+ This parameter determines whether the BSP \r
+ waits after the AP is dispatched. If it is \r
+ NULL, the BSP does not wait after the AP \r
+ is dispatched. If it is not NULL, the BSP \r
+ waits after the AP is dispatched, and the \r
+ time interval is determined by TimeoutInMicrosecs.\r
+ Type EFI_EVENT is defined in CreateEvent() \r
+ in the Unified Extensible Firmware Interface \r
+ Specification.\r
+ @param[in] TimeoutInMicrosecsond Time to wait for APs to finish.\r
+ - IA32, X64:\r
+ If the value is zero, it means no timeout \r
+ limit. The BSP waits until the AP finishes. \r
+ If the value is not zero, the BSP waits until \r
+ the AP finishes or timeout expires. If timeout \r
+ expires, EFI_TIMEOUT is returned, and the \r
+ BSP will then check the AP\92s status periodically, \r
+ with time interval of 16 microseconds.\r
+ - IPF:\r
+ If WaitEvent is NULL, this parameter is ignored.\r
+ If WaitEvent is not NULL, the BSP waits after \r
+ the AP is dispatched and this value determines \r
+ time interval. If the value is zero, the length \r
+ of time interval is 10ms. If the value is \r
+ non-zero, the BSP waits until the AP finishes.\r
+ @param[in] ProcedureArgument Pointer to the optional parameter of the \r
+ function specified by Procedure.\r
+\r
+ @retval EFI_SUCCESS Specified AP has finished before the timeout \r
+ expires.\r
+ @retval EFI_TIMEOUT The timeout expires before specified AP has \r
+ finished.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified \r
+ by ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Specified AP is busy or disabled.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Procedure is NULL.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: ProcessorNumber specifies the BSP\r
+ @retval EFI_NOT_READY IPF: Specified AP is busy\r
+ @retval EFI_NOT_AVAILABLE_YET IPF: ProcessorNumber specifies the BSP\r
+ @retval EFI_NOT_AVAILABLE_YET IPF: Specified AP is disabled.\r
+ @retval EFI_NOT_AVAILABLE_YET IPF: Specified AP is unhealthy or untested.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_STARTUP_THIS_AP)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_AP_PROCEDURE Procedure,\r
+ IN UINTN ProcessorNumber,\r
+ IN EFI_EVENT WaitEvent OPTIONAL,\r
+ IN UINTN TimeoutInMicroSecs,\r
+ IN OUT VOID *ProcArguments OPTIONAL\r
+ );\r
+\r
+/**\r
+ This service switches the requested AP to be the BSP from that point onward. \r
+ The new BSP can take over the execution of the old BSP and continue seamlessly \r
+ from where the old one left off. This call can only be performed by the \r
+ current BSP.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] ProcessorNumber The handle number of AP. The range is from 0 to \r
+ the total number of logical processors minus 1. \r
+ The total number of logical processors can be \r
+ retrieved by GetGeneralMPInfo().\r
+ @param[in] EnableOldBSP If TRUE, then the old BSP will be listed as an \r
+ enabled AP. Otherwise, it will be disabled.\r
+\r
+ @retval EFI_SUCCESS BSP successfully switched.\r
+ @retval EFI_INVALID_PARAMETER Processor with the handle specified by \r
+ ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP.\r
+ @retval EFI_NOT_READY IA32, X64: Specified AP is busy or disabled.\r
+ @retval EFI_INVALID_PARAMETER IPF: Specified AP is disabled.\r
+ @retval EFI_INVALID_PARAMETER IPF: Specified AP is unhealthy or untested.\r
+ @retval EFI_NOT_READY IPF: Specified AP is busy.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_SWITCH_BSP)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN BOOLEAN EnableOldBSP\r
+ );\r
+\r
+/**\r
+ This service sends an IPI to a specified AP. Caller can specify vector number \r
+ and delivery mode of the interrupt.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] ProcessorNumber The handle number of AP. The range is from 0 to \r
+ the total number of logical processors minus 1. \r
+ The total number of logical processors can be \r
+ retrieved by GetGeneralMPInfo().\r
+ @param[in] VectorNumber Vector number of the interrupt.\r
+ @param[in] DeliveryMode Delivery mode of the interrupt.\r
+\r
+ @retval EFI_SUCCESS IPI is successfully sent.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified \r
+ by ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: VectorNumber is greater than 255.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: DeliveryMode is greater than or equal \r
+ to DELIVERY_MODE_MAX.\r
+ @retval EFI_NOT_READY IA32, X64: IPI is not accepted by the target \r
+ processor within 10 microseconds.\r
+ @retval EFI_INVALID_PARAMETER IPF: Specified AP is disabled.\r
+ @retval EFI_INVALID_PARAMETER IPF: Specified AP is unhealthy or untested.\r
+ @retval EFI_NOT_READY IPF: Specified AP is busy.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_SEND_IPI)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN UINTN VectorNumber,\r
+ IN UINTN DeliveryMode\r
+ );\r
+\r
+/**\r
+ This service lets the caller enable or disable an AP. The caller can optionally \r
+ specify the health status of the AP by Health. It is usually used to update the \r
+ health status of the processor after some processor test.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] ProcessorNumber The handle number of AP. The range is from 0 to \r
+ the total number of logical processors minus 1. \r
+ The total number of logical processors can be \r
+ retrieved by GetGeneralMPInfo().\r
+ @param[in] NewAPState Indicates whether the new, desired state of the \r
+ AP is enabled or disabled. TRUE for enabling, \r
+ FALSE otherwise.\r
+ @param[in] HealthState If not NULL, it points to the value that specifies \r
+ the new health status of the AP. If it is NULL, \r
+ this parameter is ignored. \r
+\r
+ @retval EFI_SUCCESS AP successfully enabled or disabled.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP.\r
+ @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified \r
+ by ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER IPF: If an unhealthy or untested AP is to be \r
+ enabled.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_ENABLEDISABLEAP)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN BOOLEAN NewAPState,\r
+ IN EFI_MP_HEALTH *HealthState OPTIONAL\r
+ );\r
+\r
+/**\r
+ This service lets the caller processor get its handle number, with which any \r
+ processor in the system can be uniquely identified. The range is from 0 to the \r
+ total number of logical processors minus 1. The total number of logical \r
+ processors can be retrieved by GetGeneralMPInfo(). This service may be called \r
+ from the BSP and APs.\r
+\r
+ @param[in] This Pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[out] ProcessorNumber A pointer to the handle number of AP. The range is \r
+ from 0 to the total number of logical processors \r
+ minus 1. The total number of logical processors \r
+ can be retrieved by GetGeneralMPInfo().\r
+\r
+@retval EFI_SUCCESS This function always returns EFI_SUCCESS.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_WHOAMI)(\r
+ IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This,\r
+ OUT UINTN *ProcessorNumber\r
+ );\r
+\r
+///\r
+/// Framework MP Services Protocol structure\r
+///\r
+typedef struct _FRAMEWORK_EFI_MP_SERVICES_PROTOCOL {\r
+ FRAMEWORK_EFI_MP_SERVICES_GET_GENERAL_MP_INFO GetGeneralMPInfo;\r
+ FRAMEWORK_EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT GetProcessorContext;\r
+ FRAMEWORK_EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs;\r
+ FRAMEWORK_EFI_MP_SERVICES_STARTUP_THIS_AP StartupThisAP;\r
+ FRAMEWORK_EFI_MP_SERVICES_SWITCH_BSP SwitchBSP;\r
+ FRAMEWORK_EFI_MP_SERVICES_SEND_IPI SendIPI;\r
+ FRAMEWORK_EFI_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP;\r
+ FRAMEWORK_EFI_MP_SERVICES_WHOAMI WhoAmI;\r
+};\r
+\r
+extern EFI_GUID gFrameworkEfiMpServiceProtocolGuid;\r
+\r
+#endif\r