blob: 9ffdc499c67ad3671d1fe8a43bfa21929653aa51 [file] [log] [blame]
The Android Open Source Project10e23ee2009-03-03 19:30:30 -08001/**
2 * @file op_events.h
3 * Details of PMC profiling events
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef OP_EVENTS_H
13#define OP_EVENTS_H
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19#include "op_cpu_type.h"
20#include "op_types.h"
21#include "op_list.h"
22
23/** Describe an unit mask type. Events can optionally use a filter called
24 * the unit mask. the mask type can be a bitmask or a discrete value */
25enum unit_mask_type {
26 utm_mandatory, /**< useless but required by the hardware */
27 utm_exclusive, /**< only one of the values is allowed */
28 utm_bitmask /**< bitmask */
29};
30
31/** up to thirty two allowed unit masks */
32#define MAX_UNIT_MASK 32
33
34
35/** Describe an unit mask. */
36struct op_unit_mask {
37 char * name; /**< name of unit mask type */
38 u32 num; /**< number of possible unit masks */
39 enum unit_mask_type unit_type_mask;
40 u32 default_mask; /**< only the gui use it */
41 struct op_described_um {
42 u32 value;
43 char * desc;
44 } um[MAX_UNIT_MASK];
45 struct list_head um_next; /**< next um in list */
46 int used; /**< used by events file parser */
47};
48
49
50/** Describe an event. */
51struct op_event {
52 u32 counter_mask; /**< bitmask of allowed counter */
53 u32 val; /**< event number */
54 /** which unit mask if any allowed */
55 struct op_unit_mask * unit;
56 char * name; /**< the event name */
57 char * desc; /**< the event description */
58 int min_count; /**< minimum counter value allowed */
Ben Cheng5a4eb4e2009-09-14 16:00:41 -070059 int filter; /**< architecture specific filter or -1 */
60 char * ext; /**< extended events */
The Android Open Source Project10e23ee2009-03-03 19:30:30 -080061 struct list_head event_next; /**< next event in list */
62};
63
64/** Return the known events list. Idempotent */
65struct list_head * op_events(op_cpu cpu_type);
66
67/** Find a given event, returns NULL on error */
Ben Cheng5a4eb4e2009-09-14 16:00:41 -070068struct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um);
69struct op_event * op_find_event_any(op_cpu cpu_type, u32 nr);
The Android Open Source Project10e23ee2009-03-03 19:30:30 -080070
71/** Find a given event by name */
Ben Cheng5a4eb4e2009-09-14 16:00:41 -070072struct op_event * find_event_by_name(char const * name, unsigned um,
73 int um_valid);
The Android Open Source Project10e23ee2009-03-03 19:30:30 -080074
75/**
76 * Find a mapping for a given event ID for architectures requiring additional information
77 * from what is held in the events file.
78 */
79char const * find_mapping_for_event(u32 val, op_cpu cpu_type);
80
81
82/** op_check_events() return code */
83enum op_event_check {
84 OP_OK_EVENT = 0, /**< event is valid and allowed */
85 OP_INVALID_EVENT = 1, /**< event number is invalid */
86 OP_INVALID_UM = 2, /**< unit mask is invalid */
87 OP_INVALID_COUNTER = 4 /**< event is not allowed for the given counter */
88};
89
90/**
91 * sanity check event values
92 * @param ctr counter number
93 * @param event value for counter
94 * @param um unit mask for counter
95 * @param cpu_type processor type
96 *
97 * Check that the counter event and unit mask values are allowed.
98 *
99 * The function returns bitmask of failure cause 0 otherwise
100 *
101 * \sa op_cpu, OP_EVENTS_OK
102 */
103int op_check_events(int ctr, u32 event, u32 um, op_cpu cpu_type);
104
105/**
106 * free memory used by any call to above function. Need to be called only once
107 */
108void op_free_events(void);
109
110struct op_default_event_descr {
111 char * name;
112 unsigned long count;
113 unsigned long um;
114};
115
116/**
117 * op_default_event - return the details of the default event
118 * @param cpu_type cpu type
119 * @param descr filled event description
120 *
121 * Fills in the event description if applicable
122 */
123void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr);
124
125#ifdef __cplusplus
126}
127#endif
128
129#endif /* OP_EVENTS_H */