Get AP loop mode to prepare for the monitor buffer required for ApInMwaitLoop
and ApInRunLoop.

Contributed-under: TianoCore Contribution Agreement 1.0
Cc: Feng Tian <feng.t...@intel.com>
Cc: Michael Kinney <michael.d.kin...@intel.com>
Cc: Jordan Justen <jordan.l.jus...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff....@intel.com>
Tested-by: Michael Kinney <michael.d.kin...@intel.com>
---
 UefiCpuPkg/CpuMpPei/CpuMpPei.c | 25 +++++++++++++++++++++++--
 UefiCpuPkg/CpuMpPei/CpuMpPei.h |  3 +++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
index ac609a0..b8fa511 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
@@ -589,6 +589,10 @@ PrepareAPStartupVector (
   UINTN                         WakeupBuffer;
   UINTN                         WakeupBufferSize;
   MP_ASSEMBLY_ADDRESS_MAP       AddressMap;
+  UINT8                         ApLoopMode;
+  UINT16                        MonitorFilterSize;
+  UINT8                         *MonitorBuffer;
+  UINTN                         Index;
 
   AsmGetAddressMap (&AddressMap);
   WakeupBufferSize = AddressMap.RendezvousFunnelSize + sizeof 
(MP_CPU_EXCHANGE_INFO);
@@ -597,11 +601,14 @@ PrepareAPStartupVector (
   DEBUG ((EFI_D_INFO, "CpuMpPei: WakeupBuffer = 0x%x\n", WakeupBuffer));
 
   //
-  // Allocate Pages for APs stack, CPU MP Data and backup buffer for wakeup 
buffer
+  // Allocate Pages for APs stack, CPU MP Data, backup buffer for wakeup 
buffer,
+  // and monitor buffer if required.
   //
   MaxCpuCount = PcdGet32(PcdCpuMaxLogicalProcessorNumber);
   BufferSize  = PcdGet32 (PcdCpuApStackSize) * MaxCpuCount + sizeof 
(PEI_CPU_MP_DATA)
                   + WakeupBufferSize + sizeof (PEI_CPU_DATA) * MaxCpuCount;
+  ApLoopMode = GetApLoopMode (&MonitorFilterSize);
+  BufferSize += MonitorFilterSize * MaxCpuCount;
   Status = PeiServicesAllocatePages (
              EfiBootServicesData,
              EFI_SIZE_TO_PAGES (BufferSize),
@@ -627,7 +634,21 @@ PrepareAPStartupVector (
   InitializeSpinLock(&PeiCpuMpData->MpLock);
   SaveVolatileRegisters (&PeiCpuMpData->CpuData[0].VolatileRegisters);
   CopyMem (&PeiCpuMpData->AddressMap, &AddressMap, sizeof 
(MP_ASSEMBLY_ADDRESS_MAP));
-
+  //
+  // Initialize AP loop mode
+  //
+  PeiCpuMpData->ApLoopMode = ApLoopMode;
+  DEBUG ((EFI_D_INFO, "AP Loop Mode is %d\n", PeiCpuMpData->ApLoopMode));
+  MonitorBuffer = (UINT8 *)(PeiCpuMpData->CpuData + MaxCpuCount);
+  if (PeiCpuMpData->ApLoopMode != ApInHltLoop) {
+    //
+    // Set up APs wakeup signal buffer
+    //
+    for (Index = 0; Index < MaxCpuCount; Index++) {
+      PeiCpuMpData->CpuData[Index].StartupApSignal = 
+        (UINT32 *)(MonitorBuffer + MonitorFilterSize * Index);
+    }
+  }
   //
   // Backup original data and copy AP reset code in it
   //
diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
index 4be8234..c44376e 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
@@ -132,6 +132,7 @@ typedef struct {
 } CPU_VOLATILE_REGISTERS;
 
 typedef struct {
+  volatile UINT32                *StartupApSignal;
   UINT32                         ApicId;
   EFI_HEALTH_FLAGS               Health;
   CPU_STATE                      State;
@@ -161,6 +162,8 @@ struct _PEI_CPU_MP_DATA {
   CPU_EXCHANGE_ROLE_INFO         BSPInfo;
   CPU_EXCHANGE_ROLE_INFO         APInfo;
   MTRR_SETTINGS                  MtrrTable;
+  UINT8                          ApLoopMode;
+  UINT8                          ApTargetCState;
   PEI_CPU_DATA                   *CpuData;
   volatile MP_CPU_EXCHANGE_INFO  *MpCpuExchangeInfo;
 };
-- 
1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to