110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_events.h
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Details of PMC profiling events
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#ifndef OP_EVENTS_H
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define OP_EVENTS_H
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#ifdef __cplusplus
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectextern "C" {
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#endif
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_cpu_type.h"
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_types.h"
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_list.h"
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Describe an unit mask type. Events can optionally use a filter called
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * the unit mask. the mask type can be a bitmask or a discrete value */
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectenum unit_mask_type {
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	utm_mandatory,		/**< useless but required by the hardware */
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	utm_exclusive,		/**< only one of the values is allowed */
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	utm_bitmask		/**< bitmask */
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project};
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** up to thirty two allowed unit masks */
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define MAX_UNIT_MASK 32
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Describe an unit mask. */
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct op_unit_mask {
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * name;		/**< name of unit mask type */
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	u32 num;		/**< number of possible unit masks */
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	enum unit_mask_type unit_type_mask;
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	u32 default_mask;	/**< only the gui use it */
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct op_described_um {
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		u32 value;
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char * desc;
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} um[MAX_UNIT_MASK];
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head um_next; /**< next um in list */
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int used;                 /**< used by events file parser */
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project};
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Describe an event. */
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct op_event {
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	u32 counter_mask;	/**< bitmask of allowed counter  */
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	u32 val;		/**< event number */
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/** which unit mask if any allowed */
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct op_unit_mask * unit;
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * name;		/**< the event name */
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * desc;      	/**< the event description */
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int min_count;		/**< minimum counter value allowed */
595a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng	int filter;		/**< architecture specific filter or -1 */
605a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng	char * ext;		/**< extended events */
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head event_next;   /**< next event in list */
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project};
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Return the known events list. Idempotent */
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct list_head * op_events(op_cpu cpu_type);
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Find a given event, returns NULL on error */
685a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um);
695a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * op_find_event_any(op_cpu cpu_type, u32 nr);
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** Find a given event by name */
725a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * find_event_by_name(char const * name, unsigned um,
735a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng                                     int um_valid);
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Find a mapping for a given event ID for architectures requiring additional information
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * from what is held in the events file.
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar const * find_mapping_for_event(u32 val, op_cpu cpu_type);
8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** op_check_events() return code */
8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectenum op_event_check {
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	OP_OK_EVENT = 0, /**< event is valid and allowed */
8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	OP_INVALID_EVENT = 1, /**< event number is invalid */
8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	OP_INVALID_UM = 2, /**< unit mask is invalid */
8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	OP_INVALID_COUNTER = 4 /**< event is not allowed for the given counter */
8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project};
8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * sanity check event values
9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param ctr counter number
9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param event value for counter
9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param um unit mask for counter
9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param cpu_type processor type
9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Check that the counter event and unit mask values are allowed.
9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * The function returns bitmask of failure cause 0 otherwise
10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * \sa op_cpu, OP_EVENTS_OK
10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint op_check_events(int ctr, u32 event, u32 um, op_cpu cpu_type);
10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * free memory used by any call to above function. Need to be called only once
10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid op_free_events(void);
10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct op_default_event_descr {
11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * name;
11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long count;
11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long um;
11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project};
11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * op_default_event - return the details of the default event
11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param cpu_type  cpu type
11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param descr filled event description
12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Fills in the event description if applicable
12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr);
12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#ifdef __cplusplus
12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#endif
12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#endif /* OP_EVENTS_H */
130