mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 13:44:33 +02:00
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:
parent
fc4f6627f8
commit
e51965ddd1
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user