/** @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
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
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
(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
+ DEBUG ((DEBUG_INFO, " 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
}\r
}\r
-\r