|
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 |
};
|