From 15ac284815b1e1d5fe8dbc737129f82c9a92649b Mon Sep 17 00:00:00 2001
From: Robert Phelps <robert@ami.com>
Date: Tue, 12 May 2020 04:24:13 +0800
Subject: [PATCH] MdePkg: Update structures for MpServices Protocol

Added EXTENDED_PROCESSOR_INFORMATION structure and supporting
structures and definitions.  The intent is to support updated
topology layout for CPUs.  (PI 1.7a Mantis 2071)

Signed-off-by: Robert Phelps <robert@ami.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
---
 MdePkg/Include/Protocol/MpService.h | 50 +++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/MdePkg/Include/Protocol/MpService.h b/MdePkg/Include/Protocol/MpService.h
index 10e2405daf..9445c5567f 100644
--- a/MdePkg/Include/Protocol/MpService.h
+++ b/MdePkg/Include/Protocol/MpService.h
@@ -47,6 +47,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
     0x3fdda605, 0xa76e, 0x4f46, {0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08} \
   }
 
+///
+/// Value used in the NumberProcessors parameter of the GetProcessorInfo function
+///
+#define CPU_V2_EXTENDED_TOPOLOGY BIT24
+
 ///
 /// Forward declaration for the EFI_MP_SERVICES_PROTOCOL.
 ///
@@ -96,6 +101,47 @@ typedef struct {
   UINT32  Thread;
 } EFI_CPU_PHYSICAL_LOCATION;
 
+///
+///  Structure that defines the 6-level physical location of the processor
+///
+typedef struct {
+///
+///    Package     Zero-based physical package number that identifies the cartridge of the processor.
+///
+UINT32  Package;
+///
+///    Module      Zero-based physical module number within package of the processor.
+///
+UINT32  Module;
+///
+///    Tile        Zero-based physical tile number within module of the processor.
+///
+UINT32  Tile;
+///
+///    Die         Zero-based physical die number within tile of the processor.
+///
+UINT32  Die;
+///
+///     Core        Zero-based physical core number within die of the processor.
+///
+UINT32  Core;
+///
+///     Thread      Zero-based logical thread number within core of the processor.
+///
+UINT32  Thread;
+} EFI_CPU_PHYSICAL_LOCATION2;
+
+
+typedef union {
+  /// The 6-level physical location of the processor, including the
+  /// physical package number that identifies the cartridge, the physical
+  /// module number within package, the physical tile number within the module,
+  /// the physical die number within the tile, the physical core number within
+  /// package, and logical thread number within core.
+  EFI_CPU_PHYSICAL_LOCATION2  Location2;
+} EXTENDED_PROCESSOR_INFORMATION;
+
+
 ///
 /// Structure that describes information about a logical CPU.
 ///
@@ -132,6 +178,10 @@ typedef struct {
   /// logical thread number within core.
   ///
   EFI_CPU_PHYSICAL_LOCATION  Location;
+  ///
+  /// The extended information of the processor. This field is filled only when
+  /// CPU_V2_EXTENDED_TOPOLOGY is set in parameter ProcessorNumber.
+  EXTENDED_PROCESSOR_INFORMATION ExtendedInformation;
 } EFI_PROCESSOR_INFORMATION;
 
 /**