UefiCpuPkg: Cache core type in MpInfo2 HOB

Cache core type in MpInfo2 HOB by CpuMpPei module.

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:
Dun Tan 2023-12-01 10:51:18 +08:00 committed by mergify[bot]
parent fc4f6627f8
commit e51965ddd1
2 changed files with 59 additions and 2 deletions

View File

@ -541,6 +541,30 @@ InitializeMpExceptionStackSwitchHandlers (
FreePages (SwitchStackData, EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT))); FreePages (SwitchStackData, EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT)));
} }
/**
Get CPU core type.
@param[in, out] Buffer Argument of the procedure.
**/
VOID
EFIAPI
GetProcessorCoreType (
IN OUT VOID *Buffer
)
{
EFI_STATUS Status;
UINT8 *CoreTypes;
CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX NativeModelIdAndCoreTypeEax;
UINTN ProcessorIndex;
Status = MpInitLibWhoAmI (&ProcessorIndex);
ASSERT_EFI_ERROR (Status);
CoreTypes = (UINT8 *)Buffer;
AsmCpuidEx (CPUID_HYBRID_INFORMATION, CPUID_HYBRID_INFORMATION_MAIN_LEAF, &NativeModelIdAndCoreTypeEax.Uint32, NULL, NULL, NULL);
CoreTypes[ProcessorIndex] = (UINT8)NativeModelIdAndCoreTypeEax.Bits.CoreType;
}
/** /**
Create gMpInformationHobGuid2. Create gMpInformationHobGuid2.
**/ **/
@ -558,13 +582,36 @@ BuildMpInformationHob (
MP_INFORMATION2_HOB_DATA *MpInformation2HobData; MP_INFORMATION2_HOB_DATA *MpInformation2HobData;
MP_INFORMATION2_ENTRY *MpInformation2Entry; MP_INFORMATION2_ENTRY *MpInformation2Entry;
UINTN Index; UINTN Index;
UINT8 *CoreTypes;
UINT32 CpuidMaxInput;
UINTN CoreTypePages;
ProcessorIndex = 0; ProcessorIndex = 0;
MpInformation2HobData = NULL; MpInformation2HobData = NULL;
MpInformation2Entry = NULL; MpInformation2Entry = NULL;
CoreTypes = NULL;
CoreTypePages = 0;
Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors); Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
//
// Get Processors CoreType
//
AsmCpuid (CPUID_SIGNATURE, &CpuidMaxInput, NULL, NULL, NULL);
if (CpuidMaxInput >= CPUID_HYBRID_INFORMATION) {
CoreTypePages = EFI_SIZE_TO_PAGES (sizeof (UINT8) * NumberOfProcessors);
CoreTypes = AllocatePages (CoreTypePages);
ASSERT (CoreTypes != NULL);
Status = MpInitLibStartupAllCPUs (
GetProcessorCoreType,
0,
(VOID *)CoreTypes
);
ASSERT_EFI_ERROR (Status);
}
MaxProcessorsPerHob = ((MAX_UINT16 & ~7) - sizeof (EFI_HOB_GUID_TYPE) - sizeof (MP_INFORMATION2_HOB_DATA)) / sizeof (MP_INFORMATION2_ENTRY); MaxProcessorsPerHob = ((MAX_UINT16 & ~7) - sizeof (EFI_HOB_GUID_TYPE) - sizeof (MP_INFORMATION2_HOB_DATA)) / sizeof (MP_INFORMATION2_ENTRY);
NumberOfProcessorsInHob = MaxProcessorsPerHob; NumberOfProcessorsInHob = MaxProcessorsPerHob;
@ -597,12 +644,16 @@ BuildMpInformationHob (
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
MpInformation2Entry->CoreType = (CoreTypes != NULL) ? CoreTypes[Index + ProcessorIndex] : 0;
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
" Processor[%04d]: ProcessorId = 0x%lx, StatusFlag = 0x%x\n", " Processor[%04d]: ProcessorId = 0x%lx, StatusFlag = 0x%x, CoreType = 0x%x\n",
Index + ProcessorIndex, Index + ProcessorIndex,
MpInformation2Entry->ProcessorInfo.ProcessorId, MpInformation2Entry->ProcessorInfo.ProcessorId,
MpInformation2Entry->ProcessorInfo.StatusFlag MpInformation2Entry->ProcessorInfo.StatusFlag,
MpInformation2Entry->CoreType
)); ));
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
@ -625,6 +676,10 @@ BuildMpInformationHob (
ProcessorIndex += NumberOfProcessorsInHob; ProcessorIndex += NumberOfProcessorsInHob;
} }
if (CoreTypes != NULL) {
FreePages (CoreTypes, CoreTypePages);
}
} }
/** /**

View File

@ -32,6 +32,8 @@
#include <Guid/MpInformation2.h> #include <Guid/MpInformation2.h>
#include <Register/Cpuid.h>
extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc; extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc;
/** /**