]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuMpPei: Wake up APs by proper method
authorJeff Fan <jeff.fan@intel.com>
Fri, 18 Dec 2015 03:26:03 +0000 (03:26 +0000)
committervanjeff <vanjeff@Edk2>
Fri, 18 Dec 2015 03:26:03 +0000 (03:26 +0000)
If ApLoopMode is ApInHltLoop, BSP will send INIT-SIPI-SIPI to wake up APs.
If ApLoopMode is ApInMwaitLoop or ApInRunLoop, BSP will write one semaphore to
wake up APs.

Contributed-under: TianoCore Contribution Agreement 1.0
Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19346 6f19259b-4bc3-4df7-8a09-765794883524

UefiCpuPkg/CpuMpPei/CpuMpPei.c
UefiCpuPkg/CpuMpPei/CpuMpPei.h
UefiCpuPkg/CpuMpPei/CpuMpPei.inf
UefiCpuPkg/CpuMpPei/PeiMpServices.c

index ba82ba42184d606d6dc19256459c775872c31d51..950d61cc4853797dd3b6f67879481d9114d5a351 100644 (file)
@@ -399,7 +399,7 @@ ApCFunction (
   @param PeiCpuMpData       Pointer to PEI CPU MP Data\r
   @param Broadcast          TRUE:  Send broadcast IPI to all APs\r
                             FALSE: Send IPI to AP by ApicId\r
-  @param ApicId             Apic ID for the processor to be waked\r
+  @param ProcessorNumber    The handle number of specified processor\r
   @param Procedure          The function to be invoked by AP\r
   @param ProcedureArgument  The argument to be passed into AP function\r
 **/\r
@@ -407,12 +407,13 @@ VOID
 WakeUpAP (\r
   IN PEI_CPU_MP_DATA           *PeiCpuMpData,\r
   IN BOOLEAN                   Broadcast,\r
-  IN UINT32                    ApicId,\r
+  IN UINTN                     ProcessorNumber,\r
   IN EFI_AP_PROCEDURE          Procedure,              OPTIONAL\r
   IN VOID                      *ProcedureArgument      OPTIONAL\r
   )\r
 {\r
   volatile MP_CPU_EXCHANGE_INFO    *ExchangeInfo;\r
+  UINTN                            Index;\r
 \r
   PeiCpuMpData->ApFunction         = (UINTN) Procedure;\r
   PeiCpuMpData->ApFunctionArgument = (UINTN) ProcedureArgument;\r
@@ -436,12 +437,40 @@ WakeUpAP (
   CopyMem ((VOID *)&ExchangeInfo->GdtrProfile, &mGdt, sizeof(mGdt));\r
   AsmReadIdtr ((IA32_DESCRIPTOR *) &ExchangeInfo->IdtrProfile);\r
 \r
-  if (Broadcast) {\r
-    SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);\r
-  } else {\r
-    SendInitSipiSipi (ApicId, (UINT32) ExchangeInfo->BufferStart);\r
+  if (PeiCpuMpData->ApLoopMode == ApInMwaitLoop) {\r
+    //\r
+    // Get AP target C-state each time when waking up AP,\r
+    // for it maybe updated by platform again\r
+    //\r
+    PeiCpuMpData->ApTargetCState = PcdGet8 (PcdCpuApTargetCstate);\r
   }\r
 \r
+  //\r
+  // Wakeup APs per AP loop state\r
+  //\r
+  if (PeiCpuMpData->ApLoopMode == ApInHltLoop || PeiCpuMpData->InitFlag) {\r
+    if (Broadcast) {\r
+      SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);\r
+    } else {\r
+      SendInitSipiSipi (\r
+        PeiCpuMpData->CpuData[ProcessorNumber].ApicId,\r
+        (UINT32) ExchangeInfo->BufferStart\r
+        );\r
+    }\r
+  } else if ((PeiCpuMpData->ApLoopMode == ApInMwaitLoop) ||\r
+             (PeiCpuMpData->ApLoopMode == ApInRunLoop)) {\r
+    if (Broadcast) {\r
+      for (Index = 0; Index < PeiCpuMpData->CpuCount; Index++) {\r
+        if (Index != PeiCpuMpData->BspNumber) {\r
+          *(PeiCpuMpData->CpuData[Index].StartupApSignal) = WAKEUP_AP_SIGNAL;\r
+        }\r
+      }\r
+    } else {\r
+      *(PeiCpuMpData->CpuData[ProcessorNumber].StartupApSignal) = WAKEUP_AP_SIGNAL;\r
+    }\r
+  } else {\r
+    ASSERT (FALSE);\r
+  }\r
   return ;\r
 }\r
 \r
@@ -600,7 +629,7 @@ CountProcessorNumber (
     if (PeiCpuMpData->X2ApicEnable) {\r
       DEBUG ((EFI_D_INFO, "Force x2APIC mode!\n"));\r
       //\r
-      // Send 2nd broadcast IPI to all APs to enable x2APIC mode\r
+      // Wakeup all APs to enable x2APIC mode\r
       //\r
       WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);\r
       //\r
index 47038c282533734ada8b122011fb9076fb86881a..6f508b420be3d3fe84693c5c38af792535307c73 100644 (file)
@@ -255,7 +255,7 @@ CpuMpEndOfPeiCallback (
   @param PeiCpuMpData       Pointer to PEI CPU MP Data\r
   @param Broadcast          TRUE:  Send broadcast IPI to all APs\r
                             FALSE: Send IPI to AP by ApicId\r
-  @param ApicId             Apic ID for the processor to be waked\r
+  @param ProcessorNumber    The handle number of specified processor\r
   @param Procedure          The function to be invoked by AP\r
   @param ProcedureArgument  The argument to be passed into AP function\r
 **/\r
@@ -263,7 +263,7 @@ VOID
 WakeUpAP (\r
   IN PEI_CPU_MP_DATA           *PeiCpuMpData,\r
   IN BOOLEAN                   Broadcast,\r
-  IN UINT32                    ApicId,\r
+  IN UINTN                     ProcessorNumber,\r
   IN EFI_AP_PROCEDURE          Procedure,              OPTIONAL\r
   IN VOID                      *ProcedureArgument      OPTIONAL\r
   );\r
index ec353aed7d500e5e932605b808c7a2821eec4e71..70b272e33bc4386720b8166323d78c265c96c713 100644 (file)
@@ -83,6 +83,7 @@
   gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress            ## CONSUMES\r
   gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize         ## CONSUMES\r
   gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode                       ## CONSUMES\r
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate                   ## SOMETIMES_CONSUMES\r
 \r
 [Depex]\r
   gEfiPeiMemoryDiscoveredPpiGuid\r
index 5dd2c153f46a0399c56cc9fe72bca67b824d6add..e784377d674a5db253ed1d1cdcfca92fa5d9a771 100644 (file)
@@ -520,7 +520,7 @@ PeiStartupAllAPs (
       if (Index == CallerNumber) {\r
         continue;\r
       }\r
-      WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[Index].ApicId, Procedure, ProcedureArgument);\r
+      WakeUpAP (PeiCpuMpData, FALSE, Index, Procedure, ProcedureArgument);\r
       //\r
       // Wait to finish\r
       //\r
@@ -655,7 +655,7 @@ PeiStartupThisAP (
   WaitCountIndex = 0;\r
   FinishedCount = &PeiCpuMpData->FinishedCount;\r
 \r
-  WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, Procedure, ProcedureArgument);\r
+  WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument);\r
 \r
   //\r
   // Wait to finish\r
@@ -791,7 +791,7 @@ PeiSwitchBSP (
   //\r
   // Need to wakeUp AP (future BSP).\r
   //\r
-  WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, FutureBSPProc, PeiCpuMpData);\r
+  WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, FutureBSPProc, PeiCpuMpData);\r
 \r
   AsmExchangeRole (&PeiCpuMpData->BSPInfo, &PeiCpuMpData->APInfo);\r
 \r