diff options
author | Dun Tan <dun.tan@intel.com> | 2023-12-01 10:51:18 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2023-12-12 01:37:41 +0000 |
commit | e51965ddd1816a0506818e66644a635ae830e20f (patch) | |
tree | 0ea01bc4b69df265f5bb227d22898977bff65cf5 /UefiCpuPkg | |
parent | fc4f6627f8ca7fd77b0adf7b93840988fd6da78a (diff) | |
download | edk2-e51965ddd1816a0506818e66644a635ae830e20f.tar.gz edk2-e51965ddd1816a0506818e66644a635ae830e20f.tar.bz2 edk2-e51965ddd1816a0506818e66644a635ae830e20f.zip |
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>
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r-- | UefiCpuPkg/CpuMpPei/CpuMpPei.c | 59 | ||||
-rw-r--r-- | UefiCpuPkg/CpuMpPei/CpuMpPei.h | 2 |
2 files changed, 59 insertions, 2 deletions
diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index e96a76c9a5..93919be94f 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -542,6 +542,30 @@ InitializeMpExceptionStackSwitchHandlers ( }
/**
+ 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.
**/
VOID
@@ -558,13 +582,36 @@ BuildMpInformationHob ( MP_INFORMATION2_HOB_DATA *MpInformation2HobData;
MP_INFORMATION2_ENTRY *MpInformation2Entry;
UINTN Index;
+ UINT8 *CoreTypes;
+ UINT32 CpuidMaxInput;
+ UINTN CoreTypePages;
ProcessorIndex = 0;
MpInformation2HobData = NULL;
MpInformation2Entry = NULL;
+ CoreTypes = NULL;
+ CoreTypePages = 0;
Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors);
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);
NumberOfProcessorsInHob = MaxProcessorsPerHob;
@@ -597,12 +644,16 @@ BuildMpInformationHob ( NULL
);
ASSERT_EFI_ERROR (Status);
+
+ MpInformation2Entry->CoreType = (CoreTypes != NULL) ? CoreTypes[Index + ProcessorIndex] : 0;
+
DEBUG ((
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,
MpInformation2Entry->ProcessorInfo.ProcessorId,
- MpInformation2Entry->ProcessorInfo.StatusFlag
+ MpInformation2Entry->ProcessorInfo.StatusFlag,
+ MpInformation2Entry->CoreType
));
DEBUG ((
DEBUG_INFO,
@@ -625,6 +676,10 @@ BuildMpInformationHob ( ProcessorIndex += NumberOfProcessorsInHob;
}
+
+ if (CoreTypes != NULL) {
+ FreePages (CoreTypes, CoreTypePages);
+ }
}
/**
diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h index a40fd2c077..e7d07ffd64 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h @@ -32,6 +32,8 @@ #include <Guid/MpInformation2.h>
+#include <Register/Cpuid.h>
+
extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc;
/**
|