UefiCpuPkg/MpInitLib: Do not wakeup AP if only one processor supported

If MaxLogicalProcessorNumber is only 1, we needn't to wake up APs at all
and needn't to register callback functions.

It could improve boot performance on single supported system.

https://bugzilla.tianocore.org/show_bug.cgi?id=204

Cc: Feng Tian <feng.tian@intel.com>
Cc: Liming Gao <liming.gao@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>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
Jeff Fan 2016-11-04 15:45:13 +08:00
parent b028c1021c
commit 14e8137c82
3 changed files with 37 additions and 17 deletions

View File

@ -290,6 +290,13 @@ InitMpGlobalData (
SaveCpuMpData (CpuMpData); SaveCpuMpData (CpuMpData);
if (CpuMpData->CpuCount == 1) {
//
// If only BSP exists, return
//
return;
}
// //
// Avoid APs access invalid buff data which allocated by BootServices, // Avoid APs access invalid buff data which allocated by BootServices,
// so we will allocate reserved data for AP loop code. // so we will allocate reserved data for AP loop code.

View File

@ -1143,6 +1143,7 @@ MpInitLibInitialize (
} else { } else {
MaxLogicalProcessorNumber = OldCpuMpData->CpuCount; MaxLogicalProcessorNumber = OldCpuMpData->CpuCount;
} }
ASSERT (MaxLogicalProcessorNumber != 0);
AsmGetAddressMap (&AddressMap); AsmGetAddressMap (&AddressMap);
ApResetVectorSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO); ApResetVectorSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO);
@ -1209,10 +1210,12 @@ MpInitLibInitialize (
MtrrGetAllMtrrs (&CpuMpData->MtrrTable); MtrrGetAllMtrrs (&CpuMpData->MtrrTable);
if (OldCpuMpData == NULL) { if (OldCpuMpData == NULL) {
// if (MaxLogicalProcessorNumber > 1) {
// Wakeup all APs and calculate the processor count in system //
// // Wakeup all APs and calculate the processor count in system
CollectProcessorCount (CpuMpData); //
CollectProcessorCount (CpuMpData);
}
} else { } else {
// //
// APs have been wakeup before, just get the CPU Information // APs have been wakeup before, just get the CPU Information
@ -1238,19 +1241,21 @@ MpInitLibInitialize (
sizeof (CPU_VOLATILE_REGISTERS) sizeof (CPU_VOLATILE_REGISTERS)
); );
} }
// if (MaxLogicalProcessorNumber > 1) {
// Wakeup APs to do some AP initialize sync //
// // Wakeup APs to do some AP initialize sync
WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData); //
// WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData);
// Wait for all APs finished initialization //
// // Wait for all APs finished initialization
while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) { //
CpuPause (); while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) {
} CpuPause ();
CpuMpData->InitFlag = ApInitDone; }
for (Index = 0; Index < CpuMpData->CpuCount; Index++) { CpuMpData->InitFlag = ApInitDone;
SetApState (&CpuMpData->CpuData[Index], CpuStateIdle); for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
SetApState (&CpuMpData->CpuData[Index], CpuStateIdle);
}
} }
} }

View File

@ -321,6 +321,14 @@ InitMpGlobalData (
EFI_STATUS Status; EFI_STATUS Status;
SaveCpuMpData (CpuMpData); SaveCpuMpData (CpuMpData);
if (CpuMpData->CpuCount == 1) {
//
// If only BSP exists, return
//
return;
}
// //
// Register an event for EndOfPei // Register an event for EndOfPei
// //