UefiCpuPkg/CpuDxe: introduce two PCD value

introduce PCD value: PcdCpuMaxLogicalProcessorNumber and PcdCpuApStackSize,
used for initialize APs stacks.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16350 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chen Fan 2014-11-13 18:25:48 +00:00 committed by jljusten
parent 533263ee5a
commit 6a26a597a3
3 changed files with 52 additions and 1 deletions

View File

@ -75,6 +75,10 @@
gIdleLoopEventGuid ## CONSUMES ## Event gIdleLoopEventGuid ## CONSUMES ## Event
gEfiVectorHandoffTableGuid ## SOMETIMES_CONSUMES ## SystemTable gEfiVectorHandoffTableGuid ## SOMETIMES_CONSUMES ## SystemTable
[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize ## CONSUMES
[Depex] [Depex]
TRUE TRUE

View File

@ -15,9 +15,14 @@
#include "CpuDxe.h" #include "CpuDxe.h"
#include "CpuMp.h" #include "CpuMp.h"
UINTN gMaxLogicalProcessorNumber;
UINTN gApStackSize;
VOID *mCommonStack = 0; VOID *mCommonStack = 0;
VOID *mTopOfApCommonStack = 0; VOID *mTopOfApCommonStack = 0;
VOID *mApStackStart = 0;
volatile UINTN mNumberOfProcessors;
/** /**
Application Processor C code entry point. Application Processor C code entry point.
@ -29,6 +34,7 @@ ApEntryPointInC (
VOID VOID
) )
{ {
mNumberOfProcessors++;
} }
@ -41,5 +47,39 @@ InitializeMpSupport (
VOID VOID
) )
{ {
} gMaxLogicalProcessorNumber = (UINTN) PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
if (gMaxLogicalProcessorNumber < 1) {
DEBUG ((DEBUG_ERROR, "Setting PcdCpuMaxLogicalProcessorNumber should be more than zero.\n"));
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;
mNumberOfProcessors = 1;
if (mNumberOfProcessors == 1) {
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
return;
}
if (mNumberOfProcessors < gMaxLogicalProcessorNumber) {
FreePages (mApStackStart, EFI_SIZE_TO_PAGES ((gMaxLogicalProcessorNumber - mNumberOfProcessors) *
gApStackSize));
}
}

View File

@ -54,6 +54,13 @@
## Specifies delay value in microseconds after sending out an INIT IPI. ## Specifies delay value in microseconds after sending out an INIT IPI.
# @Prompt Configure delay value after send an INIT IPI # @Prompt Configure delay value after send an INIT IPI
gUefiCpuPkgTokenSpaceGuid.PcdCpuInitIpiDelayInMicroSeconds|10000|UINT32|0x30000002 gUefiCpuPkgTokenSpaceGuid.PcdCpuInitIpiDelayInMicroSeconds|10000|UINT32|0x30000002
## Specifies max supported number of Logical Processors.
# @Prompt Configure max supported number of Logical Processorss
gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|64|UINT32|0x00000002
## This value specifies the Application Processor (AP) stack size, used for Mp Service, which must
## aligns the address on a 4-KByte boundary.
# @Prompt Configure stack size for Application Processor (AP)
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize|0x8000|UINT32|0x00000003
[UserExtensions.TianoCore."ExtraFiles"] [UserExtensions.TianoCore."ExtraFiles"]
UefiCpuPkgExtra.uni UefiCpuPkgExtra.uni