Reviewed-by: Michael Kinney <[email protected]>

> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of Jeff 
> Fan
> Sent: Tuesday, November 24, 2015 12:55 AM
> To: [email protected]
> Cc: Kinney, Michael D <[email protected]>; Tian, Feng 
> <[email protected]>
> 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 <[email protected]>
> Cc: Michael Kinney <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <[email protected]>
> ---
>  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(&PeiCpuMpData->MpLock);
> +      PeiCpuMpData->X2ApicEnable = TRUE;
> +      ReleaseSpinLock(&PeiCpuMpData->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(&PeiCpuMpData->MpLock);
>    CopyMem (&PeiCpuMpData->AddressMap, &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 UINT32                FinishedCount;
>    BOOLEAN                        EndOfPeiFlag;
>    BOOLEAN                        InitFlag;
> +  BOOLEAN                        X2ApicEnable;
>    CPU_EXCHANGE_ROLE_INFO         BSPInfo;
>    CPU_EXCHANGE_ROLE_INFO         APInfo;
>    MTRR_SETTINGS                  MtrrTable;
> --
> 1.9.5.msysgit.0
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to