]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
UefiCpuPkg/MpInitLib: Implementation of MpInitLibStartupAllAPs()
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / DxeMpLib.c
index 785653be8f6e4708b0f2be2a70609dbac72143cc..1043becf4c2e37b9837fb0aa19b41b57ecc4d583 100644 (file)
@@ -120,6 +120,43 @@ CheckAndUpdateApsStatus (
   VOID\r
   )\r
 {\r
+  UINTN                   ProcessorNumber;\r
+  EFI_STATUS              Status;\r
+  CPU_MP_DATA             *CpuMpData;\r
+\r
+  CpuMpData = GetCpuMpData ();\r
+\r
+  //\r
+  // First, check whether pending StartupAllAPs() exists.\r
+  //\r
+  if (CpuMpData->WaitEvent != NULL) {\r
+\r
+    Status = CheckAllAPs ();\r
+    //\r
+    // If all APs finish for StartupAllAPs(), signal the WaitEvent for it.\r
+    //\r
+    if (Status != EFI_NOT_READY) {\r
+      Status = gBS->SignalEvent (CpuMpData->WaitEvent);\r
+      CpuMpData->WaitEvent = NULL;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Second, check whether pending StartupThisAPs() callings exist.\r
+  //\r
+  for (ProcessorNumber = 0; ProcessorNumber < CpuMpData->CpuCount; ProcessorNumber++) {\r
+\r
+    if (CpuMpData->CpuData[ProcessorNumber].WaitEvent == NULL) {\r
+      continue;\r
+    }\r
+\r
+    Status = CheckThisAP (ProcessorNumber);\r
+\r
+    if (Status != EFI_NOT_READY) {\r
+      gBS->SignalEvent (CpuMpData->CpuData[ProcessorNumber].WaitEvent);\r
+     CpuMpData->CpuData[ProcessorNumber].WaitEvent = NULL;\r
+    }\r
+  }\r
 }\r
 \r
 /**\r
@@ -268,7 +305,28 @@ MpInitLibStartupAllAPs (
   OUT UINTN                     **FailedCpuList         OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS              Status;\r
+\r
+  //\r
+  // Temporarily stop checkAllApsStatus for avoid resource dead-lock.\r
+  //\r
+  mStopCheckAllApsStatus = TRUE;\r
+\r
+  Status = StartupAllAPsWorker (\r
+             Procedure,\r
+             SingleThread,\r
+             WaitEvent,\r
+             TimeoutInMicroseconds,\r
+             ProcedureArgument,\r
+             FailedCpuList\r
+             );\r
+\r
+  //\r
+  // Start checkAllApsStatus\r
+  //\r
+  mStopCheckAllApsStatus = FALSE;\r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -353,7 +411,25 @@ MpInitLibStartupThisAP (
   OUT BOOLEAN                   *Finished               OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS              Status;\r
+\r
+  //\r
+  // temporarily stop checkAllApsStatus for avoid resource dead-lock.\r
+  //\r
+  mStopCheckAllApsStatus = TRUE;\r
+\r
+  Status = StartupThisAPWorker (\r
+             Procedure,\r
+             ProcessorNumber,\r
+             WaitEvent,\r
+             TimeoutInMicroseconds,\r
+             ProcedureArgument,\r
+             Finished\r
+             );\r
+\r
+  mStopCheckAllApsStatus = FALSE;\r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -454,5 +530,23 @@ MpInitLibEnableDisableAP (
   IN  UINT32                    *HealthFlag OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS     Status;\r
+  BOOLEAN        TempStopCheckState;\r
+\r
+  TempStopCheckState = FALSE;\r
+  //\r
+  // temporarily stop checkAllAPsStatus for initialize parameters.\r
+  //\r
+  if (!mStopCheckAllApsStatus) {\r
+    mStopCheckAllApsStatus = TRUE;\r
+    TempStopCheckState     = TRUE;\r
+  }\r
+\r
+  Status = EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);\r
+\r
+  if (TempStopCheckState) {\r
+    mStopCheckAllApsStatus = FALSE;\r
+  }\r
+\r
+  return Status;\r
 }\r