/** @file\r
Update and publish processors' BIST information.\r
\r
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015 - 2018, 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
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
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
\r
MpInitLibGetNumberOfProcessors(&NumberOfProcessors, &NumberOfEnabledProcessors);\r
\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
);\r
}\r
DEBUG ((EFI_D_INFO, " APICID - 0x%08x, BIST - 0x%08x\n",\r
- ProcessorInfo.ProcessorId,\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