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