mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg/CpuDxe: introduce MP_SYSTEM_DATA for Mp Service Protocol
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com> Reviewed-by: Jeff Fan <jeff.fan@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16353 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
003973d98c
commit
03673ae11e
|
@ -42,6 +42,7 @@
|
|||
UefiLib
|
||||
CpuExceptionHandlerLib
|
||||
TimerLib
|
||||
SynchronizationLib
|
||||
|
||||
[Sources]
|
||||
ApStartup.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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#define _CPU_MP_H_
|
||||
|
||||
#include <Protocol/MpService.h>
|
||||
#include <Library/SynchronizationLib.h>
|
||||
|
||||
/**
|
||||
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_
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue