162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef PMU_EVENTS_H 362306a36Sopenharmony_ci#define PMU_EVENTS_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <stdbool.h> 662306a36Sopenharmony_ci#include <stddef.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistruct perf_pmu; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cienum aggr_mode_class { 1162306a36Sopenharmony_ci PerChip = 1, 1262306a36Sopenharmony_ci PerCore 1362306a36Sopenharmony_ci}; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/** 1662306a36Sopenharmony_ci * enum metric_event_groups - How events within a pmu_metric should be grouped. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_cienum metric_event_groups { 1962306a36Sopenharmony_ci /** 2062306a36Sopenharmony_ci * @MetricGroupEvents: Default, group events within the metric. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci MetricGroupEvents = 0, 2362306a36Sopenharmony_ci /** 2462306a36Sopenharmony_ci * @MetricNoGroupEvents: Don't group events for the metric. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci MetricNoGroupEvents = 1, 2762306a36Sopenharmony_ci /** 2862306a36Sopenharmony_ci * @MetricNoGroupEventsNmi: Don't group events for the metric if the NMI 2962306a36Sopenharmony_ci * watchdog is enabled. 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci MetricNoGroupEventsNmi = 2, 3262306a36Sopenharmony_ci /** 3362306a36Sopenharmony_ci * @MetricNoGroupEventsSmt: Don't group events for the metric if SMT is 3462306a36Sopenharmony_ci * enabled. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci MetricNoGroupEventsSmt = 3, 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Describe each PMU event. Each CPU has a table of PMU events. 4062306a36Sopenharmony_ci */ 4162306a36Sopenharmony_cistruct pmu_event { 4262306a36Sopenharmony_ci const char *name; 4362306a36Sopenharmony_ci const char *compat; 4462306a36Sopenharmony_ci const char *event; 4562306a36Sopenharmony_ci const char *desc; 4662306a36Sopenharmony_ci const char *topic; 4762306a36Sopenharmony_ci const char *long_desc; 4862306a36Sopenharmony_ci const char *pmu; 4962306a36Sopenharmony_ci const char *unit; 5062306a36Sopenharmony_ci bool perpkg; 5162306a36Sopenharmony_ci bool deprecated; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct pmu_metric { 5562306a36Sopenharmony_ci const char *pmu; 5662306a36Sopenharmony_ci const char *metric_name; 5762306a36Sopenharmony_ci const char *metric_group; 5862306a36Sopenharmony_ci const char *metric_expr; 5962306a36Sopenharmony_ci const char *metric_threshold; 6062306a36Sopenharmony_ci const char *unit; 6162306a36Sopenharmony_ci const char *compat; 6262306a36Sopenharmony_ci const char *desc; 6362306a36Sopenharmony_ci const char *long_desc; 6462306a36Sopenharmony_ci const char *metricgroup_no_group; 6562306a36Sopenharmony_ci const char *default_metricgroup_name; 6662306a36Sopenharmony_ci enum aggr_mode_class aggr_mode; 6762306a36Sopenharmony_ci enum metric_event_groups event_grouping; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct pmu_events_table; 7162306a36Sopenharmony_cistruct pmu_metrics_table; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_citypedef int (*pmu_event_iter_fn)(const struct pmu_event *pe, 7462306a36Sopenharmony_ci const struct pmu_events_table *table, 7562306a36Sopenharmony_ci void *data); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_citypedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm, 7862306a36Sopenharmony_ci const struct pmu_metrics_table *table, 7962306a36Sopenharmony_ci void *data); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciint pmu_events_table__for_each_event(const struct pmu_events_table *table, 8262306a36Sopenharmony_ci struct perf_pmu *pmu, 8362306a36Sopenharmony_ci pmu_event_iter_fn fn, 8462306a36Sopenharmony_ci void *data); 8562306a36Sopenharmony_ciint pmu_events_table__find_event(const struct pmu_events_table *table, 8662306a36Sopenharmony_ci struct perf_pmu *pmu, 8762306a36Sopenharmony_ci const char *name, 8862306a36Sopenharmony_ci pmu_event_iter_fn fn, 8962306a36Sopenharmony_ci void *data); 9062306a36Sopenharmony_cisize_t pmu_events_table__num_events(const struct pmu_events_table *table, 9162306a36Sopenharmony_ci struct perf_pmu *pmu); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ciint pmu_metrics_table__for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn, 9462306a36Sopenharmony_ci void *data); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciconst struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu); 9762306a36Sopenharmony_ciconst struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu); 9862306a36Sopenharmony_ciconst struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid); 9962306a36Sopenharmony_ciconst struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid); 10062306a36Sopenharmony_ciint pmu_for_each_core_event(pmu_event_iter_fn fn, void *data); 10162306a36Sopenharmony_ciint pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciconst struct pmu_events_table *find_sys_events_table(const char *name); 10462306a36Sopenharmony_ciconst struct pmu_metrics_table *find_sys_metrics_table(const char *name); 10562306a36Sopenharmony_ciint pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data); 10662306a36Sopenharmony_ciint pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciconst char *describe_metricgroup(const char *group); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#endif 111