1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef PMU_EVENTS_H |
3 | #define PMU_EVENTS_H |
4 | |
5 | #include <stdbool.h> |
6 | #include <stddef.h> |
7 | |
8 | struct perf_pmu; |
9 | |
10 | enum aggr_mode_class { |
11 | PerChip = 1, |
12 | PerCore |
13 | }; |
14 | |
15 | /** |
16 | * enum metric_event_groups - How events within a pmu_metric should be grouped. |
17 | */ |
18 | enum metric_event_groups { |
19 | /** |
20 | * @MetricGroupEvents: Default, group events within the metric. |
21 | */ |
22 | MetricGroupEvents = 0, |
23 | /** |
24 | * @MetricNoGroupEvents: Don't group events for the metric. |
25 | */ |
26 | MetricNoGroupEvents = 1, |
27 | /** |
28 | * @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI |
29 | * watchdog is enabled. |
30 | */ |
31 | MetricNoGroupEventsNmi = 2, |
32 | /** |
33 | * @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is |
34 | * enabled. |
35 | */ |
36 | MetricNoGroupEventsSmt = 3, |
37 | }; |
38 | /* |
39 | * Describe each PMU event. Each CPU has a table of PMU events. |
40 | */ |
41 | struct pmu_event { |
42 | const char *name; |
43 | const char *compat; |
44 | const char *event; |
45 | const char *desc; |
46 | const char *topic; |
47 | const char *long_desc; |
48 | const char *pmu; |
49 | const char *unit; |
50 | bool perpkg; |
51 | bool deprecated; |
52 | }; |
53 | |
54 | struct pmu_metric { |
55 | const char *pmu; |
56 | const char *metric_name; |
57 | const char *metric_group; |
58 | const char *metric_expr; |
59 | const char *metric_threshold; |
60 | const char *unit; |
61 | const char *compat; |
62 | const char *desc; |
63 | const char *long_desc; |
64 | const char *metricgroup_no_group; |
65 | const char *default_metricgroup_name; |
66 | enum aggr_mode_class aggr_mode; |
67 | enum metric_event_groups event_grouping; |
68 | }; |
69 | |
70 | struct pmu_events_table; |
71 | struct pmu_metrics_table; |
72 | |
73 | typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe, |
74 | const struct pmu_events_table *table, |
75 | void *data); |
76 | |
77 | typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm, |
78 | const struct pmu_metrics_table *table, |
79 | void *data); |
80 | |
81 | int pmu_events_table__for_each_event(const struct pmu_events_table *table, |
82 | struct perf_pmu *pmu, |
83 | pmu_event_iter_fn fn, |
84 | void *data); |
85 | int pmu_events_table__find_event(const struct pmu_events_table *table, |
86 | struct perf_pmu *pmu, |
87 | const char *name, |
88 | pmu_event_iter_fn fn, |
89 | void *data); |
90 | size_t pmu_events_table__num_events(const struct pmu_events_table *table, |
91 | struct perf_pmu *pmu); |
92 | |
93 | int pmu_metrics_table__for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn, |
94 | void *data); |
95 | |
96 | const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu); |
97 | const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu); |
98 | const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid); |
99 | const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid); |
100 | int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data); |
101 | int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data); |
102 | |
103 | const struct pmu_events_table *find_sys_events_table(const char *name); |
104 | const struct pmu_metrics_table *find_sys_metrics_table(const char *name); |
105 | int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data); |
106 | int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data); |
107 | |
108 | const char *describe_metricgroup(const char *group); |
109 | |
110 | #endif |
111 | |