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