]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuMpPei: Enable x2APIC mode on BSP/APs
authorJeff Fan <jeff.fan@intel.com>
Wed, 25 Nov 2015 02:47:59 +0000 (02:47 +0000)
committervanjeff <vanjeff@Edk2>
Wed, 25 Nov 2015 02:47:59 +0000 (02:47 +0000)
If x2APIC flag is set, enable x2APIC mode on all APs and BSP. Before we wakeup
APs to enable x2APIC mode, we should wait all APs have finished initialization.

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

UefiCpuPkg/CpuMpPei/CpuMpPei.c

index 8ed52436c98ff8a3ea5fd19fdd71539606cbcf4e..c222522203164f5a5a27f21641057e4fef76fd07 100644 (file)
@@ -101,6 +101,20 @@ SortApicId (
   }\r
 }\r
 \r
   }\r
 }\r
 \r
+/**\r
+  Enable x2APIC mode on APs.\r
+\r
+  @param Buffer  Pointer to private data buffer.\r
+**/\r
+VOID\r
+EFIAPI\r
+ApFuncEnableX2Apic (\r
+  IN OUT VOID  *Buffer\r
+  )\r
+{\r
+  SetApicMode (LOCAL_APIC_MODE_X2APIC);\r
+}\r
+\r
 /**\r
   Get CPU MP Data pointer from the Guided HOB.\r
 \r
 /**\r
   Get CPU MP Data pointer from the Guided HOB.\r
 \r
@@ -385,6 +399,31 @@ CountProcessorNumber (
     PeiCpuMpData->CpuCount += (UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;\r
     ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));\r
     //\r
     PeiCpuMpData->CpuCount += (UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;\r
     ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));\r
     //\r
+    // Wait for all APs finished the initialization\r
+    //\r
+    while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {\r
+      CpuPause ();\r
+    }\r
+\r
+    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
+      //\r
+      WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);\r
+      //\r
+      // Wait for all known APs finished\r
+      //\r
+      while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {\r
+        CpuPause ();\r
+      }\r
+      //\r
+      // Enable x2APIC on BSP\r
+      //\r
+      SetApicMode (LOCAL_APIC_MODE_X2APIC);\r
+    }\r
+    DEBUG ((EFI_D_INFO, "APIC MODE is %d\n", GetApicMode ()));\r
+    //\r
     // Sort BSP/Aps by CPU APIC ID in ascending order\r
     //\r
     SortApicId (PeiCpuMpData);\r
     // Sort BSP/Aps by CPU APIC ID in ascending order\r
     //\r
     SortApicId (PeiCpuMpData);\r