Re: [edk2] [Patch v2 1/2] UefiCpuPkg/CpuMpPei: Set X2APIC flag if one x2APIC ID larger than 254

2015-11-24 Thread Kinney, Michael D
Reviewed-by: Michael Kinney <michael.d.kin...@intel.com>


> -Original Message-
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Jeff 
> Fan
> Sent: Tuesday, November 24, 2015 12:55 AM
> To: edk2-de...@ml01.01.org
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Tian, Feng 
> <feng.t...@intel.com>
> Subject: [edk2] [Patch v2 1/2] UefiCpuPkg/CpuMpPei: Set X2APIC flag if one 
> x2APIC ID larger than 254
> 
> If there are any logical processor reporting an APIC ID of 255 or greater, set
> X2ApicEnable flag.
> 
> GetInitialApicId() will return x2APIC ID if CPUID leaf B supported.
> 
> Cc: Feng Tian <feng.t...@intel.com>
> Cc: Michael Kinney <michael.d.kin...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <jeff@intel.com>
> ---
>  UefiCpuPkg/CpuMpPei/CpuMpPei.c | 21 -
>  UefiCpuPkg/CpuMpPei/CpuMpPei.h |  2 ++
>  2 files changed, 18 insertions(+), 5 deletions(-)
> 
> diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> index 8e35f28..8ed5243 100644
> --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> @@ -146,11 +146,20 @@ ApCFunction (
>PeiCpuMpData = ExchangeInfo->PeiCpuMpData;
>if (PeiCpuMpData->InitFlag) {
>  //
> -// This is first time AP wakeup, get BIST inforamtion from AP stack
> +// This is first time AP wakeup, get BIST information from AP stack
>  //
>  BistData = *(UINTN *) (PeiCpuMpData->Buffer + NumApsExecuting * 
> PeiCpuMpData->CpuApStackSize - sizeof (UINTN));
> -PeiCpuMpData->CpuData[NumApsExecuting].ApicId= GetInitialApicId 
> ();
>  PeiCpuMpData->CpuData[NumApsExecuting].Health.Uint32 = (UINT32) BistData;
> +PeiCpuMpData->CpuData[NumApsExecuting].ApicId = GetInitialApicId ();
> +if (PeiCpuMpData->CpuData[NumApsExecuting].ApicId >= 0xFF) {
> +  //
> +  // Set x2APIC mode if there are any logical processor reporting
> +  // an APIC ID of 255 or greater.
> +  //
> +  AcquireSpinLock(>MpLock);
> +  PeiCpuMpData->X2ApicEnable = TRUE;
> +  ReleaseSpinLock(>MpLock);
> +}
>  //
>  // Sync BSP's Mtrr table to all wakeup APs and load microcode on APs.
>  //
> @@ -363,15 +372,16 @@ CountProcessorNumber (
>//
>if (PcdGet32 (PcdCpuMaxLogicalProcessorNumber) > 1) {
>  //
> -// Send broadcast IPI to APs to wakeup APs
> +// Send 1st broadcast IPI to APs to wakeup APs
>  //
> -PeiCpuMpData->InitFlag = 1;
> +PeiCpuMpData->InitFlag = TRUE;
> +PeiCpuMpData->X2ApicEnable = FALSE;
>  WakeUpAP (PeiCpuMpData, TRUE, 0, NULL, NULL);
>  //
>  // Wait for AP task to complete and then exit.
>  //
>  MicroSecondDelay (PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds));
> -PeiCpuMpData->InitFlag = 0;
> +PeiCpuMpData->InitFlag  = FALSE;
>  PeiCpuMpData->CpuCount += 
> (UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
>  ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 
> (PcdCpuMaxLogicalProcessorNumber));
>  //
> @@ -439,6 +449,7 @@ PrepareAPStartupVector (
>PeiCpuMpData->CpuData[0].ApicId= GetInitialApicId ();
>PeiCpuMpData->CpuData[0].Health.Uint32 = 0;
>PeiCpuMpData->EndOfPeiFlag = FALSE;
> +  InitializeSpinLock(>MpLock);
>CopyMem (>AddressMap, , sizeof 
> (MP_ASSEMBLY_ADDRESS_MAP));
> 
>//
> diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
> index 9325a12..de90113 100644
> --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h
> +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
> @@ -124,6 +124,7 @@ typedef struct {
>  // PEI CPU MP Data save in memory
>  //
>  struct _PEI_CPU_MP_DATA {
> +  SPIN_LOCK  MpLock;
>UINT32 CpuCount;
>UINT32 BspNumber;
>UINTN  Buffer;
> @@ -137,6 +138,7 @@ struct _PEI_CPU_MP_DATA {
>volatile UINT32FinishedCount;
>BOOLEANEndOfPeiFlag;
>BOOLEANInitFlag;
> +  BOOLEANX2ApicEnable;
>CPU_EXCHANGE_ROLE_INFO BSPInfo;
>CPU_EXCHANGE_ROLE_INFO APInfo;
>MTRR_SETTINGS  MtrrTable;
> --
> 1.9.5.msysgit.0
> 
> ___
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [Patch v2 1/2] UefiCpuPkg/CpuMpPei: Set X2APIC flag if one x2APIC ID larger than 254

2015-11-24 Thread Jeff Fan
If there are any logical processor reporting an APIC ID of 255 or greater, set
X2ApicEnable flag.

GetInitialApicId() will return x2APIC ID if CPUID leaf B supported.

Cc: Feng Tian 
Cc: Michael Kinney 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan 
---
 UefiCpuPkg/CpuMpPei/CpuMpPei.c | 21 -
 UefiCpuPkg/CpuMpPei/CpuMpPei.h |  2 ++
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
index 8e35f28..8ed5243 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
@@ -146,11 +146,20 @@ ApCFunction (
   PeiCpuMpData = ExchangeInfo->PeiCpuMpData;
   if (PeiCpuMpData->InitFlag) {
 //
-// This is first time AP wakeup, get BIST inforamtion from AP stack
+// This is first time AP wakeup, get BIST information from AP stack
 //
 BistData = *(UINTN *) (PeiCpuMpData->Buffer + NumApsExecuting * 
PeiCpuMpData->CpuApStackSize - sizeof (UINTN));
-PeiCpuMpData->CpuData[NumApsExecuting].ApicId= GetInitialApicId ();
 PeiCpuMpData->CpuData[NumApsExecuting].Health.Uint32 = (UINT32) BistData;
+PeiCpuMpData->CpuData[NumApsExecuting].ApicId = GetInitialApicId ();
+if (PeiCpuMpData->CpuData[NumApsExecuting].ApicId >= 0xFF) {
+  //
+  // Set x2APIC mode if there are any logical processor reporting
+  // an APIC ID of 255 or greater.
+  //
+  AcquireSpinLock(>MpLock);
+  PeiCpuMpData->X2ApicEnable = TRUE;
+  ReleaseSpinLock(>MpLock);
+}
 //
 // Sync BSP's Mtrr table to all wakeup APs and load microcode on APs.
 //
@@ -363,15 +372,16 @@ CountProcessorNumber (
   //
   if (PcdGet32 (PcdCpuMaxLogicalProcessorNumber) > 1) {
 //
-// Send broadcast IPI to APs to wakeup APs
+// Send 1st broadcast IPI to APs to wakeup APs
 //
-PeiCpuMpData->InitFlag = 1;
+PeiCpuMpData->InitFlag = TRUE;
+PeiCpuMpData->X2ApicEnable = FALSE;
 WakeUpAP (PeiCpuMpData, TRUE, 0, NULL, NULL);
 //
 // Wait for AP task to complete and then exit.
 //
 MicroSecondDelay (PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds));
-PeiCpuMpData->InitFlag = 0;
+PeiCpuMpData->InitFlag  = FALSE;
 PeiCpuMpData->CpuCount += 
(UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
 ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 
(PcdCpuMaxLogicalProcessorNumber));
 //
@@ -439,6 +449,7 @@ PrepareAPStartupVector (
   PeiCpuMpData->CpuData[0].ApicId= GetInitialApicId ();
   PeiCpuMpData->CpuData[0].Health.Uint32 = 0;
   PeiCpuMpData->EndOfPeiFlag = FALSE;
+  InitializeSpinLock(>MpLock);
   CopyMem (>AddressMap, , sizeof 
(MP_ASSEMBLY_ADDRESS_MAP));
 
   //
diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
index 9325a12..de90113 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
@@ -124,6 +124,7 @@ typedef struct {
 // PEI CPU MP Data save in memory
 //
 struct _PEI_CPU_MP_DATA {
+  SPIN_LOCK  MpLock;
   UINT32 CpuCount;
   UINT32 BspNumber;
   UINTN  Buffer;
@@ -137,6 +138,7 @@ struct _PEI_CPU_MP_DATA {
   volatile UINT32FinishedCount;
   BOOLEANEndOfPeiFlag;
   BOOLEANInitFlag;
+  BOOLEANX2ApicEnable;
   CPU_EXCHANGE_ROLE_INFO BSPInfo;
   CPU_EXCHANGE_ROLE_INFO APInfo;
   MTRR_SETTINGS  MtrrTable;
-- 
1.9.5.msysgit.0

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