From 03673ae11e255b9467e8f317175495b1ff79f965 Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Thu, 13 Nov 2014 18:26:23 +0000 Subject: UefiCpuPkg/CpuDxe: introduce MP_SYSTEM_DATA for Mp Service Protocol Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16353 6f19259b-4bc3-4df7-8a09-765794883524 --- UefiCpuPkg/CpuDxe/CpuDxe.inf | 1 + UefiCpuPkg/CpuDxe/CpuMp.c | 89 +++++++++++++++++++++++++++++++++++++++----- UefiCpuPkg/CpuDxe/CpuMp.h | 47 +++++++++++++++++++++++ UefiCpuPkg/UefiCpuPkg.dsc | 1 + 4 files changed, 128 insertions(+), 10 deletions(-) (limited to 'UefiCpuPkg') diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf index aa37269de7..61bc55a445 100644 --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf @@ -42,6 +42,7 @@ UefiLib CpuExceptionHandlerLib TimerLib + SynchronizationLib [Sources] ApStartup.c diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index e3734c2790..de599dad6a 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -18,12 +18,12 @@ UINTN gMaxLogicalProcessorNumber; UINTN gApStackSize; +MP_SYSTEM_DATA mMpSystemData; + VOID *mCommonStack = 0; VOID *mTopOfApCommonStack = 0; VOID *mApStackStart = 0; -volatile UINTN mNumberOfProcessors; - EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = { NULL, // GetNumberOfProcessors, NULL, // GetProcessorInfo, @@ -66,16 +66,84 @@ ApEntryPointInC ( VOID ) { - mNumberOfProcessors++; - mApStackStart = (UINT8*)mApStackStart + gApStackSize; + VOID* TopOfApStack; + + FillInProcessorInformation (FALSE, mMpSystemData.NumberOfProcessors); + TopOfApStack = (UINT8*)mApStackStart + gApStackSize; + mApStackStart = TopOfApStack; + + mMpSystemData.NumberOfProcessors++; SwitchStack ( (SWITCH_STACK_ENTRY_POINT)(UINTN)ProcessorToIdleState, NULL, NULL, - mApStackStart); + TopOfApStack); +} + +/** + This function is called by all processors (both BSP and AP) once and collects MP related data. + + @param Bsp TRUE if the CPU is BSP + @param ProcessorNumber The specific processor number + + @retval EFI_SUCCESS Data for the processor collected and filled in + +**/ +EFI_STATUS +FillInProcessorInformation ( + IN BOOLEAN Bsp, + IN UINTN ProcessorNumber + ) +{ + CPU_DATA_BLOCK *CpuData; + UINT32 ProcessorId; + + CpuData = &mMpSystemData.CpuDatas[ProcessorNumber]; + ProcessorId = GetApicId (); + CpuData->Info.ProcessorId = ProcessorId; + CpuData->Info.StatusFlag = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT; + if (Bsp) { + CpuData->Info.StatusFlag |= PROCESSOR_AS_BSP_BIT; + } + CpuData->Info.Location.Package = ProcessorId; + CpuData->Info.Location.Core = 0; + CpuData->Info.Location.Thread = 0; + CpuData->State = Bsp ? CpuStateBuzy : CpuStateIdle; + + CpuData->Procedure = NULL; + CpuData->Parameter = NULL; + InitializeSpinLock (&CpuData->CpuDataLock); + + return EFI_SUCCESS; } +/** + Prepare the System Data. + + @retval EFI_SUCCESS the System Data finished initilization. + +**/ +EFI_STATUS +InitMpSystemData ( + VOID + ) +{ + ZeroMem (&mMpSystemData, sizeof (MP_SYSTEM_DATA)); + + mMpSystemData.NumberOfProcessors = 1; + mMpSystemData.NumberOfEnabledProcessors = 1; + + mMpSystemData.CpuDatas = AllocateZeroPool (sizeof (CPU_DATA_BLOCK) * gMaxLogicalProcessorNumber); + ASSERT(mMpSystemData.CpuDatas != NULL); + + // + // BSP + // + FillInProcessorInformation (TRUE, 0); + + return EFI_SUCCESS; +} /** Initialize Multi-processor support. @@ -110,15 +178,16 @@ InitializeMpSupport ( mTopOfApCommonStack = (UINT8*) mApStackStart + gApStackSize; mApStackStart = mTopOfApCommonStack; - mNumberOfProcessors = 1; + InitMpSystemData (); - if (mNumberOfProcessors == 1) { + if (mMpSystemData.NumberOfProcessors == 1) { FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize)); return; } - if (mNumberOfProcessors < gMaxLogicalProcessorNumber) { - FreePages (mApStackStart, EFI_SIZE_TO_PAGES ((gMaxLogicalProcessorNumber - mNumberOfProcessors) * - gApStackSize)); + if (mMpSystemData.NumberOfProcessors < gMaxLogicalProcessorNumber) { + FreePages (mApStackStart, EFI_SIZE_TO_PAGES ( + (gMaxLogicalProcessorNumber - mMpSystemData.NumberOfProcessors) * + gApStackSize)); } } diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h index 157ac36c48..481f7b1618 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.h +++ b/UefiCpuPkg/CpuDxe/CpuMp.h @@ -16,6 +16,7 @@ #define _CPU_MP_H_ #include +#include /** Initialize Multi-processor support. @@ -77,5 +78,51 @@ AsmApDoneWithCommonStack ( VOID ); +typedef enum { + CpuStateIdle, + CpuStateBlocked, + CpuStateReady, + CpuStateBuzy, + CpuStateFinished +} CPU_STATE; + +/** + Define Individual Processor Data block. + +**/ +typedef struct { + EFI_PROCESSOR_INFORMATION Info; + SPIN_LOCK CpuDataLock; + volatile CPU_STATE State; + + EFI_AP_PROCEDURE Procedure; + VOID *Parameter; +} CPU_DATA_BLOCK; + +/** + Define MP data block which consumes individual processor block. + +**/ +typedef struct { + CPU_DATA_BLOCK *CpuDatas; + UINTN NumberOfProcessors; + UINTN NumberOfEnabledProcessors; +} MP_SYSTEM_DATA; + +/** + This function is called by all processors (both BSP and AP) once and collects MP related data. + + @param Bsp TRUE if the CPU is BSP + @param ProcessorNumber The specific processor number + + @retval EFI_SUCCESS Data for the processor collected and filled in + +**/ +EFI_STATUS +FillInProcessorInformation ( + IN BOOLEAN Bsp, + IN UINTN ProcessorNumber + ); + #endif // _CPU_MP_H_ diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 70d5bb032d..9fa9270d6e 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -52,6 +52,7 @@ LocalApicLib|UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf CpuExceptionHandlerLib|MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.inf + SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf [LibraryClasses.common.PEIM] MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf -- cgit v1.2.3