|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef __PERF_STATS_H | 
|  | #define __PERF_STATS_H | 
|  |  | 
|  | #include <linux/types.h> | 
|  | #include <stdio.h> | 
|  | #include "xyarray.h" | 
|  | #include "rblist.h" | 
|  |  | 
|  | struct stats { | 
|  | double n, mean, M2; | 
|  | u64 max, min; | 
|  | }; | 
|  |  | 
|  | enum perf_stat_evsel_id { | 
|  | PERF_STAT_EVSEL_ID__NONE = 0, | 
|  | PERF_STAT_EVSEL_ID__CYCLES_IN_TX, | 
|  | PERF_STAT_EVSEL_ID__TRANSACTION_START, | 
|  | PERF_STAT_EVSEL_ID__ELISION_START, | 
|  | PERF_STAT_EVSEL_ID__CYCLES_IN_TX_CP, | 
|  | PERF_STAT_EVSEL_ID__TOPDOWN_TOTAL_SLOTS, | 
|  | PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_ISSUED, | 
|  | PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_RETIRED, | 
|  | PERF_STAT_EVSEL_ID__TOPDOWN_FETCH_BUBBLES, | 
|  | PERF_STAT_EVSEL_ID__TOPDOWN_RECOVERY_BUBBLES, | 
|  | PERF_STAT_EVSEL_ID__SMI_NUM, | 
|  | PERF_STAT_EVSEL_ID__APERF, | 
|  | PERF_STAT_EVSEL_ID__MAX, | 
|  | }; | 
|  |  | 
|  | struct perf_stat_evsel { | 
|  | struct stats		 res_stats[3]; | 
|  | enum perf_stat_evsel_id	 id; | 
|  | u64			*group_data; | 
|  | }; | 
|  |  | 
|  | enum aggr_mode { | 
|  | AGGR_NONE, | 
|  | AGGR_GLOBAL, | 
|  | AGGR_SOCKET, | 
|  | AGGR_CORE, | 
|  | AGGR_THREAD, | 
|  | AGGR_UNSET, | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | CTX_BIT_USER	= 1 << 0, | 
|  | CTX_BIT_KERNEL	= 1 << 1, | 
|  | CTX_BIT_HV	= 1 << 2, | 
|  | CTX_BIT_HOST	= 1 << 3, | 
|  | CTX_BIT_IDLE	= 1 << 4, | 
|  | CTX_BIT_MAX	= 1 << 5, | 
|  | }; | 
|  |  | 
|  | #define NUM_CTX CTX_BIT_MAX | 
|  |  | 
|  | enum stat_type { | 
|  | STAT_NONE = 0, | 
|  | STAT_NSECS, | 
|  | STAT_CYCLES, | 
|  | STAT_STALLED_CYCLES_FRONT, | 
|  | STAT_STALLED_CYCLES_BACK, | 
|  | STAT_BRANCHES, | 
|  | STAT_CACHEREFS, | 
|  | STAT_L1_DCACHE, | 
|  | STAT_L1_ICACHE, | 
|  | STAT_LL_CACHE, | 
|  | STAT_ITLB_CACHE, | 
|  | STAT_DTLB_CACHE, | 
|  | STAT_CYCLES_IN_TX, | 
|  | STAT_TRANSACTION, | 
|  | STAT_ELISION, | 
|  | STAT_TOPDOWN_TOTAL_SLOTS, | 
|  | STAT_TOPDOWN_SLOTS_ISSUED, | 
|  | STAT_TOPDOWN_SLOTS_RETIRED, | 
|  | STAT_TOPDOWN_FETCH_BUBBLES, | 
|  | STAT_TOPDOWN_RECOVERY_BUBBLES, | 
|  | STAT_SMI_NUM, | 
|  | STAT_APERF, | 
|  | STAT_MAX | 
|  | }; | 
|  |  | 
|  | struct runtime_stat { | 
|  | struct rblist value_list; | 
|  | }; | 
|  |  | 
|  | struct perf_stat_config { | 
|  | enum aggr_mode	aggr_mode; | 
|  | bool		scale; | 
|  | FILE		*output; | 
|  | unsigned int	interval; | 
|  | unsigned int	timeout; | 
|  | int		times; | 
|  | struct runtime_stat *stats; | 
|  | int		stats_num; | 
|  | }; | 
|  |  | 
|  | void update_stats(struct stats *stats, u64 val); | 
|  | double avg_stats(struct stats *stats); | 
|  | double stddev_stats(struct stats *stats); | 
|  | double rel_stddev_stats(double stddev, double avg); | 
|  |  | 
|  | static inline void init_stats(struct stats *stats) | 
|  | { | 
|  | stats->n    = 0.0; | 
|  | stats->mean = 0.0; | 
|  | stats->M2   = 0.0; | 
|  | stats->min  = (u64) -1; | 
|  | stats->max  = 0; | 
|  | } | 
|  |  | 
|  | struct perf_evsel; | 
|  | struct perf_evlist; | 
|  |  | 
|  | struct perf_aggr_thread_value { | 
|  | struct perf_evsel *counter; | 
|  | int id; | 
|  | double uval; | 
|  | u64 val; | 
|  | u64 run; | 
|  | u64 ena; | 
|  | }; | 
|  |  | 
|  | bool __perf_evsel_stat__is(struct perf_evsel *evsel, | 
|  | enum perf_stat_evsel_id id); | 
|  |  | 
|  | #define perf_stat_evsel__is(evsel, id) \ | 
|  | __perf_evsel_stat__is(evsel, PERF_STAT_EVSEL_ID__ ## id) | 
|  |  | 
|  | extern struct runtime_stat rt_stat; | 
|  | extern struct stats walltime_nsecs_stats; | 
|  |  | 
|  | typedef void (*print_metric_t)(void *ctx, const char *color, const char *unit, | 
|  | const char *fmt, double val); | 
|  | typedef void (*new_line_t )(void *ctx); | 
|  |  | 
|  | void runtime_stat__init(struct runtime_stat *st); | 
|  | void runtime_stat__exit(struct runtime_stat *st); | 
|  | void perf_stat__init_shadow_stats(void); | 
|  | void perf_stat__reset_shadow_stats(void); | 
|  | void perf_stat__reset_shadow_per_stat(struct runtime_stat *st); | 
|  | void perf_stat__update_shadow_stats(struct perf_evsel *counter, u64 count, | 
|  | int cpu, struct runtime_stat *st); | 
|  | struct perf_stat_output_ctx { | 
|  | void *ctx; | 
|  | print_metric_t print_metric; | 
|  | new_line_t new_line; | 
|  | bool force_header; | 
|  | }; | 
|  |  | 
|  | void perf_stat__print_shadow_stats(struct perf_evsel *evsel, | 
|  | double avg, int cpu, | 
|  | struct perf_stat_output_ctx *out, | 
|  | struct rblist *metric_events, | 
|  | struct runtime_stat *st); | 
|  | void perf_stat__collect_metric_expr(struct perf_evlist *); | 
|  |  | 
|  | int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw); | 
|  | void perf_evlist__free_stats(struct perf_evlist *evlist); | 
|  | void perf_evlist__reset_stats(struct perf_evlist *evlist); | 
|  | void perf_evlist__reset_prev_raw_counts(struct perf_evlist *evlist); | 
|  |  | 
|  | int perf_stat_process_counter(struct perf_stat_config *config, | 
|  | struct perf_evsel *counter); | 
|  | struct perf_tool; | 
|  | union perf_event; | 
|  | struct perf_session; | 
|  | int perf_event__process_stat_event(struct perf_tool *tool, | 
|  | union perf_event *event, | 
|  | struct perf_session *session); | 
|  |  | 
|  | size_t perf_event__fprintf_stat(union perf_event *event, FILE *fp); | 
|  | size_t perf_event__fprintf_stat_round(union perf_event *event, FILE *fp); | 
|  | size_t perf_event__fprintf_stat_config(union perf_event *event, FILE *fp); | 
|  | #endif |