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