xref: /linux/tools/perf/pmu-events/pmu-events.h (revision bd3846d0fea2e8e3375fc54a6556561726f466cf)
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 
1490053634SIan Rogers /**
1590053634SIan Rogers  * enum metric_event_groups - How events within a pmu_metric should be grouped.
1690053634SIan Rogers  */
1790053634SIan Rogers enum metric_event_groups {
1890053634SIan Rogers 	/**
1990053634SIan Rogers 	 * @MetricGroupEvents: Default, group events within the metric.
2090053634SIan Rogers 	 */
2190053634SIan Rogers 	MetricGroupEvents = 0,
2290053634SIan Rogers 	/**
2390053634SIan Rogers 	 * @MetricNoGroupEvents: Don't group events for the metric.
2490053634SIan Rogers 	 */
2590053634SIan Rogers 	MetricNoGroupEvents = 1,
2690053634SIan Rogers 	/**
2790053634SIan Rogers 	 * @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI
2890053634SIan Rogers 	 *                          watchdog is enabled.
2990053634SIan Rogers 	 */
3090053634SIan Rogers 	MetricNoGroupEventsNmi = 2,
3190053634SIan Rogers 	/**
3290053634SIan Rogers 	 * @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is
3390053634SIan Rogers 	 *                          enabled.
3490053634SIan Rogers 	 */
3590053634SIan Rogers 	MetricNoGroupEventsSmt = 3,
3690053634SIan 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 {
54*bd3846d0SIan Rogers 	const char *pmu;
55db95818eSIan Rogers 	const char *metric_name;
56db95818eSIan Rogers 	const char *metric_group;
57d9dc8874SIan Rogers 	const char *metric_expr;
5845e8867aSIan Rogers 	const char *metric_threshold;
59d9dc8874SIan Rogers 	const char *unit;
60d9dc8874SIan Rogers 	const char *compat;
61d9dc8874SIan Rogers 	const char *desc;
62d9dc8874SIan Rogers 	const char *long_desc;
63ccc66c60SIan Rogers 	const char *metricgroup_no_group;
641fa0c371SIan Rogers 	enum aggr_mode_class aggr_mode;
6590053634SIan Rogers 	enum metric_event_groups event_grouping;
66db95818eSIan Rogers };
67db95818eSIan Rogers 
681ba3752aSIan Rogers struct pmu_events_table;
69f8ea2c15SIan Rogers struct pmu_metrics_table;
701ba3752aSIan Rogers 
7129be2fe0SIan Rogers typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe,
721ba3752aSIan Rogers 				 const struct pmu_events_table *table,
7329be2fe0SIan Rogers 				 void *data);
7480eeb67fSAndi Kleen 
75db95818eSIan Rogers typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm,
76f8ea2c15SIan Rogers 				  const struct pmu_metrics_table *table,
77db95818eSIan Rogers 				  void *data);
78db95818eSIan Rogers 
791ba3752aSIan Rogers int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_event_iter_fn fn,
80660842e4SIan Rogers 				    void *data);
81f8ea2c15SIan Rogers int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
82db95818eSIan Rogers 				     void *data);
83660842e4SIan Rogers 
8496d2a746SIan Rogers const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu);
85f8ea2c15SIan Rogers const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
861ba3752aSIan Rogers const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid);
87f8ea2c15SIan Rogers const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid);
8829be2fe0SIan Rogers int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data);
89db95818eSIan Rogers int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data);
902519db2aSIan Rogers 
911ba3752aSIan Rogers const struct pmu_events_table *find_sys_events_table(const char *name);
92f8ea2c15SIan Rogers const struct pmu_metrics_table *find_sys_metrics_table(const char *name);
932519db2aSIan Rogers int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data);
94db95818eSIan Rogers int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data);
9580eeb67fSAndi Kleen 
9680eeb67fSAndi Kleen #endif
97