UefiCpuPkg: Update CPU MP drivers to support single CPU configuration

Only perform AP detection if PcdCpuMaxLogicalProcessorNumber > 1
Only free AP related structures of they were allocated

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18629 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Michael Kinney 2015-10-19 19:07:52 +00:00 committed by mdkinney
parent 368002a31c
commit 944f45ae2f
2 changed files with 51 additions and 38 deletions

View File

@ -1642,35 +1642,40 @@ InitializeMpSupport (
return;
}
if (gMaxLogicalProcessorNumber == 1) {
return;
}
gApStackSize = (UINTN) PcdGet32 (PcdCpuApStackSize);
ASSERT ((gApStackSize & (SIZE_4KB - 1)) == 0);
mApStackStart = AllocatePages (EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
ASSERT (mApStackStart != NULL);
//
// the first buffer of stack size used for common stack, when the amount of AP
// more than 1, we should never free the common stack which maybe used for AP reset.
//
mCommonStack = mApStackStart;
mTopOfApCommonStack = (UINT8*) mApStackStart + gApStackSize;
mApStackStart = mTopOfApCommonStack;
InitMpSystemData ();
PrepareAPStartupCode ();
//
// Only perform AP detection if PcdCpuMaxLogicalProcessorNumber is greater than 1
//
if (gMaxLogicalProcessorNumber > 1) {
StartApsStackless ();
gApStackSize = (UINTN) PcdGet32 (PcdCpuApStackSize);
ASSERT ((gApStackSize & (SIZE_4KB - 1)) == 0);
mApStackStart = AllocatePages (EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
ASSERT (mApStackStart != NULL);
//
// the first buffer of stack size used for common stack, when the amount of AP
// more than 1, we should never free the common stack which maybe used for AP reset.
//
mCommonStack = mApStackStart;
mTopOfApCommonStack = (UINT8*) mApStackStart + gApStackSize;
mApStackStart = mTopOfApCommonStack;
PrepareAPStartupCode ();
StartApsStackless ();
}
DEBUG ((DEBUG_INFO, "Detect CPU count: %d\n", mMpSystemData.NumberOfProcessors));
if (mMpSystemData.NumberOfProcessors == 1) {
FreeApStartupCode ();
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
return;
if (mCommonStack != NULL) {
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
}
}
mMpSystemData.CpuDatas = ReallocatePool (
@ -1692,10 +1697,12 @@ InitializeMpSupport (
);
ASSERT_EFI_ERROR (Status);
if (mMpSystemData.NumberOfProcessors < gMaxLogicalProcessorNumber) {
FreePages (mApStackStart, EFI_SIZE_TO_PAGES (
(gMaxLogicalProcessorNumber - mMpSystemData.NumberOfProcessors) *
gApStackSize));
if (mMpSystemData.NumberOfProcessors > 1 && mMpSystemData.NumberOfProcessors < gMaxLogicalProcessorNumber) {
if (mApStackStart != NULL) {
FreePages (mApStackStart, EFI_SIZE_TO_PAGES (
(gMaxLogicalProcessorNumber - mMpSystemData.NumberOfProcessors) *
gApStackSize));
}
}
Status = gBS->CreateEvent (

View File

@ -357,22 +357,28 @@ CountProcessorNumber (
// Store BSP's MTRR setting
//
MtrrGetAllMtrrs (&PeiCpuMpData->MtrrTable);
//
// Send broadcast IPI to APs to wakeup APs
// Only perform AP detection if PcdCpuMaxLogicalProcessorNumber is greater than 1
//
PeiCpuMpData->InitFlag = 1;
WakeUpAP (PeiCpuMpData, TRUE, 0, NULL, NULL);
//
// Wait for AP task to complete and then exit.
//
MicroSecondDelay (PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds));
PeiCpuMpData->InitFlag = 0;
PeiCpuMpData->CpuCount += (UINT32) PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
ASSERT (PeiCpuMpData->CpuCount <= PcdGet32(PcdCpuMaxLogicalProcessorNumber));
//
// Sort BSP/Aps by CPU APIC ID in ascending order
//
SortApicId (PeiCpuMpData);
if (PcdGet32 (PcdCpuMaxLogicalProcessorNumber) > 1) {
//
// Send broadcast IPI to APs to wakeup APs
//
PeiCpuMpData->InitFlag = 1;
WakeUpAP (PeiCpuMpData, TRUE, 0, NULL, NULL);
//
// Wait for AP task to complete and then exit.
//
MicroSecondDelay (PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds));
PeiCpuMpData->InitFlag = 0;
PeiCpuMpData->CpuCount += (UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));
//
// Sort BSP/Aps by CPU APIC ID in ascending order
//
SortApicId (PeiCpuMpData);
}
DEBUG ((EFI_D_INFO, "CpuMpPei: Find %d processors in system.\n", PeiCpuMpData->CpuCount));
return PeiCpuMpData->CpuCount;