From e10f1f5a043a402fb2daf2091b8f725fd2951743 Mon Sep 17 00:00:00 2001 From: Dun Tan Date: Fri, 24 Nov 2023 15:53:33 +0800 Subject: UefiCpuPkg: Build MpInfo2HOB in CpuMpPei Build MpInfo2HOB in CpuMpPei module so that later PiSmmCpuDxe or other StandaloneMm module can consume the HOB. Since there might be more one gMpInformationHobGuid2 in HOB list, CpuMpPei create a gMpInformationHobGuid2 with 0 value NumberOfProcessors field in the end of the process to indicate it's the last MP_INFORMATION2_HOB. Signed-off-by: Dun Tan Cc: Eric Dong Reviewed-by: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann --- UefiCpuPkg/CpuMpPei/CpuMpPei.c | 91 ++++++++++++++++++++++++++++++++++++++++ UefiCpuPkg/CpuMpPei/CpuMpPei.h | 4 +- UefiCpuPkg/CpuMpPei/CpuMpPei.inf | 3 +- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index b504bea3cf..e96a76c9a5 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -541,6 +541,92 @@ InitializeMpExceptionStackSwitchHandlers ( FreePages (SwitchStackData, EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT))); } +/** + Create gMpInformationHobGuid2. +**/ +VOID +BuildMpInformationHob ( + VOID + ) +{ + EFI_STATUS Status; + UINTN ProcessorIndex; + UINTN NumberOfProcessors; + UINTN NumberOfEnabledProcessors; + UINTN NumberOfProcessorsInHob; + UINTN MaxProcessorsPerHob; + MP_INFORMATION2_HOB_DATA *MpInformation2HobData; + MP_INFORMATION2_ENTRY *MpInformation2Entry; + UINTN Index; + + ProcessorIndex = 0; + MpInformation2HobData = NULL; + MpInformation2Entry = NULL; + + Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors); + ASSERT_EFI_ERROR (Status); + MaxProcessorsPerHob = ((MAX_UINT16 & ~7) - sizeof (EFI_HOB_GUID_TYPE) - sizeof (MP_INFORMATION2_HOB_DATA)) / sizeof (MP_INFORMATION2_ENTRY); + NumberOfProcessorsInHob = MaxProcessorsPerHob; + + // + // Create MP_INFORMATION2_HOB. when the max HobLength 0xFFF8 is not enough, there + // will be a MP_INFORMATION2_HOB series in the HOB list. + // In the HOB list, there is a gMpInformationHobGuid2 with 0 value NumberOfProcessors + // fields to indicate it's the last MP_INFORMATION2_HOB. + // + while (NumberOfProcessorsInHob != 0) { + NumberOfProcessorsInHob = MIN (NumberOfProcessors - ProcessorIndex, MaxProcessorsPerHob); + MpInformation2HobData = BuildGuidHob ( + &gMpInformationHobGuid2, + sizeof (MP_INFORMATION2_HOB_DATA) + sizeof (MP_INFORMATION2_ENTRY) * NumberOfProcessorsInHob + ); + ASSERT (MpInformation2HobData != NULL); + + MpInformation2HobData->Version = MP_INFORMATION2_HOB_REVISION; + MpInformation2HobData->ProcessorIndex = ProcessorIndex; + MpInformation2HobData->NumberOfProcessors = (UINT16)NumberOfProcessorsInHob; + MpInformation2HobData->EntrySize = sizeof (MP_INFORMATION2_ENTRY); + + DEBUG ((DEBUG_INFO, "Creating MpInformation2 HOB...\n")); + + for (Index = 0; Index < NumberOfProcessorsInHob; Index++) { + MpInformation2Entry = &MpInformation2HobData->Entry[Index]; + Status = MpInitLibGetProcessorInfo ( + (Index + ProcessorIndex) | CPU_V2_EXTENDED_TOPOLOGY, + &MpInformation2Entry->ProcessorInfo, + NULL + ); + ASSERT_EFI_ERROR (Status); + DEBUG (( + DEBUG_INFO, + " Processor[%04d]: ProcessorId = 0x%lx, StatusFlag = 0x%x\n", + Index + ProcessorIndex, + MpInformation2Entry->ProcessorInfo.ProcessorId, + MpInformation2Entry->ProcessorInfo.StatusFlag + )); + DEBUG (( + DEBUG_INFO, + " Location = Package:%d Core:%d Thread:%d\n", + MpInformation2Entry->ProcessorInfo.Location.Package, + MpInformation2Entry->ProcessorInfo.Location.Core, + MpInformation2Entry->ProcessorInfo.Location.Thread + )); + DEBUG (( + DEBUG_INFO, + " Location2 = Package:%d Die:%d Tile:%d Module:%d Core:%d Thread:%d\n", + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Package, + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Die, + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Tile, + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Module, + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Core, + MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Thread + )); + } + + ProcessorIndex += NumberOfProcessorsInHob; + } +} + /** Initializes MP and exceptions handlers. @@ -602,6 +688,11 @@ InitializeCpuMpWorker ( Status = PeiServicesInstallPpi (mPeiCpuMpPpiList); ASSERT_EFI_ERROR (Status); + // + // Create gMpInformationHobGuid2 + // + BuildMpInformationHob (); + return Status; } diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h index 1b9a94e18f..a40fd2c077 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h @@ -1,7 +1,7 @@ /** @file Definitions to install Multiple Processor PPI. - Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
+ Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -30,6 +30,8 @@ #include #include +#include + extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc; /** diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.inf b/UefiCpuPkg/CpuMpPei/CpuMpPei.inf index 865be5627e..812fa179bd 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.inf +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.inf @@ -1,7 +1,7 @@ ## @file # CPU driver installs CPU PI Multi-processor PPI. # -# Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
+# Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -50,6 +50,7 @@ [Guids] gEdkiiMigratedFvInfoGuid ## SOMETIMES_CONSUMES ## HOB + gMpInformationHobGuid2 ## PRODUCES [Ppis] gEfiPeiMpServicesPpiGuid ## PRODUCES -- cgit v1.2.3