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 <[email protected]>
Cc: Michael Kinney <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <[email protected]>
---
 UefiCpuPkg/CpuMpPei/CpuMpPei.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
index 8ed5243..c222522 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
@@ -102,6 +102,20 @@ SortApicId (
 }
 
 /**
+  Enable x2APIC mode on APs.
+
+  @param Buffer  Pointer to private data buffer.
+**/
+VOID
+EFIAPI
+ApFuncEnableX2Apic (
+  IN OUT VOID  *Buffer
+  )
+{
+  SetApicMode (LOCAL_APIC_MODE_X2APIC);
+}
+
+/**
   Get CPU MP Data pointer from the Guided HOB.
 
   @return  Pointer to Pointer to PEI CPU MP Data
@@ -385,6 +399,31 @@ CountProcessorNumber (
     PeiCpuMpData->CpuCount += 
(UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
     ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 
(PcdCpuMaxLogicalProcessorNumber));
     //
+    // Wait for all APs finished the initialization
+    //
+    while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {
+      CpuPause ();
+    }
+
+    if (PeiCpuMpData->X2ApicEnable) {
+      DEBUG ((EFI_D_INFO, "Force x2APIC mode!\n"));
+      //
+      // Send 2nd broadcast IPI to all APs to enable x2APIC mode
+      //
+      WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);
+      //
+      // Wait for all known APs finished
+      //
+      while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {
+        CpuPause ();
+      }
+      //
+      // Enable x2APIC on BSP
+      //
+      SetApicMode (LOCAL_APIC_MODE_X2APIC);
+    }
+    DEBUG ((EFI_D_INFO, "APIC MODE is %d\n", GetApicMode ()));
+    //
     // Sort BSP/Aps by CPU APIC ID in ascending order
     //
     SortApicId (PeiCpuMpData);
-- 
1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to