18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __PERF_ENV_H
38c2ecf20Sopenharmony_ci#define __PERF_ENV_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/types.h>
68c2ecf20Sopenharmony_ci#include <linux/rbtree.h>
78c2ecf20Sopenharmony_ci#include "rwsem.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistruct perf_cpu_map;
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct cpu_topology_map {
128c2ecf20Sopenharmony_ci	int	socket_id;
138c2ecf20Sopenharmony_ci	int	die_id;
148c2ecf20Sopenharmony_ci	int	core_id;
158c2ecf20Sopenharmony_ci};
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct cpu_cache_level {
188c2ecf20Sopenharmony_ci	u32	level;
198c2ecf20Sopenharmony_ci	u32	line_size;
208c2ecf20Sopenharmony_ci	u32	sets;
218c2ecf20Sopenharmony_ci	u32	ways;
228c2ecf20Sopenharmony_ci	char	*type;
238c2ecf20Sopenharmony_ci	char	*size;
248c2ecf20Sopenharmony_ci	char	*map;
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct numa_node {
288c2ecf20Sopenharmony_ci	u32		 node;
298c2ecf20Sopenharmony_ci	u64		 mem_total;
308c2ecf20Sopenharmony_ci	u64		 mem_free;
318c2ecf20Sopenharmony_ci	struct perf_cpu_map	*map;
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistruct memory_node {
358c2ecf20Sopenharmony_ci	u64		 node;
368c2ecf20Sopenharmony_ci	u64		 size;
378c2ecf20Sopenharmony_ci	unsigned long	*set;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistruct perf_env {
418c2ecf20Sopenharmony_ci	char			*hostname;
428c2ecf20Sopenharmony_ci	char			*os_release;
438c2ecf20Sopenharmony_ci	char			*version;
448c2ecf20Sopenharmony_ci	char			*arch;
458c2ecf20Sopenharmony_ci	int			nr_cpus_online;
468c2ecf20Sopenharmony_ci	int			nr_cpus_avail;
478c2ecf20Sopenharmony_ci	char			*cpu_desc;
488c2ecf20Sopenharmony_ci	char			*cpuid;
498c2ecf20Sopenharmony_ci	unsigned long long	total_mem;
508c2ecf20Sopenharmony_ci	unsigned int		msr_pmu_type;
518c2ecf20Sopenharmony_ci	unsigned int		max_branches;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	int			nr_cmdline;
548c2ecf20Sopenharmony_ci	int			nr_sibling_cores;
558c2ecf20Sopenharmony_ci	int			nr_sibling_dies;
568c2ecf20Sopenharmony_ci	int			nr_sibling_threads;
578c2ecf20Sopenharmony_ci	int			nr_numa_nodes;
588c2ecf20Sopenharmony_ci	int			nr_memory_nodes;
598c2ecf20Sopenharmony_ci	int			nr_pmu_mappings;
608c2ecf20Sopenharmony_ci	int			nr_groups;
618c2ecf20Sopenharmony_ci	int			nr_cpu_pmu_caps;
628c2ecf20Sopenharmony_ci	char			*cmdline;
638c2ecf20Sopenharmony_ci	const char		**cmdline_argv;
648c2ecf20Sopenharmony_ci	char			*sibling_cores;
658c2ecf20Sopenharmony_ci	char			*sibling_dies;
668c2ecf20Sopenharmony_ci	char			*sibling_threads;
678c2ecf20Sopenharmony_ci	char			*pmu_mappings;
688c2ecf20Sopenharmony_ci	char			*cpu_pmu_caps;
698c2ecf20Sopenharmony_ci	struct cpu_topology_map	*cpu;
708c2ecf20Sopenharmony_ci	struct cpu_cache_level	*caches;
718c2ecf20Sopenharmony_ci	int			 caches_cnt;
728c2ecf20Sopenharmony_ci	u32			comp_ratio;
738c2ecf20Sopenharmony_ci	u32			comp_ver;
748c2ecf20Sopenharmony_ci	u32			comp_type;
758c2ecf20Sopenharmony_ci	u32			comp_level;
768c2ecf20Sopenharmony_ci	u32			comp_mmap_len;
778c2ecf20Sopenharmony_ci	struct numa_node	*numa_nodes;
788c2ecf20Sopenharmony_ci	struct memory_node	*memory_nodes;
798c2ecf20Sopenharmony_ci	unsigned long long	 memory_bsize;
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	/*
828c2ecf20Sopenharmony_ci	 * bpf_info_lock protects bpf rbtrees. This is needed because the
838c2ecf20Sopenharmony_ci	 * trees are accessed by different threads in perf-top
848c2ecf20Sopenharmony_ci	 */
858c2ecf20Sopenharmony_ci	struct {
868c2ecf20Sopenharmony_ci		struct rw_semaphore	lock;
878c2ecf20Sopenharmony_ci		struct rb_root		infos;
888c2ecf20Sopenharmony_ci		u32			infos_cnt;
898c2ecf20Sopenharmony_ci		struct rb_root		btfs;
908c2ecf20Sopenharmony_ci		u32			btfs_cnt;
918c2ecf20Sopenharmony_ci	} bpf_progs;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	/* same reason as above (for perf-top) */
948c2ecf20Sopenharmony_ci	struct {
958c2ecf20Sopenharmony_ci		struct rw_semaphore	lock;
968c2ecf20Sopenharmony_ci		struct rb_root		tree;
978c2ecf20Sopenharmony_ci	} cgroups;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci	/* For fast cpu to numa node lookup via perf_env__numa_node */
1008c2ecf20Sopenharmony_ci	int			*numa_map;
1018c2ecf20Sopenharmony_ci	int			 nr_numa_map;
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	/* For real clock time reference. */
1048c2ecf20Sopenharmony_ci	struct {
1058c2ecf20Sopenharmony_ci		u64	tod_ns;
1068c2ecf20Sopenharmony_ci		u64	clockid_ns;
1078c2ecf20Sopenharmony_ci		u64     clockid_res_ns;
1088c2ecf20Sopenharmony_ci		int	clockid;
1098c2ecf20Sopenharmony_ci		/*
1108c2ecf20Sopenharmony_ci		 * enabled is valid for report mode, and is true if above
1118c2ecf20Sopenharmony_ci		 * values are set, it's set in process_clock_data
1128c2ecf20Sopenharmony_ci		 */
1138c2ecf20Sopenharmony_ci		bool	enabled;
1148c2ecf20Sopenharmony_ci	} clock;
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cienum perf_compress_type {
1188c2ecf20Sopenharmony_ci	PERF_COMP_NONE = 0,
1198c2ecf20Sopenharmony_ci	PERF_COMP_ZSTD,
1208c2ecf20Sopenharmony_ci	PERF_COMP_MAX
1218c2ecf20Sopenharmony_ci};
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cistruct bpf_prog_info_node;
1248c2ecf20Sopenharmony_cistruct btf_node;
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ciextern struct perf_env perf_env;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_civoid perf_env__exit(struct perf_env *env);
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ciint perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ciint perf_env__read_cpuid(struct perf_env *env);
1338c2ecf20Sopenharmony_ciint perf_env__read_cpu_topology_map(struct perf_env *env);
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_civoid cpu_cache_level__free(struct cpu_cache_level *cache);
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ciconst char *perf_env__arch(struct perf_env *env);
1388c2ecf20Sopenharmony_ciconst char *perf_env__raw_arch(struct perf_env *env);
1398c2ecf20Sopenharmony_ciint perf_env__nr_cpus_avail(struct perf_env *env);
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_civoid perf_env__init(struct perf_env *env);
1428c2ecf20Sopenharmony_civoid __perf_env__insert_bpf_prog_info(struct perf_env *env,
1438c2ecf20Sopenharmony_ci				      struct bpf_prog_info_node *info_node);
1448c2ecf20Sopenharmony_civoid perf_env__insert_bpf_prog_info(struct perf_env *env,
1458c2ecf20Sopenharmony_ci				    struct bpf_prog_info_node *info_node);
1468c2ecf20Sopenharmony_cistruct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
1478c2ecf20Sopenharmony_ci							__u32 prog_id);
1488c2ecf20Sopenharmony_cibool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
1498c2ecf20Sopenharmony_cibool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
1508c2ecf20Sopenharmony_cistruct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
1518c2ecf20Sopenharmony_cistruct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ciint perf_env__numa_node(struct perf_env *env, int cpu);
1548c2ecf20Sopenharmony_ci#endif /* __PERF_ENV_H */
155