[PATCH v7 073/120] perf/x86/intel: Use parsed CPUID(0x15)

From: Ahmed S. Darwish

Date: Thu May 28 2026 - 12:27:23 EST


Use parsed CPUID(0x15) instead of a direct CPUID query and raw register
access.

Remove the maximum CPUID level check as it is implied by the CPUID API not
returning NULL.

Remove the excessive details regarding CPUID(0x15).EBX being zero since it
is not relevant to the actual code beneath it. The code only caches the
TSC to core crystal clock ration numerator and denominator.

Signed-off-by: Ahmed S. Darwish <darwi@xxxxxxxxxxxxx>
---
arch/x86/events/intel/pt.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
index b5726b50e77d..b938acac9cee 100644
--- a/arch/x86/events/intel/pt.c
+++ b/arch/x86/events/intel/pt.c
@@ -189,6 +189,7 @@ static const struct attribute_group *pt_attr_groups[] = {

static int __init pt_pmu_hw_init(void)
{
+ const struct leaf_0x15_0 *l15;
struct dev_ext_attribute *de_attrs;
struct attribute **attrs;
size_t size;
@@ -199,18 +200,11 @@ static int __init pt_pmu_hw_init(void)
rdmsrq(MSR_PLATFORM_INFO, reg);
pt_pmu.max_nonturbo_ratio = (reg & 0xff00) >> 8;

- /*
- * if available, read in TSC to core crystal clock ratio,
- * otherwise, zero for numerator stands for "not enumerated"
- * as per SDM
- */
- if (boot_cpu_data.cpuid_level >= CPUID_LEAF_TSC) {
- u32 eax, ebx, ecx, edx;
-
- cpuid(CPUID_LEAF_TSC, &eax, &ebx, &ecx, &edx);
-
- pt_pmu.tsc_art_num = ebx;
- pt_pmu.tsc_art_den = eax;
+ /* Save the TSC to core crystal clock ratio, if available */
+ l15 = cpuid_leaf(&boot_cpu_data, 0x15);
+ if (l15) {
+ pt_pmu.tsc_art_num = l15->tsc_numerator;
+ pt_pmu.tsc_art_den = l15->tsc_denominator;
}

/* model-specific quirks */
--
2.54.0