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

