1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Performance events x86 architecture header
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
5*4882a593Smuzhiyun * Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
6*4882a593Smuzhiyun * Copyright (C) 2009 Jaswinder Singh Rajput
7*4882a593Smuzhiyun * Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
8*4882a593Smuzhiyun * Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra
9*4882a593Smuzhiyun * Copyright (C) 2009 Intel Corporation, <markus.t.metzger@intel.com>
10*4882a593Smuzhiyun * Copyright (C) 2009 Google, Inc., Stephane Eranian
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * For licencing details see kernel-base/COPYING
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include <linux/perf_event.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <asm/intel_ds.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun /* To enable MSR tracing please use the generic trace points. */
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun * | NHM/WSM | SNB |
23*4882a593Smuzhiyun * register -------------------------------
24*4882a593Smuzhiyun * | HT | no HT | HT | no HT |
25*4882a593Smuzhiyun *-----------------------------------------
26*4882a593Smuzhiyun * offcore | core | core | cpu | core |
27*4882a593Smuzhiyun * lbr_sel | core | core | cpu | core |
28*4882a593Smuzhiyun * ld_lat | cpu | core | cpu | core |
29*4882a593Smuzhiyun *-----------------------------------------
30*4882a593Smuzhiyun *
31*4882a593Smuzhiyun * Given that there is a small number of shared regs,
32*4882a593Smuzhiyun * we can pre-allocate their slot in the per-cpu
33*4882a593Smuzhiyun * per-core reg tables.
34*4882a593Smuzhiyun */
35*4882a593Smuzhiyun enum extra_reg_type {
36*4882a593Smuzhiyun EXTRA_REG_NONE = -1, /* not used */
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun EXTRA_REG_RSP_0 = 0, /* offcore_response_0 */
39*4882a593Smuzhiyun EXTRA_REG_RSP_1 = 1, /* offcore_response_1 */
40*4882a593Smuzhiyun EXTRA_REG_LBR = 2, /* lbr_select */
41*4882a593Smuzhiyun EXTRA_REG_LDLAT = 3, /* ld_lat_threshold */
42*4882a593Smuzhiyun EXTRA_REG_FE = 4, /* fe_* */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun EXTRA_REG_MAX /* number of entries needed */
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct event_constraint {
48*4882a593Smuzhiyun union {
49*4882a593Smuzhiyun unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
50*4882a593Smuzhiyun u64 idxmsk64;
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun u64 code;
53*4882a593Smuzhiyun u64 cmask;
54*4882a593Smuzhiyun int weight;
55*4882a593Smuzhiyun int overlap;
56*4882a593Smuzhiyun int flags;
57*4882a593Smuzhiyun unsigned int size;
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun
constraint_match(struct event_constraint * c,u64 ecode)60*4882a593Smuzhiyun static inline bool constraint_match(struct event_constraint *c, u64 ecode)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun return ((ecode & c->cmask) - c->code) <= (u64)c->size;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun * struct hw_perf_event.flags flags
67*4882a593Smuzhiyun */
68*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_LDLAT 0x0001 /* ld+ldlat data address sampling */
69*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_ST 0x0002 /* st data address sampling */
70*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_ST_HSW 0x0004 /* haswell style datala, store */
71*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_LD_HSW 0x0008 /* haswell style datala, load */
72*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_NA_HSW 0x0010 /* haswell style datala, unknown */
73*4882a593Smuzhiyun #define PERF_X86_EVENT_EXCL 0x0020 /* HT exclusivity on counter */
74*4882a593Smuzhiyun #define PERF_X86_EVENT_DYNAMIC 0x0040 /* dynamic alloc'd constraint */
75*4882a593Smuzhiyun #define PERF_X86_EVENT_RDPMC_ALLOWED 0x0080 /* grant rdpmc permission */
76*4882a593Smuzhiyun #define PERF_X86_EVENT_EXCL_ACCT 0x0100 /* accounted EXCL event */
77*4882a593Smuzhiyun #define PERF_X86_EVENT_AUTO_RELOAD 0x0200 /* use PEBS auto-reload */
78*4882a593Smuzhiyun #define PERF_X86_EVENT_LARGE_PEBS 0x0400 /* use large PEBS */
79*4882a593Smuzhiyun #define PERF_X86_EVENT_PEBS_VIA_PT 0x0800 /* use PT buffer for PEBS */
80*4882a593Smuzhiyun #define PERF_X86_EVENT_PAIR 0x1000 /* Large Increment per Cycle */
81*4882a593Smuzhiyun #define PERF_X86_EVENT_LBR_SELECT 0x2000 /* Save/Restore MSR_LBR_SELECT */
82*4882a593Smuzhiyun #define PERF_X86_EVENT_TOPDOWN 0x4000 /* Count Topdown slots/metrics events */
83*4882a593Smuzhiyun
is_topdown_count(struct perf_event * event)84*4882a593Smuzhiyun static inline bool is_topdown_count(struct perf_event *event)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun return event->hw.flags & PERF_X86_EVENT_TOPDOWN;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
is_metric_event(struct perf_event * event)89*4882a593Smuzhiyun static inline bool is_metric_event(struct perf_event *event)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun u64 config = event->attr.config;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun return ((config & ARCH_PERFMON_EVENTSEL_EVENT) == 0) &&
94*4882a593Smuzhiyun ((config & INTEL_ARCH_EVENT_MASK) >= INTEL_TD_METRIC_RETIRING) &&
95*4882a593Smuzhiyun ((config & INTEL_ARCH_EVENT_MASK) <= INTEL_TD_METRIC_MAX);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
is_slots_event(struct perf_event * event)98*4882a593Smuzhiyun static inline bool is_slots_event(struct perf_event *event)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun return (event->attr.config & INTEL_ARCH_EVENT_MASK) == INTEL_TD_SLOTS;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
is_topdown_event(struct perf_event * event)103*4882a593Smuzhiyun static inline bool is_topdown_event(struct perf_event *event)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun return is_metric_event(event) || is_slots_event(event);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun struct amd_nb {
109*4882a593Smuzhiyun int nb_id; /* NorthBridge id */
110*4882a593Smuzhiyun int refcnt; /* reference count */
111*4882a593Smuzhiyun struct perf_event *owners[X86_PMC_IDX_MAX];
112*4882a593Smuzhiyun struct event_constraint event_constraints[X86_PMC_IDX_MAX];
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun #define PEBS_COUNTER_MASK ((1ULL << MAX_PEBS_EVENTS) - 1)
116*4882a593Smuzhiyun #define PEBS_PMI_AFTER_EACH_RECORD BIT_ULL(60)
117*4882a593Smuzhiyun #define PEBS_OUTPUT_OFFSET 61
118*4882a593Smuzhiyun #define PEBS_OUTPUT_MASK (3ull << PEBS_OUTPUT_OFFSET)
119*4882a593Smuzhiyun #define PEBS_OUTPUT_PT (1ull << PEBS_OUTPUT_OFFSET)
120*4882a593Smuzhiyun #define PEBS_VIA_PT_MASK (PEBS_OUTPUT_PT | PEBS_PMI_AFTER_EACH_RECORD)
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /*
123*4882a593Smuzhiyun * Flags PEBS can handle without an PMI.
124*4882a593Smuzhiyun *
125*4882a593Smuzhiyun * TID can only be handled by flushing at context switch.
126*4882a593Smuzhiyun * REGS_USER can be handled for events limited to ring 3.
127*4882a593Smuzhiyun *
128*4882a593Smuzhiyun */
129*4882a593Smuzhiyun #define LARGE_PEBS_FLAGS \
130*4882a593Smuzhiyun (PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_ADDR | \
131*4882a593Smuzhiyun PERF_SAMPLE_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_STREAM_ID | \
132*4882a593Smuzhiyun PERF_SAMPLE_DATA_SRC | PERF_SAMPLE_IDENTIFIER | \
133*4882a593Smuzhiyun PERF_SAMPLE_TRANSACTION | PERF_SAMPLE_PHYS_ADDR | \
134*4882a593Smuzhiyun PERF_SAMPLE_REGS_INTR | PERF_SAMPLE_REGS_USER | \
135*4882a593Smuzhiyun PERF_SAMPLE_PERIOD)
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun #define PEBS_GP_REGS \
138*4882a593Smuzhiyun ((1ULL << PERF_REG_X86_AX) | \
139*4882a593Smuzhiyun (1ULL << PERF_REG_X86_BX) | \
140*4882a593Smuzhiyun (1ULL << PERF_REG_X86_CX) | \
141*4882a593Smuzhiyun (1ULL << PERF_REG_X86_DX) | \
142*4882a593Smuzhiyun (1ULL << PERF_REG_X86_DI) | \
143*4882a593Smuzhiyun (1ULL << PERF_REG_X86_SI) | \
144*4882a593Smuzhiyun (1ULL << PERF_REG_X86_SP) | \
145*4882a593Smuzhiyun (1ULL << PERF_REG_X86_BP) | \
146*4882a593Smuzhiyun (1ULL << PERF_REG_X86_IP) | \
147*4882a593Smuzhiyun (1ULL << PERF_REG_X86_FLAGS) | \
148*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R8) | \
149*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R9) | \
150*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R10) | \
151*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R11) | \
152*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R12) | \
153*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R13) | \
154*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R14) | \
155*4882a593Smuzhiyun (1ULL << PERF_REG_X86_R15))
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /*
158*4882a593Smuzhiyun * Per register state.
159*4882a593Smuzhiyun */
160*4882a593Smuzhiyun struct er_account {
161*4882a593Smuzhiyun raw_spinlock_t lock; /* per-core: protect structure */
162*4882a593Smuzhiyun u64 config; /* extra MSR config */
163*4882a593Smuzhiyun u64 reg; /* extra MSR number */
164*4882a593Smuzhiyun atomic_t ref; /* reference count */
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /*
168*4882a593Smuzhiyun * Per core/cpu state
169*4882a593Smuzhiyun *
170*4882a593Smuzhiyun * Used to coordinate shared registers between HT threads or
171*4882a593Smuzhiyun * among events on a single PMU.
172*4882a593Smuzhiyun */
173*4882a593Smuzhiyun struct intel_shared_regs {
174*4882a593Smuzhiyun struct er_account regs[EXTRA_REG_MAX];
175*4882a593Smuzhiyun int refcnt; /* per-core: #HT threads */
176*4882a593Smuzhiyun unsigned core_id; /* per-core: core id */
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun enum intel_excl_state_type {
180*4882a593Smuzhiyun INTEL_EXCL_UNUSED = 0, /* counter is unused */
181*4882a593Smuzhiyun INTEL_EXCL_SHARED = 1, /* counter can be used by both threads */
182*4882a593Smuzhiyun INTEL_EXCL_EXCLUSIVE = 2, /* counter can be used by one thread only */
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun struct intel_excl_states {
186*4882a593Smuzhiyun enum intel_excl_state_type state[X86_PMC_IDX_MAX];
187*4882a593Smuzhiyun bool sched_started; /* true if scheduling has started */
188*4882a593Smuzhiyun };
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun struct intel_excl_cntrs {
191*4882a593Smuzhiyun raw_spinlock_t lock;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun struct intel_excl_states states[2];
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun union {
196*4882a593Smuzhiyun u16 has_exclusive[2];
197*4882a593Smuzhiyun u32 exclusive_present;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun int refcnt; /* per-core: #HT threads */
201*4882a593Smuzhiyun unsigned core_id; /* per-core: core id */
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun struct x86_perf_task_context;
205*4882a593Smuzhiyun #define MAX_LBR_ENTRIES 32
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun enum {
208*4882a593Smuzhiyun LBR_FORMAT_32 = 0x00,
209*4882a593Smuzhiyun LBR_FORMAT_LIP = 0x01,
210*4882a593Smuzhiyun LBR_FORMAT_EIP = 0x02,
211*4882a593Smuzhiyun LBR_FORMAT_EIP_FLAGS = 0x03,
212*4882a593Smuzhiyun LBR_FORMAT_EIP_FLAGS2 = 0x04,
213*4882a593Smuzhiyun LBR_FORMAT_INFO = 0x05,
214*4882a593Smuzhiyun LBR_FORMAT_TIME = 0x06,
215*4882a593Smuzhiyun LBR_FORMAT_MAX_KNOWN = LBR_FORMAT_TIME,
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun enum {
219*4882a593Smuzhiyun X86_PERF_KFREE_SHARED = 0,
220*4882a593Smuzhiyun X86_PERF_KFREE_EXCL = 1,
221*4882a593Smuzhiyun X86_PERF_KFREE_MAX
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun struct cpu_hw_events {
225*4882a593Smuzhiyun /*
226*4882a593Smuzhiyun * Generic x86 PMC bits
227*4882a593Smuzhiyun */
228*4882a593Smuzhiyun struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */
229*4882a593Smuzhiyun unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
230*4882a593Smuzhiyun unsigned long running[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
231*4882a593Smuzhiyun int enabled;
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun int n_events; /* the # of events in the below arrays */
234*4882a593Smuzhiyun int n_added; /* the # last events in the below arrays;
235*4882a593Smuzhiyun they've never been enabled yet */
236*4882a593Smuzhiyun int n_txn; /* the # last events in the below arrays;
237*4882a593Smuzhiyun added in the current transaction */
238*4882a593Smuzhiyun int n_txn_pair;
239*4882a593Smuzhiyun int n_txn_metric;
240*4882a593Smuzhiyun int assign[X86_PMC_IDX_MAX]; /* event to counter assignment */
241*4882a593Smuzhiyun u64 tags[X86_PMC_IDX_MAX];
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun struct perf_event *event_list[X86_PMC_IDX_MAX]; /* in enabled order */
244*4882a593Smuzhiyun struct event_constraint *event_constraint[X86_PMC_IDX_MAX];
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun int n_excl; /* the number of exclusive events */
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun unsigned int txn_flags;
249*4882a593Smuzhiyun int is_fake;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /*
252*4882a593Smuzhiyun * Intel DebugStore bits
253*4882a593Smuzhiyun */
254*4882a593Smuzhiyun struct debug_store *ds;
255*4882a593Smuzhiyun void *ds_pebs_vaddr;
256*4882a593Smuzhiyun void *ds_bts_vaddr;
257*4882a593Smuzhiyun u64 pebs_enabled;
258*4882a593Smuzhiyun int n_pebs;
259*4882a593Smuzhiyun int n_large_pebs;
260*4882a593Smuzhiyun int n_pebs_via_pt;
261*4882a593Smuzhiyun int pebs_output;
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun /* Current super set of events hardware configuration */
264*4882a593Smuzhiyun u64 pebs_data_cfg;
265*4882a593Smuzhiyun u64 active_pebs_data_cfg;
266*4882a593Smuzhiyun int pebs_record_size;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun /*
269*4882a593Smuzhiyun * Intel LBR bits
270*4882a593Smuzhiyun */
271*4882a593Smuzhiyun int lbr_users;
272*4882a593Smuzhiyun int lbr_pebs_users;
273*4882a593Smuzhiyun struct perf_branch_stack lbr_stack;
274*4882a593Smuzhiyun struct perf_branch_entry lbr_entries[MAX_LBR_ENTRIES];
275*4882a593Smuzhiyun union {
276*4882a593Smuzhiyun struct er_account *lbr_sel;
277*4882a593Smuzhiyun struct er_account *lbr_ctl;
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun u64 br_sel;
280*4882a593Smuzhiyun void *last_task_ctx;
281*4882a593Smuzhiyun int last_log_id;
282*4882a593Smuzhiyun int lbr_select;
283*4882a593Smuzhiyun void *lbr_xsave;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun /*
286*4882a593Smuzhiyun * Intel host/guest exclude bits
287*4882a593Smuzhiyun */
288*4882a593Smuzhiyun u64 intel_ctrl_guest_mask;
289*4882a593Smuzhiyun u64 intel_ctrl_host_mask;
290*4882a593Smuzhiyun struct perf_guest_switch_msr guest_switch_msrs[X86_PMC_IDX_MAX];
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun /*
293*4882a593Smuzhiyun * Intel checkpoint mask
294*4882a593Smuzhiyun */
295*4882a593Smuzhiyun u64 intel_cp_status;
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun /*
298*4882a593Smuzhiyun * manage shared (per-core, per-cpu) registers
299*4882a593Smuzhiyun * used on Intel NHM/WSM/SNB
300*4882a593Smuzhiyun */
301*4882a593Smuzhiyun struct intel_shared_regs *shared_regs;
302*4882a593Smuzhiyun /*
303*4882a593Smuzhiyun * manage exclusive counter access between hyperthread
304*4882a593Smuzhiyun */
305*4882a593Smuzhiyun struct event_constraint *constraint_list; /* in enable order */
306*4882a593Smuzhiyun struct intel_excl_cntrs *excl_cntrs;
307*4882a593Smuzhiyun int excl_thread_id; /* 0 or 1 */
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun /*
310*4882a593Smuzhiyun * SKL TSX_FORCE_ABORT shadow
311*4882a593Smuzhiyun */
312*4882a593Smuzhiyun u64 tfa_shadow;
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /*
315*4882a593Smuzhiyun * Perf Metrics
316*4882a593Smuzhiyun */
317*4882a593Smuzhiyun /* number of accepted metrics events */
318*4882a593Smuzhiyun int n_metric;
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun /*
321*4882a593Smuzhiyun * AMD specific bits
322*4882a593Smuzhiyun */
323*4882a593Smuzhiyun struct amd_nb *amd_nb;
324*4882a593Smuzhiyun /* Inverted mask of bits to clear in the perf_ctr ctrl registers */
325*4882a593Smuzhiyun u64 perf_ctr_virt_mask;
326*4882a593Smuzhiyun int n_pair; /* Large increment events */
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun void *kfree_on_online[X86_PERF_KFREE_MAX];
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun struct pmu *pmu;
331*4882a593Smuzhiyun };
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun #define __EVENT_CONSTRAINT_RANGE(c, e, n, m, w, o, f) { \
334*4882a593Smuzhiyun { .idxmsk64 = (n) }, \
335*4882a593Smuzhiyun .code = (c), \
336*4882a593Smuzhiyun .size = (e) - (c), \
337*4882a593Smuzhiyun .cmask = (m), \
338*4882a593Smuzhiyun .weight = (w), \
339*4882a593Smuzhiyun .overlap = (o), \
340*4882a593Smuzhiyun .flags = f, \
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun #define __EVENT_CONSTRAINT(c, n, m, w, o, f) \
344*4882a593Smuzhiyun __EVENT_CONSTRAINT_RANGE(c, c, n, m, w, o, f)
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun #define EVENT_CONSTRAINT(c, n, m) \
347*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 0, 0)
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun /*
350*4882a593Smuzhiyun * The constraint_match() function only works for 'simple' event codes
351*4882a593Smuzhiyun * and not for extended (AMD64_EVENTSEL_EVENT) events codes.
352*4882a593Smuzhiyun */
353*4882a593Smuzhiyun #define EVENT_CONSTRAINT_RANGE(c, e, n, m) \
354*4882a593Smuzhiyun __EVENT_CONSTRAINT_RANGE(c, e, n, m, HWEIGHT(n), 0, 0)
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun #define INTEL_EXCLEVT_CONSTRAINT(c, n) \
357*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, ARCH_PERFMON_EVENTSEL_EVENT, HWEIGHT(n),\
358*4882a593Smuzhiyun 0, PERF_X86_EVENT_EXCL)
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun /*
361*4882a593Smuzhiyun * The overlap flag marks event constraints with overlapping counter
362*4882a593Smuzhiyun * masks. This is the case if the counter mask of such an event is not
363*4882a593Smuzhiyun * a subset of any other counter mask of a constraint with an equal or
364*4882a593Smuzhiyun * higher weight, e.g.:
365*4882a593Smuzhiyun *
366*4882a593Smuzhiyun * c_overlaps = EVENT_CONSTRAINT_OVERLAP(0, 0x09, 0);
367*4882a593Smuzhiyun * c_another1 = EVENT_CONSTRAINT(0, 0x07, 0);
368*4882a593Smuzhiyun * c_another2 = EVENT_CONSTRAINT(0, 0x38, 0);
369*4882a593Smuzhiyun *
370*4882a593Smuzhiyun * The event scheduler may not select the correct counter in the first
371*4882a593Smuzhiyun * cycle because it needs to know which subsequent events will be
372*4882a593Smuzhiyun * scheduled. It may fail to schedule the events then. So we set the
373*4882a593Smuzhiyun * overlap flag for such constraints to give the scheduler a hint which
374*4882a593Smuzhiyun * events to select for counter rescheduling.
375*4882a593Smuzhiyun *
376*4882a593Smuzhiyun * Care must be taken as the rescheduling algorithm is O(n!) which
377*4882a593Smuzhiyun * will increase scheduling cycles for an over-committed system
378*4882a593Smuzhiyun * dramatically. The number of such EVENT_CONSTRAINT_OVERLAP() macros
379*4882a593Smuzhiyun * and its counter masks must be kept at a minimum.
380*4882a593Smuzhiyun */
381*4882a593Smuzhiyun #define EVENT_CONSTRAINT_OVERLAP(c, n, m) \
382*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 1, 0)
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun /*
385*4882a593Smuzhiyun * Constraint on the Event code.
386*4882a593Smuzhiyun */
387*4882a593Smuzhiyun #define INTEL_EVENT_CONSTRAINT(c, n) \
388*4882a593Smuzhiyun EVENT_CONSTRAINT(c, n, ARCH_PERFMON_EVENTSEL_EVENT)
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun /*
391*4882a593Smuzhiyun * Constraint on a range of Event codes
392*4882a593Smuzhiyun */
393*4882a593Smuzhiyun #define INTEL_EVENT_CONSTRAINT_RANGE(c, e, n) \
394*4882a593Smuzhiyun EVENT_CONSTRAINT_RANGE(c, e, n, ARCH_PERFMON_EVENTSEL_EVENT)
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /*
397*4882a593Smuzhiyun * Constraint on the Event code + UMask + fixed-mask
398*4882a593Smuzhiyun *
399*4882a593Smuzhiyun * filter mask to validate fixed counter events.
400*4882a593Smuzhiyun * the following filters disqualify for fixed counters:
401*4882a593Smuzhiyun * - inv
402*4882a593Smuzhiyun * - edge
403*4882a593Smuzhiyun * - cnt-mask
404*4882a593Smuzhiyun * - in_tx
405*4882a593Smuzhiyun * - in_tx_checkpointed
406*4882a593Smuzhiyun * The other filters are supported by fixed counters.
407*4882a593Smuzhiyun * The any-thread option is supported starting with v3.
408*4882a593Smuzhiyun */
409*4882a593Smuzhiyun #define FIXED_EVENT_FLAGS (X86_RAW_EVENT_MASK|HSW_IN_TX|HSW_IN_TX_CHECKPOINTED)
410*4882a593Smuzhiyun #define FIXED_EVENT_CONSTRAINT(c, n) \
411*4882a593Smuzhiyun EVENT_CONSTRAINT(c, (1ULL << (32+n)), FIXED_EVENT_FLAGS)
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /*
414*4882a593Smuzhiyun * The special metric counters do not actually exist. They are calculated from
415*4882a593Smuzhiyun * the combination of the FxCtr3 + MSR_PERF_METRICS.
416*4882a593Smuzhiyun *
417*4882a593Smuzhiyun * The special metric counters are mapped to a dummy offset for the scheduler.
418*4882a593Smuzhiyun * The sharing between multiple users of the same metric without multiplexing
419*4882a593Smuzhiyun * is not allowed, even though the hardware supports that in principle.
420*4882a593Smuzhiyun */
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun #define METRIC_EVENT_CONSTRAINT(c, n) \
423*4882a593Smuzhiyun EVENT_CONSTRAINT(c, (1ULL << (INTEL_PMC_IDX_METRIC_BASE + n)), \
424*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK)
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun /*
427*4882a593Smuzhiyun * Constraint on the Event code + UMask
428*4882a593Smuzhiyun */
429*4882a593Smuzhiyun #define INTEL_UEVENT_CONSTRAINT(c, n) \
430*4882a593Smuzhiyun EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK)
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun /* Constraint on specific umask bit only + event */
433*4882a593Smuzhiyun #define INTEL_UBIT_EVENT_CONSTRAINT(c, n) \
434*4882a593Smuzhiyun EVENT_CONSTRAINT(c, n, ARCH_PERFMON_EVENTSEL_EVENT|(c))
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun /* Like UEVENT_CONSTRAINT, but match flags too */
437*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT(c, n) \
438*4882a593Smuzhiyun EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS)
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun #define INTEL_EXCLUEVT_CONSTRAINT(c, n) \
441*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK, \
442*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_EXCL)
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun #define INTEL_PLD_CONSTRAINT(c, n) \
445*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
446*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_LDLAT)
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun #define INTEL_PST_CONSTRAINT(c, n) \
449*4882a593Smuzhiyun __EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
450*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_ST)
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /* Event constraint, but match on all event flags too. */
453*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT(c, n) \
454*4882a593Smuzhiyun EVENT_CONSTRAINT(c, n, ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS)
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT_RANGE(c, e, n) \
457*4882a593Smuzhiyun EVENT_CONSTRAINT_RANGE(c, e, n, ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS)
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun /* Check only flags, but allow all event/umask */
460*4882a593Smuzhiyun #define INTEL_ALL_EVENT_CONSTRAINT(code, n) \
461*4882a593Smuzhiyun EVENT_CONSTRAINT(code, n, X86_ALL_EVENT_FLAGS)
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun /* Check flags and event code, and set the HSW store flag */
464*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_ST(code, n) \
465*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
466*4882a593Smuzhiyun ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS, \
467*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_ST_HSW)
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun /* Check flags and event code, and set the HSW load flag */
470*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_LD(code, n) \
471*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
472*4882a593Smuzhiyun ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS, \
473*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_LD_HSW)
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_LD_RANGE(code, end, n) \
476*4882a593Smuzhiyun __EVENT_CONSTRAINT_RANGE(code, end, n, \
477*4882a593Smuzhiyun ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS, \
478*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_LD_HSW)
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun #define INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_XLD(code, n) \
481*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
482*4882a593Smuzhiyun ARCH_PERFMON_EVENTSEL_EVENT|X86_ALL_EVENT_FLAGS, \
483*4882a593Smuzhiyun HWEIGHT(n), 0, \
484*4882a593Smuzhiyun PERF_X86_EVENT_PEBS_LD_HSW|PERF_X86_EVENT_EXCL)
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /* Check flags and event code/umask, and set the HSW store flag */
487*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(code, n) \
488*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
489*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
490*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_ST_HSW)
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_XST(code, n) \
493*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
494*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
495*4882a593Smuzhiyun HWEIGHT(n), 0, \
496*4882a593Smuzhiyun PERF_X86_EVENT_PEBS_ST_HSW|PERF_X86_EVENT_EXCL)
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* Check flags and event code/umask, and set the HSW load flag */
499*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(code, n) \
500*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
501*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
502*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_LD_HSW)
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_XLD(code, n) \
505*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
506*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
507*4882a593Smuzhiyun HWEIGHT(n), 0, \
508*4882a593Smuzhiyun PERF_X86_EVENT_PEBS_LD_HSW|PERF_X86_EVENT_EXCL)
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun /* Check flags and event code/umask, and set the HSW N/A flag */
511*4882a593Smuzhiyun #define INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_NA(code, n) \
512*4882a593Smuzhiyun __EVENT_CONSTRAINT(code, n, \
513*4882a593Smuzhiyun INTEL_ARCH_EVENT_MASK|X86_ALL_EVENT_FLAGS, \
514*4882a593Smuzhiyun HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_NA_HSW)
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun /*
518*4882a593Smuzhiyun * We define the end marker as having a weight of -1
519*4882a593Smuzhiyun * to enable blacklisting of events using a counter bitmask
520*4882a593Smuzhiyun * of zero and thus a weight of zero.
521*4882a593Smuzhiyun * The end marker has a weight that cannot possibly be
522*4882a593Smuzhiyun * obtained from counting the bits in the bitmask.
523*4882a593Smuzhiyun */
524*4882a593Smuzhiyun #define EVENT_CONSTRAINT_END { .weight = -1 }
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun /*
527*4882a593Smuzhiyun * Check for end marker with weight == -1
528*4882a593Smuzhiyun */
529*4882a593Smuzhiyun #define for_each_event_constraint(e, c) \
530*4882a593Smuzhiyun for ((e) = (c); (e)->weight != -1; (e)++)
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun /*
533*4882a593Smuzhiyun * Extra registers for specific events.
534*4882a593Smuzhiyun *
535*4882a593Smuzhiyun * Some events need large masks and require external MSRs.
536*4882a593Smuzhiyun * Those extra MSRs end up being shared for all events on
537*4882a593Smuzhiyun * a PMU and sometimes between PMU of sibling HT threads.
538*4882a593Smuzhiyun * In either case, the kernel needs to handle conflicting
539*4882a593Smuzhiyun * accesses to those extra, shared, regs. The data structure
540*4882a593Smuzhiyun * to manage those registers is stored in cpu_hw_event.
541*4882a593Smuzhiyun */
542*4882a593Smuzhiyun struct extra_reg {
543*4882a593Smuzhiyun unsigned int event;
544*4882a593Smuzhiyun unsigned int msr;
545*4882a593Smuzhiyun u64 config_mask;
546*4882a593Smuzhiyun u64 valid_mask;
547*4882a593Smuzhiyun int idx; /* per_xxx->regs[] reg index */
548*4882a593Smuzhiyun bool extra_msr_access;
549*4882a593Smuzhiyun };
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun #define EVENT_EXTRA_REG(e, ms, m, vm, i) { \
552*4882a593Smuzhiyun .event = (e), \
553*4882a593Smuzhiyun .msr = (ms), \
554*4882a593Smuzhiyun .config_mask = (m), \
555*4882a593Smuzhiyun .valid_mask = (vm), \
556*4882a593Smuzhiyun .idx = EXTRA_REG_##i, \
557*4882a593Smuzhiyun .extra_msr_access = true, \
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun #define INTEL_EVENT_EXTRA_REG(event, msr, vm, idx) \
561*4882a593Smuzhiyun EVENT_EXTRA_REG(event, msr, ARCH_PERFMON_EVENTSEL_EVENT, vm, idx)
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun #define INTEL_UEVENT_EXTRA_REG(event, msr, vm, idx) \
564*4882a593Smuzhiyun EVENT_EXTRA_REG(event, msr, ARCH_PERFMON_EVENTSEL_EVENT | \
565*4882a593Smuzhiyun ARCH_PERFMON_EVENTSEL_UMASK, vm, idx)
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun #define INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(c) \
568*4882a593Smuzhiyun INTEL_UEVENT_EXTRA_REG(c, \
569*4882a593Smuzhiyun MSR_PEBS_LD_LAT_THRESHOLD, \
570*4882a593Smuzhiyun 0xffff, \
571*4882a593Smuzhiyun LDLAT)
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun #define EVENT_EXTRA_END EVENT_EXTRA_REG(0, 0, 0, 0, RSP_0)
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun union perf_capabilities {
576*4882a593Smuzhiyun struct {
577*4882a593Smuzhiyun u64 lbr_format:6;
578*4882a593Smuzhiyun u64 pebs_trap:1;
579*4882a593Smuzhiyun u64 pebs_arch_reg:1;
580*4882a593Smuzhiyun u64 pebs_format:4;
581*4882a593Smuzhiyun u64 smm_freeze:1;
582*4882a593Smuzhiyun /*
583*4882a593Smuzhiyun * PMU supports separate counter range for writing
584*4882a593Smuzhiyun * values > 32bit.
585*4882a593Smuzhiyun */
586*4882a593Smuzhiyun u64 full_width_write:1;
587*4882a593Smuzhiyun u64 pebs_baseline:1;
588*4882a593Smuzhiyun u64 perf_metrics:1;
589*4882a593Smuzhiyun u64 pebs_output_pt_available:1;
590*4882a593Smuzhiyun u64 anythread_deprecated:1;
591*4882a593Smuzhiyun };
592*4882a593Smuzhiyun u64 capabilities;
593*4882a593Smuzhiyun };
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun struct x86_pmu_quirk {
596*4882a593Smuzhiyun struct x86_pmu_quirk *next;
597*4882a593Smuzhiyun void (*func)(void);
598*4882a593Smuzhiyun };
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun union x86_pmu_config {
601*4882a593Smuzhiyun struct {
602*4882a593Smuzhiyun u64 event:8,
603*4882a593Smuzhiyun umask:8,
604*4882a593Smuzhiyun usr:1,
605*4882a593Smuzhiyun os:1,
606*4882a593Smuzhiyun edge:1,
607*4882a593Smuzhiyun pc:1,
608*4882a593Smuzhiyun interrupt:1,
609*4882a593Smuzhiyun __reserved1:1,
610*4882a593Smuzhiyun en:1,
611*4882a593Smuzhiyun inv:1,
612*4882a593Smuzhiyun cmask:8,
613*4882a593Smuzhiyun event2:4,
614*4882a593Smuzhiyun __reserved2:4,
615*4882a593Smuzhiyun go:1,
616*4882a593Smuzhiyun ho:1;
617*4882a593Smuzhiyun } bits;
618*4882a593Smuzhiyun u64 value;
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun #define X86_CONFIG(args...) ((union x86_pmu_config){.bits = {args}}).value
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun enum {
624*4882a593Smuzhiyun x86_lbr_exclusive_lbr,
625*4882a593Smuzhiyun x86_lbr_exclusive_bts,
626*4882a593Smuzhiyun x86_lbr_exclusive_pt,
627*4882a593Smuzhiyun x86_lbr_exclusive_max,
628*4882a593Smuzhiyun };
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /*
631*4882a593Smuzhiyun * struct x86_pmu - generic x86 pmu
632*4882a593Smuzhiyun */
633*4882a593Smuzhiyun struct x86_pmu {
634*4882a593Smuzhiyun /*
635*4882a593Smuzhiyun * Generic x86 PMC bits
636*4882a593Smuzhiyun */
637*4882a593Smuzhiyun const char *name;
638*4882a593Smuzhiyun int version;
639*4882a593Smuzhiyun int (*handle_irq)(struct pt_regs *);
640*4882a593Smuzhiyun void (*disable_all)(void);
641*4882a593Smuzhiyun void (*enable_all)(int added);
642*4882a593Smuzhiyun void (*enable)(struct perf_event *);
643*4882a593Smuzhiyun void (*disable)(struct perf_event *);
644*4882a593Smuzhiyun void (*add)(struct perf_event *);
645*4882a593Smuzhiyun void (*del)(struct perf_event *);
646*4882a593Smuzhiyun void (*read)(struct perf_event *event);
647*4882a593Smuzhiyun int (*hw_config)(struct perf_event *event);
648*4882a593Smuzhiyun int (*schedule_events)(struct cpu_hw_events *cpuc, int n, int *assign);
649*4882a593Smuzhiyun unsigned eventsel;
650*4882a593Smuzhiyun unsigned perfctr;
651*4882a593Smuzhiyun int (*addr_offset)(int index, bool eventsel);
652*4882a593Smuzhiyun int (*rdpmc_index)(int index);
653*4882a593Smuzhiyun u64 (*event_map)(int);
654*4882a593Smuzhiyun int max_events;
655*4882a593Smuzhiyun int num_counters;
656*4882a593Smuzhiyun int num_counters_fixed;
657*4882a593Smuzhiyun int cntval_bits;
658*4882a593Smuzhiyun u64 cntval_mask;
659*4882a593Smuzhiyun union {
660*4882a593Smuzhiyun unsigned long events_maskl;
661*4882a593Smuzhiyun unsigned long events_mask[BITS_TO_LONGS(ARCH_PERFMON_EVENTS_COUNT)];
662*4882a593Smuzhiyun };
663*4882a593Smuzhiyun int events_mask_len;
664*4882a593Smuzhiyun int apic;
665*4882a593Smuzhiyun u64 max_period;
666*4882a593Smuzhiyun struct event_constraint *
667*4882a593Smuzhiyun (*get_event_constraints)(struct cpu_hw_events *cpuc,
668*4882a593Smuzhiyun int idx,
669*4882a593Smuzhiyun struct perf_event *event);
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun void (*put_event_constraints)(struct cpu_hw_events *cpuc,
672*4882a593Smuzhiyun struct perf_event *event);
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun void (*start_scheduling)(struct cpu_hw_events *cpuc);
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun void (*commit_scheduling)(struct cpu_hw_events *cpuc, int idx, int cntr);
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun void (*stop_scheduling)(struct cpu_hw_events *cpuc);
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun struct event_constraint *event_constraints;
681*4882a593Smuzhiyun struct x86_pmu_quirk *quirks;
682*4882a593Smuzhiyun int perfctr_second_write;
683*4882a593Smuzhiyun u64 (*limit_period)(struct perf_event *event, u64 l);
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun /* PMI handler bits */
686*4882a593Smuzhiyun unsigned int late_ack :1,
687*4882a593Smuzhiyun enabled_ack :1,
688*4882a593Smuzhiyun counter_freezing :1;
689*4882a593Smuzhiyun /*
690*4882a593Smuzhiyun * sysfs attrs
691*4882a593Smuzhiyun */
692*4882a593Smuzhiyun int attr_rdpmc_broken;
693*4882a593Smuzhiyun int attr_rdpmc;
694*4882a593Smuzhiyun struct attribute **format_attrs;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun ssize_t (*events_sysfs_show)(char *page, u64 config);
697*4882a593Smuzhiyun const struct attribute_group **attr_update;
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun unsigned long attr_freeze_on_smi;
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun /*
702*4882a593Smuzhiyun * CPU Hotplug hooks
703*4882a593Smuzhiyun */
704*4882a593Smuzhiyun int (*cpu_prepare)(int cpu);
705*4882a593Smuzhiyun void (*cpu_starting)(int cpu);
706*4882a593Smuzhiyun void (*cpu_dying)(int cpu);
707*4882a593Smuzhiyun void (*cpu_dead)(int cpu);
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun void (*check_microcode)(void);
710*4882a593Smuzhiyun void (*sched_task)(struct perf_event_context *ctx,
711*4882a593Smuzhiyun bool sched_in);
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun /*
714*4882a593Smuzhiyun * Intel Arch Perfmon v2+
715*4882a593Smuzhiyun */
716*4882a593Smuzhiyun u64 intel_ctrl;
717*4882a593Smuzhiyun union perf_capabilities intel_cap;
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /*
720*4882a593Smuzhiyun * Intel DebugStore bits
721*4882a593Smuzhiyun */
722*4882a593Smuzhiyun unsigned int bts :1,
723*4882a593Smuzhiyun bts_active :1,
724*4882a593Smuzhiyun pebs :1,
725*4882a593Smuzhiyun pebs_active :1,
726*4882a593Smuzhiyun pebs_broken :1,
727*4882a593Smuzhiyun pebs_prec_dist :1,
728*4882a593Smuzhiyun pebs_no_tlb :1,
729*4882a593Smuzhiyun pebs_no_isolation :1;
730*4882a593Smuzhiyun int pebs_record_size;
731*4882a593Smuzhiyun int pebs_buffer_size;
732*4882a593Smuzhiyun int max_pebs_events;
733*4882a593Smuzhiyun void (*drain_pebs)(struct pt_regs *regs, struct perf_sample_data *data);
734*4882a593Smuzhiyun struct event_constraint *pebs_constraints;
735*4882a593Smuzhiyun void (*pebs_aliases)(struct perf_event *event);
736*4882a593Smuzhiyun unsigned long large_pebs_flags;
737*4882a593Smuzhiyun u64 rtm_abort_event;
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun /*
740*4882a593Smuzhiyun * Intel LBR
741*4882a593Smuzhiyun */
742*4882a593Smuzhiyun unsigned int lbr_tos, lbr_from, lbr_to,
743*4882a593Smuzhiyun lbr_info, lbr_nr; /* LBR base regs and size */
744*4882a593Smuzhiyun union {
745*4882a593Smuzhiyun u64 lbr_sel_mask; /* LBR_SELECT valid bits */
746*4882a593Smuzhiyun u64 lbr_ctl_mask; /* LBR_CTL valid bits */
747*4882a593Smuzhiyun };
748*4882a593Smuzhiyun union {
749*4882a593Smuzhiyun const int *lbr_sel_map; /* lbr_select mappings */
750*4882a593Smuzhiyun int *lbr_ctl_map; /* LBR_CTL mappings */
751*4882a593Smuzhiyun };
752*4882a593Smuzhiyun bool lbr_double_abort; /* duplicated lbr aborts */
753*4882a593Smuzhiyun bool lbr_pt_coexist; /* (LBR|BTS) may coexist with PT */
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun /*
756*4882a593Smuzhiyun * Intel Architectural LBR CPUID Enumeration
757*4882a593Smuzhiyun */
758*4882a593Smuzhiyun unsigned int lbr_depth_mask:8;
759*4882a593Smuzhiyun unsigned int lbr_deep_c_reset:1;
760*4882a593Smuzhiyun unsigned int lbr_lip:1;
761*4882a593Smuzhiyun unsigned int lbr_cpl:1;
762*4882a593Smuzhiyun unsigned int lbr_filter:1;
763*4882a593Smuzhiyun unsigned int lbr_call_stack:1;
764*4882a593Smuzhiyun unsigned int lbr_mispred:1;
765*4882a593Smuzhiyun unsigned int lbr_timed_lbr:1;
766*4882a593Smuzhiyun unsigned int lbr_br_type:1;
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun void (*lbr_reset)(void);
769*4882a593Smuzhiyun void (*lbr_read)(struct cpu_hw_events *cpuc);
770*4882a593Smuzhiyun void (*lbr_save)(void *ctx);
771*4882a593Smuzhiyun void (*lbr_restore)(void *ctx);
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun /*
774*4882a593Smuzhiyun * Intel PT/LBR/BTS are exclusive
775*4882a593Smuzhiyun */
776*4882a593Smuzhiyun atomic_t lbr_exclusive[x86_lbr_exclusive_max];
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun /*
779*4882a593Smuzhiyun * Intel perf metrics
780*4882a593Smuzhiyun */
781*4882a593Smuzhiyun u64 (*update_topdown_event)(struct perf_event *event);
782*4882a593Smuzhiyun int (*set_topdown_event_period)(struct perf_event *event);
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun /*
785*4882a593Smuzhiyun * perf task context (i.e. struct perf_event_context::task_ctx_data)
786*4882a593Smuzhiyun * switch helper to bridge calls from perf/core to perf/x86.
787*4882a593Smuzhiyun * See struct pmu::swap_task_ctx() usage for examples;
788*4882a593Smuzhiyun */
789*4882a593Smuzhiyun void (*swap_task_ctx)(struct perf_event_context *prev,
790*4882a593Smuzhiyun struct perf_event_context *next);
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun /*
793*4882a593Smuzhiyun * AMD bits
794*4882a593Smuzhiyun */
795*4882a593Smuzhiyun unsigned int amd_nb_constraints : 1;
796*4882a593Smuzhiyun u64 perf_ctr_pair_en;
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun /*
799*4882a593Smuzhiyun * Extra registers for events
800*4882a593Smuzhiyun */
801*4882a593Smuzhiyun struct extra_reg *extra_regs;
802*4882a593Smuzhiyun unsigned int flags;
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun /*
805*4882a593Smuzhiyun * Intel host/guest support (KVM)
806*4882a593Smuzhiyun */
807*4882a593Smuzhiyun struct perf_guest_switch_msr *(*guest_get_msrs)(int *nr);
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun /*
810*4882a593Smuzhiyun * Check period value for PERF_EVENT_IOC_PERIOD ioctl.
811*4882a593Smuzhiyun */
812*4882a593Smuzhiyun int (*check_period) (struct perf_event *event, u64 period);
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun int (*aux_output_match) (struct perf_event *event);
815*4882a593Smuzhiyun };
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun struct x86_perf_task_context_opt {
818*4882a593Smuzhiyun int lbr_callstack_users;
819*4882a593Smuzhiyun int lbr_stack_state;
820*4882a593Smuzhiyun int log_id;
821*4882a593Smuzhiyun };
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun struct x86_perf_task_context {
824*4882a593Smuzhiyun u64 lbr_sel;
825*4882a593Smuzhiyun int tos;
826*4882a593Smuzhiyun int valid_lbrs;
827*4882a593Smuzhiyun struct x86_perf_task_context_opt opt;
828*4882a593Smuzhiyun struct lbr_entry lbr[MAX_LBR_ENTRIES];
829*4882a593Smuzhiyun };
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun struct x86_perf_task_context_arch_lbr {
832*4882a593Smuzhiyun struct x86_perf_task_context_opt opt;
833*4882a593Smuzhiyun struct lbr_entry entries[];
834*4882a593Smuzhiyun };
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun /*
837*4882a593Smuzhiyun * Add padding to guarantee the 64-byte alignment of the state buffer.
838*4882a593Smuzhiyun *
839*4882a593Smuzhiyun * The structure is dynamically allocated. The size of the LBR state may vary
840*4882a593Smuzhiyun * based on the number of LBR registers.
841*4882a593Smuzhiyun *
842*4882a593Smuzhiyun * Do not put anything after the LBR state.
843*4882a593Smuzhiyun */
844*4882a593Smuzhiyun struct x86_perf_task_context_arch_lbr_xsave {
845*4882a593Smuzhiyun struct x86_perf_task_context_opt opt;
846*4882a593Smuzhiyun
847*4882a593Smuzhiyun union {
848*4882a593Smuzhiyun struct xregs_state xsave;
849*4882a593Smuzhiyun struct {
850*4882a593Smuzhiyun struct fxregs_state i387;
851*4882a593Smuzhiyun struct xstate_header header;
852*4882a593Smuzhiyun struct arch_lbr_state lbr;
853*4882a593Smuzhiyun } __attribute__ ((packed, aligned (XSAVE_ALIGNMENT)));
854*4882a593Smuzhiyun };
855*4882a593Smuzhiyun };
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun #define x86_add_quirk(func_) \
858*4882a593Smuzhiyun do { \
859*4882a593Smuzhiyun static struct x86_pmu_quirk __quirk __initdata = { \
860*4882a593Smuzhiyun .func = func_, \
861*4882a593Smuzhiyun }; \
862*4882a593Smuzhiyun __quirk.next = x86_pmu.quirks; \
863*4882a593Smuzhiyun x86_pmu.quirks = &__quirk; \
864*4882a593Smuzhiyun } while (0)
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun /*
867*4882a593Smuzhiyun * x86_pmu flags
868*4882a593Smuzhiyun */
869*4882a593Smuzhiyun #define PMU_FL_NO_HT_SHARING 0x1 /* no hyper-threading resource sharing */
870*4882a593Smuzhiyun #define PMU_FL_HAS_RSP_1 0x2 /* has 2 equivalent offcore_rsp regs */
871*4882a593Smuzhiyun #define PMU_FL_EXCL_CNTRS 0x4 /* has exclusive counter requirements */
872*4882a593Smuzhiyun #define PMU_FL_EXCL_ENABLED 0x8 /* exclusive counter active */
873*4882a593Smuzhiyun #define PMU_FL_PEBS_ALL 0x10 /* all events are valid PEBS events */
874*4882a593Smuzhiyun #define PMU_FL_TFA 0x20 /* deal with TSX force abort */
875*4882a593Smuzhiyun #define PMU_FL_PAIR 0x40 /* merge counters for large incr. events */
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun #define EVENT_VAR(_id) event_attr_##_id
878*4882a593Smuzhiyun #define EVENT_PTR(_id) &event_attr_##_id.attr.attr
879*4882a593Smuzhiyun
880*4882a593Smuzhiyun #define EVENT_ATTR(_name, _id) \
881*4882a593Smuzhiyun static struct perf_pmu_events_attr EVENT_VAR(_id) = { \
882*4882a593Smuzhiyun .attr = __ATTR(_name, 0444, events_sysfs_show, NULL), \
883*4882a593Smuzhiyun .id = PERF_COUNT_HW_##_id, \
884*4882a593Smuzhiyun .event_str = NULL, \
885*4882a593Smuzhiyun };
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun #define EVENT_ATTR_STR(_name, v, str) \
888*4882a593Smuzhiyun static struct perf_pmu_events_attr event_attr_##v = { \
889*4882a593Smuzhiyun .attr = __ATTR(_name, 0444, events_sysfs_show, NULL), \
890*4882a593Smuzhiyun .id = 0, \
891*4882a593Smuzhiyun .event_str = str, \
892*4882a593Smuzhiyun };
893*4882a593Smuzhiyun
894*4882a593Smuzhiyun #define EVENT_ATTR_STR_HT(_name, v, noht, ht) \
895*4882a593Smuzhiyun static struct perf_pmu_events_ht_attr event_attr_##v = { \
896*4882a593Smuzhiyun .attr = __ATTR(_name, 0444, events_ht_sysfs_show, NULL),\
897*4882a593Smuzhiyun .id = 0, \
898*4882a593Smuzhiyun .event_str_noht = noht, \
899*4882a593Smuzhiyun .event_str_ht = ht, \
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun struct pmu *x86_get_pmu(unsigned int cpu);
903*4882a593Smuzhiyun extern struct x86_pmu x86_pmu __read_mostly;
904*4882a593Smuzhiyun
task_context_opt(void * ctx)905*4882a593Smuzhiyun static __always_inline struct x86_perf_task_context_opt *task_context_opt(void *ctx)
906*4882a593Smuzhiyun {
907*4882a593Smuzhiyun if (static_cpu_has(X86_FEATURE_ARCH_LBR))
908*4882a593Smuzhiyun return &((struct x86_perf_task_context_arch_lbr *)ctx)->opt;
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun return &((struct x86_perf_task_context *)ctx)->opt;
911*4882a593Smuzhiyun }
912*4882a593Smuzhiyun
x86_pmu_has_lbr_callstack(void)913*4882a593Smuzhiyun static inline bool x86_pmu_has_lbr_callstack(void)
914*4882a593Smuzhiyun {
915*4882a593Smuzhiyun return x86_pmu.lbr_sel_map &&
916*4882a593Smuzhiyun x86_pmu.lbr_sel_map[PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT] > 0;
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun DECLARE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun int x86_perf_event_set_period(struct perf_event *event);
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun /*
924*4882a593Smuzhiyun * Generalized hw caching related hw_event table, filled
925*4882a593Smuzhiyun * in on a per model basis. A value of 0 means
926*4882a593Smuzhiyun * 'not supported', -1 means 'hw_event makes no sense on
927*4882a593Smuzhiyun * this CPU', any other value means the raw hw_event
928*4882a593Smuzhiyun * ID.
929*4882a593Smuzhiyun */
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun #define C(x) PERF_COUNT_HW_CACHE_##x
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun extern u64 __read_mostly hw_cache_event_ids
934*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_MAX]
935*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_OP_MAX]
936*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_RESULT_MAX];
937*4882a593Smuzhiyun extern u64 __read_mostly hw_cache_extra_regs
938*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_MAX]
939*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_OP_MAX]
940*4882a593Smuzhiyun [PERF_COUNT_HW_CACHE_RESULT_MAX];
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun u64 x86_perf_event_update(struct perf_event *event);
943*4882a593Smuzhiyun
x86_pmu_config_addr(int index)944*4882a593Smuzhiyun static inline unsigned int x86_pmu_config_addr(int index)
945*4882a593Smuzhiyun {
946*4882a593Smuzhiyun return x86_pmu.eventsel + (x86_pmu.addr_offset ?
947*4882a593Smuzhiyun x86_pmu.addr_offset(index, true) : index);
948*4882a593Smuzhiyun }
949*4882a593Smuzhiyun
x86_pmu_event_addr(int index)950*4882a593Smuzhiyun static inline unsigned int x86_pmu_event_addr(int index)
951*4882a593Smuzhiyun {
952*4882a593Smuzhiyun return x86_pmu.perfctr + (x86_pmu.addr_offset ?
953*4882a593Smuzhiyun x86_pmu.addr_offset(index, false) : index);
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun
x86_pmu_rdpmc_index(int index)956*4882a593Smuzhiyun static inline int x86_pmu_rdpmc_index(int index)
957*4882a593Smuzhiyun {
958*4882a593Smuzhiyun return x86_pmu.rdpmc_index ? x86_pmu.rdpmc_index(index) : index;
959*4882a593Smuzhiyun }
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun int x86_add_exclusive(unsigned int what);
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun void x86_del_exclusive(unsigned int what);
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun int x86_reserve_hardware(void);
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun void x86_release_hardware(void);
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun int x86_pmu_max_precise(void);
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun void hw_perf_lbr_event_destroy(struct perf_event *event);
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun int x86_setup_perfctr(struct perf_event *event);
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun int x86_pmu_hw_config(struct perf_event *event);
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun void x86_pmu_disable_all(void);
978*4882a593Smuzhiyun
is_counter_pair(struct hw_perf_event * hwc)979*4882a593Smuzhiyun static inline bool is_counter_pair(struct hw_perf_event *hwc)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun return hwc->flags & PERF_X86_EVENT_PAIR;
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun
__x86_pmu_enable_event(struct hw_perf_event * hwc,u64 enable_mask)984*4882a593Smuzhiyun static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc,
985*4882a593Smuzhiyun u64 enable_mask)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun if (hwc->extra_reg.reg)
990*4882a593Smuzhiyun wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config);
991*4882a593Smuzhiyun
992*4882a593Smuzhiyun /*
993*4882a593Smuzhiyun * Add enabled Merge event on next counter
994*4882a593Smuzhiyun * if large increment event being enabled on this counter
995*4882a593Smuzhiyun */
996*4882a593Smuzhiyun if (is_counter_pair(hwc))
997*4882a593Smuzhiyun wrmsrl(x86_pmu_config_addr(hwc->idx + 1), x86_pmu.perf_ctr_pair_en);
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun wrmsrl(hwc->config_base, (hwc->config | enable_mask) & ~disable_mask);
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun void x86_pmu_enable_all(int added);
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun int perf_assign_events(struct event_constraint **constraints, int n,
1005*4882a593Smuzhiyun int wmin, int wmax, int gpmax, int *assign);
1006*4882a593Smuzhiyun int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign);
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun void x86_pmu_stop(struct perf_event *event, int flags);
1009*4882a593Smuzhiyun
x86_pmu_disable_event(struct perf_event * event)1010*4882a593Smuzhiyun static inline void x86_pmu_disable_event(struct perf_event *event)
1011*4882a593Smuzhiyun {
1012*4882a593Smuzhiyun u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
1013*4882a593Smuzhiyun struct hw_perf_event *hwc = &event->hw;
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun wrmsrl(hwc->config_base, hwc->config & ~disable_mask);
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun if (is_counter_pair(hwc))
1018*4882a593Smuzhiyun wrmsrl(x86_pmu_config_addr(hwc->idx + 1), 0);
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun void x86_pmu_enable_event(struct perf_event *event);
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun int x86_pmu_handle_irq(struct pt_regs *regs);
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun extern struct event_constraint emptyconstraint;
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun extern struct event_constraint unconstrained;
1028*4882a593Smuzhiyun
kernel_ip(unsigned long ip)1029*4882a593Smuzhiyun static inline bool kernel_ip(unsigned long ip)
1030*4882a593Smuzhiyun {
1031*4882a593Smuzhiyun #ifdef CONFIG_X86_32
1032*4882a593Smuzhiyun return ip > PAGE_OFFSET;
1033*4882a593Smuzhiyun #else
1034*4882a593Smuzhiyun return (long)ip < 0;
1035*4882a593Smuzhiyun #endif
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun /*
1039*4882a593Smuzhiyun * Not all PMUs provide the right context information to place the reported IP
1040*4882a593Smuzhiyun * into full context. Specifically segment registers are typically not
1041*4882a593Smuzhiyun * supplied.
1042*4882a593Smuzhiyun *
1043*4882a593Smuzhiyun * Assuming the address is a linear address (it is for IBS), we fake the CS and
1044*4882a593Smuzhiyun * vm86 mode using the known zero-based code segment and 'fix up' the registers
1045*4882a593Smuzhiyun * to reflect this.
1046*4882a593Smuzhiyun *
1047*4882a593Smuzhiyun * Intel PEBS/LBR appear to typically provide the effective address, nothing
1048*4882a593Smuzhiyun * much we can do about that but pray and treat it like a linear address.
1049*4882a593Smuzhiyun */
set_linear_ip(struct pt_regs * regs,unsigned long ip)1050*4882a593Smuzhiyun static inline void set_linear_ip(struct pt_regs *regs, unsigned long ip)
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun regs->cs = kernel_ip(ip) ? __KERNEL_CS : __USER_CS;
1053*4882a593Smuzhiyun if (regs->flags & X86_VM_MASK)
1054*4882a593Smuzhiyun regs->flags ^= (PERF_EFLAGS_VM | X86_VM_MASK);
1055*4882a593Smuzhiyun regs->ip = ip;
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event);
1059*4882a593Smuzhiyun ssize_t intel_event_sysfs_show(char *page, u64 config);
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr,
1062*4882a593Smuzhiyun char *page);
1063*4882a593Smuzhiyun ssize_t events_ht_sysfs_show(struct device *dev, struct device_attribute *attr,
1064*4882a593Smuzhiyun char *page);
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun #ifdef CONFIG_CPU_SUP_AMD
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun int amd_pmu_init(void);
1069*4882a593Smuzhiyun
1070*4882a593Smuzhiyun #else /* CONFIG_CPU_SUP_AMD */
1071*4882a593Smuzhiyun
amd_pmu_init(void)1072*4882a593Smuzhiyun static inline int amd_pmu_init(void)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun return 0;
1075*4882a593Smuzhiyun }
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun #endif /* CONFIG_CPU_SUP_AMD */
1078*4882a593Smuzhiyun
is_pebs_pt(struct perf_event * event)1079*4882a593Smuzhiyun static inline int is_pebs_pt(struct perf_event *event)
1080*4882a593Smuzhiyun {
1081*4882a593Smuzhiyun return !!(event->hw.flags & PERF_X86_EVENT_PEBS_VIA_PT);
1082*4882a593Smuzhiyun }
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun #ifdef CONFIG_CPU_SUP_INTEL
1085*4882a593Smuzhiyun
intel_pmu_has_bts_period(struct perf_event * event,u64 period)1086*4882a593Smuzhiyun static inline bool intel_pmu_has_bts_period(struct perf_event *event, u64 period)
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun struct hw_perf_event *hwc = &event->hw;
1089*4882a593Smuzhiyun unsigned int hw_event, bts_event;
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun if (event->attr.freq)
1092*4882a593Smuzhiyun return false;
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun hw_event = hwc->config & INTEL_ARCH_EVENT_MASK;
1095*4882a593Smuzhiyun bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS);
1096*4882a593Smuzhiyun
1097*4882a593Smuzhiyun return hw_event == bts_event && period == 1;
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun
intel_pmu_has_bts(struct perf_event * event)1100*4882a593Smuzhiyun static inline bool intel_pmu_has_bts(struct perf_event *event)
1101*4882a593Smuzhiyun {
1102*4882a593Smuzhiyun struct hw_perf_event *hwc = &event->hw;
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun return intel_pmu_has_bts_period(event, hwc->sample_period);
1105*4882a593Smuzhiyun }
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun int intel_pmu_save_and_restart(struct perf_event *event);
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun struct event_constraint *
1110*4882a593Smuzhiyun x86_get_event_constraints(struct cpu_hw_events *cpuc, int idx,
1111*4882a593Smuzhiyun struct perf_event *event);
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun extern int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu);
1114*4882a593Smuzhiyun extern void intel_cpuc_finish(struct cpu_hw_events *cpuc);
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun int intel_pmu_init(void);
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun void init_debug_store_on_cpu(int cpu);
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun void fini_debug_store_on_cpu(int cpu);
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun void release_ds_buffers(void);
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun void reserve_ds_buffers(void);
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun void release_lbr_buffers(void);
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun void reserve_lbr_buffers(void);
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun extern struct event_constraint bts_constraint;
1131*4882a593Smuzhiyun extern struct event_constraint vlbr_constraint;
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun void intel_pmu_enable_bts(u64 config);
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun void intel_pmu_disable_bts(void);
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun int intel_pmu_drain_bts_buffer(void);
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun extern struct event_constraint intel_core2_pebs_event_constraints[];
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun extern struct event_constraint intel_atom_pebs_event_constraints[];
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun extern struct event_constraint intel_slm_pebs_event_constraints[];
1144*4882a593Smuzhiyun
1145*4882a593Smuzhiyun extern struct event_constraint intel_glm_pebs_event_constraints[];
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun extern struct event_constraint intel_glp_pebs_event_constraints[];
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun extern struct event_constraint intel_nehalem_pebs_event_constraints[];
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun extern struct event_constraint intel_westmere_pebs_event_constraints[];
1152*4882a593Smuzhiyun
1153*4882a593Smuzhiyun extern struct event_constraint intel_snb_pebs_event_constraints[];
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun extern struct event_constraint intel_ivb_pebs_event_constraints[];
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun extern struct event_constraint intel_hsw_pebs_event_constraints[];
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun extern struct event_constraint intel_bdw_pebs_event_constraints[];
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun extern struct event_constraint intel_skl_pebs_event_constraints[];
1162*4882a593Smuzhiyun
1163*4882a593Smuzhiyun extern struct event_constraint intel_icl_pebs_event_constraints[];
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun struct event_constraint *intel_pebs_constraints(struct perf_event *event);
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun void intel_pmu_pebs_add(struct perf_event *event);
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun void intel_pmu_pebs_del(struct perf_event *event);
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun void intel_pmu_pebs_enable(struct perf_event *event);
1172*4882a593Smuzhiyun
1173*4882a593Smuzhiyun void intel_pmu_pebs_disable(struct perf_event *event);
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun void intel_pmu_pebs_enable_all(void);
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun void intel_pmu_pebs_disable_all(void);
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun void intel_pmu_pebs_sched_task(struct perf_event_context *ctx, bool sched_in);
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun void intel_pmu_auto_reload_read(struct perf_event *event);
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyun void intel_pmu_store_pebs_lbrs(struct lbr_entry *lbr);
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun void intel_ds_init(void);
1186*4882a593Smuzhiyun
1187*4882a593Smuzhiyun void intel_pmu_lbr_swap_task_ctx(struct perf_event_context *prev,
1188*4882a593Smuzhiyun struct perf_event_context *next);
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun void intel_pmu_lbr_sched_task(struct perf_event_context *ctx, bool sched_in);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun u64 lbr_from_signext_quirk_wr(u64 val);
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun void intel_pmu_lbr_reset(void);
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun void intel_pmu_lbr_reset_32(void);
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun void intel_pmu_lbr_reset_64(void);
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun void intel_pmu_lbr_add(struct perf_event *event);
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun void intel_pmu_lbr_del(struct perf_event *event);
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun void intel_pmu_lbr_enable_all(bool pmi);
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun void intel_pmu_lbr_disable_all(void);
1207*4882a593Smuzhiyun
1208*4882a593Smuzhiyun void intel_pmu_lbr_read(void);
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun void intel_pmu_lbr_read_32(struct cpu_hw_events *cpuc);
1211*4882a593Smuzhiyun
1212*4882a593Smuzhiyun void intel_pmu_lbr_read_64(struct cpu_hw_events *cpuc);
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun void intel_pmu_lbr_save(void *ctx);
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun void intel_pmu_lbr_restore(void *ctx);
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun void intel_pmu_lbr_init_core(void);
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun void intel_pmu_lbr_init_nhm(void);
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun void intel_pmu_lbr_init_atom(void);
1223*4882a593Smuzhiyun
1224*4882a593Smuzhiyun void intel_pmu_lbr_init_slm(void);
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun void intel_pmu_lbr_init_snb(void);
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun void intel_pmu_lbr_init_hsw(void);
1229*4882a593Smuzhiyun
1230*4882a593Smuzhiyun void intel_pmu_lbr_init_skl(void);
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun void intel_pmu_lbr_init_knl(void);
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun void intel_pmu_arch_lbr_init(void);
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun void intel_pmu_pebs_data_source_nhm(void);
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun void intel_pmu_pebs_data_source_skl(bool pmem);
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun int intel_pmu_setup_lbr_filter(struct perf_event *event);
1241*4882a593Smuzhiyun
1242*4882a593Smuzhiyun void intel_pt_interrupt(void);
1243*4882a593Smuzhiyun
1244*4882a593Smuzhiyun int intel_bts_interrupt(void);
1245*4882a593Smuzhiyun
1246*4882a593Smuzhiyun void intel_bts_enable_local(void);
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun void intel_bts_disable_local(void);
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun int p4_pmu_init(void);
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun int p6_pmu_init(void);
1253*4882a593Smuzhiyun
1254*4882a593Smuzhiyun int knc_pmu_init(void);
1255*4882a593Smuzhiyun
is_ht_workaround_enabled(void)1256*4882a593Smuzhiyun static inline int is_ht_workaround_enabled(void)
1257*4882a593Smuzhiyun {
1258*4882a593Smuzhiyun return !!(x86_pmu.flags & PMU_FL_EXCL_ENABLED);
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun #else /* CONFIG_CPU_SUP_INTEL */
1262*4882a593Smuzhiyun
reserve_ds_buffers(void)1263*4882a593Smuzhiyun static inline void reserve_ds_buffers(void)
1264*4882a593Smuzhiyun {
1265*4882a593Smuzhiyun }
1266*4882a593Smuzhiyun
release_ds_buffers(void)1267*4882a593Smuzhiyun static inline void release_ds_buffers(void)
1268*4882a593Smuzhiyun {
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun
release_lbr_buffers(void)1271*4882a593Smuzhiyun static inline void release_lbr_buffers(void)
1272*4882a593Smuzhiyun {
1273*4882a593Smuzhiyun }
1274*4882a593Smuzhiyun
reserve_lbr_buffers(void)1275*4882a593Smuzhiyun static inline void reserve_lbr_buffers(void)
1276*4882a593Smuzhiyun {
1277*4882a593Smuzhiyun }
1278*4882a593Smuzhiyun
intel_pmu_init(void)1279*4882a593Smuzhiyun static inline int intel_pmu_init(void)
1280*4882a593Smuzhiyun {
1281*4882a593Smuzhiyun return 0;
1282*4882a593Smuzhiyun }
1283*4882a593Smuzhiyun
intel_cpuc_prepare(struct cpu_hw_events * cpuc,int cpu)1284*4882a593Smuzhiyun static inline int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu)
1285*4882a593Smuzhiyun {
1286*4882a593Smuzhiyun return 0;
1287*4882a593Smuzhiyun }
1288*4882a593Smuzhiyun
intel_cpuc_finish(struct cpu_hw_events * cpuc)1289*4882a593Smuzhiyun static inline void intel_cpuc_finish(struct cpu_hw_events *cpuc)
1290*4882a593Smuzhiyun {
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun
is_ht_workaround_enabled(void)1293*4882a593Smuzhiyun static inline int is_ht_workaround_enabled(void)
1294*4882a593Smuzhiyun {
1295*4882a593Smuzhiyun return 0;
1296*4882a593Smuzhiyun }
1297*4882a593Smuzhiyun #endif /* CONFIG_CPU_SUP_INTEL */
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun #if ((defined CONFIG_CPU_SUP_CENTAUR) || (defined CONFIG_CPU_SUP_ZHAOXIN))
1300*4882a593Smuzhiyun int zhaoxin_pmu_init(void);
1301*4882a593Smuzhiyun #else
zhaoxin_pmu_init(void)1302*4882a593Smuzhiyun static inline int zhaoxin_pmu_init(void)
1303*4882a593Smuzhiyun {
1304*4882a593Smuzhiyun return 0;
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun #endif /*CONFIG_CPU_SUP_CENTAUR or CONFIG_CPU_SUP_ZHAOXIN*/
1307