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
Cc: Laszlo Ersek
Cc: Chandana Kumar
Cc: Star Zeng
Signed-off-by: Eric Dong
Reviewed-by: Ray Ni
---
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 5 +-
UefiCpuPkg/Library/MpInitLib/MpLib.c| 61 +++--
UefiCpuPkg/Library/MpInitLib/MpLib.h| 6 ++-
UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 5 +-
4 files changed, 67 insertions(+), 10 deletions(-)
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 6be1bae464..b17e287bbf 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -1,7 +1,7 @@
/** @file
MP initialize support functions for DXE phase.
- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -568,9 +568,10 @@ MpInitLibStartupAllAPs (
//
mStopCheckAllApsStatus = TRUE;
- Status = StartupAllAPsWorker (
+ Status = StartupAllCPUsWorker (
Procedure,
SingleThread,
+ TRUE,
WaitEvent,
TimeoutInMicroseconds,
ProcedureArgument,
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c
b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 6f51bc4ebf..572495ec36 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -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_ERRORCaller 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