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

Packit 577717
/**
Packit 577717
 * @file    linux-mx.c
Packit 577717
 * @brief A component for Myricom MX (Myrinet Express)
Packit 577717
 */
Packit 577717
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_internal.h"
Packit 577717
#include "papi_vector.h"
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
#include <unistd.h>
Packit 577717
#include <string.h>
Packit 577717
#include <ctype.h>
Packit 577717
Packit 577717
#define MX_MAX_COUNTERS 100
Packit 577717
#define MX_MAX_COUNTER_TERMS  MX_MAX_COUNTERS
Packit 577717
Packit 577717
#define LINELEN 128
Packit 577717
Packit 577717
typedef struct MX_register
Packit 577717
{
Packit 577717
	/* indicate which counters this event can live on */
Packit 577717
	unsigned int selector;
Packit 577717
} MX_register_t;
Packit 577717
Packit 577717
typedef struct MX_native_event_entry
Packit 577717
{
Packit 577717
	/* description of the resources required by this native event */
Packit 577717
	MX_register_t resources;
Packit 577717
	/* If it exists, then this is the name of this event */
Packit 577717
	char *name;
Packit 577717
	/* If it exists, then this is the description of this event */
Packit 577717
	char *description;
Packit 577717
} MX_native_event_entry_t;
Packit 577717
Packit 577717
typedef struct MX_reg_alloc
Packit 577717
{
Packit 577717
	MX_register_t ra_bits;
Packit 577717
} MX_reg_alloc_t;
Packit 577717
Packit 577717
typedef struct MX_control_state
Packit 577717
{
Packit 577717
  long long start_count[MX_MAX_COUNTERS];
Packit 577717
  long long current_count[MX_MAX_COUNTERS];
Packit 577717
  long long difference[MX_MAX_COUNTERS];
Packit 577717
  int which_counter[MX_MAX_COUNTERS];
Packit 577717
  int num_events;
Packit 577717
} MX_control_state_t;
Packit 577717
Packit 577717
typedef struct MX_context
Packit 577717
{
Packit 577717
	MX_control_state_t state;
Packit 577717
} MX_context_t;
Packit 577717
Packit 577717
Packit 577717
static const MX_native_event_entry_t mx_native_table[] = {
Packit 577717
	{{1,  }, "LANAI_UPTIME", "Lanai uptime (seconds)"},
Packit 577717
	{{2,  }, "COUNTERS_UPTIME", "Counters uptime (seconds)"},
Packit 577717
	{{3,  }, "BAD_CRC8", "Bad CRC8 (Port 0)"},
Packit 577717
	{{4,  }, "BAD_CRC32", "Bad CRC32 (Port 0)"},
Packit 577717
	{{5,  }, "UNSTRIPPED_ROUTE", "Unstripped route (Port 0)"},
Packit 577717
	{{6,  }, "PKT_DESC_INVALID", "pkt_desc_invalid (Port 0)"},
Packit 577717
	{{7,  }, "RECV_PKT_ERRORS", "recv_pkt_errors (Port 0)"},
Packit 577717
	{{8,  }, "PKT_MISROUTED", "pkt_misrouted (Port 0)"},
Packit 577717
	{{9,  }, "DATA_SRC_UNKNOWN", "data_src_unknown"},
Packit 577717
	{{10,  }, "DATA_BAD_ENDPT", "data_bad_endpt"},
Packit 577717
	{{11,  }, "DATA_ENDPT_CLOSED", "data_endpt_closed"},
Packit 577717
	{{12,  }, "DATA_BAD_SESSION", "data_bad_session"},
Packit 577717
	{{13,  }, "PUSH_BAD_WINDOW", "push_bad_window"},
Packit 577717
	{{14,  }, "PUSH_DUPLICATE", "push_duplicate"},
Packit 577717
	{{15,  }, "PUSH_OBSOLETE", "push_obsolete"},
Packit 577717
	{{16,  }, "PUSH_RACE_DRIVER", "push_race_driver"},
Packit 577717
	{{17,  }, "PUSH_BAD_SEND_HANDLE_MAGIC", "push_bad_send_handle_magic"},
Packit 577717
	{{18,  }, "PUSH_BAD_SRC_MAGIC", "push_bad_src_magic"},
Packit 577717
	{{19,  }, "PULL_OBSOLETE", "pull_obsolete"},
Packit 577717
	{{20,  }, "PULL_NOTIFY_OBSOLETE", "pull_notify_obsolete"},
Packit 577717
	{{21,  }, "PULL_RACE_DRIVER", "pull_race_driver"},
Packit 577717
	{{22,  }, "ACK_BAD_TYPE", "ack_bad_type"},
Packit 577717
	{{23,  }, "ACK_BAD_MAGIC", "ack_bad_magic"},
Packit 577717
	{{24,  }, "ACK_RESEND_RACE", "ack_resend_race"},
Packit 577717
	{{25,  }, "LATE_ACK", "Late ack"},
Packit 577717
	{{26,  }, "ACK_NACK_FRAMES_IN_PIPE", "ack_nack_frames_in_pipe"},
Packit 577717
	{{27,  }, "NACK_BAD_ENDPT", "nack_bad_endpt"},
Packit 577717
	{{28,  }, "NACK_ENDPT_CLOSED", "nack_endpt_closed"},
Packit 577717
	{{29,  }, "NACK_BAD_SESSION", "nack_bad_session"},
Packit 577717
	{{30,  }, "NACK_BAD_RDMAWIN", "nack_bad_rdmawin"},
Packit 577717
	{{31,  }, "NACK_EVENTQ_FULL", "nack_eventq_full"},
Packit 577717
	{{32,  }, "SEND_BAD_RDMAWIN", "send_bad_rdmawin"},
Packit 577717
	{{33,  }, "CONNECT_TIMEOUT", "connect_timeout"},
Packit 577717
	{{34,  }, "CONNECT_SRC_UNKNOWN", "connect_src_unknown"},
Packit 577717
	{{35,  }, "QUERY_BAD_MAGIC", "query_bad_magic"},
Packit 577717
	{{36,  }, "QUERY_TIMED_OUT", "query_timed_out"},
Packit 577717
	{{37,  }, "QUERY_SRC_UNKNOWN", "query_src_unknown"},
Packit 577717
	{{38,  }, "RAW_SENDS", "Raw sends (Port 0)"},
Packit 577717
	{{39,  }, "RAW_RECEIVES", "Raw receives (Port 0)"},
Packit 577717
	{{40,  }, "RAW_OVERSIZED_PACKETS", "Raw oversized packets (Port 0)"},
Packit 577717
	{{41,  }, "RAW_RECV_OVERRUN", "raw_recv_overrun"},
Packit 577717
	{{42,  }, "RAW_DISABLED", "raw_disabled"},
Packit 577717
	{{43,  }, "CONNECT_SEND", "connect_send"},
Packit 577717
	{{44,  }, "CONNECT_RECV", "connect_recv"},
Packit 577717
	{{45,  }, "ACK_SEND", "ack_send (Port 0)"},
Packit 577717
	{{46,  }, "ACK_RECV", "ack_recv (Port 0)"},
Packit 577717
	{{47,  }, "PUSH_SEND", "push_send (Port 0)"},
Packit 577717
	{{48,  }, "PUSH_RECV", "push_recv (Port 0)"},
Packit 577717
	{{49,  }, "QUERY_SEND", "query_send (Port 0)"},
Packit 577717
	{{50,  }, "QUERY_RECV", "query_recv (Port 0)"},
Packit 577717
	{{51,  }, "REPLY_SEND", "reply_send (Port 0)"},
Packit 577717
	{{52,  }, "REPLY_RECV", "reply_recv (Port 0)"},
Packit 577717
	{{53,  }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},
Packit 577717
/*   {{ 54,  }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},*/
Packit 577717
	{{55,  }, "DATA_SEND_NULL", "data_send_null (Port 0)"},
Packit 577717
	{{56,  }, "DATA_SEND_SMALL", "data_send_small (Port 0)"},
Packit 577717
	{{57,  }, "DATA_SEND_MEDIUM", "data_send_medium (Port 0)"},
Packit 577717
	{{58,  }, "DATA_SEND_RNDV", "data_send_rndv (Port 0)"},
Packit 577717
	{{59,  }, "DATA_SEND_PULL", "data_send_pull (Port 0)"},
Packit 577717
	{{60,  }, "DATA_RECV_NULL", "data_recv_null (Port 0)"},
Packit 577717
	{{61,  }, "DATA_RECV_SMALL_INLINE", "data_recv_small_inline (Port 0)"},
Packit 577717
	{{62,  }, "DATA_RECV_SMALL_COPY", "data_recv_small_copy (Port 0)"},
Packit 577717
	{{63,  }, "DATA_RECV_MEDIUM", "data_recv_medium (Port 0)"},
Packit 577717
	{{64,  }, "DATA_RECV_RNDV", "data_recv_rndv (Port 0)"},
Packit 577717
	{{65,  }, "DATA_RECV_PULL", "data_recv_pull (Port 0)"},
Packit 577717
	{{66,  }, "ETHER_SEND_UNICAST_CNT", "ether_send_unicast_cnt (Port 0)"},
Packit 577717
	{{67,  }, "ETHER_SEND_MULTICAST_CNT", "ether_send_multicast_cnt (Port 0)"},
Packit 577717
	{{68,  }, "ETHER_RECV_SMALL_CNT", "ether_recv_small_cnt (Port 0)"},
Packit 577717
	{{69,  }, "ETHER_RECV_BIG_CNT", "ether_recv_big_cnt (Port 0)"},
Packit 577717
	{{70,  }, "ETHER_OVERRUN", "ether_overrun"},
Packit 577717
	{{71,  }, "ETHER_OVERSIZED", "ether_oversized"},
Packit 577717
	{{72,  }, "DATA_RECV_NO_CREDITS", "data_recv_no_credits"},
Packit 577717
	{{73,  }, "PACKETS_RECENT", "Packets resent"},
Packit 577717
	{{74,  }, "PACKETS_DROPPED", "Packets dropped (data send side)"},
Packit 577717
	{{75,  }, "MAPPER_ROUTES_UPDATE", "Mapper routes update"},
Packit 577717
	{{76,  }, "ROUTE_DISPERSION", "Route dispersion (Port 0)"},
Packit 577717
	{{77,  }, "OUT_OF_SEND_HANDLES", "out_of_send_handles"},
Packit 577717
	{{78,  }, "OUT_OF_PULL_HANDLES", "out_of_pull_handles"},
Packit 577717
	{{79,  }, "OUT_OF_PUSH_HANDLES", "out_of_push_handles"},
Packit 577717
	{{80,  }, "MEDIUM_CONT_RACE", "medium_cont_race"},
Packit 577717
	{{81,  }, "CMD_TYPE_UNKNOWN", "cmd_type_unknown"},
Packit 577717
	{{82,  }, "UREQ_TYPE_UNKNOWN", "ureq_type_unknown"},
Packit 577717
	{{83,  }, "INTERRUPTS_OVERRUN", "Interrupts overrun"},
Packit 577717
	{{84,  }, "WAITING_FOR_INTERRUPT_DMA", "Waiting for interrupt DMA"},
Packit 577717
	{{85,  }, "WAITING_FOR_INTERRUPT_ACK", "Waiting for interrupt Ack"},
Packit 577717
	{{86,  }, "WAITING_FOR_INTERRUPT_TIMER", "Waiting for interrupt Timer"},
Packit 577717
	{{87,  }, "SLABS_RECYCLING", "Slabs recycling"},
Packit 577717
	{{88,  }, "SLABS_PRESSURE", "Slabs pressure"},
Packit 577717
	{{89,  }, "SLABS_STARVATION", "Slabs starvation"},
Packit 577717
	{{90,  }, "OUT_OF_RDMA_HANDLES", "out_of_rdma handles"},
Packit 577717
	{{91,  }, "EVENTQ_FULL", "eventq_full"},
Packit 577717
	{{92,  }, "BUFFER_DROP", "buffer_drop (Port 0)"},
Packit 577717
	{{93,  }, "MEMORY_DROP", "memory_drop (Port 0)"},
Packit 577717
	{{94,  }, "HARDWARE_FLOW_CONTROL", "Hardware flow control (Port 0)"},
Packit 577717
	{{95,  }, "SIMULATED_PACKETS_LOST", "(Devel) Simulated packets lost (Port 0)"},
Packit 577717
	{{96,  }, "LOGGING_FRAMES_DUMPED", "(Logging) Logging frames dumped"},
Packit 577717
	{{97,  }, "WAKE_INTERRUPTS", "Wake interrupts"},
Packit 577717
	{{98,  }, "AVERTED_WAKEUP_RACE", "Averted wakeup race"},
Packit 577717
	{{99,  }, "DMA_METADATA_RACE", "Dma metadata race"},
Packit 577717
	{{0, }, "", ""}
Packit 577717
};
Packit 577717
Packit 577717
static int num_events=0;
Packit 577717
papi_vector_t _mx_vector;
Packit 577717
Packit 577717
static char mx_counters_exe[BUFSIZ];
Packit 577717
Packit 577717
static int
Packit 577717
read_mx_counters( long long *counters )
Packit 577717
{
Packit 577717
	FILE *fp;
Packit 577717
	char line[LINELEN];
Packit 577717
	int i, linenum;
Packit 577717
Packit 577717
	/* Open a pipe to the mx_counters executable */
Packit 577717
Packit 577717
	fp = popen( mx_counters_exe, "r" );
Packit 577717
	if ( !fp ) {
Packit 577717
	   perror( "popen" );
Packit 577717
	   return PAPI_ECMP;
Packit 577717
	}
Packit 577717
Packit 577717
Packit 577717
	/* A line of output looks something similar to:       */
Packit 577717
        /* "    Lanai uptime (seconds):     766268 (0xbb13c)" */
Packit 577717
Packit 577717
	/* This code may fail if number of ports on card > 1 */
Packit 577717
Packit 577717
	linenum = 0;
Packit 577717
	while ( fgets( line, LINELEN, fp ) ) {
Packit 577717
	  //	   printf("%s",line);
Packit 577717
	   for(i=0; line[i]!= '\0' && i
Packit 577717
Packit 577717
	      /* skip to colon */
Packit 577717
	      if (line[i]==':') {
Packit 577717
Packit 577717
	         /* read in value */
Packit 577717
	         if (line[i+1]!='\0') {
Packit 577717
		   //	    printf("Line %d trying %s",linenum,&line[i+1]);
Packit 577717
	            sscanf(&line[i+1],"%lld",&counters[linenum]);
Packit 577717
		    linenum++;
Packit 577717
		    break;
Packit 577717
		 }
Packit 577717
	      }
Packit 577717
	   }
Packit 577717
	   if (linenum>=MX_MAX_COUNTERS) break;
Packit 577717
	}
Packit 577717
Packit 577717
	pclose( fp );
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * Component setup and shutdown
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
static int
Packit 577717
_mx_init_component( int cidx )
Packit 577717
{
Packit 577717
Packit 577717
	FILE *fff;
Packit 577717
	char test_string[BUFSIZ];
Packit 577717
Packit 577717
	/* detect if MX available */
Packit 577717
Packit 577717
	strncpy(mx_counters_exe,"mx_counters 2> /dev/null",BUFSIZ);
Packit 577717
	fff=popen(mx_counters_exe,"r");
Packit 577717
	/* popen only returns NULL if "sh" fails, not the actual command */
Packit 577717
	if (fgets(test_string,BUFSIZ,fff)==NULL) {
Packit 577717
	   pclose(fff);
Packit 577717
	   strncpy(mx_counters_exe,"./components/mx/utils/fake_mx_counters 2> /dev/null",BUFSIZ);
Packit 577717
	   fff=popen(mx_counters_exe,"r");
Packit 577717
	   if (fgets(test_string,BUFSIZ,fff)==NULL) {
Packit 577717
	      pclose(fff);
Packit 577717
	      /* neither real nor fake found */
Packit 577717
	      strncpy(_mx_vector.cmp_info.disabled_reason,
Packit 577717
		      "No MX utilities found",PAPI_MAX_STR_LEN);
Packit 577717
	      return PAPI_ECMP;
Packit 577717
	   }
Packit 577717
	}
Packit 577717
	pclose(fff);
Packit 577717
Packit 577717
	num_events=MX_MAX_COUNTERS;
Packit 577717
	_mx_vector.cmp_info.num_native_events=num_events;
Packit 577717
Packit 577717
	/* Export the component id */
Packit 577717
	_mx_vector.cmp_info.CmpIdx = cidx;
Packit 577717
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * This is called whenever a thread is initialized
Packit 577717
 */
Packit 577717
static int
Packit 577717
_mx_init_thread( hwd_context_t * ctx )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_shutdown_component(void) 
Packit 577717
{
Packit 577717
  return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
_mx_shutdown_thread( hwd_context_t * ctx )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
	return PAPI_OK;
Packit 577717
}
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
static int
Packit 577717
_mx_init_control_state( hwd_control_state_t *ctl )
Packit 577717
{
Packit 577717
	( void ) ctl;			 /*unused */
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
_mx_update_control_state( hwd_control_state_t *ctl, NativeInfo_t *native,
Packit 577717
			  int count, hwd_context_t *ctx )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
	int i, index;
Packit 577717
	
Packit 577717
	MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
Packit 577717
Packit 577717
	for(i=0; i
Packit 577717
	    index = native[i].ni_event;
Packit 577717
	    mx_ctl->which_counter[i]=index;
Packit 577717
	    //	    printf("Mapping event# %d to HW counter %d (count=%d)\n",
Packit 577717
	    //	   i,index,count); 
Packit 577717
	    native[i].ni_position = i;
Packit 577717
	}
Packit 577717
Packit 577717
	mx_ctl->num_events=count;
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_start( hwd_context_t *ctx, hwd_control_state_t *ctl )
Packit 577717
{
Packit 577717
Packit 577717
        long long mx_counters[MX_MAX_COUNTERS];
Packit 577717
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
Packit 577717
	MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
Packit 577717
	int i;
Packit 577717
Packit 577717
	read_mx_counters( mx_counters );
Packit 577717
Packit 577717
	//	for(i=0;i
Packit 577717
Packit 577717
	for(i=0;i<mx_ctl->num_events;i++) {
Packit 577717
           mx_ctl->current_count[i]=
Packit 577717
	         mx_counters[mx_ctl->which_counter[i]];
Packit 577717
	   mx_ctl->start_count[i]=mx_ctl->current_count[i];
Packit 577717
	}
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_stop( hwd_context_t *ctx, hwd_control_state_t *ctl )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
Packit 577717
        long long mx_counters[MX_MAX_COUNTERS];
Packit 577717
	MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
Packit 577717
	int i;
Packit 577717
Packit 577717
	read_mx_counters( mx_counters );
Packit 577717
Packit 577717
	for(i=0;i<mx_ctl->num_events;i++) {
Packit 577717
           mx_ctl->current_count[i]=
Packit 577717
	         mx_counters[mx_ctl->which_counter[i]];
Packit 577717
	}
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
_mx_read( hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events,
Packit 577717
		 int flags )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
	( void ) flags;			 /*unused */
Packit 577717
	int i;
Packit 577717
        long long mx_counters[MX_MAX_COUNTERS];
Packit 577717
Packit 577717
	MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
Packit 577717
Packit 577717
	read_mx_counters( mx_counters );
Packit 577717
Packit 577717
	for ( i = 0; i < mx_ctl->num_events; i++ ) {
Packit 577717
            mx_ctl->current_count[i]=
Packit 577717
	         mx_counters[mx_ctl->which_counter[i]];
Packit 577717
	    mx_ctl->difference[i] = mx_ctl->current_count[i]-
Packit 577717
	                               mx_ctl->start_count[i];
Packit 577717
	}
Packit 577717
	*events = mx_ctl->difference;
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_reset( hwd_context_t * ctx, hwd_control_state_t * ctrl )
Packit 577717
{
Packit 577717
	_mx_start( ctx, ctrl );
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
/* Unused write function */
Packit 577717
/* static int */
Packit 577717
/* _mx_write( hwd_context_t * ctx, hwd_control_state_t * ctrl, long long *from ) */
Packit 577717
/* { */
Packit 577717
/* 	( void ) ctx;			 /\*unused *\/ */
Packit 577717
/* 	( void ) ctrl;			 /\*unused *\/ */
Packit 577717
/* 	( void ) from;			 /\*unused *\/ */
Packit 577717
Packit 577717
/* 	return PAPI_OK; */
Packit 577717
/* } */
Packit 577717
Packit 577717
/*
Packit 577717
 * Functions for setting up various options
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
static int
Packit 577717
_mx_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
Packit 577717
{
Packit 577717
	( void ) ctx;			 /*unused */
Packit 577717
	( void ) code;			 /*unused */
Packit 577717
	( void ) option;		 /*unused */
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * This function has to set the bits needed to count different domains
Packit 577717
 * In particular: PAPI_DOM_USER, PAPI_DOM_KERNEL PAPI_DOM_OTHER
Packit 577717
 * By default return PAPI_EINVAL if none of those are specified
Packit 577717
 * and PAPI_OK with success
Packit 577717
 * PAPI_DOM_USER is only user context is counted
Packit 577717
 * PAPI_DOM_KERNEL is only the Kernel/OS context is counted
Packit 577717
 * PAPI_DOM_OTHER  is Exception/transient mode (like user TLB misses)
Packit 577717
 * PAPI_DOM_ALL   is all of the domains
Packit 577717
 */
Packit 577717
static int
Packit 577717
_mx_set_domain( hwd_control_state_t * cntrl, int domain )
Packit 577717
{
Packit 577717
	( void ) cntrl;			 /*unused */
Packit 577717
	if ( PAPI_DOM_ALL != domain ) {
Packit 577717
		return PAPI_EINVAL;
Packit 577717
	}
Packit 577717
Packit 577717
	return PAPI_OK;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_ntv_code_to_name( unsigned int EventCode, char *name, int len )
Packit 577717
{
Packit 577717
Packit 577717
	int event=EventCode;
Packit 577717
Packit 577717
	if (event >=0 && event < num_events) {
Packit 577717
	  strncpy( name, mx_native_table[event].name, len );
Packit 577717
	  return PAPI_OK;
Packit 577717
	}
Packit 577717
	return PAPI_ENOEVNT;
Packit 577717
Packit 577717
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
_mx_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
Packit 577717
{
Packit 577717
    int event=EventCode;
Packit 577717
Packit 577717
    if (event >=0 && event < num_events) {
Packit 577717
       strncpy( name, mx_native_table[event].description, len );
Packit 577717
       return PAPI_OK;
Packit 577717
    }
Packit 577717
    return PAPI_ENOEVNT;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
static int
Packit 577717
_mx_ntv_enum_events( unsigned int *EventCode, int modifier )
Packit 577717
{
Packit 577717
Packit 577717
	if ( modifier == PAPI_ENUM_FIRST ) {
Packit 577717
	   if (num_events==0) return PAPI_ENOEVNT;
Packit 577717
	   *EventCode = 0;
Packit 577717
	   return PAPI_OK;
Packit 577717
	}
Packit 577717
Packit 577717
	if ( modifier == PAPI_ENUM_EVENTS ) {
Packit 577717
		int index = *EventCode;
Packit 577717
Packit 577717
		if ( mx_native_table[index + 1].resources.selector ) {
Packit 577717
			*EventCode = *EventCode + 1;
Packit 577717
			return PAPI_OK;
Packit 577717
		} else {
Packit 577717
			return PAPI_ENOEVNT;
Packit 577717
		}
Packit 577717
	}
Packit 577717
		
Packit 577717
        return PAPI_EINVAL;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
papi_vector_t _mx_vector = {
Packit 577717
	.cmp_info = {
Packit 577717
	    .name = "mx",
Packit 577717
		.short_name = "mx",
Packit 577717
	    .version = "1.4",
Packit 577717
	    .description = "Myricom MX (Myrinet Express) statistics",
Packit 577717
	    .num_mpx_cntrs = MX_MAX_COUNTERS,
Packit 577717
	    .num_cntrs = MX_MAX_COUNTERS,
Packit 577717
	    .default_domain = PAPI_DOM_ALL,
Packit 577717
	    .default_granularity = PAPI_GRN_SYS,
Packit 577717
	    .available_granularities = PAPI_GRN_SYS,
Packit 577717
	    .hardware_intr_sig = PAPI_INT_SIGNAL,
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
	    .available_domains = PAPI_DOM_ALL,
Packit 577717
  },
Packit 577717
Packit 577717
	/* sizes of framework-opaque component-private structures */
Packit 577717
	.size = {
Packit 577717
	    .context = sizeof ( MX_context_t ),
Packit 577717
	    .control_state = sizeof ( MX_control_state_t ),
Packit 577717
	    .reg_value = sizeof ( MX_register_t ),
Packit 577717
	    .reg_alloc = sizeof ( MX_reg_alloc_t ),
Packit 577717
  },
Packit 577717
        /* function pointers in this component */
Packit 577717
	.init_thread =          _mx_init_thread,
Packit 577717
	.init_component =       _mx_init_component,
Packit 577717
	.init_control_state =   _mx_init_control_state,
Packit 577717
	.start =                _mx_start,
Packit 577717
	.stop =                 _mx_stop,
Packit 577717
	.read =                 _mx_read,
Packit 577717
	.shutdown_thread =      _mx_shutdown_thread,
Packit 577717
	.shutdown_component =   _mx_shutdown_component,
Packit 577717
	.ctl =                  _mx_ctl,
Packit 577717
	.update_control_state = _mx_update_control_state,
Packit 577717
	.set_domain =           _mx_set_domain,
Packit 577717
	.reset =                _mx_reset,
Packit 577717
Packit 577717
	.ntv_enum_events =      _mx_ntv_enum_events,
Packit 577717
	.ntv_code_to_name =     _mx_ntv_code_to_name,
Packit 577717
	.ntv_code_to_descr =    _mx_ntv_code_to_descr,
Packit 577717
};