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