|
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__ */
|