UefiCpuPkg/MpInitLib: Register one period event to check APs status

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>
This commit is contained in:
Jeff Fan 2016-07-21 16:56:51 +08:00
parent 6dc05093a0
commit 963788618b
1 changed files with 66 additions and 0 deletions

View File

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