summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg
diff options
context:
space:
mode:
authorDun Tan <dun.tan@intel.com>2023-12-01 10:51:18 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-12-12 01:37:41 +0000
commite51965ddd1816a0506818e66644a635ae830e20f (patch)
tree0ea01bc4b69df265f5bb227d22898977bff65cf5 /UefiCpuPkg
parentfc4f6627f8ca7fd77b0adf7b93840988fd6da78a (diff)
downloadedk2-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.c59
-rw-r--r--UefiCpuPkg/CpuMpPei/CpuMpPei.h2
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;
/**