18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Intel(R) Processor Trace PMU driver for perf
48c2ecf20Sopenharmony_ci * Copyright (c) 2013-2014, Intel Corporation.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Intel PT is specified in the Intel Architecture Instruction Set Extensions
78c2ecf20Sopenharmony_ci * Programming Reference:
88c2ecf20Sopenharmony_ci * http://software.intel.com/en-us/intel-isa-extensions
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#ifndef __INTEL_PT_H__
128c2ecf20Sopenharmony_ci#define __INTEL_PT_H__
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/*
158c2ecf20Sopenharmony_ci * Single-entry ToPA: when this close to region boundary, switch
168c2ecf20Sopenharmony_ci * buffers to avoid losing data.
178c2ecf20Sopenharmony_ci */
188c2ecf20Sopenharmony_ci#define TOPA_PMI_MARGIN 512
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define TOPA_SHIFT 12
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistatic inline unsigned int sizes(unsigned int tsz)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	return 1 << (tsz + TOPA_SHIFT);
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct topa_entry {
288c2ecf20Sopenharmony_ci	u64	end	: 1;
298c2ecf20Sopenharmony_ci	u64	rsvd0	: 1;
308c2ecf20Sopenharmony_ci	u64	intr	: 1;
318c2ecf20Sopenharmony_ci	u64	rsvd1	: 1;
328c2ecf20Sopenharmony_ci	u64	stop	: 1;
338c2ecf20Sopenharmony_ci	u64	rsvd2	: 1;
348c2ecf20Sopenharmony_ci	u64	size	: 4;
358c2ecf20Sopenharmony_ci	u64	rsvd3	: 2;
368c2ecf20Sopenharmony_ci	u64	base	: 36;
378c2ecf20Sopenharmony_ci	u64	rsvd4	: 16;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/* TSC to Core Crystal Clock Ratio */
418c2ecf20Sopenharmony_ci#define CPUID_TSC_LEAF		0x15
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistruct pt_pmu {
448c2ecf20Sopenharmony_ci	struct pmu		pmu;
458c2ecf20Sopenharmony_ci	u32			caps[PT_CPUID_REGS_NUM * PT_CPUID_LEAVES];
468c2ecf20Sopenharmony_ci	bool			vmx;
478c2ecf20Sopenharmony_ci	bool			branch_en_always_on;
488c2ecf20Sopenharmony_ci	unsigned long		max_nonturbo_ratio;
498c2ecf20Sopenharmony_ci	unsigned int		tsc_art_num;
508c2ecf20Sopenharmony_ci	unsigned int		tsc_art_den;
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci/**
548c2ecf20Sopenharmony_ci * struct pt_buffer - buffer configuration; one buffer per task_struct or
558c2ecf20Sopenharmony_ci *		cpu, depending on perf event configuration
568c2ecf20Sopenharmony_ci * @tables:	list of ToPA tables in this buffer
578c2ecf20Sopenharmony_ci * @first:	shorthand for first topa table
588c2ecf20Sopenharmony_ci * @last:	shorthand for last topa table
598c2ecf20Sopenharmony_ci * @cur:	current topa table
608c2ecf20Sopenharmony_ci * @nr_pages:	buffer size in pages
618c2ecf20Sopenharmony_ci * @cur_idx:	current output region's index within @cur table
628c2ecf20Sopenharmony_ci * @output_off:	offset within the current output region
638c2ecf20Sopenharmony_ci * @data_size:	running total of the amount of data in this buffer
648c2ecf20Sopenharmony_ci * @lost:	if data was lost/truncated
658c2ecf20Sopenharmony_ci * @head:	logical write offset inside the buffer
668c2ecf20Sopenharmony_ci * @snapshot:	if this is for a snapshot/overwrite counter
678c2ecf20Sopenharmony_ci * @single:	use Single Range Output instead of ToPA
688c2ecf20Sopenharmony_ci * @stop_pos:	STOP topa entry index
698c2ecf20Sopenharmony_ci * @intr_pos:	INT topa entry index
708c2ecf20Sopenharmony_ci * @stop_te:	STOP topa entry pointer
718c2ecf20Sopenharmony_ci * @intr_te:	INT topa entry pointer
728c2ecf20Sopenharmony_ci * @data_pages:	array of pages from perf
738c2ecf20Sopenharmony_ci * @topa_index:	table of topa entries indexed by page offset
748c2ecf20Sopenharmony_ci */
758c2ecf20Sopenharmony_cistruct pt_buffer {
768c2ecf20Sopenharmony_ci	struct list_head	tables;
778c2ecf20Sopenharmony_ci	struct topa		*first, *last, *cur;
788c2ecf20Sopenharmony_ci	unsigned int		cur_idx;
798c2ecf20Sopenharmony_ci	size_t			output_off;
808c2ecf20Sopenharmony_ci	unsigned long		nr_pages;
818c2ecf20Sopenharmony_ci	local_t			data_size;
828c2ecf20Sopenharmony_ci	local64_t		head;
838c2ecf20Sopenharmony_ci	bool			snapshot;
848c2ecf20Sopenharmony_ci	bool			single;
858c2ecf20Sopenharmony_ci	long			stop_pos, intr_pos;
868c2ecf20Sopenharmony_ci	struct topa_entry	*stop_te, *intr_te;
878c2ecf20Sopenharmony_ci	void			**data_pages;
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define PT_FILTERS_NUM	4
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci/**
938c2ecf20Sopenharmony_ci * struct pt_filter - IP range filter configuration
948c2ecf20Sopenharmony_ci * @msr_a:	range start, goes to RTIT_ADDRn_A
958c2ecf20Sopenharmony_ci * @msr_b:	range end, goes to RTIT_ADDRn_B
968c2ecf20Sopenharmony_ci * @config:	4-bit field in RTIT_CTL
978c2ecf20Sopenharmony_ci */
988c2ecf20Sopenharmony_cistruct pt_filter {
998c2ecf20Sopenharmony_ci	unsigned long	msr_a;
1008c2ecf20Sopenharmony_ci	unsigned long	msr_b;
1018c2ecf20Sopenharmony_ci	unsigned long	config;
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci/**
1058c2ecf20Sopenharmony_ci * struct pt_filters - IP range filtering context
1068c2ecf20Sopenharmony_ci * @filter:	filters defined for this context
1078c2ecf20Sopenharmony_ci * @nr_filters:	number of defined filters in the @filter array
1088c2ecf20Sopenharmony_ci */
1098c2ecf20Sopenharmony_cistruct pt_filters {
1108c2ecf20Sopenharmony_ci	struct pt_filter	filter[PT_FILTERS_NUM];
1118c2ecf20Sopenharmony_ci	unsigned int		nr_filters;
1128c2ecf20Sopenharmony_ci};
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci/**
1158c2ecf20Sopenharmony_ci * struct pt - per-cpu pt context
1168c2ecf20Sopenharmony_ci * @handle:		perf output handle
1178c2ecf20Sopenharmony_ci * @filters:		last configured filters
1188c2ecf20Sopenharmony_ci * @handle_nmi:		do handle PT PMI on this cpu, there's an active event
1198c2ecf20Sopenharmony_ci * @vmx_on:		1 if VMX is ON on this cpu
1208c2ecf20Sopenharmony_ci * @output_base:	cached RTIT_OUTPUT_BASE MSR value
1218c2ecf20Sopenharmony_ci * @output_mask:	cached RTIT_OUTPUT_MASK MSR value
1228c2ecf20Sopenharmony_ci */
1238c2ecf20Sopenharmony_cistruct pt {
1248c2ecf20Sopenharmony_ci	struct perf_output_handle handle;
1258c2ecf20Sopenharmony_ci	struct pt_filters	filters;
1268c2ecf20Sopenharmony_ci	int			handle_nmi;
1278c2ecf20Sopenharmony_ci	int			vmx_on;
1288c2ecf20Sopenharmony_ci	u64			output_base;
1298c2ecf20Sopenharmony_ci	u64			output_mask;
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci#endif /* __INTEL_PT_H__ */
133