xref: /linux/tools/perf/pmu-events/pmu-events.h (revision 900536349d12516114eed9f5b47d30c362e68cdc)
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>
69ed8b7dcSIan Rogers 
729be2fe0SIan Rogers struct perf_pmu;
829be2fe0SIan Rogers 
9560ccbc4SKajol Jain enum aggr_mode_class {
10560ccbc4SKajol Jain 	PerChip = 1,
11560ccbc4SKajol Jain 	PerCore
12560ccbc4SKajol Jain };
13560ccbc4SKajol Jain 
14*90053634SIan Rogers /**
15*90053634SIan Rogers  * enum metric_event_groups - How events within a pmu_metric should be grouped.
16*90053634SIan Rogers  */
17*90053634SIan Rogers enum metric_event_groups {
18*90053634SIan Rogers 	/**
19*90053634SIan Rogers 	 * @MetricGroupEvents: Default, group events within the metric.
20*90053634SIan Rogers 	 */
21*90053634SIan Rogers 	MetricGroupEvents = 0,
22*90053634SIan Rogers 	/**
23*90053634SIan Rogers 	 * @MetricNoGroupEvents: Don't group events for the metric.
24*90053634SIan Rogers 	 */
25*90053634SIan Rogers 	MetricNoGroupEvents = 1,
26*90053634SIan Rogers 	/**
27*90053634SIan Rogers 	 * @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI
28*90053634SIan Rogers 	 *                          watchdog is enabled.
29*90053634SIan Rogers 	 */
30*90053634SIan Rogers 	MetricNoGroupEventsNmi = 2,
31*90053634SIan Rogers 	/**
32*90053634SIan Rogers 	 * @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is
33*90053634SIan Rogers 	 *                          enabled.
34*90053634SIan Rogers 	 */
35*90053634SIan Rogers 	MetricNoGroupEventsSmt = 3,
36*90053634SIan Rogers };
3780eeb67fSAndi Kleen /*
3880eeb67fSAndi Kleen  * Describe each PMU event. Each CPU has a table of PMU events.
3980eeb67fSAndi Kleen  */
4080eeb67fSAndi Kleen struct pmu_event {
4180eeb67fSAndi Kleen 	const char *name;
424689f567SJohn Garry 	const char *compat;
4380eeb67fSAndi Kleen 	const char *event;
4480eeb67fSAndi Kleen 	const char *desc;
4580eeb67fSAndi Kleen 	const char *topic;
46794ba54aSSukadev Bhattiprolu 	const char *long_desc;
47fedb2b51SAndi Kleen 	const char *pmu;
48fedb2b51SAndi Kleen 	const char *unit;
49bd680861SIan Rogers 	bool perpkg;
509ed8b7dcSIan Rogers 	bool deprecated;
5180eeb67fSAndi Kleen };
5280eeb67fSAndi Kleen 
53db95818eSIan Rogers struct pmu_metric {
54db95818eSIan Rogers 	const char *metric_name;
55db95818eSIan Rogers 	const char *metric_group;
56d9dc8874SIan Rogers 	const char *metric_expr;
57d9dc8874SIan Rogers 	const char *unit;
58d9dc8874SIan Rogers 	const char *compat;
59d9dc8874SIan Rogers 	const char *desc;
60d9dc8874SIan Rogers 	const char *long_desc;
611fa0c371SIan Rogers 	enum aggr_mode_class aggr_mode;
62*90053634SIan Rogers 	enum metric_event_groups event_grouping;
63db95818eSIan Rogers };
64db95818eSIan Rogers 
651ba3752aSIan Rogers struct pmu_events_table;
66f8ea2c15SIan Rogers struct pmu_metrics_table;
671ba3752aSIan Rogers 
6829be2fe0SIan Rogers typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe,
691ba3752aSIan Rogers 				 const struct pmu_events_table *table,
7029be2fe0SIan Rogers 				 void *data);
7180eeb67fSAndi Kleen 
72db95818eSIan Rogers typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm,
73f8ea2c15SIan Rogers 				  const struct pmu_metrics_table *table,
74db95818eSIan Rogers 				  void *data);
75db95818eSIan Rogers 
761ba3752aSIan Rogers int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_event_iter_fn fn,
77660842e4SIan Rogers 				    void *data);
78f8ea2c15SIan Rogers int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
79db95818eSIan Rogers 				     void *data);
80660842e4SIan Rogers 
8196d2a746SIan Rogers const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu);
82f8ea2c15SIan Rogers const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
831ba3752aSIan Rogers const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid);
84f8ea2c15SIan Rogers const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid);
8529be2fe0SIan Rogers int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data);
86db95818eSIan Rogers int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data);
872519db2aSIan Rogers 
881ba3752aSIan Rogers const struct pmu_events_table *find_sys_events_table(const char *name);
89f8ea2c15SIan Rogers const struct pmu_metrics_table *find_sys_metrics_table(const char *name);
902519db2aSIan Rogers int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data);
91db95818eSIan Rogers int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data);
9280eeb67fSAndi Kleen 
9380eeb67fSAndi Kleen #endif
94