Blame src/libpfm4/lib/pfmlib_amd64_priv.h

Packit 577717
/*
Packit 577717
 * Copyright (c) 2004-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
 * This file is part of libpfm, a performance monitoring support library for
Packit 577717
 * applications on Linux.
Packit 577717
 */
Packit 577717
#ifndef __PFMLIB_AMD64_PRIV_H__
Packit 577717
#define __PFMLIB_AMD64_PRIV_H__
Packit 577717
Packit 577717
#define AMD64_MAX_GRP		4 /* must be < 32 (int) */
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	const char		*uname; /* unit mask name */
Packit 577717
	const char		*udesc; /* event/umask description */
Packit 577717
	unsigned int		ucode;  /* unit mask code */
Packit 577717
	unsigned int		uflags; /* unit mask flags */
Packit 577717
	unsigned int		grpid;	/* unit mask group id */
Packit 577717
} amd64_umask_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	const char		*name;	/* event name */
Packit 577717
	const char		*desc;	/* event description */
Packit 577717
	const amd64_umask_t	*umasks;/* list of umasks */
Packit 577717
	unsigned int		code; 	/* event code */
Packit 577717
	unsigned int		numasks;/* number of umasks */
Packit 577717
	unsigned int		flags;	/* flags */
Packit 577717
	unsigned int		modmsk;	/* modifiers bitmask */
Packit 577717
	unsigned int		ngrp;	/* number of unit masks groups */
Packit 577717
} amd64_entry_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * we keep an internal revision type to avoid
Packit 577717
 * dealing with arbitrarily large pfm_pmu_t
Packit 577717
 * which would not fit into the 8 bits reserved
Packit 577717
 * in amd64_entry_t.flags or amd64_umask_t.flags
Packit 577717
 */
Packit 577717
#define AMD64_FAM10H AMD64_FAM10H_REV_B
Packit 577717
typedef enum {
Packit 577717
        AMD64_CPU_UN = 0,
Packit 577717
        AMD64_K7,
Packit 577717
        AMD64_K8_REV_B,
Packit 577717
        AMD64_K8_REV_C,
Packit 577717
        AMD64_K8_REV_D,
Packit 577717
        AMD64_K8_REV_E,
Packit 577717
        AMD64_K8_REV_F,
Packit 577717
        AMD64_K8_REV_G,
Packit 577717
        AMD64_FAM10H_REV_B,
Packit 577717
        AMD64_FAM10H_REV_C,
Packit 577717
        AMD64_FAM10H_REV_D,
Packit 577717
Packit 577717
        AMD64_FAM14H_REV_B,
Packit 577717
} amd64_rev_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
        pfm_pmu_t		revision;
Packit 577717
        int             	family; /* 0 means nothing detected yet */
Packit 577717
        int             	model;
Packit 577717
        int             	stepping;
Packit 577717
} pfm_amd64_config_t;
Packit 577717
Packit 577717
extern pfm_amd64_config_t pfm_amd64_cfg;
Packit 577717
Packit 577717
/* 
Packit 577717
 * flags values (bottom 8 bits only)
Packit 577717
 * bits 00-07: flags
Packit 577717
 * bits 08-15: from revision
Packit 577717
 * bits 16-23: till revision
Packit 577717
 */
Packit 577717
#define AMD64_FROM_REV(rev)	((rev)<<8)
Packit 577717
#define AMD64_TILL_REV(rev)	((rev)<<16)
Packit 577717
#define AMD64_NOT_SUPP		0x1ff00
Packit 577717
Packit 577717
#define AMD64_FL_NCOMBO        		0x01 /* unit mask can be combined */
Packit 577717
#define AMD64_FL_IBSFE			0x02 /* IBS fetch */
Packit 577717
#define AMD64_FL_IBSOP			0x04 /* IBS op */
Packit 577717
#define AMD64_FL_DFL			0x08 /* unit mask is default choice */
Packit 577717
#define AMD64_FL_OMIT			0x10 /* umask can be omitted */
Packit 577717
Packit 577717
#define AMD64_FL_TILL_K8_REV_C		AMD64_TILL_REV(AMD64_K8_REV_C)
Packit 577717
#define AMD64_FL_K8_REV_D		AMD64_FROM_REV(AMD64_K8_REV_D)
Packit 577717
#define AMD64_FL_K8_REV_E		AMD64_FROM_REV(AMD64_K8_REV_E)
Packit 577717
#define AMD64_FL_TILL_K8_REV_E		AMD64_TILL_REV(AMD64_K8_REV_E)
Packit 577717
#define AMD64_FL_K8_REV_F		AMD64_FROM_REV(AMD64_K8_REV_F)
Packit 577717
#define AMD64_FL_TILL_FAM10H_REV_B	AMD64_TILL_REV(AMD64_FAM10H_REV_B)
Packit 577717
#define AMD64_FL_FAM10H_REV_C		AMD64_FROM_REV(AMD64_FAM10H_REV_C)
Packit 577717
#define AMD64_FL_TILL_FAM10H_REV_C	AMD64_TILL_REV(AMD64_FAM10H_REV_C)
Packit 577717
#define AMD64_FL_FAM10H_REV_D		AMD64_FROM_REV(AMD64_FAM10H_REV_D)
Packit 577717
Packit 577717
#define AMD64_ATTR_K	0
Packit 577717
#define AMD64_ATTR_U	1
Packit 577717
#define AMD64_ATTR_E	2
Packit 577717
#define AMD64_ATTR_I	3
Packit 577717
#define AMD64_ATTR_C	4
Packit 577717
#define AMD64_ATTR_H	5
Packit 577717
#define AMD64_ATTR_G	6
Packit 577717
Packit 577717
#define _AMD64_ATTR_U  (1 << AMD64_ATTR_U)
Packit 577717
#define _AMD64_ATTR_K  (1 << AMD64_ATTR_K)
Packit 577717
#define _AMD64_ATTR_I  (1 << AMD64_ATTR_I)
Packit 577717
#define _AMD64_ATTR_E  (1 << AMD64_ATTR_E)
Packit 577717
#define _AMD64_ATTR_C  (1 << AMD64_ATTR_C)
Packit 577717
#define _AMD64_ATTR_H  (1 << AMD64_ATTR_H)
Packit 577717
#define _AMD64_ATTR_G  (1 << AMD64_ATTR_G)
Packit 577717
Packit 577717
#define AMD64_BASIC_ATTRS \
Packit 577717
	(_AMD64_ATTR_I|_AMD64_ATTR_E|_AMD64_ATTR_C|_AMD64_ATTR_U|_AMD64_ATTR_K)
Packit 577717
Packit 577717
#define AMD64_K8_ATTRS			(AMD64_BASIC_ATTRS)
Packit 577717
#define AMD64_FAM10H_ATTRS		(AMD64_BASIC_ATTRS|_AMD64_ATTR_H|_AMD64_ATTR_G)
Packit 577717
#define AMD64_FAM12H_ATTRS		AMD64_FAM10H_ATTRS
Packit 577717
#define AMD64_FAM14H_ATTRS		AMD64_FAM10H_ATTRS
Packit 577717
#define AMD64_FAM15H_ATTRS		AMD64_FAM10H_ATTRS
Packit 577717
#define AMD64_FAM17H_ATTRS		AMD64_FAM10H_ATTRS
Packit 577717
Packit 577717
#define AMD64_FAM10H_PLM	(PFM_PLM0|PFM_PLM3|PFM_PLMH)
Packit 577717
#define AMD64_K7_PLM		(PFM_PLM0|PFM_PLM3)
Packit 577717
Packit 577717
/*
Packit 577717
 * AMD64 MSR definitions
Packit 577717
 */
Packit 577717
typedef union {
Packit 577717
	uint64_t val;				/* complete register value */
Packit 577717
	struct {
Packit 577717
		uint64_t sel_event_mask:8;	/* event mask */
Packit 577717
		uint64_t sel_unit_mask:8;	/* unit mask */
Packit 577717
		uint64_t sel_usr:1;		/* user level */
Packit 577717
		uint64_t sel_os:1;		/* system level */
Packit 577717
		uint64_t sel_edge:1;		/* edge detec */
Packit 577717
		uint64_t sel_pc:1;		/* pin control */
Packit 577717
		uint64_t sel_int:1;		/* enable APIC intr */
Packit 577717
		uint64_t sel_res1:1;		/* reserved */
Packit 577717
		uint64_t sel_en:1;		/* enable */
Packit 577717
		uint64_t sel_inv:1;		/* invert counter mask */
Packit 577717
		uint64_t sel_cnt_mask:8;	/* counter mask */
Packit 577717
		uint64_t sel_event_mask2:4;	/* 10h only: event mask [11:8] */
Packit 577717
		uint64_t sel_res2:4;		/* reserved */
Packit 577717
		uint64_t sel_guest:1;		/* 10h only: guest only counter */
Packit 577717
		uint64_t sel_host:1;		/* 10h only: host only counter */
Packit 577717
		uint64_t sel_res3:22;		/* reserved */
Packit 577717
	} perfsel;
Packit 577717
Packit 577717
	struct {
Packit 577717
		uint64_t maxcnt:16;
Packit 577717
		uint64_t cnt:16;
Packit 577717
		uint64_t lat:16;
Packit 577717
		uint64_t en:1;
Packit 577717
		uint64_t val:1;
Packit 577717
		uint64_t comp:1;
Packit 577717
		uint64_t icmiss:1;
Packit 577717
		uint64_t phyaddrvalid:1;
Packit 577717
		uint64_t l1tlbpgsz:2;
Packit 577717
		uint64_t l1tlbmiss:1;
Packit 577717
		uint64_t l2tlbmiss:1;
Packit 577717
		uint64_t randen:1;
Packit 577717
		uint64_t reserved:6;
Packit 577717
	} ibsfetch;
Packit 577717
	struct {
Packit 577717
		uint64_t maxcnt:16;
Packit 577717
		uint64_t reserved1:1;
Packit 577717
		uint64_t en:1;
Packit 577717
		uint64_t val:1;
Packit 577717
		uint64_t reserved2:45;
Packit 577717
	} ibsop;
Packit 577717
} pfm_amd64_reg_t; /* MSR 0xc001000-0xc001003 */
Packit 577717
Packit 577717
/* let's define some handy shortcuts! */
Packit 577717
#define sel_event_mask	perfsel.sel_event_mask
Packit 577717
#define sel_unit_mask	perfsel.sel_unit_mask
Packit 577717
#define sel_usr		perfsel.sel_usr
Packit 577717
#define sel_os		perfsel.sel_os
Packit 577717
#define sel_edge	perfsel.sel_edge
Packit 577717
#define sel_pc		perfsel.sel_pc
Packit 577717
#define sel_int		perfsel.sel_int
Packit 577717
#define sel_en		perfsel.sel_en
Packit 577717
#define sel_inv		perfsel.sel_inv
Packit 577717
#define sel_cnt_mask	perfsel.sel_cnt_mask
Packit 577717
#define sel_event_mask2 perfsel.sel_event_mask2
Packit 577717
#define sel_guest	perfsel.sel_guest
Packit 577717
#define sel_host	perfsel.sel_host
Packit 577717
Packit 577717
#define IS_FAMILY_10H(p) (((pfmlib_pmu_t *)(p))->pmu_rev >= AMD64_FAM10H)
Packit 577717
#define IS_FAMILY_15H(p) (((pfmlib_pmu_t *)(p))->pmu == PFM_PMU_AMD64_FAM15H_INTERLAGOS)
Packit 577717
Packit 577717
extern int pfm_amd64_get_encoding(void *this, pfmlib_event_desc_t *e);
Packit 577717
extern int pfm_amd64_get_event_first(void *this);
Packit 577717
extern int pfm_amd64_get_event_next(void *this, int idx);
Packit 577717
extern int pfm_amd64_event_is_valid(void *this, int idx);
Packit 577717
extern int pfm_amd64_get_event_attr_info(void *this, int idx, int attr_idx, pfmlib_event_attr_info_t *info);
Packit 577717
extern int pfm_amd64_get_event_info(void *this, int idx, pfm_event_info_t *info);
Packit 577717
extern int pfm_amd64_validate_table(void *this, FILE *fp);
Packit 577717
extern int pfm_amd64_detect(void *this);
Packit 577717
extern const pfmlib_attr_desc_t amd64_mods[];
Packit 577717
extern unsigned int pfm_amd64_get_event_nattrs(void *this, int pidx);
Packit 577717
extern int pfm_amd64_get_num_events(void *this);
Packit 577717
Packit 577717
extern int pfm_amd64_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
Packit 577717
extern void pfm_amd64_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e);
Packit 577717
extern void pfm_amd64_nb_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e);
Packit 577717
extern int pfm_amd64_family_detect(void *this);
Packit 577717
#endif /* __PFMLIB_AMD64_PRIV_H__ */