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