UefiCpuPkg/CpuDxe: Get CPU BIST information from Guided HOB
Get CPU BIST information from gEfiSecPlatformInformation2PpiGuid or gEfiSecPlatformInformationPpiGuid Guided HOB and update the CPU healthy status for CPU MP Service. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17641 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
CPU DXE Module.
|
||||
|
||||
Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -1520,6 +1520,89 @@ InitMpSystemData (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Collects BIST data from HOB.
|
||||
|
||||
This function collects BIST data from HOB built from Sec Platform Information
|
||||
PPI or SEC Platform Information2 PPI.
|
||||
|
||||
**/
|
||||
VOID
|
||||
CollectBistDataFromHob (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_HOB_GUID_TYPE *GuidHob;
|
||||
EFI_SEC_PLATFORM_INFORMATION_RECORD2 *SecPlatformInformation2;
|
||||
EFI_SEC_PLATFORM_INFORMATION_RECORD *SecPlatformInformation;
|
||||
UINTN NumberOfData;
|
||||
EFI_SEC_PLATFORM_INFORMATION_CPU *CpuInstance;
|
||||
EFI_SEC_PLATFORM_INFORMATION_CPU BspCpuInstance;
|
||||
UINTN ProcessorNumber;
|
||||
UINT32 InitialLocalApicId;
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
|
||||
SecPlatformInformation2 = NULL;
|
||||
SecPlatformInformation = NULL;
|
||||
|
||||
//
|
||||
// Get gEfiSecPlatformInformation2PpiGuid Guided HOB firstly
|
||||
//
|
||||
GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformation2PpiGuid);
|
||||
if (GuidHob != NULL) {
|
||||
//
|
||||
// Sec Platform Information2 PPI includes BSP/APs' BIST information
|
||||
//
|
||||
SecPlatformInformation2 = GET_GUID_HOB_DATA (GuidHob);
|
||||
NumberOfData = SecPlatformInformation2->NumberOfCpus;
|
||||
CpuInstance = SecPlatformInformation2->CpuInstance;
|
||||
} else {
|
||||
//
|
||||
// Otherwise, get gEfiSecPlatformInformationPpiGuid Guided HOB
|
||||
//
|
||||
GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformationPpiGuid);
|
||||
if (GuidHob != NULL) {
|
||||
SecPlatformInformation = GET_GUID_HOB_DATA (GuidHob);
|
||||
NumberOfData = 1;
|
||||
//
|
||||
// SEC Platform Information only includes BSP's BIST information
|
||||
// does not have BSP's APIC ID
|
||||
//
|
||||
BspCpuInstance.CpuLocation = GetApicId ();
|
||||
BspCpuInstance.InfoRecord.IA32HealthFlags.Uint32 = SecPlatformInformation->IA32HealthFlags.Uint32;
|
||||
CpuInstance = &BspCpuInstance;
|
||||
} else {
|
||||
DEBUG ((EFI_D_INFO, "Does not find any HOB stored CPU BIST information!\n"));
|
||||
//
|
||||
// Does not find any HOB stored BIST information
|
||||
//
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while (NumberOfData--) {
|
||||
for (ProcessorNumber = 0; ProcessorNumber < mMpSystemData.NumberOfProcessors; ProcessorNumber++) {
|
||||
CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
|
||||
InitialLocalApicId = (UINT32) CpuData->Info.ProcessorId;
|
||||
if (InitialLocalApicId == CpuInstance[NumberOfData].CpuLocation) {
|
||||
//
|
||||
// Update CPU health status for MP Services Protocol according to BIST data.
|
||||
//
|
||||
if (CpuInstance[NumberOfData].InfoRecord.IA32HealthFlags.Uint32 != 0) {
|
||||
CpuData->Info.StatusFlag &= ~PROCESSOR_HEALTH_STATUS_BIT;
|
||||
//
|
||||
// Report Status Code that self test is failed
|
||||
//
|
||||
REPORT_STATUS_CODE (
|
||||
EFI_ERROR_CODE | EFI_ERROR_MAJOR,
|
||||
(EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Callback function for ExitBootServices.
|
||||
|
||||
@@ -1597,6 +1680,11 @@ InitializeMpSupport (
|
||||
|
||||
mAPsAlreadyInitFinished = TRUE;
|
||||
|
||||
//
|
||||
// Update CPU healthy information from Guided HOB
|
||||
//
|
||||
CollectBistDataFromHob ();
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mMpServiceHandle,
|
||||
&gEfiMpServiceProtocolGuid, &mMpServicesTemplate,
|
||||
|
Reference in New Issue
Block a user