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