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