}\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
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