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

> -----Original Message-----
> From: Fan, Jeff
> Sent: Tuesday, November 24, 2015 12:55 AM
> To: [email protected]
> Cc: Tian, Feng <[email protected]>; Kinney, Michael D 
> <[email protected]>
> Subject: [Patch v2 2/2] UefiCpuPkg/CpuMpPei: Enable x2APIC mode on BSP/APs
> 
> If x2APIC flag is set, enable x2APIC mode on all APs and BSP. Before we wakeup
> APs to enable x2APIC mode, we should wait all APs have finished 
> initialization.
> 
> 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 | 39 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
> 
> diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> index 8ed5243..c222522 100644
> --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
> @@ -102,6 +102,20 @@ SortApicId (
>  }
> 
>  /**
> +  Enable x2APIC mode on APs.
> +
> +  @param Buffer  Pointer to private data buffer.
> +**/
> +VOID
> +EFIAPI
> +ApFuncEnableX2Apic (
> +  IN OUT VOID  *Buffer
> +  )
> +{
> +  SetApicMode (LOCAL_APIC_MODE_X2APIC);
> +}
> +
> +/**
>    Get CPU MP Data pointer from the Guided HOB.
> 
>    @return  Pointer to Pointer to PEI CPU MP Data
> @@ -385,6 +399,31 @@ CountProcessorNumber (
>      PeiCpuMpData->CpuCount += 
> (UINT32)PeiCpuMpData->MpCpuExchangeInfo->NumApsExecuting;
>      ASSERT (PeiCpuMpData->CpuCount <= PcdGet32 
> (PcdCpuMaxLogicalProcessorNumber));
>      //
> +    // Wait for all APs finished the initialization
> +    //
> +    while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {
> +      CpuPause ();
> +    }
> +
> +    if (PeiCpuMpData->X2ApicEnable) {
> +      DEBUG ((EFI_D_INFO, "Force x2APIC mode!\n"));
> +      //
> +      // Send 2nd broadcast IPI to all APs to enable x2APIC mode
> +      //
> +      WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);
> +      //
> +      // Wait for all known APs finished
> +      //
> +      while (PeiCpuMpData->FinishedCount < (PeiCpuMpData->CpuCount - 1)) {
> +        CpuPause ();
> +      }
> +      //
> +      // Enable x2APIC on BSP
> +      //
> +      SetApicMode (LOCAL_APIC_MODE_X2APIC);
> +    }
> +    DEBUG ((EFI_D_INFO, "APIC MODE is %d\n", GetApicMode ()));
> +    //
>      // Sort BSP/Aps by CPU APIC ID in ascending order
>      //
>      SortApicId (PeiCpuMpData);
> --
> 1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to