Blame src/components/micpower/linux-micpower.c

Packit Service a1973e
#include <string.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
Packit Service a1973e
/* Headers required by PAPI */
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_internal.h"
Packit Service a1973e
#include "papi_vector.h"
Packit Service a1973e
#include "papi_memory.h"
Packit Service a1973e
Packit Service a1973e
#include "linux-micpower.h"
Packit Service a1973e
Packit Service a1973e
/* Intel says
Packit Service a1973e
----
Packit Service a1973e
The power measurements can be obtained from the host as well as the MIC card 
Packit Service a1973e
over a 50msec interval. The SMC is designed to sample power consumption only 
Packit Service a1973e
every 50mSecs.
Packit Service a1973e
----
Packit Service a1973e
**/
Packit Service a1973e
#define REFRESH_LAT 50000
Packit Service a1973e
Packit Service a1973e
#define INVALID_RESULT -1000000L
Packit Service a1973e
#define MICPOWER_NUMBER_OF_NATIVE_EVENTS 16 
Packit Service a1973e
Packit Service a1973e
papi_vector_t _micpower_vector;
Packit Service a1973e
Packit Service a1973e
static MICPOWER_native_event_entry_t _micpower_native_events[] = {
Packit Service a1973e
		{ 	.name 				= "tot0",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Total power, win 0", 
Packit Service a1973e
				.resources.selector	= 1
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "tot1",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Total power, win 1", 
Packit Service a1973e
				.resources.selector	= 2
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "pcie",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "PCI-E connector power", 
Packit Service a1973e
				.resources.selector	= 3
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "inst",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Instantaneous power", 
Packit Service a1973e
				.resources.selector	= 4
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "imax",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Max Instantaneous power", 
Packit Service a1973e
				.resources.selector	= 5
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "c2x3",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "2x3 connector power", 
Packit Service a1973e
				.resources.selector	= 6
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "c2x4",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "2x4 connector power", 
Packit Service a1973e
				.resources.selector	= 7
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vccp:pwr",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Core rail; Power reading", 
Packit Service a1973e
				.resources.selector	= 8
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vccp:cur",
Packit Service a1973e
				.units 				= "uA",
Packit Service a1973e
				.description 		= "Core rail; Current", 
Packit Service a1973e
				.resources.selector	= 9
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vccp:volt",
Packit Service a1973e
				.units 				= "uV",
Packit Service a1973e
				.description 		= "Core rail; Voltage", 
Packit Service a1973e
				.resources.selector	= 10
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddg:pwr",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Uncore rail; Power reading", 
Packit Service a1973e
				.resources.selector	= 11
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddg:cur",
Packit Service a1973e
				.units 				= "uA",
Packit Service a1973e
				.description 		= "Uncore rail; Current", 
Packit Service a1973e
				.resources.selector	= 12
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddg:volt",
Packit Service a1973e
				.units 				= "uV",
Packit Service a1973e
				.description 		= "Uncore rail; Voltage", 
Packit Service a1973e
				.resources.selector	= 13
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddq:pwr",
Packit Service a1973e
				.units 				= "uW",
Packit Service a1973e
				.description 		= "Memory subsystem rail; Power reading", 
Packit Service a1973e
				.resources.selector	= 14
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddq:cur",
Packit Service a1973e
				.units 				= "uA",
Packit Service a1973e
				.description 		= "Memory subsystem rail; Current", 
Packit Service a1973e
				.resources.selector	= 15
Packit Service a1973e
		},
Packit Service a1973e
		{ 	.name 				= "vddq:volt",
Packit Service a1973e
				.units 				= "uV",
Packit Service a1973e
				.description 		= "Memory subsystem rail; Voltage", 
Packit Service a1973e
				.resources.selector	= 16
Packit Service a1973e
		}
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
static int num_events		= 0;
Packit Service a1973e
static int is_initialized	= 0;
Packit Service a1973e
Packit Service a1973e
/***************************************************************************/
Packit Service a1973e
/******  BEGIN FUNCTIONS  USED INTERNALLY SPECIFIC TO THIS COMPONENT *******/
Packit Service a1973e
/***************************************************************************/
Packit Service a1973e
Packit Service a1973e
#if 0
Packit Service a1973e
From Intel docs, power readings are exported via sysfs at
Packit Service a1973e
/sys/class/micras/power
Packit Service a1973e
Packit Service a1973e
typedeftruct mr_rsp_pws {	/* Power status */
Packit Service a1973e
  uint32_t	prr;				/* Current reading, in uW */
Packit Service a1973e
  uint8_t p_val;                /* Valid bits, power */
Packit Service a1973e
} MrRspPws;
Packit Service a1973e
Packit Service a1973e
typedef struct mr_rsp_vrr {	/* Voltage regulator status */
Packit Service a1973e
  uint32_t pwr;                 /* Power reading, in uW */
Packit Service a1973e
  uint32_t cur;                 /* Current, in uA */
Packit Service a1973e
  uint32_t volt;                /* Voltage, in uV */
Packit Service a1973e
  uint8_t p_val;                /* Valid bits, power */
Packit Service a1973e
  uint8_t c_val;                /* Valid bits, current */
Packit Service a1973e
  uint8_t v_val;                /* Valid bits, voltage */
Packit Service a1973e
} MrRspVrr;
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
I am assuming for the purposes of this component that only
Packit Service a1973e
the readings are exported.
Packit Service a1973e
typedef struct mr_rsp_power {
Packit Service a1973e
  MrRspPws tot0;                /* Total power, win 0 */
Packit Service a1973e
  MrRspPws tot1;                /* Total power, win 1 */
Packit Service a1973e
  MrRspPws	pcie;				/* PCI-E connector power */
Packit Service a1973e
  MrRspPws	inst;				/* Instantaneous power */
Packit Service a1973e
  MrRspPws	imax;				/* Max Instantaneous power */
Packit Service a1973e
  MrRspPws	c2x3;				/* 2x3 connector power */
Packit Service a1973e
  MrRspPws	c2x4;				/* 2x4 connector power */
Packit Service a1973e
  MrRspVrr	vccp;				/* Core rail */
Packit Service a1973e
  MrRspVrr	vddg;				/* Uncore rail */
Packit Service a1973e
  MrRspVrr	vddq;				/* Memory subsystem rail */
Packit Service a1973e
} MrRspPower;
Packit Service a1973e
Packit Service a1973e
#endif
Packit Service a1973e
static int 
Packit Service a1973e
read_sysfs_file( long long* counts) 
Packit Service a1973e
{
Packit Service a1973e
		FILE* fp = NULL;
Packit Service a1973e
		int i;
Packit Service a1973e
		int retval = 1;
Packit Service a1973e
		fp = fopen( "/sys/class/micras/power", "r" );
Packit Service a1973e
		if (!fp)
Packit Service a1973e
		    return 0;
Packit Service a1973e
Packit Service a1973e
		for (i=0; i < MICPOWER_MAX_COUNTERS-9; i++) {
Packit Service a1973e
				retval&= fscanf(fp, "%lld", &counts[i]);
Packit Service a1973e
		}
Packit Service a1973e
		for (i=MICPOWER_MAX_COUNTERS-9; i < MICPOWER_MAX_COUNTERS; i+=3) {
Packit Service a1973e
				retval&= fscanf(fp, "%lld %lld %lld", &counts[i], &counts[i+1], &counts[i+2] );
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		fclose(fp);
Packit Service a1973e
		return retval;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*****************************************************************************
Packit Service a1973e
 *******************  BEGIN PAPI's COMPONENT REQUIRED FUNCTIONS  *************
Packit Service a1973e
 *****************************************************************************/
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * This is called whenever a thread is initialized
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_init_thread( hwd_context_t *ctx )
Packit Service a1973e
{
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/* Initialize hardware counters, setup the function vector table
Packit Service a1973e
 * and get hardware information, this routine is called when the 
Packit Service a1973e
 * PAPI process is initialized (IE PAPI_library_init)
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_init_component( int cidx )
Packit Service a1973e
{
Packit Service a1973e
		if ( is_initialized )
Packit Service a1973e
				return (PAPI_OK );
Packit Service a1973e
Packit Service a1973e
		is_initialized = 1;
Packit Service a1973e
Packit Service a1973e
		/* Check that /sys/class/micras/power is readable */
Packit Service a1973e
		if ( 0 != access( "/sys/class/micras/power", R_OK ) ) {
Packit Service a1973e
				strncpy(_micpower_vector.cmp_info.disabled_reason,
Packit Service a1973e
								"Cannot read /sys/class/micras/power",PAPI_MAX_STR_LEN);
Packit Service a1973e
				return PAPI_ENOCMP;
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
		/* Export the total number of events available */
Packit Service a1973e
		num_events =
Packit Service a1973e
				_micpower_vector.cmp_info.num_native_events = MICPOWER_NUMBER_OF_NATIVE_EVENTS;
Packit Service a1973e
Packit Service a1973e
		/* Export the component id */
Packit Service a1973e
		_micpower_vector.cmp_info.CmpIdx = cidx;
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Control of counters (Reading/Writing/Starting/Stopping/Setup)
Packit Service a1973e
 * functions
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_init_control_state( hwd_control_state_t * ctl)
Packit Service a1973e
{
Packit Service a1973e
		int retval = 0;
Packit Service a1973e
		MICPOWER_control_state_t *micpower_ctl = (MICPOWER_control_state_t *) ctl;
Packit Service a1973e
Packit Service a1973e
		retval = read_sysfs_file(micpower_ctl->counts);
Packit Service a1973e
Packit Service a1973e
		/* Set last access time for caching results */
Packit Service a1973e
		micpower_ctl->lastupdate = PAPI_get_real_usec();
Packit Service a1973e
Packit Service a1973e
		return (retval)?PAPI_OK:PAPI_ESYS;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_start( hwd_context_t *ctx, hwd_control_state_t *ctl)
Packit Service a1973e
{
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		( void ) ctl;
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_read( hwd_context_t *ctx, hwd_control_state_t *ctl,
Packit Service a1973e
				long long ** events, int flags)
Packit Service a1973e
{
Packit Service a1973e
		(void) flags;
Packit Service a1973e
		(void) ctx;
Packit Service a1973e
		int retval = 1;
Packit Service a1973e
Packit Service a1973e
		MICPOWER_control_state_t* control = (MICPOWER_control_state_t*) ctl;
Packit Service a1973e
		long long now = PAPI_get_real_usec();
Packit Service a1973e
Packit Service a1973e
		/* Only read the values from the kernel if enough time has passed */
Packit Service a1973e
		/* since the last read.  Otherwise return cached values.          */
Packit Service a1973e
Packit Service a1973e
		if ( now - control->lastupdate > REFRESH_LAT ) {
Packit Service a1973e
				retval = read_sysfs_file(control->counts);
Packit Service a1973e
				control->lastupdate = now;
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		/* Pass back a pointer to our results */
Packit Service a1973e
		*events = control->counts;
Packit Service a1973e
Packit Service a1973e
		return (retval)?PAPI_OK:PAPI_ESYS;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_stop( hwd_context_t *ctx, hwd_control_state_t *ctl )
Packit Service a1973e
{
Packit Service a1973e
		(void) ctx;
Packit Service a1973e
		int retval = 1;
Packit Service a1973e
		long long now = PAPI_get_real_usec();
Packit Service a1973e
		/* read values */
Packit Service a1973e
		MICPOWER_control_state_t* control = (MICPOWER_control_state_t*) ctl;
Packit Service a1973e
Packit Service a1973e
		if ( now - control->lastupdate > REFRESH_LAT ) {
Packit Service a1973e
				retval = read_sysfs_file(control->counts);
Packit Service a1973e
				control->lastupdate = now;
Packit Service a1973e
		}
Packit Service a1973e
		return (retval)?PAPI_OK:PAPI_ESYS;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* Shutdown a thread */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_shutdown_thread( hwd_context_t * ctx )
Packit Service a1973e
{
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Clean up what was setup in  micpower_init_component().
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_shutdown_component( ) 
Packit Service a1973e
{
Packit Service a1973e
		if ( is_initialized ) {
Packit Service a1973e
				is_initialized = 0;
Packit Service a1973e
				num_events = 0;
Packit Service a1973e
		}
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/* This function sets various options in the component
Packit Service a1973e
 * The valid codes being passed in are PAPI_SET_DEFDOM,
Packit Service a1973e
 * PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL * and PAPI_SET_INHERIT
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_ctl( hwd_context_t *ctx, int code, _papi_int_option_t *option )
Packit Service a1973e
{
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		( void ) code;
Packit Service a1973e
		( void ) option;
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_update_control_state(	hwd_control_state_t *ptr,
Packit Service a1973e
				NativeInfo_t * native, int count,
Packit Service a1973e
				hwd_context_t * ctx )
Packit Service a1973e
{
Packit Service a1973e
		int i, index;
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		( void ) ptr;
Packit Service a1973e
Packit Service a1973e
		for ( i = 0; i < count; i++ ) {
Packit Service a1973e
				index = native[i].ni_event&PAPI_NATIVE_AND_MASK;
Packit Service a1973e
				native[i].ni_position = _micpower_native_events[index].resources.selector - 1;
Packit Service a1973e
		}
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * This function has to set the bits needed to count different domains
Packit Service a1973e
 * In particular: PAPI_DOM_USER, PAPI_DOM_KERNEL PAPI_DOM_OTHER
Packit Service a1973e
 * By default return PAPI_EINVAL if none of those are specified
Packit Service a1973e
 * and PAPI_OK with success
Packit Service a1973e
 * PAPI_DOM_USER is only user context is counted
Packit Service a1973e
 * PAPI_DOM_KERNEL is only the Kernel/OS context is counted
Packit Service a1973e
 * PAPI_DOM_OTHER  is Exception/transient mode (like user TLB misses)
Packit Service a1973e
 * PAPI_DOM_ALL   is all of the domains
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_set_domain( hwd_control_state_t * cntl, int domain )
Packit Service a1973e
{
Packit Service a1973e
		( void ) cntl;
Packit Service a1973e
Packit Service a1973e
		if ( PAPI_DOM_ALL != domain )
Packit Service a1973e
		    return PAPI_EINVAL;
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_reset( hwd_context_t *ctx, hwd_control_state_t *ctl )
Packit Service a1973e
{
Packit Service a1973e
		( void ) ctx;
Packit Service a1973e
		( void ) ctl;
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Native Event functions
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_ntv_enum_events( unsigned int *EventCode, int modifier )
Packit Service a1973e
{
Packit Service a1973e
Packit Service a1973e
		int index;
Packit Service a1973e
Packit Service a1973e
		switch ( modifier ) {
Packit Service a1973e
Packit Service a1973e
				case PAPI_ENUM_FIRST:
Packit Service a1973e
Packit Service a1973e
						if (num_events==0) {
Packit Service a1973e
								return PAPI_ENOEVNT;
Packit Service a1973e
						}
Packit Service a1973e
						*EventCode = 0;
Packit Service a1973e
Packit Service a1973e
						return PAPI_OK;
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
				case PAPI_ENUM_EVENTS:
Packit Service a1973e
Packit Service a1973e
						index = *EventCode&PAPI_NATIVE_AND_MASK;
Packit Service a1973e
Packit Service a1973e
						if ( index < num_events - 1 ) {
Packit Service a1973e
								*EventCode = *EventCode + 1;
Packit Service a1973e
								return PAPI_OK;
Packit Service a1973e
						} else {
Packit Service a1973e
								return PAPI_ENOEVNT;
Packit Service a1973e
						}
Packit Service a1973e
						break;
Packit Service a1973e
Packit Service a1973e
				default:
Packit Service a1973e
						return PAPI_EINVAL;
Packit Service a1973e
		}
Packit Service a1973e
		return PAPI_EINVAL;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_ntv_code_to_name( unsigned int EventCode, char *name, int len )
Packit Service a1973e
{
Packit Service a1973e
		int index = EventCode&PAPI_NATIVE_AND_MASK;
Packit Service a1973e
Packit Service a1973e
		if ( index >= 0 && index < num_events ) {
Packit Service a1973e
				strncpy( name, _micpower_native_events[index].name, len );
Packit Service a1973e
				return PAPI_OK;
Packit Service a1973e
		}
Packit Service a1973e
		return PAPI_ENOEVNT;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
static int 
Packit Service a1973e
_micpower_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
Packit Service a1973e
{
Packit Service a1973e
		int index = EventCode&PAPI_NATIVE_AND_MASK;
Packit Service a1973e
Packit Service a1973e
		if ( index >= 0 && index < num_events ) {
Packit Service a1973e
				strncpy( name, _micpower_native_events[index].description, len );
Packit Service a1973e
				return PAPI_OK;
Packit Service a1973e
		}
Packit Service a1973e
		return PAPI_ENOEVNT;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static int
Packit Service a1973e
_micpower_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info) 
Packit Service a1973e
{
Packit Service a1973e
Packit Service a1973e
		int index = EventCode&PAPI_NATIVE_AND_MASK;
Packit Service a1973e
Packit Service a1973e
		if ( ( index < 0) || (index >= num_events )) return PAPI_ENOEVNT;
Packit Service a1973e
Packit Service a1973e
		strncpy( info->symbol, _micpower_native_events[index].name, sizeof(info->symbol));
Packit Service a1973e
		strncpy( info->long_descr, _micpower_native_events[index].description, sizeof(info->long_descr));
Packit Service a1973e
		strncpy( info->units, _micpower_native_events[index].units, sizeof(info->units));
Packit Service a1973e
		info->units[sizeof(info->units)-1] = '\0';
Packit Service a1973e
Packit Service a1973e
		return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
papi_vector_t _micpower_vector = {
Packit Service a1973e
		.cmp_info = {
Packit Service a1973e
				/* default component information (unspecified values are initialized to 0) */
Packit Service a1973e
				.name = "micpower",
Packit Service a1973e
				.short_name = "micpower",
Packit Service a1973e
				.description = "Component for reading power on Intel Xeon Phi (MIC)",
Packit Service a1973e
				.version = "5.1",
Packit Service a1973e
				.num_mpx_cntrs = MICPOWER_NUMBER_OF_NATIVE_EVENTS,
Packit Service a1973e
				.num_cntrs = MICPOWER_NUMBER_OF_NATIVE_EVENTS,
Packit Service a1973e
				.default_domain = PAPI_DOM_ALL,
Packit Service a1973e
				.available_domains = PAPI_DOM_ALL,
Packit Service a1973e
				.default_granularity = PAPI_GRN_SYS,
Packit Service a1973e
				.available_granularities = PAPI_GRN_SYS,
Packit Service a1973e
				.hardware_intr_sig = PAPI_INT_SIGNAL,
Packit Service a1973e
Packit Service a1973e
				/* component specific cmp_info initializations */
Packit Service a1973e
				.fast_real_timer = 0,
Packit Service a1973e
				.fast_virtual_timer = 0,
Packit Service a1973e
				.attach = 0,
Packit Service a1973e
				.attach_must_ptrace = 0,
Packit Service a1973e
		}
Packit Service a1973e
		,
Packit Service a1973e
Packit Service a1973e
				/* sizes of framework-opaque component-private structures */
Packit Service a1973e
				.size = {
Packit Service a1973e
						.context = sizeof ( MICPOWER_context_t ),
Packit Service a1973e
						.control_state = sizeof ( MICPOWER_control_state_t ),
Packit Service a1973e
						.reg_value = sizeof ( MICPOWER_register_t ),
Packit Service a1973e
						.reg_alloc = sizeof ( MICPOWER_reg_alloc_t ),
Packit Service a1973e
				}
Packit Service a1973e
		,
Packit Service a1973e
				/* function pointers in this component */
Packit Service a1973e
				.init_thread =          _micpower_init_thread,
Packit Service a1973e
				.init_component =       _micpower_init_component,
Packit Service a1973e
				.init_control_state =   _micpower_init_control_state,
Packit Service a1973e
				.start =                _micpower_start,
Packit Service a1973e
				.stop =                 _micpower_stop,
Packit Service a1973e
				.read =                 _micpower_read,
Packit Service a1973e
				.shutdown_thread =      _micpower_shutdown_thread,
Packit Service a1973e
				.shutdown_component =   _micpower_shutdown_component,
Packit Service a1973e
				.ctl =                  _micpower_ctl,
Packit Service a1973e
Packit Service a1973e
				.update_control_state = _micpower_update_control_state,
Packit Service a1973e
				.set_domain =           _micpower_set_domain,
Packit Service a1973e
				.reset =                _micpower_reset,
Packit Service a1973e
Packit Service a1973e
				.ntv_enum_events =      _micpower_ntv_enum_events,
Packit Service a1973e
				.ntv_code_to_name =     _micpower_ntv_code_to_name,
Packit Service a1973e
				.ntv_code_to_descr =    _micpower_ntv_code_to_descr,
Packit Service a1973e
				.ntv_code_to_info =     _micpower_ntv_code_to_info,
Packit Service a1973e
};