UefiCpuPkg/MpInitLib: Implementation of MpInitLibEnableDisableAP()

v4:
  1. Simply the internal function MpInitLibEnableDisableAP()'s function
     header due to it is duplicated with MpInitLibEnableDisableAP().
v3:
  1. Use CamelCase for mCheckAllAPsEvent, mStopCheckAllApsStatus.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
This commit is contained in:
Jeff Fan 2016-07-21 21:23:05 +08:00
parent 41be0da59a
commit e37109bcc7
4 changed files with 97 additions and 2 deletions

View File

@ -454,5 +454,23 @@ MpInitLibEnableDisableAP (
IN UINT32 *HealthFlag OPTIONAL IN UINT32 *HealthFlag OPTIONAL
) )
{ {
return EFI_UNSUPPORTED; EFI_STATUS Status;
BOOLEAN TempStopCheckState;
TempStopCheckState = FALSE;
//
// temporarily stop checkAllAPsStatus for initialize parameters.
//
if (!mStopCheckAllApsStatus) {
mStopCheckAllApsStatus = TRUE;
TempStopCheckState = TRUE;
}
Status = EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);
if (TempStopCheckState) {
mStopCheckAllApsStatus = FALSE;
}
return Status;
} }

View File

@ -1238,6 +1238,62 @@ SwitchBSPWorker (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Worker function to let the caller enable or disable an AP from this point onward.
This service may only be called from the BSP.
@param[in] ProcessorNumber The handle number of AP.
@param[in] EnableAP Specifies the new state for the processor for
enabled, FALSE for disabled.
@param[in] HealthFlag If not NULL, a pointer to a value that specifies
the new health status of the AP.
@retval EFI_SUCCESS The specified AP was enabled or disabled successfully.
@retval others Failed to Enable/Disable AP.
**/
EFI_STATUS
EnableDisableApWorker (
IN UINTN ProcessorNumber,
IN BOOLEAN EnableAP,
IN UINT32 *HealthFlag OPTIONAL
)
{
CPU_MP_DATA *CpuMpData;
UINTN CallerNumber;
CpuMpData = GetCpuMpData ();
//
// Check whether caller processor is BSP
//
MpInitLibWhoAmI (&CallerNumber);
if (CallerNumber != CpuMpData->BspNumber) {
return EFI_DEVICE_ERROR;
}
if (ProcessorNumber == CpuMpData->BspNumber) {
return EFI_INVALID_PARAMETER;
}
if (ProcessorNumber >= CpuMpData->CpuCount) {
return EFI_NOT_FOUND;
}
if (!EnableAP) {
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateDisabled);
} else {
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);
}
if (HealthFlag != NULL) {
CpuMpData->CpuData[ProcessorNumber].CpuHealthy =
(BOOLEAN) ((*HealthFlag & PROCESSOR_HEALTH_STATUS_BIT) != 0);
}
return EFI_SUCCESS;
}
/** /**
This return the handle number for the calling processor. This service may be This return the handle number for the calling processor. This service may be
called from the BSP and APs. called from the BSP and APs.

View File

@ -364,6 +364,27 @@ SwitchBSPWorker (
IN BOOLEAN EnableOldBSP IN BOOLEAN EnableOldBSP
); );
/**
Worker function to let the caller enable or disable an AP from this point onward.
This service may only be called from the BSP.
@param[in] ProcessorNumber The handle number of AP.
@param[in] EnableAP Specifies the new state for the processor for
enabled, FALSE for disabled.
@param[in] HealthFlag If not NULL, a pointer to a value that specifies
the new health status of the AP.
@retval EFI_SUCCESS The specified AP was enabled or disabled successfully.
@retval others Failed to Enable/Disable AP.
**/
EFI_STATUS
EnableDisableApWorker (
IN UINTN ProcessorNumber,
IN BOOLEAN EnableAP,
IN UINT32 *HealthFlag OPTIONAL
);
/** /**
Get pointer to CPU MP Data structure from GUIDed HOB. Get pointer to CPU MP Data structure from GUIDed HOB.

View File

@ -604,7 +604,7 @@ MpInitLibEnableDisableAP (
IN UINT32 *HealthFlag OPTIONAL IN UINT32 *HealthFlag OPTIONAL
) )
{ {
return EFI_UNSUPPORTED; return EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);
} }