Skip to content

Commit

Permalink
UefiCpuPkg/MpService: GetProcessorInfo returns 6-level topology
Browse files Browse the repository at this point in the history
Signed-off-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
  • Loading branch information
niruiyu committed Jun 20, 2019
1 parent 8a08dc5 commit 2409b78
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 5 deletions.
50 changes: 45 additions & 5 deletions MdePkg/Include/Protocol/MpService.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
APs to help test system memory in parallel with other device initialization.
Diagnostics applications may also use this protocol for multi-processor.
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Revision Reference:
Expand Down Expand Up @@ -79,7 +79,7 @@ typedef struct _EFI_MP_SERVICES_PROTOCOL EFI_MP_SERVICES_PROTOCOL;
#define PROCESSOR_HEALTH_STATUS_BIT 0x00000004

///
/// Structure that describes the pyhiscal location of a logical CPU.
/// Structure that describes the physical location of a logical CPU.
///
typedef struct {
///
Expand All @@ -96,6 +96,45 @@ typedef struct {
UINT32 Thread;
} EFI_CPU_PHYSICAL_LOCATION;

#define CPU_V2_EXTENDED_TOPOLOGY BIT24

///
/// Structure that describes the v2 physical location of a logical CPU.
///
typedef struct {
///
/// Zero-based physical package number that identifies the cartridge of the processor.
///
UINT32 Package;
///
/// Zero-based physical module number within package of the processor.
///
UINT32 Module;
///
/// Zero-based physical tile number within module of the processor.
///
UINT32 Tile;
///
/// Zero-based physical die number within tile of the processor.
///
UINT32 Die;
///
/// Zero-based physical core number within die of the processor.
///
UINT32 Core;
///
/// Zero-based logical thread number within core of the processor.
///
UINT32 Thread;
} EFI_CPU_PHYSICAL_LOCATION2;

///
/// Structure that describes extended processor information.
///
typedef union {
EFI_CPU_PHYSICAL_LOCATION2 Location2;
} EXTENDED_PROCESSOR_INFORMATION;

///
/// Structure that describes information about a logical CPU.
///
Expand All @@ -106,7 +145,7 @@ typedef struct {
/// are used, and higher bits are reserved. For IPF, the lower 16 bits contains
/// id/eid, and higher bits are reserved.
///
UINT64 ProcessorId;
UINT64 ProcessorId;
///
/// Flags indicating if the processor is BSP or AP, if the processor is enabled
/// or disabled, and if the processor is healthy. Bits 3..31 are reserved and
Expand All @@ -125,13 +164,14 @@ typedef struct {
/// 1 1 1 Healthy Enabled BSP.
/// </pre>
///
UINT32 StatusFlag;
UINT32 StatusFlag;
///
/// The physical location of the processor, including the physical package number
/// that identifies the cartridge, the physical core number within package, and
/// logical thread number within core.
///
EFI_CPU_PHYSICAL_LOCATION Location;
EFI_CPU_PHYSICAL_LOCATION Location;
EXTENDED_PROCESSOR_INFORMATION ExtendedInformation;
} EFI_PROCESSOR_INFORMATION;

/**
Expand Down
19 changes: 19 additions & 0 deletions UefiCpuPkg/Library/MpInitLib/MpLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1774,10 +1774,17 @@ MpInitLibGetProcessorInfo (
CPU_MP_DATA *CpuMpData;
UINTN CallerNumber;
CPU_INFO_IN_HOB *CpuInfoInHob;
UINTN OriginalProcessorNumber;

CpuMpData = GetCpuMpData ();
CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;

//
// Lower 24 bits contains the actual processor number.
//
OriginalProcessorNumber = ProcessorNumber;
ProcessorNumber &= BIT24 - 1;

//
// Check whether caller processor is BSP
//
Expand Down Expand Up @@ -1818,6 +1825,18 @@ MpInitLibGetProcessorInfo (
&ProcessorInfoBuffer->Location.Thread
);

if ((OriginalProcessorNumber & CPU_V2_EXTENDED_TOPOLOGY) != 0) {
GetProcessorLocation2ByApicId (
CpuInfoInHob[ProcessorNumber].ApicId,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Package,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Die,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Tile,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Module,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Core,
&ProcessorInfoBuffer->ExtendedInformation.Location2.Thread
);
}

if (HealthData != NULL) {
HealthData->Uint32 = CpuInfoInHob[ProcessorNumber].Health;
}
Expand Down

0 comments on commit 2409b78

Please sign in to comment.