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