Chen,

1.FillInProcessorInformation() function head's parameters block does not match 
the function declaration.
+/**
+  This function is called by all processors (both BSP and AP) once and 
+collects MP related data
+
+  @param MPSystemData    Pointer to the data structure containing MP related 
data
+  @param BSP             TRUE if the CPU is BSP
+
+  @retval EFI_SUCCESS    Data for the processor collected and filled in
+
+**/
+EFI_STATUS
+FillInProcessorInformation (
+  IN     BOOLEAN              BSP,
+  IN     UINTN                ProcessorNumber
+  )

2. Missing point at end of function description of 
FillInProcessorInformation(). The similar issue exists in the following 
functions.
    GetMpSpinLock (),ReleaseMpSpinLock (),CheckAndUpdateAllAPsToIdleState ().

Thanks!
Jeff

-----Original Message-----
From: Chen Fan [mailto:chen.fan.f...@cn.fujitsu.com] 
Sent: Monday, October 27, 2014 5:30 PM
To: edk2-devel@lists.sourceforge.net
Cc: Fan, Jeff; Jordan Justen
Subject: [RFC PATCH v6 09/27] UefiCpuPkg/CpuDxe: introduce MP_SYSTEM_DATA for 
Mp Service Protocol

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com>
---
 UefiCpuPkg/CpuDxe/CpuDxe.inf |  1 +
 UefiCpuPkg/CpuDxe/CpuMp.c    | 89 +++++++++++++++++++++++++++++++++++++++-----
 UefiCpuPkg/CpuDxe/CpuMp.h    | 47 +++++++++++++++++++++++
 UefiCpuPkg/UefiCpuPkg.dsc    |  1 +
 4 files changed, 128 insertions(+), 10 deletions(-)

diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf index 
4f8ccac..6761e91 100644
--- a/UefiCpuPkg/CpuDxe/CpuDxe.inf
+++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf
@@ -42,6 +42,7 @@
   UefiLib
   CpuExceptionHandlerLib
   TimerLib
+  SynchronizationLib
 
 [Sources]
   ApStartup.c
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 
61c3a23..20433b9 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.c
+++ b/UefiCpuPkg/CpuDxe/CpuMp.c
@@ -18,12 +18,12 @@
 UINTN gMaxLogicalProcessorNumber;
 UINTN gApStackSize;
 
+MP_SYSTEM_DATA mMpSystemData;
+
 VOID *mCommonStack = 0;
 VOID *mTopOfApCommonStack = 0;
 VOID *mApStackStart = 0;
 
-volatile UINTN mNumberOfProcessors;
-
 EFI_MP_SERVICES_PROTOCOL  mMpServicesTemplate = {
   NULL, // GetNumberOfProcessors,
   NULL, // GetProcessorInfo,
@@ -63,14 +63,81 @@ ApEntryPointInC (
   VOID
   )
 {
-  mNumberOfProcessors++;
-  mApStackStart = mApStackStart + gApStackSize;
+  VOID* TopOfApStack;
+
+  FillInProcessorInformation (FALSE, mMpSystemData.NumberOfProcessors);
+  TopOfApStack  = mApStackStart + gApStackSize;  mApStackStart = 
+ TopOfApStack;
+
+  mMpSystemData.NumberOfProcessors++;
 
   SwitchStack (
     (SWITCH_STACK_ENTRY_POINT)(UINTN)ProcessorToIdleState,
     NULL,
     NULL,
-    mApStackStart);
+    TopOfApStack);
+}
+
+/**
+  This function is called by all processors (both BSP and AP) once and 
+collects MP related data
+
+  @param MPSystemData    Pointer to the data structure containing MP related 
data
+  @param BSP             TRUE if the CPU is BSP
+
+  @retval EFI_SUCCESS    Data for the processor collected and filled in
+
+**/
+EFI_STATUS
+FillInProcessorInformation (
+  IN     BOOLEAN              BSP,
+  IN     UINTN                ProcessorNumber
+  )
+{
+  CPU_DATA_BLOCK  *CpuData;
+
+  CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
+  CpuData->Info.ProcessorId  = GetApicId ();
+  CpuData->Info.StatusFlag   = PROCESSOR_ENABLED_BIT | 
PROCESSOR_HEALTH_STATUS_BIT;
+  if (BSP) {
+    CpuData->Info.StatusFlag |= PROCESSOR_AS_BSP_BIT;  }  
+ CpuData->Info.Location.Package = (UINT32) ProcessorNumber;
+  CpuData->Info.Location.Core    = 0;
+  CpuData->Info.Location.Thread  = 0;
+  CpuData->State = BSP ? CpuStateBuzy : CpuStateIdle;
+
+  CpuData->Procedure        = NULL;
+  CpuData->Parameter        = NULL;
+  InitializeSpinLock (&CpuData->CpuDataLock);
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Prepare the System Data.
+
+  @retval EFI_SUCCESS     the System Data finished initilization.
+
+**/
+EFI_STATUS
+InitMpSystemData (
+  VOID
+  )
+{
+  ZeroMem (&mMpSystemData, sizeof (MP_SYSTEM_DATA));
+
+  mMpSystemData.NumberOfProcessors = 1;  
+ mMpSystemData.NumberOfEnabledProcessors = 1;
+
+  mMpSystemData.CpuDatas = AllocateZeroPool (sizeof (CPU_DATA_BLOCK) * 
+ gMaxLogicalProcessorNumber);  ASSERT(mMpSystemData.CpuDatas != NULL);
+
+  //
+  // BSP
+  //
+  FillInProcessorInformation (TRUE, 0);
+
+  return EFI_SUCCESS;
 }
 
 
@@ -106,15 +173,17 @@ InitializeMpSupport (
   mTopOfApCommonStack = mApStackStart + gApStackSize;
   mApStackStart = mTopOfApCommonStack;
 
-  mNumberOfProcessors = 1;
+  InitMpSystemData ();
 
-  if (mNumberOfProcessors == 1) {
+  if (mMpSystemData.NumberOfProcessors == 1) {
     FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * 
gApStackSize));
     return;
   }
 
-  if (mNumberOfProcessors < gMaxLogicalProcessorNumber) {
-    FreePages (mApStackStart, EFI_SIZE_TO_PAGES ((gMaxLogicalProcessorNumber - 
mNumberOfProcessors) *
-                                                 gApStackSize));
+
+  if (mMpSystemData.NumberOfProcessors < gMaxLogicalProcessorNumber) {
+    FreePages (mApStackStart, EFI_SIZE_TO_PAGES (
+                                (gMaxLogicalProcessorNumber - 
mMpSystemData.NumberOfProcessors) *
+                                gApStackSize));
   }
 }
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h index 
efdd948..b8771f7 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.h
+++ b/UefiCpuPkg/CpuDxe/CpuMp.h
@@ -16,6 +16,7 @@
 #define _CPU_MP_H_
 
 #include <Protocol/MpService.h>
+#include <Library/SynchronizationLib.h>
 
 /**
   Initialize Multi-processor support.
@@ -76,5 +77,51 @@ AsmApDoneWithCommonStack (
   VOID
   );
 
+typedef enum {
+  CpuStateIdle,
+  CpuStateBlocked,
+  CpuStateReady,
+  CpuStateBuzy,
+  CpuStateFinished
+} CPU_STATE;
+
+/**
+  Define Individual Processor Data block.
+
+**/
+typedef struct {
+  EFI_PROCESSOR_INFORMATION      Info;
+  SPIN_LOCK                      CpuDataLock;
+  volatile CPU_STATE             State;
+
+  EFI_AP_PROCEDURE               Procedure;
+  VOID                           *Parameter;
+} CPU_DATA_BLOCK;
+
+/**
+  Define MP data block which consumes individual processor block.
+
+**/
+typedef struct {
+  CPU_DATA_BLOCK              *CpuDatas;
+  UINTN                       NumberOfProcessors;
+  UINTN                       NumberOfEnabledProcessors;
+} MP_SYSTEM_DATA;
+
+/**
+  This function is called by all processors (both BSP and AP) once and 
+collects MP related data
+
+  @param MPSystemData    Pointer to the data structure containing MP related 
data
+  @param BSP             TRUE if the CPU is BSP
+
+  @retval EFI_SUCCESS    Data for the processor collected and filled in
+
+**/
+EFI_STATUS
+FillInProcessorInformation (
+  IN     BOOLEAN              BSP,
+  IN     UINTN                ProcessorNumber
+  );
+
 #endif // _CPU_MP_H_
 
diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 
70d5bb0..9fa9270 100644
--- a/UefiCpuPkg/UefiCpuPkg.dsc
+++ b/UefiCpuPkg/UefiCpuPkg.dsc
@@ -52,6 +52,7 @@
   LocalApicLib|UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf
   
ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
   
CpuExceptionHandlerLib|MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.inf
  
+  
+ SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchroni
+ zationLib.inf
 
 [LibraryClasses.common.PEIM]
   
MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
--
1.9.3


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

Reply via email to