1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
280eeb67fSAndi Kleen #ifndef PMU_EVENTS_H
380eeb67fSAndi Kleen #define PMU_EVENTS_H
480eeb67fSAndi Kleen 
59ed8b7dcSIan Rogers #include <stdbool.h>
6*e6ff1eedSIan Rogers #include <stddef.h>
79ed8b7dcSIan Rogers 
829be2fe0SIan Rogers struct perf_pmu;
929be2fe0SIan Rogers 
10560ccbc4SKajol Jain enum aggr_mode_class {
11560ccbc4SKajol Jain 	PerChip = 1,
12560ccbc4SKajol Jain 	PerCore
13560ccbc4SKajol Jain };
14560ccbc4SKajol Jain 
1590053634SIan Rogers /**
1690053634SIan Rogers  * enum metric_event_groups - How events within a pmu_metric should be grouped.
1790053634SIan Rogers  */
1890053634SIan Rogers enum metric_event_groups {
1990053634SIan Rogers 	/**
2090053634SIan Rogers 	 * @MetricGroupEvents: Default, group events within the metric.
2190053634SIan Rogers 	 */
2290053634SIan Rogers 	MetricGroupEvents = 0,
2390053634SIan Rogers 	/**
2490053634SIan Rogers 	 * @MetricNoGroupEvents: Don't group events for the metric.
2590053634SIan Rogers 	 */
2690053634SIan Rogers 	MetricNoGroupEvents = 1,
2790053634SIan Rogers 	/**
2890053634SIan Rogers 	 * @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI
2990053634SIan Rogers 	 *                          watchdog is enabled.
3090053634SIan Rogers 	 */
3190053634SIan Rogers 	MetricNoGroupEventsNmi = 2,
3290053634SIan Rogers 	/**
3390053634SIan Rogers 	 * @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is
3490053634SIan Rogers 	 *                          enabled.
3590053634SIan Rogers 	 */
3690053634SIan Rogers 	MetricNoGroupEventsSmt = 3,
3790053634SIan Rogers };
3880eeb67fSAndi Kleen /*
3980eeb67fSAndi Kleen  * Describe each PMU event. Each CPU has a table of PMU events.
4080eeb67fSAndi Kleen  */
4180eeb67fSAndi Kleen struct pmu_event {
4280eeb67fSAndi Kleen 	const char *name;
434689f567SJohn Garry 	const char *compat;
4480eeb67fSAndi Kleen 	const char *event;
4580eeb67fSAndi Kleen 	const char *desc;
4680eeb67fSAndi Kleen 	const char *topic;
47794ba54aSSukadev Bhattiprolu 	const char *long_desc;
48fedb2b51SAndi Kleen 	const char *pmu;
49fedb2b51SAndi Kleen 	const char *unit;
50bd680861SIan Rogers 	bool perpkg;
519ed8b7dcSIan Rogers 	bool deprecated;
5280eeb67fSAndi Kleen };
5380eeb67fSAndi Kleen 
54db95818eSIan Rogers struct pmu_metric {
55bd3846d0SIan Rogers 	const char *pmu;
56db95818eSIan Rogers 	const char *metric_name;
57db95818eSIan Rogers 	const char *metric_group;
58d9dc8874SIan Rogers 	const char *metric_expr;
5945e8867aSIan Rogers 	const char *metric_threshold;
60d9dc8874SIan Rogers 	const char *unit;
61d9dc8874SIan Rogers 	const char *compat;
62d9dc8874SIan Rogers 	const char *desc;
63d9dc8874SIan Rogers 	const char *long_desc;
64ccc66c60SIan Rogers 	const char *metricgroup_no_group;
65b0a9e8f8SKan Liang 	const char *default_metricgroup_name;
661fa0c371SIan Rogers 	enum aggr_mode_class aggr_mode;
6790053634SIan Rogers 	enum metric_event_groups event_grouping;
68db95818eSIan Rogers };
69db95818eSIan Rogers 
701ba3752aSIan Rogers struct pmu_events_table;
71f8ea2c15SIan Rogers struct pmu_metrics_table;
721ba3752aSIan Rogers 
7329be2fe0SIan Rogers typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe,
741ba3752aSIan Rogers 				 const struct pmu_events_table *table,
7529be2fe0SIan Rogers 				 void *data);
7680eeb67fSAndi Kleen 
77db95818eSIan Rogers typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm,
78f8ea2c15SIan Rogers 				  const struct pmu_metrics_table *table,
79db95818eSIan Rogers 				  void *data);
80db95818eSIan Rogers 
81e3edd6cfSIan Rogers int pmu_events_table__for_each_event(const struct pmu_events_table *table,
82e3edd6cfSIan Rogers 				    struct perf_pmu *pmu,
83e3edd6cfSIan Rogers 				    pmu_event_iter_fn fn,
84660842e4SIan Rogers 				    void *data);
853d504549SIan Rogers int pmu_events_table__find_event(const struct pmu_events_table *table,
863d504549SIan Rogers                                  struct perf_pmu *pmu,
873d504549SIan Rogers                                  const char *name,
883d504549SIan Rogers                                  pmu_event_iter_fn fn,
893d504549SIan Rogers 				 void *data);
90*e6ff1eedSIan Rogers size_t pmu_events_table__num_events(const struct pmu_events_table *table,
91*e6ff1eedSIan Rogers 				    struct perf_pmu *pmu);
92*e6ff1eedSIan Rogers 
934000519eSIan Rogers int pmu_metrics_table__for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
94db95818eSIan Rogers 				     void *data);
95660842e4SIan Rogers 
9696d2a746SIan Rogers const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu);
97f8ea2c15SIan Rogers const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
981ba3752aSIan Rogers const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid);
99f8ea2c15SIan Rogers const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid);
10029be2fe0SIan Rogers int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data);
101db95818eSIan Rogers int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data);
1022519db2aSIan Rogers 
1031ba3752aSIan Rogers const struct pmu_events_table *find_sys_events_table(const char *name);
104f8ea2c15SIan Rogers const struct pmu_metrics_table *find_sys_metrics_table(const char *name);
1052519db2aSIan Rogers int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data);
106db95818eSIan Rogers int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data);
10780eeb67fSAndi Kleen 
10866c6e0c1SIan Rogers const char *describe_metricgroup(const char *group);
10966c6e0c1SIan Rogers 
11080eeb67fSAndi Kleen #endif
111