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

Packit 577717
/****************************/
Packit 577717
/* THIS IS OPEN SOURCE CODE */
Packit 577717
/****************************/
Packit 577717
Packit 577717
/** 
Packit 577717
 * @file    linux-emon.c
Packit 577717
 * @author  Heike Jagode
Packit 577717
 *          jagode@eecs.utk.edu
Packit 577717
 * BGPM / emon component 
Packit 577717
 * 
Packit 577717
 * @brief
Packit 577717
 *  This file has the source code for a component that enables PAPI-C to 
Packit 577717
 *  access hardware power data for BG/Q through the EMON interface.
Packit 577717
 */
Packit 577717
Packit 577717
#include <stdint.h>
Packit 577717
#include <string.h>
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_internal.h"
Packit 577717
#include "papi_vector.h"
Packit 577717
#include "papi_memory.h"
Packit 577717
#include "extras.h"
Packit 577717
Packit 577717
#define EMON_DEFINE_GLOBALS
Packit 577717
#include <hwi/include/bqc/A2_inlines.h>
Packit 577717
#include <spi/include/emon/emon.h> // the emon library header file (no linking required)
Packit 577717
Packit 577717
#define EMON_MAX_COUNTERS 8
Packit 577717
#define EMON_TOTAL_EVENTS 8
Packit 577717
Packit 577717
#ifndef DEBUG
Packit 577717
#define EMONDBG( fmt, args...) do {} while(0)
Packit 577717
#else
Packit 577717
#define EMONDBG( fmt, args... ) do { printf("%s:%d\t"fmt, __func__, __LINE__, ##args); } while(0)
Packit 577717
#endif
Packit 577717
Packit 577717
/* Stores private information for each event */
Packit 577717
typedef struct EMON_register
Packit 577717
{
Packit 577717
	unsigned int selector;
Packit 577717
	/* Signifies which counter slot is being used */
Packit 577717
	/* Indexed from 1 as 0 has a special meaning  */
Packit 577717
} EMON_register_t;
Packit 577717
Packit 577717
/** This structure is used to build the table of events  */
Packit 577717
/*   The contents of this structure will vary based on   */
Packit 577717
/*   your component, however having name and description */
Packit 577717
/*   fields are probably useful.                         */
Packit 577717
typedef struct EMON_native_event_entry
Packit 577717
{
Packit 577717
	EMON_register_t resources;	        /**< Per counter resources       */
Packit 577717
	char *name;	    /**< Name of the counter         */
Packit 577717
	char *description; /**< Description of the counter  */
Packit 577717
	int return_type;
Packit 577717
} EMON_native_event_entry_t;
Packit 577717
Packit 577717
Packit 577717
/* Used when doing register allocation */
Packit 577717
typedef struct EMON_reg_alloc
Packit 577717
{
Packit 577717
	EMON_register_t ra_bits;
Packit 577717
} EMON_reg_alloc_t;
Packit 577717
Packit 577717
typedef struct EMON_overflow
Packit 577717
{
Packit 577717
  	int threshold;
Packit 577717
	int EventIndex;
Packit 577717
} EMON_overflow_t;
Packit 577717
Packit 577717
/* Holds control flags */
Packit 577717
typedef struct EMON_control_state
Packit 577717
{
Packit 577717
    int count;
Packit 577717
    long long counters[EMON_MAX_COUNTERS];
Packit 577717
    int being_measured[EMON_MAX_COUNTERS];
Packit 577717
    long long last_update;
Packit 577717
} EMON_control_state_t;
Packit 577717
Packit 577717
/* Holds per-thread information */
Packit 577717
typedef struct EMON_context
Packit 577717
{
Packit 577717
	EMON_control_state_t state;
Packit 577717
} EMON_context_t;
Packit 577717
Packit 577717
/* Declare our vector in advance */
Packit 577717
papi_vector_t _emon2_vector;
Packit 577717
Packit 577717
static void _check_EMON_error( char* emon2func, int err )
Packit 577717
{
Packit 577717
	( void ) emon2func;
Packit 577717
	if ( err < 0 ) {
Packit 577717
		printf( "Error: EMON API function '%s' returned %d.\n",
Packit 577717
                	emon2func, err );
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/** This table contains the native events 
Packit 577717
  * So with the EMON interface, we get every domain at a time.
Packit 577717
  */
Packit 577717
static EMON_native_event_entry_t EMON_native_table[] =
Packit 577717
{
Packit 577717
	{ 
Packit 577717
		.name = "DOMAIN1",
Packit 577717
		.description = "Chip core",
Packit 577717
		.resources.selector = 1,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN2",
Packit 577717
		.description = "Chip Memory Interface and Dramm",
Packit 577717
		.resources.selector = 2,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN3",
Packit 577717
		.description = "Optics",
Packit 577717
		.resources.selector = 3,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN4",
Packit 577717
		.description = "Optics + PCIExpress",
Packit 577717
		.resources.selector = 4,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN6",
Packit 577717
		.description = "HSS Network and Link Chip",
Packit 577717
		.resources.selector = 5,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN8",
Packit 577717
		.description = "Link Chip Core",
Packit 577717
		.resources.selector = 6,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{
Packit 577717
		.name = "DOMAIN7",
Packit 577717
		.description = "Chip SRAM",
Packit 577717
		.resources.selector = 7,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
	{   .name="EMON_DOMAIN_ALL",
Packit 577717
		.description = "Measures power on all domains.",
Packit 577717
		.resources.selector = 8,
Packit 577717
		.return_type = PAPI_DATATYPE_FP64,
Packit 577717
	},
Packit 577717
};
Packit 577717
Packit 577717
Packit 577717
Packit 577717
Packit 577717
/*****************************************************************************
Packit 577717
 *******************  BEGIN PAPI's COMPONENT REQUIRED FUNCTIONS  *************
Packit 577717
 *****************************************************************************/
Packit 577717
Packit 577717
/*
Packit 577717
 * This is called whenever a thread is initialized
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_init_thread( hwd_context_t * ctx )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_init_thread\n" );
Packit 577717
	
Packit 577717
	( void ) ctx;
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/* Initialize hardware counters, setup the function vector table
Packit 577717
 * and get hardware information, this routine is called when the 
Packit 577717
 * PAPI process is initialized (IE PAPI_library_init)
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_init_component( int cidx )
Packit 577717
{ 
Packit 577717
	int ret = 0;
Packit 577717
	_emon2_vector.cmp_info.CmpIdx = cidx;
Packit 577717
	EMONDBG( "EMON_init_component cidx = %d\n", cidx );
Packit 577717
	/* Setup connection with the fpga:
Packit 577717
	 * NOTE: any other threads attempting to call into the EMON API 
Packit 577717
	 *	    will be turned away.  */
Packit 577717
	ret = EMON_SetupPowerMeasurement();
Packit 577717
	_check_EMON_error("EMON_SetupPowerMeasurement", ret );
Packit 577717
Packit 577717
	_emon2_vector.cmp_info.num_native_events = EMON_TOTAL_EVENTS;
Packit 577717
Packit 577717
	_emon2_vector.cmp_info.num_cntrs = EMON_TOTAL_EVENTS;
Packit 577717
	_emon2_vector.cmp_info.num_mpx_cntrs = EMON_TOTAL_EVENTS;
Packit 577717
Packit 577717
	
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * Control of counters (Reading/Writing/Starting/Stopping/Setup)
Packit 577717
 * functions
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_init_control_state( hwd_control_state_t * ptr )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_init_control_state\n" );
Packit 577717
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;
Packit 577717
	memset( this_state, 0, sizeof ( EMON_control_state_t ) );
Packit 577717
	
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
static int 
Packit 577717
_emon_accessor( EMON_control_state_t * this_state ) 
Packit 577717
{
Packit 577717
	union {
Packit 577717
		long long ll;
Packit 577717
		double fp;
Packit 577717
	} return_value;
Packit 577717
	return_value.fp = -1;
Packit 577717
Packit 577717
	double volts[14],amps[14];
Packit 577717
	double cpu 		= 0;
Packit 577717
	double dram 		= 0;
Packit 577717
	double link_chip	= 0;
Packit 577717
	double network 		= 0;
Packit 577717
	double optics 		= 0;
Packit 577717
	double pci		= 0;
Packit 577717
	double sram		= 0;
Packit 577717
	unsigned k_const; 
Packit 577717
    
Packit 577717
	EMONDBG( "_emon_accessor, enter this_state = %x\n", this_state);
Packit 577717
	return_value.fp = EMON_GetPower_impl( volts, amps );
Packit 577717
	EMONDBG("_emon_accessor, after EMON_GetPower %lf \n", return_value.fp);
Packit 577717
	if ( -1 == return_value.fp ) {
Packit 577717
		PAPIERROR("EMON_GetPower() failed!\n");
Packit 577717
		return ( PAPI_ESYS );
Packit 577717
	}
Packit 577717
Packit 577717
	this_state->counters[7] = return_value.ll;
Packit 577717
Packit 577717
/*  We just stuff everything in counters, there is no extra overhead here */
Packit 577717
	k_const 	= domain_info[0].k_const; /* Chip Core Voltage */
Packit 577717
	cpu += volts[0] * amps[0] * k_const;
Packit 577717
	cpu += volts[1] * amps[1] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[1].k_const; /* Chip Core Voltage */
Packit 577717
	dram += volts[2] * amps[2] * k_const;
Packit 577717
	dram += volts[3] * amps[3] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[2].k_const; /* Chip Core Voltage */
Packit 577717
	optics += volts[4] * amps[4] * k_const;
Packit 577717
	optics += volts[5] * amps[5] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[3].k_const; /* Chip Core Voltage */
Packit 577717
	pci += volts[6] * amps[6] * k_const;
Packit 577717
	pci += volts[7] * amps[7] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[4].k_const; /* Chip Core Voltage */
Packit 577717
	network += volts[8] * amps[8] * k_const;
Packit 577717
	network += volts[9] * amps[9] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[5].k_const; /* Chip Core Voltage */
Packit 577717
	link_chip += volts[10] * amps[10] * k_const;
Packit 577717
	link_chip += volts[11] * amps[11] * k_const;
Packit 577717
Packit 577717
	k_const 	= domain_info[6].k_const; /* Chip Core Voltage */
Packit 577717
	sram += volts[12] * amps[12] * k_const;
Packit 577717
	sram += volts[13] * amps[13] * k_const;
Packit 577717
Packit 577717
	this_state->counters[0] = *(long long*)&cp;;
Packit 577717
	this_state->counters[1] = *(long long*)&dra;;
Packit 577717
	this_state->counters[2] = *(long long*)&optics;
Packit 577717
	this_state->counters[3] = *(long long*)&pci;
Packit 577717
	this_state->counters[4] = *(long long*)&link_chip;
Packit 577717
	this_state->counters[5] = *(long long*)&network;
Packit 577717
	this_state->counters[6] = *(long long*)&sram;
Packit 577717
Packit 577717
	EMONDBG("CPU = %lf\n", *(double*)&this_state->counters[0]);
Packit 577717
	EMONDBG("DRAM = %lf\n", *(double*)&this_state->counters[1]);
Packit 577717
	EMONDBG("Optics = %lf\n", *(double*)&this_state->counters[2]);
Packit 577717
	EMONDBG("PCI = %lf\n", *(double*)&this_state->counters[3]);
Packit 577717
	EMONDBG("Link Chip = %lf\n", *(double*)&this_state->counters[4]);
Packit 577717
	EMONDBG("Network = %lf\n", *(double*)&this_state->counters[5]);
Packit 577717
	EMONDBG("SRAM = %lf\n", *(double*)&this_state->counters[6]);
Packit 577717
	EMONDBG("TOTAL = %lf\n", *(double*)&this_state->counters[7] );
Packit 577717
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_start( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_start\n" );
Packit 577717
	( void ) ctx;
Packit 577717
	( void ) ptr;
Packit 577717
	/*EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;*/
Packit 577717
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_stop( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_stop\n" );
Packit 577717
	( void ) ctx;
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;
Packit 577717
Packit 577717
	return _emon_accessor( this_state );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_read( hwd_context_t * ctx, hwd_control_state_t * ptr,
Packit 577717
		   long long ** events, int flags )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_read\n" );
Packit 577717
	( void ) ctx;
Packit 577717
	( void ) flags;
Packit 577717
	int ret;
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;
Packit 577717
Packit 577717
	ret = _emon_accessor( this_state );
Packit 577717
	*events = this_state->counters;
Packit 577717
	return ret;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_shutdown_thread( hwd_context_t * ctx )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_shutdown_thread\n" );
Packit 577717
	
Packit 577717
	( void ) ctx;
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
EMON_shutdown_component( void )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_shutdown_component\n" );
Packit 577717
	
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
/* This function sets various options in the component
Packit 577717
 * The valid codes being passed in are PAPI_SET_DEFDOM,
Packit 577717
 * PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL * and PAPI_SET_INHERIT
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_ctl\n" );
Packit 577717
	
Packit 577717
	( void ) ctx;
Packit 577717
	( void ) code;
Packit 577717
	( void ) option;
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * PAPI Cleanup Eventset
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_cleanup_eventset( hwd_control_state_t * ctrl )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_cleanup_eventset\n" );
Packit 577717
	
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ctrl;
Packit 577717
	( void ) this_state;
Packit 577717
 	
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_update_control_state( hwd_control_state_t * ptr,
Packit 577717
						   NativeInfo_t * native, int count,
Packit 577717
						   hwd_context_t * ctx )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_update_control_state: count = %d\n", count );
Packit 577717
Packit 577717
	( void ) ctx;
Packit 577717
	int index, i;
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;
Packit 577717
	( void ) ptr;
Packit 577717
Packit 577717
Packit 577717
	
Packit 577717
	// otherwise, add the events to the eventset
Packit 577717
	for ( i = 0; i < count; i++ ) {
Packit 577717
		index = ( native[i].ni_event ) ;
Packit 577717
		
Packit 577717
		native[i].ni_position = i;
Packit 577717
		
Packit 577717
		EMONDBG("EMON_update_control_state: ADD event: i = %d, index = %d\n", i, index );
Packit 577717
	}
Packit 577717
	
Packit 577717
	// store how many events we added to an EventSet
Packit 577717
	this_state->count = count;
Packit 577717
	
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * As a system wide count, PAPI_DOM_ALL is all we support
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_set_domain( hwd_control_state_t * cntrl, int domain )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_set_domain\n" );
Packit 577717
    ( void ) cntrl;
Packit 577717
Packit 577717
	if ( PAPI_DOM_ALL != domain )
Packit 577717
		return ( PAPI_EINVAL );
Packit 577717
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_reset( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_reset\n" );
Packit 577717
	( void ) ctx;
Packit 577717
	int retval;
Packit 577717
	EMON_control_state_t * this_state = ( EMON_control_state_t * ) ptr;
Packit 577717
	( void ) this_state;
Packit 577717
	( void ) retval;
Packit 577717
Packit 577717
	memset( this_state->counters, 0x0, sizeof(long long) * EMON_MAX_COUNTERS);
Packit 577717
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * Native Event functions
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_ntv_enum_events( unsigned int *EventCode, int modifier )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_ntv_enum_events, EventCode = %#x\n", *EventCode );
Packit 577717
Packit 577717
	switch ( modifier ) {
Packit 577717
	case PAPI_ENUM_FIRST:
Packit 577717
		*EventCode = 0;
Packit 577717
Packit 577717
		return ( PAPI_OK );
Packit 577717
		break;
Packit 577717
Packit 577717
	case PAPI_ENUM_EVENTS:
Packit 577717
	{
Packit 577717
		int index = ( *EventCode );
Packit 577717
Packit 577717
		if ( index < EMON_TOTAL_EVENTS ) {
Packit 577717
			*EventCode = *EventCode + 1;
Packit 577717
			return ( PAPI_OK );
Packit 577717
		} else {
Packit 577717
			return ( PAPI_ENOEVNT );
Packit 577717
		}
Packit 577717
Packit 577717
		break;
Packit 577717
	}
Packit 577717
	default:
Packit 577717
		return ( PAPI_EINVAL );
Packit 577717
	}
Packit 577717
	return ( PAPI_EINVAL );
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_ntv_code_to_name( unsigned int EventCode, char *name, int len )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_ntv_code_to_name\n" );
Packit 577717
	int index;
Packit 577717
	( void ) name;
Packit 577717
	( void ) len;
Packit 577717
	
Packit 577717
	index = ( EventCode );
Packit 577717
Packit 577717
	if ( index >= EMON_TOTAL_EVENTS || index < 0 ) {
Packit 577717
		return PAPI_ENOEVNT;
Packit 577717
	}
Packit 577717
Packit 577717
	strncpy( name, EMON_native_table[index].name, len );
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * 
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_ntv_name_to_code( const char *name, unsigned int *code )
Packit 577717
{
Packit 577717
	int index;
Packit 577717
Packit 577717
	for ( index = 0; index < EMON_TOTAL_EVENTS; index++ ) {
Packit 577717
		if ( 0 == strcmp( name, EMON_native_table[index].name ) ) {
Packit 577717
			*code = index;
Packit 577717
		}
Packit 577717
	}
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
EMON_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_ntv_code_to_descr\n" );
Packit 577717
	int index;
Packit 577717
	( void ) name;
Packit 577717
	( void ) len;
Packit 577717
	
Packit 577717
	index = ( EventCode ) ;
Packit 577717
Packit 577717
	if ( index >= EMON_TOTAL_EVENTS || index < 0 ) {
Packit 577717
		return PAPI_ENOEVNT;
Packit 577717
	}
Packit 577717
	strncpy( name, EMON_native_table[index].description, len );
Packit 577717
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
int
Packit 577717
EMON_ntv_code_to_bits( unsigned int EventCode, hwd_register_t * bits )
Packit 577717
{
Packit 577717
	EMONDBG( "EMON_ntv_code_to_bits\n" );
Packit 577717
	( void ) EventCode;
Packit 577717
	( void ) bits;
Packit 577717
	return ( PAPI_OK );
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
EMON_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info) 
Packit 577717
{
Packit 577717
Packit 577717
  int index = EventCode;
Packit 577717
Packit 577717
  if ( ( index < 0) || (index >= EMON_TOTAL_EVENTS )) return PAPI_ENOEVNT;
Packit 577717
Packit 577717
  strncpy( info->symbol, EMON_native_table[index].name, 
Packit 577717
	   sizeof(info->symbol));
Packit 577717
Packit 577717
  strncpy( info->long_descr, EMON_native_table[index].description, 
Packit 577717
	   sizeof(info->symbol));
Packit 577717
Packit 577717
  //strncpy( info->units, rapl_native_events[index].units, 
Packit 577717
	   //sizeof(info->units));
Packit 577717
Packit 577717
  info->data_type = EMON_native_table[index].return_type;
Packit 577717
Packit 577717
  return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 */
Packit 577717
papi_vector_t _emon_vector = {
Packit 577717
	.cmp_info = {
Packit 577717
				 /* default component information (unspecified values are initialized to 0) */
Packit 577717
				 .name = "EMON",
Packit 577717
				 .short_name = "EMON",
Packit 577717
				 .description = "Blue Gene/Q EMON component",
Packit 577717
				 .num_native_events = EMON_MAX_COUNTERS,
Packit 577717
				 .num_cntrs = EMON_MAX_COUNTERS,
Packit 577717
				 .num_mpx_cntrs = EMON_MAX_COUNTERS,
Packit 577717
				 .default_domain = PAPI_DOM_ALL,
Packit 577717
				 .available_domains = PAPI_DOM_ALL,
Packit 577717
				 .default_granularity = PAPI_GRN_SYS,
Packit 577717
				 .available_granularities = PAPI_GRN_SYS,
Packit 577717
		
Packit 577717
				 .hardware_intr_sig = PAPI_INT_SIGNAL,
Packit 577717
				 .hardware_intr = 1,
Packit 577717
		
Packit 577717
				 .kernel_multiplex = 0,
Packit 577717
Packit 577717
				 /* component specific cmp_info initializations */
Packit 577717
				 .fast_real_timer = 0,
Packit 577717
				 .fast_virtual_timer = 0,
Packit 577717
				 .attach = 0,
Packit 577717
				 .attach_must_ptrace = 0,
Packit 577717
				 }
Packit 577717
	,
Packit 577717
Packit 577717
	/* sizes of framework-opaque component-private structures */
Packit 577717
	.size = {
Packit 577717
			 .context = sizeof ( EMON_context_t ),
Packit 577717
			 .control_state = sizeof ( EMON_control_state_t ),
Packit 577717
			 .reg_value = sizeof ( EMON_register_t ),
Packit 577717
			 .reg_alloc = sizeof ( EMON_reg_alloc_t ),
Packit 577717
			 }
Packit 577717
	,
Packit 577717
	/* function pointers in this component */
Packit 577717
	.init_thread =          EMON_init_thread,
Packit 577717
	.init_component =       EMON_init_component,
Packit 577717
	.init_control_state =   EMON_init_control_state,
Packit 577717
	.start =                EMON_start,
Packit 577717
	.stop =                 EMON_stop,
Packit 577717
	.read =                 EMON_read,
Packit 577717
	.shutdown_thread =      EMON_shutdown_thread,
Packit 577717
	.shutdown_component =   EMON_shutdown_component,
Packit 577717
	.cleanup_eventset =     EMON_cleanup_eventset,
Packit 577717
	.ctl =                  EMON_ctl,
Packit 577717
Packit 577717
	.update_control_state = EMON_update_control_state,
Packit 577717
	.set_domain =           EMON_set_domain,
Packit 577717
	.reset =                EMON_reset,
Packit 577717
Packit 577717
	.ntv_enum_events =      EMON_ntv_enum_events,
Packit 577717
	.ntv_code_to_name =     EMON_ntv_code_to_name,
Packit 577717
	.ntv_code_to_descr =    EMON_ntv_code_to_descr,
Packit 577717
	.ntv_code_to_bits =     EMON_ntv_code_to_bits,
Packit 577717
	.ntv_code_to_info = EMON_ntv_code_to_info,
Packit 577717
};