Blame src/libpfm-3.y/lib/pfmlib_gen_mips64.c

Packit 577717
/*
Packit 577717
 * pfmlib_gen_mips64.c : support for the generic MIPS64 PMU family
Packit 577717
 *
Packit 577717
 * Contributed by Philip Mucci <mucci@cs.utk.edu> based on code from
Packit 577717
 * Copyright (c) 2005-2006 Hewlett-Packard Development Company, L.P.
Packit 577717
 * Contributed by Stephane Eranian <eranian@hpl.hp.com>
Packit 577717
 *
Packit 577717
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit 577717
 * of this software and associated documentation files (the "Software"), to deal
Packit 577717
 * in the Software without restriction, including without limitation the rights
Packit 577717
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
Packit 577717
 * of the Software, and to permit persons to whom the Software is furnished to do so,
Packit 577717
 * subject to the following conditions:
Packit 577717
 *
Packit 577717
 * The above copyright notice and this permission notice shall be included in all
Packit 577717
 * copies or substantial portions of the Software.
Packit 577717
 *
Packit 577717
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
Packit 577717
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
Packit 577717
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
Packit 577717
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Packit 577717
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
Packit 577717
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 577717
 */
Packit 577717
#include <sys/types.h>
Packit 577717
#include <ctype.h>
Packit 577717
#include <string.h>
Packit 577717
#include <stdio.h>
Packit 577717
#include <unistd.h>
Packit 577717
#include <sys/types.h>
Packit 577717
#include <sys/stat.h>
Packit 577717
#include <fcntl.h>
Packit 577717
Packit 577717
/* public headers */
Packit 577717
#include <perfmon/pfmlib_gen_mips64.h>
Packit 577717
Packit 577717
/* private headers */
Packit 577717
#include "pfmlib_priv.h"			/* library private */
Packit 577717
#include "pfmlib_gen_mips64_priv.h"		/* architecture private */
Packit 577717
#include "gen_mips64_events.h"		/* PMU private */
Packit 577717
Packit 577717
/* let's define some handy shortcuts! */
Packit 577717
#define sel_event_mask	perfsel.sel_event_mask
Packit 577717
#define sel_exl		perfsel.sel_exl
Packit 577717
#define sel_os		perfsel.sel_os
Packit 577717
#define sel_usr		perfsel.sel_usr
Packit 577717
#define sel_sup		perfsel.sel_sup
Packit 577717
#define sel_int		perfsel.sel_int
Packit 577717
Packit 577717
static pme_gen_mips64_entry_t *gen_mips64_pe = NULL;
Packit 577717
Packit 577717
pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_detect(void)
Packit 577717
{
Packit 577717
	static char mips_name[64] = "";
Packit 577717
	int ret;
Packit 577717
	char buffer[128];
Packit 577717
Packit 577717
	ret = __pfm_getcpuinfo_attr("cpu model", buffer, sizeof(buffer));
Packit 577717
	if (ret == -1)
Packit 577717
		return PFMLIB_ERR_NOTSUPP;
Packit 577717
Packit 577717
	generic_mips64_support.pmu_name = mips_name;
Packit 577717
	generic_mips64_support.num_cnt = 0;
Packit 577717
	if (strstr(buffer,"MIPS 20Kc"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_20K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS20KC"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_20K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 1;
Packit 577717
		generic_mips64_support.pmd_count = 1;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_20KC_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"MIPS 24K"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_24K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS24K"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_24K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_24K_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"MIPS 25Kf"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_25K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS25KF"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_25K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_25KF_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"MIPS 34K"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_34K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS34K"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_34K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 4;
Packit 577717
		generic_mips64_support.pmd_count = 4;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_34K_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"MIPS 5Kc"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_5K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS5KC"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_5K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_5KC_PMU;
Packit 577717
	}
Packit 577717
#if 0
Packit 577717
	else if (strstr(buffer,"MIPS 74K"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_74K_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPS74K"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_74K_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 4;
Packit 577717
		generic_mips64_support.pmd_count = 4;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_74K_PMU;
Packit 577717
	}
Packit 577717
#endif
Packit 577717
	else if (strstr(buffer,"R10000"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_r10000_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSR10000"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_r10000_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_R10000_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"R12000"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_r12000_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSR12000"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_r12000_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 4;
Packit 577717
		generic_mips64_support.pmd_count = 4;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_R12000_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"RM7000"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_rm7000_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSRM7000"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_rm7000_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_RM7000_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"RM9000"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_rm9000_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSRM9000"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_rm9000_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_RM9000_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"SB1"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_sb1_pe;
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSSB1"),
Packit 577717
			generic_mips64_support.pme_count = (sizeof(gen_mips64_sb1_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		generic_mips64_support.pmc_count = 4;
Packit 577717
		generic_mips64_support.pmd_count = 4;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_SB1_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"VR5432"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_vr5432_pe;
Packit 577717
		generic_mips64_support.pme_count = (sizeof(gen_mips64_vr5432_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSVR5432"),
Packit 577717
			generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_VR5432_PMU;
Packit 577717
	  }
Packit 577717
	else if (strstr(buffer,"VR5500"))
Packit 577717
	  {
Packit 577717
		gen_mips64_pe = gen_mips64_vr5500_pe;
Packit 577717
		generic_mips64_support.pme_count = (sizeof(gen_mips64_vr5500_pe)/sizeof(pme_gen_mips64_entry_t));
Packit 577717
		strcpy(generic_mips64_support.pmu_name,"MIPSVR5500"),
Packit 577717
			generic_mips64_support.pmc_count = 2;
Packit 577717
		generic_mips64_support.pmd_count = 2;
Packit 577717
		generic_mips64_support.pmu_type = PFMLIB_MIPS_VR5500_PMU;
Packit 577717
	}
Packit 577717
	else
Packit 577717
		return PFMLIB_ERR_NOTSUPP;
Packit 577717
Packit 577717
	if (generic_mips64_support.num_cnt == 0)
Packit 577717
	generic_mips64_support.num_cnt = generic_mips64_support.pmd_count;
Packit 577717
Packit 577717
	return PFMLIB_SUCCESS;
Packit 577717
}
Packit 577717
Packit 577717
static void stuff_regs(pfmlib_event_t *e, int plm, pfmlib_reg_t *pc, pfmlib_reg_t *pd, int cntr, int j, pfmlib_gen_mips64_input_param_t *mod_in)
Packit 577717
{
Packit 577717
	pfm_gen_mips64_sel_reg_t reg;
Packit 577717
Packit 577717
	reg.val    = 0; /* assume reserved bits are zerooed */
Packit 577717
Packit 577717
	/* if plm is 0, then assume not specified per-event and use default */
Packit 577717
	plm = e[j].plm ? e[j].plm : plm;
Packit 577717
	reg.sel_usr = plm & PFM_PLM3 ? 1 : 0;
Packit 577717
	reg.sel_os  = plm & PFM_PLM0 ? 1 : 0;
Packit 577717
	reg.sel_sup = plm & PFM_PLM1 ? 1 : 0;
Packit 577717
	reg.sel_exl = plm & PFM_PLM2 ? 1 : 0;
Packit 577717
	reg.sel_int = 1; /* force int to 1 */
Packit 577717
Packit 577717
	reg.sel_event_mask = (gen_mips64_pe[e[j].event].pme_code >> (cntr*8)) & 0xff;
Packit 577717
	pc[j].reg_value   = reg.val;
Packit 577717
	pc[j].reg_addr    = cntr*2;
Packit 577717
        pc[j].reg_num     = cntr;
Packit 577717
Packit 577717
	__pfm_vbprintf("[CP0_25_%"PRIx64"(pmc%u)=0x%"PRIx64" event_mask=0x%x usr=%d os=%d sup=%d exl=%d int=1] %s\n",
Packit 577717
			pc[j].reg_addr,
Packit 577717
			pc[j].reg_num,
Packit 577717
			pc[j].reg_value,
Packit 577717
			reg.sel_event_mask,
Packit 577717
			reg.sel_usr,
Packit 577717
			reg.sel_os,
Packit 577717
			reg.sel_sup,
Packit 577717
			reg.sel_exl,
Packit 577717
			gen_mips64_pe[e[j].event].pme_name);
Packit 577717
Packit 577717
	pd[j].reg_num  = cntr;
Packit 577717
	pd[j].reg_addr = cntr*2 + 1;
Packit 577717
Packit 577717
	__pfm_vbprintf("[CP0_25_%u(pmd%u)]\n",
Packit 577717
			pc[j].reg_addr,
Packit 577717
			pc[j].reg_num);
Packit 577717
}
Packit 577717
/*
Packit 577717
 * Automatically dispatch events to corresponding counters following constraints.
Packit 577717
 * Upon return the pfarg_regt structure is ready to be submitted to kernel
Packit 577717
 */
Packit 577717
static int
Packit 577717
pfm_gen_mips64_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_gen_mips64_input_param_t *mod_in, pfmlib_output_param_t *outp)
Packit 577717
{
Packit 577717
        /* pfmlib_gen_mips64_input_param_t *param = mod_in; */
Packit 577717
	pfmlib_event_t *e = inp->pfp_events;
Packit 577717
	pfmlib_reg_t *pc, *pd;
Packit 577717
	unsigned int i, j, cnt = inp->pfp_event_count;
Packit 577717
	unsigned int used = 0;
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
	pc = outp->pfp_pmcs;
Packit 577717
	pd = outp->pfp_pmds;
Packit 577717
Packit 577717
	/* Degree 2 rank based allocation */
Packit 577717
	if (cnt > generic_mips64_support.pmc_count) return PFMLIB_ERR_TOOMANY;
Packit 577717
Packit 577717
	if (PFMLIB_DEBUG()) {
Packit 577717
		for (j=0; j < cnt; j++) {
Packit 577717
			DPRINT("ev[%d]=%s, counters=0x%x\n", j, gen_mips64_pe[e[j].event].pme_name,gen_mips64_pe[e[j].event].pme_counters);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/* Do rank based allocation, counters that live on 1 reg 
Packit 577717
	   before counters that live on 2 regs etc. */
Packit 577717
	for (i=1;i<=PMU_GEN_MIPS64_NUM_COUNTERS;i++)
Packit 577717
	  {
Packit 577717
	    for (j=0; j < cnt;j++) 
Packit 577717
	      {
Packit 577717
		unsigned int cntr, avail;
Packit 577717
		if (pfmlib_popcnt(gen_mips64_pe[e[j].event].pme_counters) == i)
Packit 577717
		  {
Packit 577717
				/* These counters can be used for this event */
Packit 577717
				avail = ~used & gen_mips64_pe[e[j].event].pme_counters;
Packit 577717
		    DPRINT("Rank %d: Counters available 0x%x\n",i,avail);
Packit 577717
				if (avail == 0x0)
Packit 577717
					return PFMLIB_ERR_NOASSIGN;
Packit 577717
Packit 577717
				/* Pick one, mark as used*/
Packit 577717
				cntr = ffs(avail) - 1;
Packit 577717
		    DPRINT("Rank %d: Chose counter %d\n",i,cntr);
Packit 577717
Packit 577717
				/* Update registers */
Packit 577717
				stuff_regs(e,inp->pfp_dfl_plm,pc,pd,cntr,j,mod_in);
Packit 577717
Packit 577717
				used |= (1 << cntr);
Packit 577717
		    DPRINT("%d: Used counters 0x%x\n",i, used);
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/* number of evtsel registers programmed */
Packit 577717
	outp->pfp_pmc_count = cnt;
Packit 577717
	outp->pfp_pmd_count = cnt;
Packit 577717
Packit 577717
	return PFMLIB_SUCCESS;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
Packit 577717
{
Packit 577717
	pfmlib_gen_mips64_input_param_t *mod_in  = (pfmlib_gen_mips64_input_param_t *)model_in;
Packit 577717
Packit 577717
	return pfm_gen_mips64_dispatch_counters(inp, mod_in, outp);
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_get_event_code(unsigned int i, unsigned int cnt, int *code)
Packit 577717
{
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
	/* check validity of counter index */
Packit 577717
	if (cnt != PFMLIB_CNT_FIRST) {
Packit 577717
		if (cnt < 0 || cnt >= generic_mips64_support.pmc_count)
Packit 577717
	    return PFMLIB_ERR_INVAL; }
Packit 577717
	else 	  {
Packit 577717
		cnt = ffs(gen_mips64_pe[i].pme_counters)-1;
Packit 577717
		if (cnt == -1)
Packit 577717
			return(PFMLIB_ERR_INVAL);
Packit 577717
	}
Packit 577717
Packit 577717
	/* if cnt == 1, shift right by 0, if cnt == 2, shift right by 8 */
Packit 577717
	/* Works on both 5k anf 20K */
Packit 577717
Packit 577717
	if (gen_mips64_pe[i].pme_counters & (1<< cnt))
Packit 577717
		*code = 0xff & (gen_mips64_pe[i].pme_code >> (cnt*8));
Packit 577717
	else
Packit 577717
		return PFMLIB_ERR_INVAL;
Packit 577717
Packit 577717
	return PFMLIB_SUCCESS;
Packit 577717
}
Packit 577717
Packit 577717
static void
Packit 577717
pfm_gen_mips64_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
Packit 577717
{
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
	unsigned int tmp;
Packit 577717
Packit 577717
	memset(counters, 0, sizeof(*counters));
Packit 577717
	tmp = gen_mips64_pe[j].pme_counters;
Packit 577717
Packit 577717
	while (tmp)
Packit 577717
	       {
Packit 577717
		int t = ffs(tmp) - 1;
Packit 577717
			pfm_regmask_set(counters, t);
Packit 577717
			tmp = tmp ^ (1 << t);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
static void
Packit 577717
pfm_gen_mips64_get_impl_perfsel(pfmlib_regmask_t *impl_pmcs)
Packit 577717
{
Packit 577717
	unsigned int i = 0;
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
	/* all pmcs are contiguous */
Packit 577717
	for(i=0; i < generic_mips64_support.pmc_count; i++) pfm_regmask_set(impl_pmcs, i);
Packit 577717
}
Packit 577717
Packit 577717
static void
Packit 577717
pfm_gen_mips64_get_impl_perfctr(pfmlib_regmask_t *impl_pmds)
Packit 577717
{
Packit 577717
	unsigned int i = 0;
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
	/* all pmds are contiguous */
Packit 577717
	for(i=0; i < generic_mips64_support.pmd_count; i++) pfm_regmask_set(impl_pmds, i);
Packit 577717
}
Packit 577717
Packit 577717
static void
Packit 577717
pfm_gen_mips64_get_impl_counters(pfmlib_regmask_t *impl_counters)
Packit 577717
{
Packit 577717
	unsigned int i = 0;
Packit 577717
	extern pfm_pmu_support_t generic_mips64_support;
Packit 577717
Packit 577717
	for(i=0; i < generic_mips64_support.pmc_count; i++)
Packit 577717
		pfm_regmask_set(impl_counters, i);
Packit 577717
}
Packit 577717
Packit 577717
static void
Packit 577717
pfm_gen_mips64_get_hw_counter_width(unsigned int *width)
Packit 577717
{
Packit 577717
	*width = PMU_GEN_MIPS64_COUNTER_WIDTH;
Packit 577717
}
Packit 577717
Packit 577717
static char *
Packit 577717
pfm_gen_mips64_get_event_name(unsigned int i)
Packit 577717
{
Packit 577717
	return gen_mips64_pe[i].pme_name;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_get_event_description(unsigned int ev, char **str)
Packit 577717
{
Packit 577717
	char *s;
Packit 577717
	s = gen_mips64_pe[ev].pme_desc;
Packit 577717
	if (s) {
Packit 577717
		*str = strdup(s);
Packit 577717
	} else {
Packit 577717
		*str = NULL;
Packit 577717
	}
Packit 577717
	return PFMLIB_SUCCESS;
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_get_cycle_event(pfmlib_event_t *e)
Packit 577717
{
Packit 577717
	return pfm_find_full_event("CYCLES",e);
Packit 577717
}
Packit 577717
Packit 577717
static int
Packit 577717
pfm_gen_mips64_get_inst_retired(pfmlib_event_t *e)
Packit 577717
{
Packit 577717
	if (pfm_current == NULL)
Packit 577717
		return(PFMLIB_ERR_NOINIT);
Packit 577717
Packit 577717
  switch (pfm_current->pmu_type)
Packit 577717
    {
Packit 577717
		case PFMLIB_MIPS_20KC_PMU:
Packit 577717
			return pfm_find_full_event("INSNS_COMPLETED",e);
Packit 577717
		case PFMLIB_MIPS_24K_PMU:
Packit 577717
			return pfm_find_full_event("INSTRUCTIONS",e); 
Packit 577717
		case PFMLIB_MIPS_25KF_PMU:
Packit 577717
			return pfm_find_full_event("INSNS_COMPLETE",e);
Packit 577717
		case PFMLIB_MIPS_34K_PMU:
Packit 577717
			return pfm_find_full_event("INSTRUCTIONS",e); 
Packit 577717
		case PFMLIB_MIPS_5KC_PMU:
Packit 577717
			return pfm_find_full_event("INSNS_EXECD",e); 
Packit 577717
		case PFMLIB_MIPS_R10000_PMU:
Packit 577717
		case PFMLIB_MIPS_R12000_PMU:
Packit 577717
			return pfm_find_full_event("INSTRUCTIONS_GRADUATED",e);
Packit 577717
		case PFMLIB_MIPS_RM7000_PMU:
Packit 577717
		case PFMLIB_MIPS_RM9000_PMU:
Packit 577717
			return pfm_find_full_event("INSTRUCTIONS_ISSUED",e); 
Packit 577717
		case PFMLIB_MIPS_VR5432_PMU:
Packit 577717
		case PFMLIB_MIPS_VR5500_PMU:
Packit 577717
			return pfm_find_full_event("INSTRUCTIONS_EXECUTED",e); 
Packit 577717
		case PFMLIB_MIPS_SB1_PMU:
Packit 577717
			return pfm_find_full_event("INSN_SURVIVED_STAGE7",e); 
Packit 577717
		default:
Packit 577717
			return(PFMLIB_ERR_NOTFOUND);
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
/* SiCortex specific functions */
Packit 577717
Packit 577717
pfm_pmu_support_t generic_mips64_support = {
Packit 577717
	.pmu_name		= NULL,
Packit 577717
	.pmu_type		= PFMLIB_UNKNOWN_PMU,
Packit 577717
	.pme_count		= 0,
Packit 577717
	.pmc_count		= 0,
Packit 577717
	.pmd_count		= 0,
Packit 577717
	.num_cnt		= 0,
Packit 577717
	.flags			= PFMLIB_MULT_CODE_EVENT,
Packit 577717
	.get_event_code		= pfm_gen_mips64_get_event_code,
Packit 577717
	.get_event_name		= pfm_gen_mips64_get_event_name,
Packit 577717
	.get_event_counters	= pfm_gen_mips64_get_event_counters,
Packit 577717
	.dispatch_events	= pfm_gen_mips64_dispatch_events,
Packit 577717
	.pmu_detect		= pfm_gen_mips64_detect,
Packit 577717
	.get_impl_pmcs		= pfm_gen_mips64_get_impl_perfsel,
Packit 577717
	.get_impl_pmds		= pfm_gen_mips64_get_impl_perfctr,
Packit 577717
	.get_impl_counters	= pfm_gen_mips64_get_impl_counters,
Packit 577717
	.get_hw_counter_width	= pfm_gen_mips64_get_hw_counter_width,
Packit 577717
	.get_event_desc         = pfm_gen_mips64_get_event_description,
Packit 577717
	.get_cycle_event	= pfm_gen_mips64_get_cycle_event,
Packit 577717
	.get_inst_retired_event = pfm_gen_mips64_get_inst_retired
Packit 577717
};