mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-30 00:54:06 +02:00
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:
parent
6dc05093a0
commit
963788618b
@ -13,7 +13,16 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
#include "MpLib.h"
|
#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;
|
CPU_MP_DATA *mCpuMpData = NULL;
|
||||||
|
EFI_EVENT mCheckAllApsEvent = NULL;
|
||||||
|
volatile BOOLEAN mStopCheckAllApsStatus = TRUE;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the pointer to CPU MP Data structure.
|
Get the pointer to CPU MP Data structure.
|
||||||
@ -42,6 +51,43 @@ SaveCpuMpData (
|
|||||||
mCpuMpData = CpuMpData;
|
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.
|
Initialize global data for MP support.
|
||||||
|
|
||||||
@ -52,8 +98,28 @@ InitMpGlobalData (
|
|||||||
IN CPU_MP_DATA *CpuMpData
|
IN CPU_MP_DATA *CpuMpData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
SaveCpuMpData (CpuMpData);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user