mirror of https://github.com/acidanthera/audk.git
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 <dun.tan@intel.com> Cc: Eric Dong <eric.dong@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
c02eed8e5a
commit
e10f1f5a04
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Definitions to install Multiple Processor PPI.
|
||||
|
||||
Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
@ -30,6 +30,8 @@
|
|||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/CpuPageTableLib.h>
|
||||
|
||||
#include <Guid/MpInformation2.h>
|
||||
|
||||
extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc;
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
## @file
|
||||
# CPU driver installs CPU PI Multi-processor PPI.
|
||||
#
|
||||
# Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.<BR>
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#
|
||||
##
|
||||
|
@ -50,6 +50,7 @@
|
|||
|
||||
[Guids]
|
||||
gEdkiiMigratedFvInfoGuid ## SOMETIMES_CONSUMES ## HOB
|
||||
gMpInformationHobGuid2 ## PRODUCES
|
||||
|
||||
[Ppis]
|
||||
gEfiPeiMpServicesPpiGuid ## PRODUCES
|
||||
|
|
Loading…
Reference in New Issue