diff options
| -rw-r--r-- | arch/x86/events/amd/core.c | 39 | ||||
| -rw-r--r-- | arch/x86/events/amd/lbr.c | 16 | ||||
| -rw-r--r-- | arch/x86/include/asm/cpufeature.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/cpufeatures.h | 10 | ||||
| -rw-r--r-- | arch/x86/include/asm/disabled-features.h | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/required-features.h | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/scattered.c | 1 | 
7 files changed, 62 insertions, 16 deletions
| diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c index aec16e581f5b..985ef3b47919 100644 --- a/arch/x86/events/amd/core.c +++ b/arch/x86/events/amd/core.c @@ -250,7 +250,7 @@ static const u64 amd_perfmon_event_map[PERF_COUNT_HW_MAX] =  /*   * AMD Performance Monitor Family 17h and later:   */ -static const u64 amd_f17h_perfmon_event_map[PERF_COUNT_HW_MAX] = +static const u64 amd_zen1_perfmon_event_map[PERF_COUNT_HW_MAX] =  {  	[PERF_COUNT_HW_CPU_CYCLES]		= 0x0076,  	[PERF_COUNT_HW_INSTRUCTIONS]		= 0x00c0, @@ -262,10 +262,39 @@ static const u64 amd_f17h_perfmon_event_map[PERF_COUNT_HW_MAX] =  	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND]	= 0x0187,  }; +static const u64 amd_zen2_perfmon_event_map[PERF_COUNT_HW_MAX] = +{ +	[PERF_COUNT_HW_CPU_CYCLES]		= 0x0076, +	[PERF_COUNT_HW_INSTRUCTIONS]		= 0x00c0, +	[PERF_COUNT_HW_CACHE_REFERENCES]	= 0xff60, +	[PERF_COUNT_HW_CACHE_MISSES]		= 0x0964, +	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS]	= 0x00c2, +	[PERF_COUNT_HW_BRANCH_MISSES]		= 0x00c3, +	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND]	= 0x00a9, +}; + +static const u64 amd_zen4_perfmon_event_map[PERF_COUNT_HW_MAX] = +{ +	[PERF_COUNT_HW_CPU_CYCLES]		= 0x0076, +	[PERF_COUNT_HW_INSTRUCTIONS]		= 0x00c0, +	[PERF_COUNT_HW_CACHE_REFERENCES]	= 0xff60, +	[PERF_COUNT_HW_CACHE_MISSES]		= 0x0964, +	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS]	= 0x00c2, +	[PERF_COUNT_HW_BRANCH_MISSES]		= 0x00c3, +	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND]	= 0x00a9, +	[PERF_COUNT_HW_REF_CPU_CYCLES]		= 0x100000120, +}; +  static u64 amd_pmu_event_map(int hw_event)  { -	if (boot_cpu_data.x86 >= 0x17) -		return amd_f17h_perfmon_event_map[hw_event]; +	if (cpu_feature_enabled(X86_FEATURE_ZEN4) || boot_cpu_data.x86 >= 0x1a) +		return amd_zen4_perfmon_event_map[hw_event]; + +	if (cpu_feature_enabled(X86_FEATURE_ZEN2) || boot_cpu_data.x86 >= 0x19) +		return amd_zen2_perfmon_event_map[hw_event]; + +	if (cpu_feature_enabled(X86_FEATURE_ZEN1)) +		return amd_zen1_perfmon_event_map[hw_event];  	return amd_perfmon_event_map[hw_event];  } @@ -904,8 +933,8 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)  	if (!status)  		goto done; -	/* Read branch records before unfreezing */ -	if (status & GLOBAL_STATUS_LBRS_FROZEN) { +	/* Read branch records */ +	if (x86_pmu.lbr_nr) {  		amd_pmu_lbr_read();  		status &= ~GLOBAL_STATUS_LBRS_FROZEN;  	} diff --git a/arch/x86/events/amd/lbr.c b/arch/x86/events/amd/lbr.c index 4a1e600314d5..5149830c7c4f 100644 --- a/arch/x86/events/amd/lbr.c +++ b/arch/x86/events/amd/lbr.c @@ -402,10 +402,12 @@ void amd_pmu_lbr_enable_all(void)  		wrmsrl(MSR_AMD64_LBR_SELECT, lbr_select);  	} -	rdmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl); -	rdmsrl(MSR_AMD_DBG_EXTN_CFG, dbg_extn_cfg); +	if (cpu_feature_enabled(X86_FEATURE_AMD_LBR_PMC_FREEZE)) { +		rdmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl); +		wrmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl | DEBUGCTLMSR_FREEZE_LBRS_ON_PMI); +	} -	wrmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl | DEBUGCTLMSR_FREEZE_LBRS_ON_PMI); +	rdmsrl(MSR_AMD_DBG_EXTN_CFG, dbg_extn_cfg);  	wrmsrl(MSR_AMD_DBG_EXTN_CFG, dbg_extn_cfg | DBG_EXTN_CFG_LBRV2EN);  } @@ -418,10 +420,12 @@ void amd_pmu_lbr_disable_all(void)  		return;  	rdmsrl(MSR_AMD_DBG_EXTN_CFG, dbg_extn_cfg); -	rdmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl); -  	wrmsrl(MSR_AMD_DBG_EXTN_CFG, dbg_extn_cfg & ~DBG_EXTN_CFG_LBRV2EN); -	wrmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl & ~DEBUGCTLMSR_FREEZE_LBRS_ON_PMI); + +	if (cpu_feature_enabled(X86_FEATURE_AMD_LBR_PMC_FREEZE)) { +		rdmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl); +		wrmsrl(MSR_IA32_DEBUGCTLMSR, dbg_ctl & ~DEBUGCTLMSR_FREEZE_LBRS_ON_PMI); +	}  }  __init int amd_pmu_lbr_init(void) diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index a1273698fc43..42157ddcc09d 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -91,8 +91,9 @@ extern const char * const x86_bug_flags[NBUGINTS*32];  	   CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 18, feature_bit) ||	\  	   CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 19, feature_bit) ||	\  	   CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 20, feature_bit) ||	\ +	   CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 21, feature_bit) ||	\  	   REQUIRED_MASK_CHECK					  ||	\ -	   BUILD_BUG_ON_ZERO(NCAPINTS != 21)) +	   BUILD_BUG_ON_ZERO(NCAPINTS != 22))  #define DISABLED_MASK_BIT_SET(feature_bit)				\  	 ( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK,  0, feature_bit) ||	\ @@ -116,8 +117,9 @@ extern const char * const x86_bug_flags[NBUGINTS*32];  	   CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 18, feature_bit) ||	\  	   CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 19, feature_bit) ||	\  	   CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 20, feature_bit) ||	\ +	   CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 21, feature_bit) ||	\  	   DISABLED_MASK_CHECK					  ||	\ -	   BUILD_BUG_ON_ZERO(NCAPINTS != 21)) +	   BUILD_BUG_ON_ZERO(NCAPINTS != 22))  #define cpu_has(c, bit)							\  	(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 :	\ diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index f0337f7bcf16..a38f8f9ba657 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -13,7 +13,7 @@  /*   * Defines x86 CPU feature bits   */ -#define NCAPINTS			21	   /* N 32-bit words worth of info */ +#define NCAPINTS			22	   /* N 32-bit words worth of info */  #define NBUGINTS			2	   /* N 32-bit bug flags */  /* @@ -460,6 +460,14 @@  #define X86_FEATURE_SRSO_NO		(20*32+29) /* "" CPU is not affected by SRSO */  /* + * Extended auxiliary flags: Linux defined - for features scattered in various + * CPUID levels like 0x80000022, etc. + * + * Reuse free bits when adding new feature flags! + */ +#define X86_FEATURE_AMD_LBR_PMC_FREEZE	(21*32+ 0) /* AMD LBR and PMC Freeze */ + +/*   * BUG word(s)   */  #define X86_BUG(x)			(NCAPINTS*32 + (x)) diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h index da4054fbf533..c492bdc97b05 100644 --- a/arch/x86/include/asm/disabled-features.h +++ b/arch/x86/include/asm/disabled-features.h @@ -155,6 +155,7 @@  #define DISABLED_MASK18	(DISABLE_IBT)  #define DISABLED_MASK19	(DISABLE_SEV_SNP)  #define DISABLED_MASK20	0 -#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 21) +#define DISABLED_MASK21	0 +#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)  #endif /* _ASM_X86_DISABLED_FEATURES_H */ diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h index 7ba1726b71c7..e9187ddd3d1f 100644 --- a/arch/x86/include/asm/required-features.h +++ b/arch/x86/include/asm/required-features.h @@ -99,6 +99,7 @@  #define REQUIRED_MASK18	0  #define REQUIRED_MASK19	0  #define REQUIRED_MASK20	0 -#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 21) +#define REQUIRED_MASK21	0 +#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)  #endif /* _ASM_X86_REQUIRED_FEATURES_H */ diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index 0dad49a09b7a..a515328d9d7d 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c @@ -49,6 +49,7 @@ static const struct cpuid_bit cpuid_bits[] = {  	{ X86_FEATURE_BMEC,		CPUID_EBX,  3, 0x80000020, 0 },  	{ X86_FEATURE_PERFMON_V2,	CPUID_EAX,  0, 0x80000022, 0 },  	{ X86_FEATURE_AMD_LBR_V2,	CPUID_EAX,  1, 0x80000022, 0 }, +	{ X86_FEATURE_AMD_LBR_PMC_FREEZE,	CPUID_EAX,  2, 0x80000022, 0 },  	{ 0, 0, 0, 0, 0 }  }; |