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.f...@cn.fujitsu.com>
---
 UefiCpuPkg/CpuDxe/CpuDxe.inf |  4 ++++
 UefiCpuPkg/CpuDxe/CpuMp.c    | 41 ++++++++++++++++++++++++++++++++++++++++-
 UefiCpuPkg/UefiCpuPkg.dec    |  6 ++++++
 3 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf
index c2f12b7..1837560 100644
--- a/UefiCpuPkg/CpuDxe/CpuDxe.inf
+++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf
@@ -75,6 +75,10 @@
   gIdleLoopEventGuid                            ## CONSUMES           ## Event
   gEfiVectorHandoffTableGuid                    ## SOMETIMES_CONSUMES ## 
SystemTable
 
+[Pcd]
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize
+
 [Depex]
   TRUE
 
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c
index ea403e8..611e3d5 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.c
+++ b/UefiCpuPkg/CpuDxe/CpuMp.c
@@ -15,9 +15,14 @@
 #include "CpuDxe.h"
 #include "CpuMp.h"
 
+UINTN gMaxLogicalProcessorNumber;
+UINTN gApStackSize;
+
 VOID *mCommonStack = 0;
 VOID *mTopOfApCommonStack = 0;
+VOID *mApStackStart = 0;
 
+volatile UINTN mNumberOfProcessors;
 
 /**
   Application Processor C code entry point.
@@ -29,6 +34,7 @@ ApEntryPointInC (
   VOID
   )
 {
+  mNumberOfProcessors++;
 }
 
 
@@ -41,5 +47,38 @@ InitializeMpSupport (
   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);
+
+  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 = 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));
+  }
+}
diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec
index c6e73a9..67d7196 100644
--- a/UefiCpuPkg/UefiCpuPkg.dec
+++ b/UefiCpuPkg/UefiCpuPkg.dec
@@ -54,6 +54,12 @@
   ## Specifies delay value in microseconds after sending out an INIT IPI.
   # @Prompt Configure delay value after send an INIT IPI
   
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, which 
used for Mp Service.
+  # @Prompt Configure stack size for Application Processor (AP)
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize|0x8000|UINT32|0x00000003
 
 [UserExtensions.TianoCore."ExtraFiles"]
   UefiCpuPkgExtra.uni
-- 
1.9.3


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to