xref: /linux/tools/perf/util/env.h (revision 1bbeaf83dd7b5e3628b98bec66ff8fe2646e14aa)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f0ce888cSArnaldo Carvalho de Melo #ifndef __PERF_ENV_H
3f0ce888cSArnaldo Carvalho de Melo #define __PERF_ENV_H
4f0ce888cSArnaldo Carvalho de Melo 
5720e98b5SJiri Olsa #include <linux/types.h>
6e4378f0cSSong Liu #include <linux/rbtree.h>
76d18804bSIan Rogers #include "cpumap.h"
8e4378f0cSSong Liu #include "rwsem.h"
9720e98b5SJiri Olsa 
1087ffb6c6SArnaldo Carvalho de Melo struct perf_cpu_map;
1187ffb6c6SArnaldo Carvalho de Melo 
12f0ce888cSArnaldo Carvalho de Melo struct cpu_topology_map {
13f0ce888cSArnaldo Carvalho de Melo 	int	socket_id;
14acae8b36SKan Liang 	int	die_id;
15*cbc917a1SYicong Yang 	int	cluster_id;
16f0ce888cSArnaldo Carvalho de Melo 	int	core_id;
17f0ce888cSArnaldo Carvalho de Melo };
18f0ce888cSArnaldo Carvalho de Melo 
19720e98b5SJiri Olsa struct cpu_cache_level {
20720e98b5SJiri Olsa 	u32	level;
21720e98b5SJiri Olsa 	u32	line_size;
22720e98b5SJiri Olsa 	u32	sets;
23720e98b5SJiri Olsa 	u32	ways;
24720e98b5SJiri Olsa 	char	*type;
25720e98b5SJiri Olsa 	char	*size;
26720e98b5SJiri Olsa 	char	*map;
27720e98b5SJiri Olsa };
28720e98b5SJiri Olsa 
29c60da22aSJiri Olsa struct numa_node {
30c60da22aSJiri Olsa 	u32		 node;
31c60da22aSJiri Olsa 	u64		 mem_total;
32c60da22aSJiri Olsa 	u64		 mem_free;
33f854839bSJiri Olsa 	struct perf_cpu_map	*map;
34c60da22aSJiri Olsa };
35c60da22aSJiri Olsa 
36e2091cedSJiri Olsa struct memory_node {
37e2091cedSJiri Olsa 	u64		 node;
38e2091cedSJiri Olsa 	u64		 size;
39e2091cedSJiri Olsa 	unsigned long	*set;
40e2091cedSJiri Olsa };
41e2091cedSJiri Olsa 
42f7d74ce3SJin Yao struct hybrid_node {
43f7d74ce3SJin Yao 	char	*pmu_name;
44f7d74ce3SJin Yao 	char	*cpus;
45f7d74ce3SJin Yao };
46f7d74ce3SJin Yao 
472139f742SRavi Bangoria struct pmu_caps {
482139f742SRavi Bangoria 	int		nr_caps;
49e119083bSJin Yao 	unsigned int    max_branches;
50ac9cd724SKan Liang 	unsigned int	br_cntr_nr;
51ac9cd724SKan Liang 	unsigned int	br_cntr_width;
52ac9cd724SKan Liang 
532139f742SRavi Bangoria 	char            **caps;
54e119083bSJin Yao 	char            *pmu_name;
55e119083bSJin Yao };
56e119083bSJin Yao 
574acef676SArnaldo Carvalho de Melo typedef const char *(arch_syscalls__strerrno_t)(int err);
584acef676SArnaldo Carvalho de Melo 
594acef676SArnaldo Carvalho de Melo struct perf_env {
604acef676SArnaldo Carvalho de Melo 	char			*hostname;
61f0ce888cSArnaldo Carvalho de Melo 	char			*os_release;
62f0ce888cSArnaldo Carvalho de Melo 	char			*version;
63f0ce888cSArnaldo Carvalho de Melo 	char			*arch;
64f0ce888cSArnaldo Carvalho de Melo 	int			nr_cpus_online;
65f0ce888cSArnaldo Carvalho de Melo 	int			nr_cpus_avail;
66f0ce888cSArnaldo Carvalho de Melo 	char			*cpu_desc;
67f0ce888cSArnaldo Carvalho de Melo 	char			*cpuid;
68f0ce888cSArnaldo Carvalho de Melo 	unsigned long long	total_mem;
69f0ce888cSArnaldo Carvalho de Melo 	unsigned int		msr_pmu_type;
70f0ce888cSArnaldo Carvalho de Melo 	unsigned int		max_branches;
71e0838e02SKan Liang 	unsigned int		br_cntr_nr;
726f91ea28SKan Liang 	unsigned int		br_cntr_width;
73ac9cd724SKan Liang 	int			kernel_is_64_bit;
74ac9cd724SKan Liang 
757c0223e1SLeo Yan 	int			nr_cmdline;
76f0ce888cSArnaldo Carvalho de Melo 	int			nr_sibling_cores;
77f0ce888cSArnaldo Carvalho de Melo 	int			nr_sibling_dies;
78f0ce888cSArnaldo Carvalho de Melo 	int			nr_sibling_threads;
79acae8b36SKan Liang 	int			nr_numa_nodes;
80f0ce888cSArnaldo Carvalho de Melo 	int			nr_memory_nodes;
81f0ce888cSArnaldo Carvalho de Melo 	int			nr_pmu_mappings;
82e2091cedSJiri Olsa 	int			nr_groups;
83f0ce888cSArnaldo Carvalho de Melo 	int			nr_cpu_pmu_caps;
84f0ce888cSArnaldo Carvalho de Melo 	int			nr_hybrid_nodes;
856f91ea28SKan Liang 	int			nr_pmus_with_caps;
86f7d74ce3SJin Yao 	char			*cmdline;
872139f742SRavi Bangoria 	const char		**cmdline_argv;
88f0ce888cSArnaldo Carvalho de Melo 	char			*sibling_cores;
89f0ce888cSArnaldo Carvalho de Melo 	char			*sibling_dies;
90f0ce888cSArnaldo Carvalho de Melo 	char			*sibling_threads;
91acae8b36SKan Liang 	char			*pmu_mappings;
92f0ce888cSArnaldo Carvalho de Melo 	char			**cpu_pmu_caps;
93f0ce888cSArnaldo Carvalho de Melo 	struct cpu_topology_map	*cpu;
94ff34eaa8SRavi Bangoria 	struct cpu_cache_level	*caches;
95f0ce888cSArnaldo Carvalho de Melo 	int			 caches_cnt;
96720e98b5SJiri Olsa 	u32			comp_ratio;
97720e98b5SJiri Olsa 	u32			comp_ver;
98d3c8c08eSAlexey Budankov 	u32			comp_type;
9942e1fd80SAlexey Budankov 	u32			comp_level;
10042e1fd80SAlexey Budankov 	u32			comp_mmap_len;
10142e1fd80SAlexey Budankov 	struct numa_node	*numa_nodes;
10242e1fd80SAlexey Budankov 	struct memory_node	*memory_nodes;
103c60da22aSJiri Olsa 	unsigned long long	 memory_bsize;
104e2091cedSJiri Olsa 	struct hybrid_node	*hybrid_nodes;
105e2091cedSJiri Olsa 	struct pmu_caps		*pmu_caps;
106f7d74ce3SJin Yao #ifdef HAVE_LIBBPF_SUPPORT
1072139f742SRavi Bangoria 	/*
108ef0580ecSArnaldo Carvalho de Melo 	 * bpf_info_lock protects bpf rbtrees. This is needed because the
109e4378f0cSSong Liu 	 * trees are accessed by different threads in perf-top
110e4378f0cSSong Liu 	 */
111e4378f0cSSong Liu 	struct {
112e4378f0cSSong Liu 		struct rw_semaphore	lock;
113e4378f0cSSong Liu 		struct rb_root		infos;
114e4378f0cSSong Liu 		u32			infos_cnt;
115e4378f0cSSong Liu 		struct rb_root		btfs;
116e4378f0cSSong Liu 		u32			btfs_cnt;
1173792cb2fSSong Liu 	} bpf_progs;
1183792cb2fSSong Liu #endif // HAVE_LIBBPF_SUPPORT
119e4378f0cSSong Liu 	/* same reason as above (for perf-top) */
120ef0580ecSArnaldo Carvalho de Melo 	struct {
121d1277aa3SNamhyung Kim 		struct rw_semaphore	lock;
122d1277aa3SNamhyung Kim 		struct rb_root		tree;
123d1277aa3SNamhyung Kim 	} cgroups;
124d1277aa3SNamhyung Kim 
125d1277aa3SNamhyung Kim 	/* For fast cpu to numa node lookup via perf_env__numa_node */
126d1277aa3SNamhyung Kim 	int			*numa_map;
127389799a7SJiri Olsa 	int			 nr_numa_map;
128389799a7SJiri Olsa 
129389799a7SJiri Olsa 	/* For real clock time reference. */
130d1e325cfSJiri Olsa 	struct {
131d1e325cfSJiri Olsa 		u64	tod_ns;
132d1e325cfSJiri Olsa 		u64	clockid_ns;
133d1e325cfSJiri Olsa 		u64     clockid_res_ns;
134d1e325cfSJiri Olsa 		int	clockid;
1359d88a1a1SJiri Olsa 		/*
136d1e325cfSJiri Olsa 		 * enabled is valid for report mode, and is true if above
137d1e325cfSJiri Olsa 		 * values are set, it's set in process_clock_data
138d1e325cfSJiri Olsa 		 */
139d1e325cfSJiri Olsa 		bool	enabled;
140d1e325cfSJiri Olsa 	} clock;
141d1e325cfSJiri Olsa 	arch_syscalls__strerrno_t *arch_strerrno;
142d1e325cfSJiri Olsa };
1434acef676SArnaldo Carvalho de Melo 
144f0ce888cSArnaldo Carvalho de Melo enum perf_compress_type {
145f0ce888cSArnaldo Carvalho de Melo 	PERF_COMP_NONE = 0,
14642e1fd80SAlexey Budankov 	PERF_COMP_ZSTD,
14742e1fd80SAlexey Budankov 	PERF_COMP_MAX
14842e1fd80SAlexey Budankov };
14942e1fd80SAlexey Budankov 
15042e1fd80SAlexey Budankov struct bpf_prog_info_node;
15142e1fd80SAlexey Budankov struct btf_node;
152e4378f0cSSong Liu 
1533792cb2fSSong Liu int perf_env__read_core_pmu_caps(struct perf_env *env);
154e4378f0cSSong Liu void perf_env__exit(struct perf_env *env);
155b6998692SArnaldo Carvalho de Melo 
156b6998692SArnaldo Carvalho de Melo int perf_env__kernel_is_64_bit(struct perf_env *env);
157f0ce888cSArnaldo Carvalho de Melo 
158f0ce888cSArnaldo Carvalho de Melo int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
1597c0223e1SLeo Yan 
1607c0223e1SLeo Yan int perf_env__read_cpuid(struct perf_env *env);
161b6998692SArnaldo Carvalho de Melo int perf_env__read_pmu_mappings(struct perf_env *env);
162b6998692SArnaldo Carvalho de Melo int perf_env__nr_pmu_mappings(struct perf_env *env);
163f1cedfb8SArnaldo Carvalho de Melo const char *perf_env__pmu_mappings(struct perf_env *env);
1649fe8895aSKim Phillips 
1659fe8895aSKim Phillips int perf_env__read_cpu_topology_map(struct perf_env *env);
1669fe8895aSKim Phillips 
1679fe8895aSKim Phillips void cpu_cache_level__free(struct cpu_cache_level *cache);
168aa36ddd7SArnaldo Carvalho de Melo 
169aa36ddd7SArnaldo Carvalho de Melo const char *perf_env__arch(struct perf_env *env);
170720e98b5SJiri Olsa const char *perf_env__arch_strerrno(struct perf_env *env, int err);
1714e8fbc1cSArnaldo Carvalho de Melo const char *perf_env__cpuid(struct perf_env *env);
1724e8fbc1cSArnaldo Carvalho de Melo const char *perf_env__raw_arch(struct perf_env *env);
17354373b5dSArnaldo Carvalho de Melo int perf_env__nr_cpus_avail(struct perf_env *env);
1749fe8895aSKim Phillips 
175dbbd34a6SAdrian Hunter void perf_env__init(struct perf_env *env);
1769cecca32SAdrian Hunter #ifdef HAVE_LIBBPF_SUPPORT
177dbbd34a6SAdrian Hunter bool __perf_env__insert_bpf_prog_info(struct perf_env *env,
178e4378f0cSSong Liu 				      struct bpf_prog_info_node *info_node);
1799c51f878SIan Rogers bool perf_env__insert_bpf_prog_info(struct perf_env *env,
1809c51f878SIan Rogers 				    struct bpf_prog_info_node *info_node);
181e4378f0cSSong Liu struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
182e4378f0cSSong Liu 							__u32 prog_id);
183e4378f0cSSong Liu void perf_env__iterate_bpf_prog_info(struct perf_env *env,
184e4378f0cSSong Liu 				     void (*cb)(struct bpf_prog_info_node *node,
1854924b1f7SIan Rogers 						void *data),
1869c51f878SIan Rogers 				     void *data);
1873792cb2fSSong Liu bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
1889c51f878SIan Rogers bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
189389799a7SJiri Olsa struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
1906d18804bSIan Rogers struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id);
1912139f742SRavi Bangoria #endif // HAVE_LIBBPF_SUPPORT
1922139f742SRavi Bangoria 
193dd678532SArnaldo Carvalho de Melo int perf_env__numa_node(struct perf_env *env, struct perf_cpu cpu);
194dd678532SArnaldo Carvalho de Melo char *perf_env__find_pmu_cap(struct perf_env *env, const char *pmu_name,
195f0ce888cSArnaldo Carvalho de Melo 			     const char *cap);
196 
197 bool perf_env__has_pmu_mapping(struct perf_env *env, const char *pmu_name);
198 void perf_env__find_br_cntr_info(struct perf_env *env,
199 				 unsigned int *nr,
200 				 unsigned int *width);
201 
202 bool x86__is_amd_cpu(void);
203 bool perf_env__is_x86_amd_cpu(struct perf_env *env);
204 bool x86__is_intel_cpu(void);
205 bool perf_env__is_x86_intel_cpu(struct perf_env *env);
206 
207 #endif /* __PERF_ENV_H */
208