xref: /openbmc/linux/arch/x86/events/intel/pt.h (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2fd1c601cSBorislav Petkov /*
3fd1c601cSBorislav Petkov  * Intel(R) Processor Trace PMU driver for perf
4fd1c601cSBorislav Petkov  * Copyright (c) 2013-2014, Intel Corporation.
5fd1c601cSBorislav Petkov  *
6fd1c601cSBorislav Petkov  * Intel PT is specified in the Intel Architecture Instruction Set Extensions
7fd1c601cSBorislav Petkov  * Programming Reference:
8fd1c601cSBorislav Petkov  * http://software.intel.com/en-us/intel-isa-extensions
9fd1c601cSBorislav Petkov  */
10fd1c601cSBorislav Petkov 
11fd1c601cSBorislav Petkov #ifndef __INTEL_PT_H__
12fd1c601cSBorislav Petkov #define __INTEL_PT_H__
13fd1c601cSBorislav Petkov 
14fd1c601cSBorislav Petkov /*
15fd1c601cSBorislav Petkov  * Single-entry ToPA: when this close to region boundary, switch
16fd1c601cSBorislav Petkov  * buffers to avoid losing data.
17fd1c601cSBorislav Petkov  */
18fd1c601cSBorislav Petkov #define TOPA_PMI_MARGIN 512
19fd1c601cSBorislav Petkov 
20fd1c601cSBorislav Petkov #define TOPA_SHIFT 12
21fd1c601cSBorislav Petkov 
sizes(unsigned int tsz)22fd1c601cSBorislav Petkov static inline unsigned int sizes(unsigned int tsz)
23fd1c601cSBorislav Petkov {
24fd1c601cSBorislav Petkov 	return 1 << (tsz + TOPA_SHIFT);
25fd1c601cSBorislav Petkov };
26fd1c601cSBorislav Petkov 
27fd1c601cSBorislav Petkov struct topa_entry {
28fd1c601cSBorislav Petkov 	u64	end	: 1;
29fd1c601cSBorislav Petkov 	u64	rsvd0	: 1;
30fd1c601cSBorislav Petkov 	u64	intr	: 1;
31fd1c601cSBorislav Petkov 	u64	rsvd1	: 1;
32fd1c601cSBorislav Petkov 	u64	stop	: 1;
33fd1c601cSBorislav Petkov 	u64	rsvd2	: 1;
34fd1c601cSBorislav Petkov 	u64	size	: 4;
35fd1c601cSBorislav Petkov 	u64	rsvd3	: 2;
368f5f3db3SMarco Cavenati 	u64	base	: 40;
378f5f3db3SMarco Cavenati 	u64	rsvd4	: 12;
38fd1c601cSBorislav Petkov };
39fd1c601cSBorislav Petkov 
4065c7e6f1SAlexander Shishkin /* TSC to Core Crystal Clock Ratio */
4165c7e6f1SAlexander Shishkin #define CPUID_TSC_LEAF		0x15
4265c7e6f1SAlexander Shishkin 
43fd1c601cSBorislav Petkov struct pt_pmu {
44fd1c601cSBorislav Petkov 	struct pmu		pmu;
45fd1c601cSBorislav Petkov 	u32			caps[PT_CPUID_REGS_NUM * PT_CPUID_LEAVES];
461c5ac21aSAlexander Shishkin 	bool			vmx;
47d35869baSAlexander Shishkin 	bool			branch_en_always_on;
4865c7e6f1SAlexander Shishkin 	unsigned long		max_nonturbo_ratio;
4965c7e6f1SAlexander Shishkin 	unsigned int		tsc_art_num;
5065c7e6f1SAlexander Shishkin 	unsigned int		tsc_art_den;
51fd1c601cSBorislav Petkov };
52fd1c601cSBorislav Petkov 
53fd1c601cSBorislav Petkov /**
54fd1c601cSBorislav Petkov  * struct pt_buffer - buffer configuration; one buffer per task_struct or
55fd1c601cSBorislav Petkov  *		cpu, depending on perf event configuration
56fd1c601cSBorislav Petkov  * @tables:	list of ToPA tables in this buffer
57fd1c601cSBorislav Petkov  * @first:	shorthand for first topa table
58fd1c601cSBorislav Petkov  * @last:	shorthand for last topa table
59fd1c601cSBorislav Petkov  * @cur:	current topa table
60fd1c601cSBorislav Petkov  * @nr_pages:	buffer size in pages
61fd1c601cSBorislav Petkov  * @cur_idx:	current output region's index within @cur table
62fd1c601cSBorislav Petkov  * @output_off:	offset within the current output region
63fd1c601cSBorislav Petkov  * @data_size:	running total of the amount of data in this buffer
64fd1c601cSBorislav Petkov  * @lost:	if data was lost/truncated
65fd1c601cSBorislav Petkov  * @head:	logical write offset inside the buffer
66fd1c601cSBorislav Petkov  * @snapshot:	if this is for a snapshot/overwrite counter
6767063847SAlexander Shishkin  * @single:	use Single Range Output instead of ToPA
68*e68ca7daSAdrian Hunter  * @wrapped:	buffer advance wrapped back to the first topa table
6939152ee5SAlexander Shishkin  * @stop_pos:	STOP topa entry index
7039152ee5SAlexander Shishkin  * @intr_pos:	INT topa entry index
7139152ee5SAlexander Shishkin  * @stop_te:	STOP topa entry pointer
7239152ee5SAlexander Shishkin  * @intr_te:	INT topa entry pointer
73fd1c601cSBorislav Petkov  * @data_pages:	array of pages from perf
74fd1c601cSBorislav Petkov  * @topa_index:	table of topa entries indexed by page offset
75fd1c601cSBorislav Petkov  */
76fd1c601cSBorislav Petkov struct pt_buffer {
77fd1c601cSBorislav Petkov 	struct list_head	tables;
78fd1c601cSBorislav Petkov 	struct topa		*first, *last, *cur;
79fd1c601cSBorislav Petkov 	unsigned int		cur_idx;
80fd1c601cSBorislav Petkov 	size_t			output_off;
81fd1c601cSBorislav Petkov 	unsigned long		nr_pages;
82fd1c601cSBorislav Petkov 	local_t			data_size;
83fd1c601cSBorislav Petkov 	local64_t		head;
84fd1c601cSBorislav Petkov 	bool			snapshot;
8567063847SAlexander Shishkin 	bool			single;
86*e68ca7daSAdrian Hunter 	bool			wrapped;
8739152ee5SAlexander Shishkin 	long			stop_pos, intr_pos;
8839152ee5SAlexander Shishkin 	struct topa_entry	*stop_te, *intr_te;
89fd1c601cSBorislav Petkov 	void			**data_pages;
90fd1c601cSBorislav Petkov };
91fd1c601cSBorislav Petkov 
92eadf48caSAlexander Shishkin #define PT_FILTERS_NUM	4
93eadf48caSAlexander Shishkin 
94eadf48caSAlexander Shishkin /**
95eadf48caSAlexander Shishkin  * struct pt_filter - IP range filter configuration
96eadf48caSAlexander Shishkin  * @msr_a:	range start, goes to RTIT_ADDRn_A
97eadf48caSAlexander Shishkin  * @msr_b:	range end, goes to RTIT_ADDRn_B
98eadf48caSAlexander Shishkin  * @config:	4-bit field in RTIT_CTL
99eadf48caSAlexander Shishkin  */
100eadf48caSAlexander Shishkin struct pt_filter {
101eadf48caSAlexander Shishkin 	unsigned long	msr_a;
102eadf48caSAlexander Shishkin 	unsigned long	msr_b;
103eadf48caSAlexander Shishkin 	unsigned long	config;
104eadf48caSAlexander Shishkin };
105eadf48caSAlexander Shishkin 
106eadf48caSAlexander Shishkin /**
107eadf48caSAlexander Shishkin  * struct pt_filters - IP range filtering context
108eadf48caSAlexander Shishkin  * @filter:	filters defined for this context
109eadf48caSAlexander Shishkin  * @nr_filters:	number of defined filters in the @filter array
110eadf48caSAlexander Shishkin  */
111eadf48caSAlexander Shishkin struct pt_filters {
112eadf48caSAlexander Shishkin 	struct pt_filter	filter[PT_FILTERS_NUM];
113eadf48caSAlexander Shishkin 	unsigned int		nr_filters;
114eadf48caSAlexander Shishkin };
115eadf48caSAlexander Shishkin 
116fd1c601cSBorislav Petkov /**
117fd1c601cSBorislav Petkov  * struct pt - per-cpu pt context
118fd1c601cSBorislav Petkov  * @handle:		perf output handle
119eadf48caSAlexander Shishkin  * @filters:		last configured filters
120fd1c601cSBorislav Petkov  * @handle_nmi:		do handle PT PMI on this cpu, there's an active event
1211c5ac21aSAlexander Shishkin  * @vmx_on:		1 if VMX is ON on this cpu
122295c52eeSAlexander Shishkin  * @output_base:	cached RTIT_OUTPUT_BASE MSR value
123295c52eeSAlexander Shishkin  * @output_mask:	cached RTIT_OUTPUT_MASK MSR value
124fd1c601cSBorislav Petkov  */
125fd1c601cSBorislav Petkov struct pt {
126fd1c601cSBorislav Petkov 	struct perf_output_handle handle;
127eadf48caSAlexander Shishkin 	struct pt_filters	filters;
128fd1c601cSBorislav Petkov 	int			handle_nmi;
1291c5ac21aSAlexander Shishkin 	int			vmx_on;
130295c52eeSAlexander Shishkin 	u64			output_base;
131295c52eeSAlexander Shishkin 	u64			output_mask;
132fd1c601cSBorislav Petkov };
133fd1c601cSBorislav Petkov 
134fd1c601cSBorislav Petkov #endif /* __INTEL_PT_H__ */
135