18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __PERF_STATS_H
38c2ecf20Sopenharmony_ci#define __PERF_STATS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/types.h>
68c2ecf20Sopenharmony_ci#include <stdio.h>
78c2ecf20Sopenharmony_ci#include <sys/types.h>
88c2ecf20Sopenharmony_ci#include <sys/resource.h>
98c2ecf20Sopenharmony_ci#include "rblist.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct perf_cpu_map;
128c2ecf20Sopenharmony_cistruct perf_stat_config;
138c2ecf20Sopenharmony_cistruct timespec;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct stats {
168c2ecf20Sopenharmony_ci	double n, mean, M2;
178c2ecf20Sopenharmony_ci	u64 max, min;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cienum perf_stat_evsel_id {
218c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__NONE = 0,
228c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__CYCLES_IN_TX,
238c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TRANSACTION_START,
248c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__ELISION_START,
258c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__CYCLES_IN_TX_CP,
268c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_TOTAL_SLOTS,
278c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_ISSUED,
288c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_RETIRED,
298c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_FETCH_BUBBLES,
308c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_RECOVERY_BUBBLES,
318c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_RETIRING,
328c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_BAD_SPEC,
338c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_FE_BOUND,
348c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__TOPDOWN_BE_BOUND,
358c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__SMI_NUM,
368c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__APERF,
378c2ecf20Sopenharmony_ci	PERF_STAT_EVSEL_ID__MAX,
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistruct perf_stat_evsel {
418c2ecf20Sopenharmony_ci	struct stats		 res_stats[3];
428c2ecf20Sopenharmony_ci	enum perf_stat_evsel_id	 id;
438c2ecf20Sopenharmony_ci	u64			*group_data;
448c2ecf20Sopenharmony_ci};
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cienum aggr_mode {
478c2ecf20Sopenharmony_ci	AGGR_NONE,
488c2ecf20Sopenharmony_ci	AGGR_GLOBAL,
498c2ecf20Sopenharmony_ci	AGGR_SOCKET,
508c2ecf20Sopenharmony_ci	AGGR_DIE,
518c2ecf20Sopenharmony_ci	AGGR_CORE,
528c2ecf20Sopenharmony_ci	AGGR_THREAD,
538c2ecf20Sopenharmony_ci	AGGR_UNSET,
548c2ecf20Sopenharmony_ci	AGGR_NODE,
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cienum {
588c2ecf20Sopenharmony_ci	CTX_BIT_USER	= 1 << 0,
598c2ecf20Sopenharmony_ci	CTX_BIT_KERNEL	= 1 << 1,
608c2ecf20Sopenharmony_ci	CTX_BIT_HV	= 1 << 2,
618c2ecf20Sopenharmony_ci	CTX_BIT_HOST	= 1 << 3,
628c2ecf20Sopenharmony_ci	CTX_BIT_IDLE	= 1 << 4,
638c2ecf20Sopenharmony_ci	CTX_BIT_MAX	= 1 << 5,
648c2ecf20Sopenharmony_ci};
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define NUM_CTX CTX_BIT_MAX
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cienum stat_type {
698c2ecf20Sopenharmony_ci	STAT_NONE = 0,
708c2ecf20Sopenharmony_ci	STAT_NSECS,
718c2ecf20Sopenharmony_ci	STAT_CYCLES,
728c2ecf20Sopenharmony_ci	STAT_STALLED_CYCLES_FRONT,
738c2ecf20Sopenharmony_ci	STAT_STALLED_CYCLES_BACK,
748c2ecf20Sopenharmony_ci	STAT_BRANCHES,
758c2ecf20Sopenharmony_ci	STAT_CACHEREFS,
768c2ecf20Sopenharmony_ci	STAT_L1_DCACHE,
778c2ecf20Sopenharmony_ci	STAT_L1_ICACHE,
788c2ecf20Sopenharmony_ci	STAT_LL_CACHE,
798c2ecf20Sopenharmony_ci	STAT_ITLB_CACHE,
808c2ecf20Sopenharmony_ci	STAT_DTLB_CACHE,
818c2ecf20Sopenharmony_ci	STAT_CYCLES_IN_TX,
828c2ecf20Sopenharmony_ci	STAT_TRANSACTION,
838c2ecf20Sopenharmony_ci	STAT_ELISION,
848c2ecf20Sopenharmony_ci	STAT_TOPDOWN_TOTAL_SLOTS,
858c2ecf20Sopenharmony_ci	STAT_TOPDOWN_SLOTS_ISSUED,
868c2ecf20Sopenharmony_ci	STAT_TOPDOWN_SLOTS_RETIRED,
878c2ecf20Sopenharmony_ci	STAT_TOPDOWN_FETCH_BUBBLES,
888c2ecf20Sopenharmony_ci	STAT_TOPDOWN_RECOVERY_BUBBLES,
898c2ecf20Sopenharmony_ci	STAT_TOPDOWN_RETIRING,
908c2ecf20Sopenharmony_ci	STAT_TOPDOWN_BAD_SPEC,
918c2ecf20Sopenharmony_ci	STAT_TOPDOWN_FE_BOUND,
928c2ecf20Sopenharmony_ci	STAT_TOPDOWN_BE_BOUND,
938c2ecf20Sopenharmony_ci	STAT_SMI_NUM,
948c2ecf20Sopenharmony_ci	STAT_APERF,
958c2ecf20Sopenharmony_ci	STAT_MAX
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistruct runtime_stat {
998c2ecf20Sopenharmony_ci	struct rblist value_list;
1008c2ecf20Sopenharmony_ci};
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_citypedef int (*aggr_get_id_t)(struct perf_stat_config *config,
1038c2ecf20Sopenharmony_ci			     struct perf_cpu_map *m, int cpu);
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistruct perf_stat_config {
1068c2ecf20Sopenharmony_ci	enum aggr_mode		 aggr_mode;
1078c2ecf20Sopenharmony_ci	bool			 scale;
1088c2ecf20Sopenharmony_ci	bool			 no_inherit;
1098c2ecf20Sopenharmony_ci	bool			 identifier;
1108c2ecf20Sopenharmony_ci	bool			 csv_output;
1118c2ecf20Sopenharmony_ci	bool			 interval_clear;
1128c2ecf20Sopenharmony_ci	bool			 metric_only;
1138c2ecf20Sopenharmony_ci	bool			 null_run;
1148c2ecf20Sopenharmony_ci	bool			 ru_display;
1158c2ecf20Sopenharmony_ci	bool			 big_num;
1168c2ecf20Sopenharmony_ci	bool			 no_merge;
1178c2ecf20Sopenharmony_ci	bool			 walltime_run_table;
1188c2ecf20Sopenharmony_ci	bool			 all_kernel;
1198c2ecf20Sopenharmony_ci	bool			 all_user;
1208c2ecf20Sopenharmony_ci	bool			 percore_show_thread;
1218c2ecf20Sopenharmony_ci	bool			 summary;
1228c2ecf20Sopenharmony_ci	bool			 metric_no_group;
1238c2ecf20Sopenharmony_ci	bool			 metric_no_merge;
1248c2ecf20Sopenharmony_ci	bool			 stop_read_counter;
1258c2ecf20Sopenharmony_ci	FILE			*output;
1268c2ecf20Sopenharmony_ci	unsigned int		 interval;
1278c2ecf20Sopenharmony_ci	unsigned int		 timeout;
1288c2ecf20Sopenharmony_ci	int			 initial_delay;
1298c2ecf20Sopenharmony_ci	unsigned int		 unit_width;
1308c2ecf20Sopenharmony_ci	unsigned int		 metric_only_len;
1318c2ecf20Sopenharmony_ci	int			 times;
1328c2ecf20Sopenharmony_ci	int			 run_count;
1338c2ecf20Sopenharmony_ci	int			 print_free_counters_hint;
1348c2ecf20Sopenharmony_ci	int			 print_mixed_hw_group_error;
1358c2ecf20Sopenharmony_ci	struct runtime_stat	*stats;
1368c2ecf20Sopenharmony_ci	int			 stats_num;
1378c2ecf20Sopenharmony_ci	const char		*csv_sep;
1388c2ecf20Sopenharmony_ci	struct stats		*walltime_nsecs_stats;
1398c2ecf20Sopenharmony_ci	struct rusage		 ru_data;
1408c2ecf20Sopenharmony_ci	struct perf_cpu_map		*aggr_map;
1418c2ecf20Sopenharmony_ci	aggr_get_id_t		 aggr_get_id;
1428c2ecf20Sopenharmony_ci	struct perf_cpu_map		*cpus_aggr_map;
1438c2ecf20Sopenharmony_ci	u64			*walltime_run;
1448c2ecf20Sopenharmony_ci	struct rblist		 metric_events;
1458c2ecf20Sopenharmony_ci	int			 ctl_fd;
1468c2ecf20Sopenharmony_ci	int			 ctl_fd_ack;
1478c2ecf20Sopenharmony_ci	bool			 ctl_fd_close;
1488c2ecf20Sopenharmony_ci	const char		*cgroup_list;
1498c2ecf20Sopenharmony_ci};
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_civoid perf_stat__set_big_num(int set);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_civoid update_stats(struct stats *stats, u64 val);
1548c2ecf20Sopenharmony_cidouble avg_stats(struct stats *stats);
1558c2ecf20Sopenharmony_cidouble stddev_stats(struct stats *stats);
1568c2ecf20Sopenharmony_cidouble rel_stddev_stats(double stddev, double avg);
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistatic inline void init_stats(struct stats *stats)
1598c2ecf20Sopenharmony_ci{
1608c2ecf20Sopenharmony_ci	stats->n    = 0.0;
1618c2ecf20Sopenharmony_ci	stats->mean = 0.0;
1628c2ecf20Sopenharmony_ci	stats->M2   = 0.0;
1638c2ecf20Sopenharmony_ci	stats->min  = (u64) -1;
1648c2ecf20Sopenharmony_ci	stats->max  = 0;
1658c2ecf20Sopenharmony_ci}
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_cistruct evsel;
1688c2ecf20Sopenharmony_cistruct evlist;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_cistruct perf_aggr_thread_value {
1718c2ecf20Sopenharmony_ci	struct evsel *counter;
1728c2ecf20Sopenharmony_ci	int id;
1738c2ecf20Sopenharmony_ci	double uval;
1748c2ecf20Sopenharmony_ci	u64 val;
1758c2ecf20Sopenharmony_ci	u64 run;
1768c2ecf20Sopenharmony_ci	u64 ena;
1778c2ecf20Sopenharmony_ci};
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cibool __perf_evsel_stat__is(struct evsel *evsel,
1808c2ecf20Sopenharmony_ci			   enum perf_stat_evsel_id id);
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci#define perf_stat_evsel__is(evsel, id) \
1838c2ecf20Sopenharmony_ci	__perf_evsel_stat__is(evsel, PERF_STAT_EVSEL_ID__ ## id)
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ciextern struct runtime_stat rt_stat;
1868c2ecf20Sopenharmony_ciextern struct stats walltime_nsecs_stats;
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_citypedef void (*print_metric_t)(struct perf_stat_config *config,
1898c2ecf20Sopenharmony_ci			       void *ctx, const char *color, const char *unit,
1908c2ecf20Sopenharmony_ci			       const char *fmt, double val);
1918c2ecf20Sopenharmony_citypedef void (*new_line_t)(struct perf_stat_config *config, void *ctx);
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_civoid runtime_stat__init(struct runtime_stat *st);
1948c2ecf20Sopenharmony_civoid runtime_stat__exit(struct runtime_stat *st);
1958c2ecf20Sopenharmony_civoid perf_stat__init_shadow_stats(void);
1968c2ecf20Sopenharmony_civoid perf_stat__reset_shadow_stats(void);
1978c2ecf20Sopenharmony_civoid perf_stat__reset_shadow_per_stat(struct runtime_stat *st);
1988c2ecf20Sopenharmony_civoid perf_stat__update_shadow_stats(struct evsel *counter, u64 count,
1998c2ecf20Sopenharmony_ci				    int cpu, struct runtime_stat *st);
2008c2ecf20Sopenharmony_cistruct perf_stat_output_ctx {
2018c2ecf20Sopenharmony_ci	void *ctx;
2028c2ecf20Sopenharmony_ci	print_metric_t print_metric;
2038c2ecf20Sopenharmony_ci	new_line_t new_line;
2048c2ecf20Sopenharmony_ci	bool force_header;
2058c2ecf20Sopenharmony_ci};
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_civoid perf_stat__print_shadow_stats(struct perf_stat_config *config,
2088c2ecf20Sopenharmony_ci				   struct evsel *evsel,
2098c2ecf20Sopenharmony_ci				   double avg, int cpu,
2108c2ecf20Sopenharmony_ci				   struct perf_stat_output_ctx *out,
2118c2ecf20Sopenharmony_ci				   struct rblist *metric_events,
2128c2ecf20Sopenharmony_ci				   struct runtime_stat *st);
2138c2ecf20Sopenharmony_civoid perf_stat__collect_metric_expr(struct evlist *);
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ciint perf_evlist__alloc_stats(struct evlist *evlist, bool alloc_raw);
2168c2ecf20Sopenharmony_civoid perf_evlist__free_stats(struct evlist *evlist);
2178c2ecf20Sopenharmony_civoid perf_evlist__reset_stats(struct evlist *evlist);
2188c2ecf20Sopenharmony_civoid perf_evlist__reset_prev_raw_counts(struct evlist *evlist);
2198c2ecf20Sopenharmony_civoid perf_evlist__copy_prev_raw_counts(struct evlist *evlist);
2208c2ecf20Sopenharmony_civoid perf_evlist__save_aggr_prev_raw_counts(struct evlist *evlist);
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ciint perf_stat_process_counter(struct perf_stat_config *config,
2238c2ecf20Sopenharmony_ci			      struct evsel *counter);
2248c2ecf20Sopenharmony_cistruct perf_tool;
2258c2ecf20Sopenharmony_ciunion perf_event;
2268c2ecf20Sopenharmony_cistruct perf_session;
2278c2ecf20Sopenharmony_cistruct target;
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ciint perf_event__process_stat_event(struct perf_session *session,
2308c2ecf20Sopenharmony_ci				   union perf_event *event);
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_cisize_t perf_event__fprintf_stat(union perf_event *event, FILE *fp);
2338c2ecf20Sopenharmony_cisize_t perf_event__fprintf_stat_round(union perf_event *event, FILE *fp);
2348c2ecf20Sopenharmony_cisize_t perf_event__fprintf_stat_config(union perf_event *event, FILE *fp);
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ciint create_perf_stat_counter(struct evsel *evsel,
2378c2ecf20Sopenharmony_ci			     struct perf_stat_config *config,
2388c2ecf20Sopenharmony_ci			     struct target *target,
2398c2ecf20Sopenharmony_ci			     int cpu);
2408c2ecf20Sopenharmony_civoid
2418c2ecf20Sopenharmony_ciperf_evlist__print_counters(struct evlist *evlist,
2428c2ecf20Sopenharmony_ci			    struct perf_stat_config *config,
2438c2ecf20Sopenharmony_ci			    struct target *_target,
2448c2ecf20Sopenharmony_ci			    struct timespec *ts,
2458c2ecf20Sopenharmony_ci			    int argc, const char **argv);
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistruct metric_expr;
2488c2ecf20Sopenharmony_cidouble test_generic_metric(struct metric_expr *mexp, int cpu, struct runtime_stat *st);
2498c2ecf20Sopenharmony_ci#endif
250