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