]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Register one period event to check APs status
authorJeff Fan <jeff.fan@intel.com>
Thu, 21 Jul 2016 08:56:51 +0000 (16:56 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 17 Aug 2016 12:00:44 +0000 (20:00 +0800)
In DxeMpInitLib, register one period event callback function CheckAPsStatus()
used to check AP Status.

v5:
  1. Introduce AP_CHECK_INTERVAL for adjust AP check timer interval potential.

v3:
  1. Use CamelCase for mCheckAllAPsEvent, mStopCheckAllApsStatus and
     CheckAndUpdateApsStatus().
  2. Move SetTimer() from Patch #17 to Patch 16.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c

index e294612f1446bb38adebad0b1214e88baff9ba05..2d8bf25b0add3b53c622221629471f4a8c080a12 100644 (file)
 **/\r
 \r
 #include "MpLib.h"\r
+\r
+#include <Library/UefiLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#define  AP_CHECK_INTERVAL     (EFI_TIMER_PERIOD_MILLISECONDS (100))\r
+\r
 CPU_MP_DATA      *mCpuMpData = NULL;\r
+EFI_EVENT        mCheckAllApsEvent = NULL;\r
+volatile BOOLEAN mStopCheckAllApsStatus = TRUE;\r
+\r
 \r
 /**\r
   Get the pointer to CPU MP Data structure.\r
@@ -42,6 +51,43 @@ SaveCpuMpData (
   mCpuMpData = CpuMpData;\r
 }\r
 \r
+/**\r
+/**\r
+  Checks APs status and updates APs status if needed.\r
+\r
+**/\r
+VOID\r
+CheckAndUpdateApsStatus (\r
+  VOID\r
+  )\r
+{\r
+}\r
+\r
+/**\r
+  Checks APs' status periodically.\r
+\r
+  This function is triggerred by timer perodically to check the\r
+  state of APs for StartupAllAPs() and StartupThisAP() executed\r
+  in non-blocking mode.\r
+\r
+  @param[in]  Event    Event triggered.\r
+  @param[in]  Context  Parameter passed with the event.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CheckApsStatus (\r
+  IN  EFI_EVENT                           Event,\r
+  IN  VOID                                *Context\r
+  )\r
+{\r
+  //\r
+  // If CheckApsStatus() is not stopped, otherwise return immediately.\r
+  //\r
+  if (!mStopCheckAllApsStatus) {\r
+    CheckAndUpdateApsStatus ();\r
+  }\r
+}\r
 /**\r
   Initialize global data for MP support.\r
 \r
@@ -52,8 +98,28 @@ InitMpGlobalData (
   IN CPU_MP_DATA               *CpuMpData\r
   )\r
 {\r
+  EFI_STATUS     Status;\r
+\r
   SaveCpuMpData (CpuMpData);\r
 \r
+  Status = gBS->CreateEvent (\r
+                  EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  CheckApsStatus,\r
+                  NULL,\r
+                  &mCheckAllApsEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Set timer to check all APs status.\r
+  //\r
+  Status = gBS->SetTimer (\r
+                  mCheckAllApsEvent,\r
+                  TimerPeriodic,\r
+                  AP_CHECK_INTERVAL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
 /**\r