From: Jeff Fan Date: Wed, 25 Nov 2015 02:47:59 +0000 (+0000) Subject: UefiCpuPkg/CpuMpPei: Enable x2APIC mode on BSP/APs X-Git-Tag: edk2-stable201903~8522 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=c7981a11840714975a7dc029366931ddec64b2a6 UefiCpuPkg/CpuMpPei: Enable x2APIC mode on BSP/APs 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 Cc: Michael Kinney Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan Reviewed-by: Michael Kinney git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18934 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index 8ed52436c9..c222522203 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -101,6 +101,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. @@ -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);