42#include "sicortex/ice9a/ice9a_all_spec_pme.h"
43#include "sicortex/ice9b/ice9b_all_spec_pme.h"
44#include "sicortex/ice9/ice9_scb_spec_sw.h"
47#define sel_event_mask perfsel.sel_event_mask
48#define sel_exl perfsel.sel_exl
49#define sel_os perfsel.sel_os
50#define sel_usr perfsel.sel_usr
51#define sel_sup perfsel.sel_sup
52#define sel_int perfsel.sel_int
57#define core_counters 2
59#define MAX_ICE9_PMCS 2+4+256
60#define MAX_ICE9_PMDS 2+4+256
73 sprintf(
tmp,
"/sys/kernel/perfmon/pmu_desc/pmd%d",
i);
74 if (access(
tmp,F_OK) == 0)
80 sprintf(
tmp,
"/sys/kernel/perfmon/pmu_desc/pmc%d",
i);
81 if (access(
tmp,F_OK) == 0)
115 for (
i=0;
i<bound;
i++)
123 for (
i=0;
i<bound;
i++)
149 static char mips_name[64] =
"";
159 if (strstr(buffer,
"SiCortex ICE9A"))
167 else if (strstr(buffer,
"SiCortex ICE9B"))
189 plm = e[j].
plm ? e[j].
plm : plm;
204 __pfm_vbprintf(
"[CP0_25_%u(pmc%u)=0x%"PRIx64
" event_mask=0x%x usr=%d os=%d sup=%d exl=%d int=1] %s\n",
232 if (e[j].unit_masks[k] == 4)
234 else if (e[j].unit_masks[k] == 1)
236 else if (e[j].unit_masks[k] == 2)
239 __pfm_vbprintf(
"[ScbPerfBucket[%u](pmc%u)=0x%"PRIx64
" event=0x%x hist=%d ifOther=0x%x]\n",
240 cntr,cntr+6,scbreg.
val,
296 __pfm_vbprintf(
"[Scb%s(pmc%u)=0x%"PRIx64
" Interval=0x%x IntBit=0x%x NoInc=%d AddrAssert=%d MagicEvent=0x%x]\n",
"PerfCtl",
316 __pfm_vbprintf(
"[Scb%s(pmc%u)=0x%"PRIx64
" HistGte=0x%x]\n",
"PerfHist",
331 __pfm_vbprintf(
"[Scb%s(pmc%u)=0x%"PRIx64
" Bucket=0x%x]\n",
"PerfBuckNum",
363 unsigned int used = 0;
365 unsigned int cntr, avail;
374 for (j=0; j < cnt; j++) {
385 for (j=0; j < cnt;j++)
392 DPRINT(
"Rank %d: Counters available 0x%x\n",
i,avail);
397 cntr = ffs(avail) - 1;
398 DPRINT(
"Rank %d: Chose counter %d\n",
i,cntr);
404 DPRINT(
"Rank %d: Used counters 0x%x\n",
i, used);
412 for (j=0; j < cnt;j++)
419 int k, has_ifother = 0, has_hist = 0;
422 if ((e[j].unit_masks[k] == 0) || (e[j].unit_masks[k] == 1) || (e[j].unit_masks[k] == 2)) {
427 else if ((e[j].unit_masks[k] == 3) || (e[j].unit_masks[k] == 4)) {
435 DPRINT(
"SCB(%d): Counters available %d\n",j,avail);
438 DPRINT(
"SCB(%d): Chose SCB counter %d\n",j,cntr);
443 DPRINT(
"SCB(%d): Used counters %d\n",j,used);
524 memset(counters, 0,
sizeof(*counters));
532 int t = ffs(
tmp) - 1;
650 return (
tmp & (1<<3));
661 return (
tmp & (1<<4));
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_MIPS_ICE9B_PMU
#define PFMLIB_ERR_TOOMANY
pfm_err_t pfm_find_full_event(const char *str, pfmlib_event_t *e)
#define PFMLIB_ERR_NOASSIGN
#define PFMLIB_MIPS_ICE9A_PMU
#define PFMLIB_ERR_NOTSUPP
#define PFMLIB_UNKNOWN_PMU
static pme_gen_mips64_entry_t * gen_mips64_pe
#define PMU_GEN_MIPS64_COUNTER_WIDTH
int __pfm_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen)
void __pfm_vbprintf(const char *fmt,...)
#define DPRINT(fmt, a...)
#define PFMLIB_MULT_CODE_EVENT
static int pfm_sicortex_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
static int pfm_sicortex_get_cycle_event(pfmlib_event_t *e)
static int pfm_sicortex_has_umask_default(unsigned int ev)
static unsigned int pfm_sicortex_get_num_event_masks(unsigned int ev)
static void pfm_sicortex_get_impl_perfsel(pfmlib_regmask_t *impl_pmcs)
int pfm_sicortex_is_cpu(unsigned int i)
static int pfm_sicortex_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
static int pfm_sicortex_get_inst_retired(pfmlib_event_t *e)
static int pfm_sicortex_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_sicortex_input_param_t *mod_in, pfmlib_output_param_t *outp)
static int stuff_sicortex_scb_control_regs(pfmlib_reg_t *pc, pfmlib_reg_t *pd, int num, pfmlib_sicortex_input_param_t *mod_in)
static void pfm_sicortex_get_hw_counter_width(unsigned int *width)
static int pfm_sicortex_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
static int pfm_sicortex_get_event_description(unsigned int ev, char **str)
int pfm_sicortex_support_domain(unsigned int i)
static int compute_ice9_counters(int type)
static int pfm_sicortex_get_event_code(unsigned int i, unsigned int cnt, int *code)
static int pfm_sicortex_detect(void)
static pme_sicortex_entry_t * sicortex_pe
static void pfm_sicortex_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
static void pfm_sicortex_get_impl_counters(pfmlib_regmask_t *impl_counters)
static char * pfm_sicortex_get_event_mask_name(unsigned int ev, unsigned int midx)
int pfm_sicortex_get_event_umask(unsigned int i, unsigned long *umask)
static char * pfm_sicortex_get_event_name(unsigned int i)
static void stuff_sicortex_regs(pfmlib_event_t *e, int plm, pfmlib_reg_t *pc, pfmlib_reg_t *pd, int cntr, int j, pfmlib_sicortex_input_param_t *mod_in)
pfm_pmu_support_t sicortex_support
int pfm_sicortex_support_vpc_pea(unsigned int i)
static void pfm_sicortex_get_impl_perfctr(pfmlib_regmask_t *impl_pmds)
int pfm_sicortex_is_scb(unsigned int i)
#define PFMLIB_SICORTEX_INPUT_SCB_NOINC
#define PFMLIB_SICORTEX_INPUT_SCB_INTERVAL
#define PFMLIB_SICORTEX_INPUT_SCB_HISTGTE
#define PFMLIB_SICORTEX_INPUT_SCB_BUCKET
static pme_sicortex_umask_t sicortex_scb_umasks[PFMLIB_SICORTEX_MAX_UMASK]
#define PFMLIB_SICORTEX_MAX_UMASK
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
unsigned int pfp_pmc_count
unsigned int pfp_pmd_count
unsigned long long reg_value
unsigned long long reg_addr
unsigned int pme_counters
unsigned int pme_counters
pme_sicortex_umask_t pme_umasks[PFMLIB_SICORTEX_MAX_UMASK]
unsigned long sel_event_mask
struct pmc_sicortex_scb_reg_t::@89 sicortex_ScbPerfHist_reg
struct pmc_sicortex_scb_reg_t::@91 sicortex_ScbPerfEna_reg
struct pmc_sicortex_scb_reg_t::@92 sicortex_ScbPerfBucket_reg
struct pmc_sicortex_scb_reg_t::@88 sicortex_ScbPerfCtl_reg
struct pmc_sicortex_scb_reg_t::@90 sicortex_ScbPerfBuckNum_reg