UefiCpuPkg/MpInitLib: Add MpInitLibStartupAllCPUs API.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1973

Add new MpInitLibStartupAllCPUs API uses to start all processors
at the same time.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Chandana Kumar <chandana.c.kumar@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Eric Dong 2019-04-10 11:00:43 +08:00
parent 92b5a2eabc
commit ee0c39fa11
4 changed files with 67 additions and 10 deletions

View File

@ -1,7 +1,7 @@
/** @file
MP initialize support functions for DXE phase.
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@ -568,9 +568,10 @@ MpInitLibStartupAllAPs (
//
mStopCheckAllApsStatus = TRUE;
Status = StartupAllAPsWorker (
Status = StartupAllCPUsWorker (
Procedure,
SingleThread,
TRUE,
WaitEvent,
TimeoutInMicroseconds,
ProcedureArgument,

View File

@ -2130,6 +2130,7 @@ MpInitLibGetNumberOfProcessors (
number. If FALSE, then all the enabled APs
execute the function specified by Procedure
simultaneously.
@param[in] ExcludeBsp Whether let BSP also trig this task.
@param[in] WaitEvent The event created by the caller with CreateEvent()
service.
@param[in] TimeoutInMicroseconds Indicates the time limit in microseconds for
@ -2151,9 +2152,10 @@ MpInitLibGetNumberOfProcessors (
**/
EFI_STATUS
StartupAllAPsWorker (
StartupAllCPUsWorker (
IN EFI_AP_PROCEDURE Procedure,
IN BOOLEAN SingleThread,
IN BOOLEAN ExcludeBsp,
IN EFI_EVENT WaitEvent OPTIONAL,
IN UINTN TimeoutInMicroseconds,
IN VOID *ProcedureArgument OPTIONAL,
@ -2175,7 +2177,7 @@ StartupAllAPsWorker (
*FailedCpuList = NULL;
}
if (CpuMpData->CpuCount == 1) {
if (CpuMpData->CpuCount == 1 && ExcludeBsp) {
return EFI_NOT_STARTED;
}
@ -2218,9 +2220,9 @@ StartupAllAPsWorker (
}
}
if (!HasEnabledAp) {
if (!HasEnabledAp && ExcludeBsp) {
//
// If no enabled AP exists, return EFI_NOT_STARTED.
// If no enabled AP exists and not include Bsp to do the procedure, return EFI_NOT_STARTED.
//
return EFI_NOT_STARTED;
}
@ -2266,6 +2268,13 @@ StartupAllAPsWorker (
}
}
if (!ExcludeBsp) {
//
// Start BSP.
//
Procedure (ProcedureArgument);
}
Status = EFI_SUCCESS;
if (WaitEvent == NULL) {
do {
@ -2411,3 +2420,47 @@ GetCpuMpDataFromGuidedHob (
return CpuMpData;
}
/**
This service executes a caller provided function on all enabled CPUs.
@param[in] Procedure A pointer to the function to be run on
enabled APs of the system. See type
EFI_AP_PROCEDURE.
@param[in] TimeoutInMicroseconds Indicates the time limit in microseconds for
APs to return from Procedure, either for
blocking or non-blocking mode. Zero means
infinity. TimeoutInMicroseconds is ignored
for BSP.
@param[in] ProcedureArgument The parameter passed into Procedure for
all APs.
@retval EFI_SUCCESS In blocking mode, all CPUs have finished before
the timeout expired.
@retval EFI_SUCCESS In non-blocking mode, function has been dispatched
to all enabled CPUs.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_NOT_READY Any enabled APs are busy.
@retval EFI_NOT_READY MP Initialize Library is not initialized.
@retval EFI_TIMEOUT In blocking mode, the timeout expired before
all enabled APs have finished.
@retval EFI_INVALID_PARAMETER Procedure is NULL.
**/
EFI_STATUS
EFIAPI
MpInitLibStartupAllCPUs (
IN EFI_AP_PROCEDURE Procedure,
IN UINTN TimeoutInMicroseconds,
IN VOID *ProcedureArgument OPTIONAL
)
{
return StartupAllCPUsWorker (
Procedure,
FALSE,
FALSE,
NULL,
TimeoutInMicroseconds,
ProcedureArgument,
NULL
);
}

View File

@ -1,7 +1,7 @@
/** @file
Common header file for MP Initialize Library.
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@ -405,6 +405,7 @@ InitMpGlobalData (
number. If FALSE, then all the enabled APs
execute the function specified by Procedure
simultaneously.
@param[in] ExcludeBsp Whether let BSP also trig this task.
@param[in] WaitEvent The event created by the caller with CreateEvent()
service.
@param[in] TimeoutInMicroseconds Indicates the time limit in microseconds for
@ -426,9 +427,10 @@ InitMpGlobalData (
**/
EFI_STATUS
StartupAllAPsWorker (
StartupAllCPUsWorker (
IN EFI_AP_PROCEDURE Procedure,
IN BOOLEAN SingleThread,
IN BOOLEAN ExcludeBsp,
IN EFI_EVENT WaitEvent OPTIONAL,
IN UINTN TimeoutInMicroseconds,
IN VOID *ProcedureArgument OPTIONAL,

View File

@ -1,7 +1,7 @@
/** @file
MP initialize support functions for PEI phase.
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@ -401,9 +401,10 @@ MpInitLibStartupAllAPs (
return EFI_UNSUPPORTED;
}
return StartupAllAPsWorker (
return StartupAllCPUsWorker (
Procedure,
SingleThread,
TRUE,
NULL,
TimeoutInMicroseconds,
ProcedureArgument,