]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add Framework MP Services Protocol
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 13 Jul 2009 00:18:41 +0000 (00:18 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 13 Jul 2009 00:18:41 +0000 (00:18 +0000)
Change EFI_AP_PROCEDURE to FRAMEWORK_EFI_AP_PROCEDURE to remove name collision with PI 1.2 MP Services Protocol in MdePkg

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8912 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkPkg/Include/Framework/DxeCis.h
IntelFrameworkPkg/Include/Framework/SmmCis.h
IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h [new file with mode: 0644]
IntelFrameworkPkg/IntelFrameworkPkg.dec

index f0f8f7e295fb083507ce7820e79167abaa6ae016..86d96ddd4125ecf5c4457d83189ab73887991200 100644 (file)
 \r
 #include <Protocol/StatusCode.h>\r
 \r
-//\r
-// Function prototype for invoking a function on an Application Processor\r
-// Used by both the SMM infrastructure and the MP Services Protocol\r
-//\r
+/**\r
+  Functions of this type are used with the Framework MP Services Protocol and\r
+  the  SMM Services Table to execute a procedure on enabled APs.  The context \r
+  the AP should use durng execution is specified by Buffer.\r
+  \r
+  @param[in]  Buffer   Pointer to the procedure's argument.\r
+\r
+**/\r
 typedef\r
 VOID\r
-(EFIAPI *EFI_AP_PROCEDURE)(\r
-  IN  VOID                          *Buffer\r
+(EFIAPI *FRAMEWORK_EFI_AP_PROCEDURE)(\r
+  IN  VOID  *Buffer\r
   );\r
 \r
-//\r
-// Framework EFI Runtime Services Table as extension to EFI 1.10 Runtime Services Table\r
-//\r
+///\r
+/// Framework EFI Runtime Services Table as extension to EFI 1.10 Runtime Services Table\r
+///\r
 typedef struct {\r
   //\r
   // Table header for the Framework EFI Runtime Services Table\r
@@ -59,10 +63,10 @@ typedef struct {
   //\r
   EFI_GET_NEXT_HIGH_MONO_COUNT      GetNextHighMonotonicCount;\r
   EFI_RESET_SYSTEM                  ResetSystem;\r
-  //\r
-  // Framework extension to EFI 1.10 runtime table\r
-  // It was moved to a protocol to not conflict with UEFI 2.0\r
-  //\r
+  ///\r
+  /// Framework extension to EFI 1.10 runtime table\r
+  /// It was moved to a protocol to not conflict with UEFI 2.0\r
+  ///\r
   EFI_REPORT_STATUS_CODE            ReportStatusCode;\r
 } FRAMEWORK_EFI_RUNTIME_SERVICES;\r
 \r
index 11d6a6b07ef36384d96c86ac183858ed0446af43..122c471add9b09f9ce307a4928eda11340bf6189 100644 (file)
@@ -180,6 +180,7 @@ EFI_STATUS
   IN EFI_PHYSICAL_ADDRESS   Memory,\r
   IN UINTN                  NumberOfPages\r
   );\r
+\r
 /**\r
   Frees memory pages for the system.\r
 \r
@@ -203,7 +204,7 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *EFI_SMM_STARTUP_THIS_AP)(\r
-  IN  EFI_AP_PROCEDURE                    Procedure,\r
+  IN  FRAMEWORK_EFI_AP_PROCEDURE          Procedure,\r
   IN  UINTN                               CpuNumber,\r
   IN  OUT VOID                            *ProcArguments OPTIONAL\r
   );\r
diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h b/IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h
new file mode 100644 (file)
index 0000000..e11bb70
--- /dev/null
@@ -0,0 +1,660 @@
+/** @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
index 33305d275a4f3870855e288578fe53449b0110f5..82254e44e5b86bd2bdc1df8ee35fb9994c7ea092 100644 (file)
   \r
   ## Include/Protocol/FrameworkHii.h \r
   gEfiHiiCompatibilityProtocolGuid = { 0x5542cce1, 0xdf5c, 0x4d1b, { 0xab, 0xca, 0x36, 0x4f, 0x77, 0xd3, 0x99, 0xfb }}\r
+\r
+  ## Include/Protocol/FrameworkMpService.h \r
+  gFrameworkEfiMpServiceProtocolGuid = { 0xf33261e7, 0x23cb, 0x11d5, {0xbd, 0x5c, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81}}\r
   \r
   ## Include/Protocol/IdeControllerInit.h\r
   gEfiIdeControllerInitProtocolGuid = { 0xa1e37052, 0x80d9, 0x4e65, { 0xa3, 0x17, 0x3e, 0x9a, 0x55, 0xc4, 0x3e, 0xc9 }}\r