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

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