[edk2-devel] [Patch v2 2/6] UefiCpuPkg/MpInitLib: Add MpInitLibStartupAllCPUs API.

Dong, Eric posted 6 patches 6 years, 6 months ago
There is a newer version of this series
[edk2-devel] [Patch v2 2/6] UefiCpuPkg/MpInitLib: Add MpInitLibStartupAllCPUs API.
Posted by Dong, Eric 6 years, 6 months ago
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>
---
 UefiCpuPkg/Library/MpInitLib/DxeMpLib.c |  3 +-
 UefiCpuPkg/Library/MpInitLib/MpLib.c    | 60 +++++++++++++++++++++++--
 UefiCpuPkg/Library/MpInitLib/MpLib.h    |  4 +-
 UefiCpuPkg/Library/MpInitLib/PeiMpLib.c |  3 +-
 4 files changed, 63 insertions(+), 7 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 6be1bae464..23adfd0625 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -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..51e63e14a3 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,46 @@ 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.
+  @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
+           );
+}
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index f89037c59e..81de45c73b 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -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,
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
index 35dff91fd2..5666ad0862 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
@@ -401,9 +401,10 @@ MpInitLibStartupAllAPs (
     return EFI_UNSUPPORTED;
   }
 
-  return StartupAllAPsWorker (
+  return StartupAllCpusWorker (
            Procedure,
            SingleThread,
+           TRUE,
            NULL,
            TimeoutInMicroseconds,
            ProcedureArgument,
-- 
2.21.0.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#44102): https://edk2.groups.io/g/devel/message/44102
Mute This Topic: https://groups.io/mt/32556153/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [Patch v2 2/6] UefiCpuPkg/MpInitLib: Add MpInitLibStartupAllCPUs API.
Posted by Ni, Ray 6 years, 6 months ago
"CPU"  is used in MpInitLibStartupAllCPUs() and StartupAllCpusWorker().
Can you please follow today's capital rule of "AP" to update
StartupAllCpusWorker() to StartupAllCPUsWorker()?

And with the copyright year update to 2019, Reviewed-by: Ray Ni <ray.ni@intel.com>

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Dong,
> Eric
> Sent: Monday, July 22, 2019 3:14 PM
> To: devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Kumar,
> Chandana C <chandana.c.kumar@intel.com>; Zeng, Star
> <star.zeng@intel.com>
> Subject: [edk2-devel] [Patch v2 2/6] 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>
> ---
>  UefiCpuPkg/Library/MpInitLib/DxeMpLib.c |  3 +-
>  UefiCpuPkg/Library/MpInitLib/MpLib.c    | 60 +++++++++++++++++++++++-
> -
>  UefiCpuPkg/Library/MpInitLib/MpLib.h    |  4 +-
>  UefiCpuPkg/Library/MpInitLib/PeiMpLib.c |  3 +-
>  4 files changed, 63 insertions(+), 7 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> index 6be1bae464..23adfd0625 100644
> --- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> @@ -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..51e63e14a3 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,46 @@ 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.
> +  @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
> +           );
> +}
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index f89037c59e..81de45c73b 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -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,
> diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> index 35dff91fd2..5666ad0862 100644
> --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> @@ -401,9 +401,10 @@ MpInitLibStartupAllAPs (
>      return EFI_UNSUPPORTED;
>    }
> 
> -  return StartupAllAPsWorker (
> +  return StartupAllCpusWorker (
>             Procedure,
>             SingleThread,
> +           TRUE,
>             NULL,
>             TimeoutInMicroseconds,
>             ProcedureArgument,
> --
> 2.21.0.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#44212): https://edk2.groups.io/g/devel/message/44212
Mute This Topic: https://groups.io/mt/32556153/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-