Skip to content

Commit

Permalink
perf/x86/amd/core: Detect available counters
Browse files Browse the repository at this point in the history
If AMD Performance Monitoring Version 2 (PerfMonV2) is
supported, use CPUID leaf 0x80000022 EBX to detect the
number of Core PMCs. This offers more flexibility if the
counts change in later processor families.

Signed-off-by: Sandipan Das <sandipan.das@amd.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/68a6d9688df189267db26530378870edd34f7b06.1650515382.git.sandipan.das@amd.com
  • Loading branch information
Sandipan Das authored and Peter Zijlstra committed May 4, 2022
1 parent 21d59e3 commit 56e026a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/x86/events/amd/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,7 @@ static const struct attribute_group *amd_attr_update[] = {

static int __init amd_core_pmu_init(void)
{
union cpuid_0x80000022_ebx ebx;
u64 even_ctr_mask = 0ULL;
int i;

Expand All @@ -1206,9 +1207,14 @@ static int __init amd_core_pmu_init(void)

/* Check for Performance Monitoring v2 support */
if (boot_cpu_has(X86_FEATURE_PERFMON_V2)) {
ebx.full = cpuid_ebx(EXT_PERFMON_DEBUG_FEATURES);

/* Update PMU version for later usage */
x86_pmu.version = 2;

/* Find the number of available Core PMCs */
x86_pmu.num_counters = ebx.split.num_core_pmc;

amd_pmu_global_cntr_mask = (1ULL << x86_pmu.num_counters) - 1;
}

Expand Down
17 changes: 17 additions & 0 deletions arch/x86/include/asm/perf_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,18 @@ union cpuid28_ecx {
unsigned int full;
};

/*
* AMD "Extended Performance Monitoring and Debug" CPUID
* detection/enumeration details:
*/
union cpuid_0x80000022_ebx {
struct {
/* Number of Core Performance Counters */
unsigned int num_core_pmc:4;
} split;
unsigned int full;
};

struct x86_pmu_capability {
int version;
int num_counters_gp;
Expand Down Expand Up @@ -367,6 +379,11 @@ struct pebs_xmm {
u64 xmm[16*2]; /* two entries for each register */
};

/*
* AMD Extended Performance Monitoring and Debug cpuid feature detection
*/
#define EXT_PERFMON_DEBUG_FEATURES 0x80000022

/*
* IBS cpuid feature detection
*/
Expand Down

0 comments on commit 56e026a

Please sign in to comment.