/** @file\r
Update and publish processors' BIST information.\r
\r
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "CpuMpPei.h"\r
\r
-EFI_SEC_PLATFORM_INFORMATION2_PPI mSecPlatformInformation2Ppi = {\r
+EFI_SEC_PLATFORM_INFORMATION2_PPI mSecPlatformInformation2Ppi = {\r
SecPlatformInformation2\r
};\r
\r
-EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformation2Ppi = {\r
+EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformation2Ppi = {\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiSecPlatformInformation2PpiGuid,\r
&mSecPlatformInformation2Ppi\r
EFI_STATUS\r
EFIAPI\r
SecPlatformInformation2 (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN OUT UINT64 *StructureSize,\r
- OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN OUT UINT64 *StructureSize,\r
+ OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2\r
)\r
{\r
- UINTN BistInformationSize;\r
- UINTN CpuIndex;\r
- EFI_SEC_PLATFORM_INFORMATION_CPU *CpuInstance;\r
- EFI_PROCESSOR_INFORMATION ProcessorInfo;\r
- EFI_HEALTH_FLAGS BistData;\r
- UINTN NumberOfProcessors;\r
- UINTN NumberOfEnabledProcessors;\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+ VOID *DataInHob;\r
+ UINTN DataSize;\r
\r
- MpInitLibGetNumberOfProcessors(&NumberOfProcessors, &NumberOfEnabledProcessors);\r
+ GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformation2PpiGuid);\r
+ if (GuidHob == NULL) {\r
+ *StructureSize = 0;\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ DataInHob = GET_GUID_HOB_DATA (GuidHob);\r
+ DataSize = GET_GUID_HOB_DATA_SIZE (GuidHob);\r
\r
- BistInformationSize = sizeof (EFI_SEC_PLATFORM_INFORMATION_RECORD2) +\r
- sizeof (EFI_SEC_PLATFORM_INFORMATION_CPU) * NumberOfProcessors;\r
//\r
- // return the information size if input buffer size is too small\r
+ // return the information from BistHob\r
//\r
- if ((*StructureSize) < (UINT64) BistInformationSize) {\r
- *StructureSize = (UINT64) BistInformationSize;\r
+ if ((*StructureSize) < (UINT64)DataSize) {\r
+ *StructureSize = (UINT64)DataSize;\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
- PlatformInformationRecord2->NumberOfCpus = (UINT32)NumberOfProcessors;\r
- CpuInstance = PlatformInformationRecord2->CpuInstance;\r
- for (CpuIndex = 0; CpuIndex < NumberOfProcessors; CpuIndex ++) {\r
- MpInitLibGetProcessorInfo (CpuIndex, &ProcessorInfo, &BistData);\r
- CpuInstance[CpuIndex].CpuLocation = (UINT32) ProcessorInfo.ProcessorId;\r
- CpuInstance[CpuIndex].InfoRecord.IA32HealthFlags = BistData;\r
- }\r
-\r
+ *StructureSize = (UINT64)DataSize;\r
+ CopyMem (PlatformInformationRecord2, DataInHob, DataSize);\r
return EFI_SUCCESS;\r
}\r
\r
**/\r
EFI_STATUS\r
GetBistInfoFromPpi (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN CONST EFI_GUID *Guid,\r
- OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,\r
- OUT VOID **BistInformationData,\r
- OUT UINT64 *BistInformationSize OPTIONAL\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_GUID *Guid,\r
+ OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,\r
+ OUT VOID **BistInformationData,\r
+ OUT UINT64 *BistInformationSize OPTIONAL\r
)\r
{\r
EFI_STATUS Status;\r
//\r
InformationSize = 0;\r
SecPlatformInformation2 = NULL;\r
- Status = SecPlatformInformation2Ppi->PlatformInformation2 (\r
- PeiServices,\r
- &InformationSize,\r
- SecPlatformInformation2\r
- );\r
+ Status = SecPlatformInformation2Ppi->PlatformInformation2 (\r
+ PeiServices,\r
+ &InformationSize,\r
+ SecPlatformInformation2\r
+ );\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
Status = PeiServicesAllocatePool (\r
- (UINTN) InformationSize,\r
- (VOID **) &SecPlatformInformation2\r
+ (UINTN)InformationSize,\r
+ (VOID **)&SecPlatformInformation2\r
);\r
if (Status == EFI_SUCCESS) {\r
//\r
if (BistInformationSize != NULL) {\r
*BistInformationSize = InformationSize;\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
}\r
**/\r
VOID\r
CollectBistDataFromPpi (\r
- IN CONST EFI_PEI_SERVICES **PeiServices\r
+ IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
EFI_STATUS Status;\r
EFI_HEALTH_FLAGS BistData;\r
UINTN NumberOfProcessors;\r
UINTN NumberOfEnabledProcessors;\r
+ UINTN BistInformationSize;\r
+ EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2;\r
+ EFI_SEC_PLATFORM_INFORMATION_CPU *CpuInstanceInHob;\r
+\r
+ MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors);\r
\r
- MpInitLibGetNumberOfProcessors(&NumberOfProcessors, &NumberOfEnabledProcessors);\r
+ BistInformationSize = sizeof (EFI_SEC_PLATFORM_INFORMATION_RECORD2) +\r
+ sizeof (EFI_SEC_PLATFORM_INFORMATION_CPU) * NumberOfProcessors;\r
+ Status = PeiServicesAllocatePool (\r
+ (UINTN)BistInformationSize,\r
+ (VOID **)&PlatformInformationRecord2\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ PlatformInformationRecord2->NumberOfCpus = (UINT32)NumberOfProcessors;\r
\r
SecPlatformInformation2 = NULL;\r
SecPlatformInformation = NULL;\r
NumberOfData = 0;\r
CpuInstance = NULL;\r
-\r
//\r
// Get BIST information from Sec Platform Information2 Ppi firstly\r
//\r
PeiServices,\r
&gEfiSecPlatformInformation2PpiGuid,\r
&SecInformationDescriptor,\r
- (VOID *) &SecPlatformInformation2,\r
+ (VOID *)&SecPlatformInformation2,\r
NULL\r
);\r
if (Status == EFI_SUCCESS) {\r
PeiServices,\r
&gEfiSecPlatformInformationPpiGuid,\r
&SecInformationDescriptor,\r
- (VOID *) &SecPlatformInformation,\r
+ (VOID *)&SecPlatformInformation,\r
NULL\r
);\r
if (Status == EFI_SUCCESS) {\r
// SEC Platform Information only includes BSP's BIST information\r
// and does not have BSP's APIC ID\r
//\r
- BspCpuInstance.CpuLocation = GetInitialApicId ();\r
- BspCpuInstance.InfoRecord.IA32HealthFlags.Uint32 = SecPlatformInformation->IA32HealthFlags.Uint32;\r
- CpuInstance = &BspCpuInstance;\r
+ BspCpuInstance.CpuLocation = GetInitialApicId ();\r
+ BspCpuInstance.InfoRecord.IA32HealthFlags.Uint32 = SecPlatformInformation->IA32HealthFlags.Uint32;\r
+ CpuInstance = &BspCpuInstance;\r
} else {\r
- DEBUG ((EFI_D_INFO, "Does not find any stored CPU BIST information from PPI!\n"));\r
+ DEBUG ((DEBUG_INFO, "Does not find any stored CPU BIST information from PPI!\n"));\r
}\r
}\r
- for (ProcessorNumber = 0; ProcessorNumber < NumberOfProcessors; ProcessorNumber ++) {\r
+\r
+ for (ProcessorNumber = 0; ProcessorNumber < NumberOfProcessors; ProcessorNumber++) {\r
MpInitLibGetProcessorInfo (ProcessorNumber, &ProcessorInfo, &BistData);\r
- for (CpuIndex = 0; CpuIndex < NumberOfData; CpuIndex ++) {\r
+ for (CpuIndex = 0; CpuIndex < NumberOfData; CpuIndex++) {\r
ASSERT (CpuInstance != NULL);\r
if (ProcessorInfo.ProcessorId == CpuInstance[CpuIndex].CpuLocation) {\r
//\r
BistData = CpuInstance[CpuIndex].InfoRecord.IA32HealthFlags;\r
}\r
}\r
+\r
if (BistData.Uint32 != 0) {\r
//\r
// Report Status Code that self test is failed\r
(EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)\r
);\r
}\r
- DEBUG ((EFI_D_INFO, " APICID - 0x%08x, BIST - 0x%08x\n",\r
- ProcessorInfo.ProcessorId,\r
- BistData\r
- ));\r
+\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ " APICID - 0x%08x, BIST - 0x%08x\n",\r
+ (UINT32)ProcessorInfo.ProcessorId,\r
+ BistData\r
+ ));\r
+ CpuInstanceInHob = PlatformInformationRecord2->CpuInstance;\r
+ CpuInstanceInHob[ProcessorNumber].CpuLocation = (UINT32)ProcessorInfo.ProcessorId;\r
+ CpuInstanceInHob[ProcessorNumber].InfoRecord.IA32HealthFlags = BistData;\r
}\r
\r
- if (SecPlatformInformation2 != NULL && NumberOfData < NumberOfProcessors) {\r
- //\r
- // Reinstall SecPlatformInformation2 PPI to include new BIST information\r
- //\r
- Status = PeiServicesReInstallPpi (\r
- SecInformationDescriptor,\r
- &mPeiSecPlatformInformation2Ppi\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Build SecPlatformInformation2 PPI GUIDed HOB that also could be consumed\r
+ // by CPU MP driver to get CPU BIST data\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiSecPlatformInformation2PpiGuid,\r
+ PlatformInformationRecord2,\r
+ (UINTN)BistInformationSize\r
+ );\r
+\r
+ if (SecPlatformInformation2 != NULL) {\r
+ if (NumberOfData < NumberOfProcessors) {\r
+ //\r
+ // Reinstall SecPlatformInformation2 PPI to include new BIST information\r
+ //\r
+ Status = PeiServicesReInstallPpi (\r
+ SecInformationDescriptor,\r
+ &mPeiSecPlatformInformation2Ppi\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
} else {\r
//\r
- // Install SecPlatformInformation2 PPI to include new BIST information\r
+ // Install SecPlatformInformation2 PPI\r
//\r
Status = PeiServicesInstallPpi (&mPeiSecPlatformInformation2Ppi);\r
- ASSERT_EFI_ERROR(Status);\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
}\r
-\r