Blame src/libpfm-3.y/include/perfmon/pfmlib_montecito.h

Packit 577717
/*
Packit 577717
 * Dual-Core Itanium 2 PMU specific types and definitions
Packit 577717
 *
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
#ifndef __PFMLIB_MONTECITO_H__
Packit 577717
#define __PFMLIB_MONTECITO_H__
Packit 577717
Packit 577717
#include <perfmon/pfmlib.h>
Packit 577717
#include <endian.h>
Packit 577717
Packit 577717
#if BYTE_ORDER != LITTLE_ENDIAN
Packit 577717
#error "this file only supports little endian environments"
Packit 577717
#endif
Packit 577717
#ifdef __cplusplus
Packit 577717
extern "C" {
Packit 577717
#endif
Packit 577717
Packit 577717
#define PMU_MONT_FIRST_COUNTER	4	/* index of first PMC/PMD counter */
Packit 577717
#define PMU_MONT_NUM_COUNTERS	12	/* total numbers of PMC/PMD pairs used as counting monitors */
Packit 577717
#define PMU_MONT_NUM_PMCS	27	/* total number of PMCS defined */
Packit 577717
#define PMU_MONT_NUM_PMDS	36	/* total number of PMDS defined */
Packit 577717
#define PMU_MONT_NUM_ETB	16	/* total number of PMDS in ETB  */
Packit 577717
#define PMU_MONT_COUNTER_WIDTH	47	/* hardware counter bit width   */
Packit 577717
Packit 577717
/*
Packit 577717
 * This structure provides a detailed way to setup a PMC register.
Packit 577717
 * Once value is loaded, it must be copied (via pmu_reg) to the
Packit 577717
 * perfmon_req_t and passed to the kernel via perfmonctl().
Packit 577717
 */
Packit 577717
typedef union {
Packit 577717
	unsigned long pmc_val;			/* complete register value */
Packit 577717
Packit 577717
	/* This is the Montecito-specific PMC layout for counters PMC4-PMC15 */
Packit 577717
	struct {
Packit 577717
		unsigned long pmc_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long pmc_ev:1;		/* external visibility */
Packit 577717
		unsigned long pmc_oi:1;		/* overflow interrupt */
Packit 577717
		unsigned long pmc_pm:1;		/* privileged monitor */
Packit 577717
		unsigned long pmc_ig1:1;	/* ignored */
Packit 577717
		unsigned long pmc_es:8;		/* event select */
Packit 577717
		unsigned long pmc_umask:4;	/* unit mask */
Packit 577717
		unsigned long pmc_thres:3;	/* threshold */
Packit 577717
		unsigned long pmc_ig2:1;	/* ignored */
Packit 577717
		unsigned long pmc_ism:2;	/* instruction set: must be 2  */
Packit 577717
		unsigned long pmc_all:1;	/* 0=only self, 1=both threads */
Packit 577717
		unsigned long pmc_i:1;		/* Invalidate */
Packit 577717
		unsigned long pmc_s:1;		/* Shared */
Packit 577717
		unsigned long pmc_e:1;		/* Exclusive */
Packit 577717
		unsigned long pmc_m:1;		/* Modified */
Packit 577717
		unsigned long pmc_res3:33;	/* reserved */
Packit 577717
	} pmc_mont_counter_reg;
Packit 577717
Packit 577717
	/* opcode matchers mask registers */
Packit 577717
	struct {
Packit 577717
		unsigned long opcm_mask:41;	/* opcode mask */
Packit 577717
		unsigned long opcm_ig1:7;	/* ignored */
Packit 577717
		unsigned long opcm_b:1;		/* B-syllable  */
Packit 577717
		unsigned long opcm_f:1;		/* F-syllable  */
Packit 577717
		unsigned long opcm_i:1;		/* I-syllable  */
Packit 577717
		unsigned long opcm_m:1;		/* M-syllable  */
Packit 577717
		unsigned long opcm_ig2:4;	/* ignored */
Packit 577717
		unsigned long opcm_inv:1;	/* inverse range for ibrp0 */
Packit 577717
		unsigned long opcm_ig_ad:1;	/* ignore address range restrictions */
Packit 577717
		unsigned long opcm_ig3:6;	/* ignored */
Packit 577717
	} pmc32_34_mont_reg;
Packit 577717
Packit 577717
	/* opcode matchers match registers */
Packit 577717
	struct {
Packit 577717
		unsigned long opcm_match:41;	/* opcode match */
Packit 577717
		unsigned long opcm_ig1:23;	/* ignored */
Packit 577717
	} pmc33_35_mont_reg;
Packit 577717
Packit 577717
	/* opcode matcher config register */
Packit 577717
	struct {
Packit 577717
		unsigned long opcm_ch0_ig_opcm:1;	/* chan0 opcode constraint */
Packit 577717
		unsigned long opcm_ch1_ig_opcm:1;	/* chan1 opcode constraint */
Packit 577717
		unsigned long opcm_ch2_ig_opcm:1;	/* chan2 opcode constraint */
Packit 577717
		unsigned long opcm_ch3_ig_opcm:1;	/* chan3 opcode constraint */
Packit 577717
		unsigned long opcm_res:28;		/* reserved */
Packit 577717
		unsigned long opcm_ig:32;		/* ignored */
Packit 577717
	} pmc36_mont_reg;
Packit 577717
Packit 577717
	/*
Packit 577717
	 * instruction event address register configuration (I-EAR)
Packit 577717
	 *
Packit 577717
	 * The register has two layouts depending on the value of the ct field.
Packit 577717
	 * In cache mode(ct=1x):
Packit 577717
	 * 	- ct is 1 bit, umask is 8 bits
Packit 577717
	 * In TLB mode (ct=0x):
Packit 577717
	 * 	- ct is 2 bits, umask is 7 bits
Packit 577717
	 * ct=11 => cache mode using a latency filter with eighth bit set
Packit 577717
	 * ct=01 => nothing monitored
Packit 577717
	 *
Packit 577717
	 * The ct=01 value is the only reason why we cannot fix the layout
Packit 577717
	 * to ct 1 bit and umask 8 bits. Even though in TLB mode, only 6 bits
Packit 577717
	 * are effectively used for the umask, if the user inadvertently sets
Packit 577717
	 * a umask with the most significant bit set, it would be equivalent
Packit 577717
	 * to no monitoring.
Packit 577717
	 */
Packit 577717
	struct {
Packit 577717
		unsigned long iear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long iear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long iear_umask:8;	/* event unit mask */
Packit 577717
		unsigned long iear_ct:1;	/* =1 for i-cache */
Packit 577717
		unsigned long iear_res:2;	/* reserved */
Packit 577717
		unsigned long iear_ig:48;	/* ignored */
Packit 577717
	} pmc37_mont_cache_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long iear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long iear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long iear_umask:7;	/* event unit mask */
Packit 577717
		unsigned long iear_ct:2;	/* 00=i-tlb, 01=nothing 1x=illegal */
Packit 577717
		unsigned long iear_res:50;	/* reserved */
Packit 577717
	} pmc37_mont_tlb_reg;
Packit 577717
Packit 577717
	/* data event address register configuration (D-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long dear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long dear_ig1:2;	/* ignored */
Packit 577717
		unsigned long dear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long dear_mode:2;	/* mode */
Packit 577717
		unsigned long dear_ig2:7;	/* ignored */
Packit 577717
		unsigned long dear_umask:4;	/* unit mask */
Packit 577717
		unsigned long dear_ig3:4;	/* ignored */
Packit 577717
		unsigned long dear_ism:2;	/* instruction set: must be 2 */
Packit 577717
		unsigned long dear_ig4:38;	/* ignored */
Packit 577717
	} pmc40_mont_reg;
Packit 577717
Packit 577717
	/* IP event address register (IP-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long ipear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long ipear_ig1:2;	/* ignored */
Packit 577717
		unsigned long ipear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long ipear_ig2:1;	/* ignored */
Packit 577717
		unsigned long ipear_mode:3;	/* mode */
Packit 577717
		unsigned long ipear_delay:8;	/* delay */
Packit 577717
		unsigned long ipear_ig3:45;	/* reserved */
Packit 577717
	} pmc42_mont_reg;
Packit 577717
			
Packit 577717
	/* execution trace buffer configuration register (ETB) */
Packit 577717
	struct {
Packit 577717
		unsigned long etbc_plm:4;	/* privilege level */
Packit 577717
		unsigned long etbc_res1:2;	/* reserved */
Packit 577717
		unsigned long etbc_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long etbc_ds:1;	/* data selector */
Packit 577717
		unsigned long etbc_tm:2;	/* taken mask */
Packit 577717
		unsigned long etbc_ptm:2;	/* predicted taken address mask */
Packit 577717
		unsigned long etbc_ppm:2;	/* predicted predicate mask */
Packit 577717
		unsigned long etbc_brt:2;	/* branch type mask */
Packit 577717
		unsigned long etbc_ig:48;	/* ignored */
Packit 577717
	} pmc39_mont_reg;
Packit 577717
Packit 577717
	/* data address range configuration register */
Packit 577717
	struct {
Packit 577717
		unsigned long darc_res1:3;	/* reserved */
Packit 577717
		unsigned long darc_cfg_dtag0:2;	/* constraints on dbrp0 */
Packit 577717
		unsigned long darc_res2:6;	/* reserved */
Packit 577717
		unsigned long darc_cfg_dtag1:2;	/* constraints on dbrp1 */
Packit 577717
		unsigned long darc_res3:6;	/* reserved */
Packit 577717
		unsigned long darc_cfg_dtag2:2;	/* constraints on dbrp2 */
Packit 577717
		unsigned long darc_res4:6;	/* reserved */
Packit 577717
		unsigned long darc_cfg_dtag3:2;	/* constraints on dbrp3 */
Packit 577717
		unsigned long darc_res5:16;	/* reserved */
Packit 577717
		unsigned long darc_ena_dbrp0:1;	/* enable constraints dbrp0 */
Packit 577717
		unsigned long darc_ena_dbrp1:1;	/* enable constraints dbrp1 */
Packit 577717
		unsigned long darc_ena_dbrp2:1;	/* enable constraints dbrp2 */
Packit 577717
		unsigned long darc_ena_dbrp3:1; /* enable constraint dbr3 */
Packit 577717
		unsigned long darc_res6:15;
Packit 577717
	} pmc41_mont_reg;
Packit 577717
Packit 577717
	/* instruction address range configuration register */
Packit 577717
	struct {
Packit 577717
		unsigned long iarc_res1:1;	/* reserved */
Packit 577717
		unsigned long iarc_ig_ibrp0:1;	/* constrained by ibrp0 */
Packit 577717
		unsigned long iarc_res2:2;	/* reserved */
Packit 577717
		unsigned long iarc_ig_ibrp1:1;	/* constrained by ibrp1 */
Packit 577717
		unsigned long iarc_res3:2;	/* reserved */
Packit 577717
		unsigned long iarc_ig_ibrp2:1;	/* constrained by ibrp2 */
Packit 577717
		unsigned long iarc_res4:2;	/* reserved */
Packit 577717
		unsigned long iarc_ig_ibrp3:1;	/* constrained by ibrp3 */
Packit 577717
		unsigned long iarc_res5:2;	/* reserved */
Packit 577717
		unsigned long iarc_fine:1;	/* fine mode */
Packit 577717
		unsigned long iarc_ig6:50;	/* reserved */
Packit 577717
	} pmc38_mont_reg;
Packit 577717
Packit 577717
} pfm_mont_pmc_reg_t;
Packit 577717
Packit 577717
typedef union {
Packit 577717
	unsigned long	pmd_val;	/* counter value */
Packit 577717
Packit 577717
	/* counting pmd register */
Packit 577717
	struct {
Packit 577717
		unsigned long pmd_count:47;	/* 47-bit hardware counter  */
Packit 577717
		unsigned long pmd_sxt47:17;	/* sign extension of bit 46 */
Packit 577717
	} pmd_mont_counter_reg;
Packit 577717
Packit 577717
	/* data event address register */
Packit 577717
	struct {
Packit 577717
		unsigned long dear_daddr;	/* data address */
Packit 577717
	} pmd32_mont_reg;
Packit 577717
Packit 577717
	/* data event address register (D-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long dear_latency:13;	/* latency  */
Packit 577717
		unsigned long dear_ov:1;	/* latency overflow */
Packit 577717
		unsigned long dear_stat:2;	/* status   */
Packit 577717
		unsigned long dear_ig:48;	/* ignored */
Packit 577717
	} pmd33_mont_reg;
Packit 577717
Packit 577717
	/* instruction event address register (I-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long iear_stat:2;	/* status bit */
Packit 577717
		unsigned long iear_ig:3;	/* ignored */
Packit 577717
		unsigned long iear_iaddr:59;	/* instruction cache line address {60:51} sxt {50}*/
Packit 577717
	} pmd34_mont_reg;
Packit 577717
Packit 577717
	/* instruction event address register (I-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long iear_latency:12;	/* latency */
Packit 577717
		unsigned long iear_ov:1;	/* latency overflow */
Packit 577717
		unsigned long iear_ig:51;	/* ignored */
Packit 577717
	} pmd35_mont_reg;
Packit 577717
Packit 577717
	/* data event address register (D-EAR) */
Packit 577717
	struct {
Packit 577717
		unsigned long dear_slot:2;	/* slot */
Packit 577717
		unsigned long dear_bn:1;	/* bundle bit (if 1 add 16 to iaddr) */
Packit 577717
		unsigned long dear_vl:1;	/* valid */
Packit 577717
		unsigned long dear_iaddr:60;	/* instruction address (2-bundle window)*/
Packit 577717
	} pmd36_mont_reg;
Packit 577717
Packit 577717
	/* execution trace buffer index register (ETB) */
Packit 577717
	struct {
Packit 577717
		unsigned long etbi_ebi:4;	/* next entry index  */
Packit 577717
		unsigned long etbi_ig1:1;	/* ignored */
Packit 577717
		unsigned long etbi_full:1;	/* ETB overflowed at least once */
Packit 577717
		unsigned long etbi_ig2:58;	/* ignored */
Packit 577717
	} pmd38_mont_reg;
Packit 577717
Packit 577717
	/* execution trace buffer extension register (ETB) */
Packit 577717
	struct {
Packit 577717
		unsigned long etb_pmd48ext_b1:1;	/* pmd48 ext  */
Packit 577717
		unsigned long etb_pmd48ext_bruflush:1;	/* pmd48 ext  */
Packit 577717
		unsigned long etb_pmd48ext_res:2;	/* reserved   */
Packit 577717
Packit 577717
		unsigned long etb_pmd56ext_b1:1;	/* pmd56 ext */
Packit 577717
		unsigned long etb_pmd56ext_bruflush:1;	/* pmd56 ext */
Packit 577717
		unsigned long etb_pmd56ext_res:2;	/* reserved  */ 
Packit 577717
Packit 577717
		unsigned long etb_pmd49ext_b1:1;	/* pmd49 ext  */
Packit 577717
		unsigned long etb_pmd49ext_bruflush:1;	/* pmd49 ext  */
Packit 577717
		unsigned long etb_pmd49ext_res:2;	/* reserved   */
Packit 577717
Packit 577717
		unsigned long etb_pmd57ext_b1:1;	/* pmd57 ext */
Packit 577717
		unsigned long etb_pmd57ext_bruflush:1;	/* pmd57 ext */
Packit 577717
		unsigned long etb_pmd57ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd50ext_b1:1;	/* pmd50 ext */
Packit 577717
		unsigned long etb_pmd50ext_bruflush:1;	/* pmd50 ext */
Packit 577717
		unsigned long etb_pmd50ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd58ext_b1:1;	/* pmd58 ext */
Packit 577717
		unsigned long etb_pmd58ext_bruflush:1;	/* pmd58 ext */
Packit 577717
		unsigned long etb_pmd58ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd51ext_b1:1;	/* pmd51 ext */
Packit 577717
		unsigned long etb_pmd51ext_bruflush:1;	/* pmd51 ext */
Packit 577717
		unsigned long etb_pmd51ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd59ext_b1:1;	/* pmd59 ext */
Packit 577717
		unsigned long etb_pmd59ext_bruflush:1;	/* pmd59 ext */
Packit 577717
		unsigned long etb_pmd59ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd52ext_b1:1;	/* pmd52 ext */
Packit 577717
		unsigned long etb_pmd52ext_bruflush:1;	/* pmd52 ext */
Packit 577717
		unsigned long etb_pmd52ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd60ext_b1:1;	/* pmd60 ext */
Packit 577717
		unsigned long etb_pmd60ext_bruflush:1;	/* pmd60 ext */
Packit 577717
		unsigned long etb_pmd60ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd53ext_b1:1;	/* pmd53 ext */
Packit 577717
		unsigned long etb_pmd53ext_bruflush:1;	/* pmd53 ext */
Packit 577717
		unsigned long etb_pmd53ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd61ext_b1:1;	/* pmd61 ext */
Packit 577717
		unsigned long etb_pmd61ext_bruflush:1;	/* pmd61 ext */
Packit 577717
		unsigned long etb_pmd61ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd54ext_b1:1;	/* pmd54 ext */
Packit 577717
		unsigned long etb_pmd54ext_bruflush:1;	/* pmd54 ext */
Packit 577717
		unsigned long etb_pmd54ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd62ext_b1:1;	/* pmd62 ext */
Packit 577717
		unsigned long etb_pmd62ext_bruflush:1;	/* pmd62 ext */
Packit 577717
		unsigned long etb_pmd62ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd55ext_b1:1;	/* pmd55 ext */
Packit 577717
		unsigned long etb_pmd55ext_bruflush:1;	/* pmd55 ext */
Packit 577717
		unsigned long etb_pmd55ext_res:2;	/* reserved  */
Packit 577717
Packit 577717
		unsigned long etb_pmd63ext_b1:1;	/* pmd63 ext */
Packit 577717
		unsigned long etb_pmd63ext_bruflush:1;	/* pmd63 ext */
Packit 577717
		unsigned long etb_pmd63ext_res:2;	/* reserved  */
Packit 577717
	} pmd39_mont_reg;
Packit 577717
Packit 577717
	/*
Packit 577717
	 * execution trace buffer extension register when used with IP-EAR
Packit 577717
	 *
Packit 577717
	 * to be used in conjunction with pmd48_63_ipear_reg (see  below)
Packit 577717
	 */
Packit 577717
	struct {
Packit 577717
		unsigned long ipear_pmd48ext_cycles:2;	/* pmd48 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd48ext_f:1;	/* pmd48 flush bit    */
Packit 577717
		unsigned long ipear_pmd48ext_ef:1;	/* pmd48 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd56ext_cycles:2;	/* pmd56 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd56ext_f:1;	/* pmd56 flush bit    */
Packit 577717
		unsigned long ipear_pmd56ext_ef:1;	/* pmd56 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd49ext_cycles:2;	/* pmd49 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd49ext_f:1;	/* pmd49 flush bit    */
Packit 577717
		unsigned long ipear_pmd49ext_ef:1;	/* pmd49 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd57ext_cycles:2;	/* pmd57 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd57ext_f:1;	/* pmd57 flush bit    */
Packit 577717
		unsigned long ipear_pmd57ext_ef:1;	/* pmd57 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd50ext_cycles:2;	/* pmd50 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd50ext_f:1;	/* pmd50 flush bit    */
Packit 577717
		unsigned long ipear_pmd50ext_ef:1;	/* pmd50 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd58ext_cycles:2;	/* pmd58 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd58ext_f:1;	/* pmd58 flush bit    */
Packit 577717
		unsigned long ipear_pmd58ext_ef:1;	/* pmd58 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd51ext_cycles:2;	/* pmd51 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd51ext_f:1;	/* pmd51 flush bit    */
Packit 577717
		unsigned long ipear_pmd51ext_ef:1;	/* pmd51 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd59ext_cycles:2;	/* pmd59 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd59ext_f:1;	/* pmd59 flush bit    */
Packit 577717
		unsigned long ipear_pmd59ext_ef:1;	/* pmd59 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd52ext_cycles:2;	/* pmd52 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd52ext_f:1;	/* pmd52 flush bit    */
Packit 577717
		unsigned long ipear_pmd52ext_ef:1;	/* pmd52 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd60ext_cycles:2;	/* pmd60 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd60ext_f:1;	/* pmd60 flush bit    */
Packit 577717
		unsigned long ipear_pmd60ext_ef:1;	/* pmd60  early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd53ext_cycles:2;	/* pmd53 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd53ext_f:1;	/* pmd53 flush bit    */
Packit 577717
		unsigned long ipear_pmd53ext_ef:1;	/* pmd53 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd61ext_cycles:2;	/* pmd61 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd61ext_f:1;	/* pmd61 flush bit    */
Packit 577717
		unsigned long ipear_pmd61ext_ef:1;	/* pmd61 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd54ext_cycles:2;	/* pmd54 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd54ext_f:1;	/* pmd54 flush bit    */
Packit 577717
		unsigned long ipear_pmd54ext_ef:1;	/* pmd54 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd62ext_cycles:2;	/* pmd62 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd62ext_f:1;	/* pmd62 flush bit    */
Packit 577717
		unsigned long ipear_pmd62ext_ef:1;	/* pmd62 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd55ext_cycles:2;	/* pmd55 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd55ext_f:1;	/* pmd55 flush bit    */
Packit 577717
		unsigned long ipear_pmd55ext_ef:1;	/* pmd55 early freeze */
Packit 577717
Packit 577717
		unsigned long ipear_pmd63ext_cycles:2;	/* pmd63 upper 2 bits of cycles */
Packit 577717
		unsigned long ipear_pmd63ext_f:1;	/* pmd63 flush bit    */
Packit 577717
		unsigned long ipear_pmd63ext_ef:1;	/* pmd63 early freeze */
Packit 577717
	} pmd39_ipear_mont_reg;
Packit 577717
Packit 577717
	/* 
Packit 577717
	 * execution trace buffer data register (ETB)
Packit 577717
	 *
Packit 577717
	 * when pmc39.ds == 0: pmd48-63 contains branch targets
Packit 577717
	 * when pmc39.ds == 1: pmd48-63 content is undefined
Packit 577717
	 */
Packit 577717
	struct {
Packit 577717
		unsigned long etb_s:1;		/* source bit */
Packit 577717
		unsigned long etb_mp:1;		/* mispredict bit */
Packit 577717
		unsigned long etb_slot:2;	/* which slot, 3=not taken branch */
Packit 577717
		unsigned long etb_addr:60;	/* bundle address(s=1), target address(s=0) */
Packit 577717
	} pmd48_63_etb_mont_reg;
Packit 577717
Packit 577717
	/* 
Packit 577717
	 * execution trace buffer when used with IP-EAR with PMD48-63.ef=0
Packit 577717
	 *
Packit 577717
	 * The cycles field straddles pmdXX and corresponding extension in
Packit 577717
	 * pmd39 (pmd39_ipear_mont_reg). For instance, cycles for pmd48: 
Packit 577717
	 *
Packit 577717
	 * cycles= pmd39_ipear_mont_reg.etb_pmd48ext_cycles << 4
Packit 577717
	 *       | pmd48_63_etb_ipear_mont_reg.etb_cycles
Packit 577717
	 */
Packit 577717
	struct {
Packit 577717
		unsigned long	ipear_addr:60;	/* retired IP[63:4]      */
Packit 577717
		unsigned long	ipear_cycles:4;	/* lower 4 bit of cycles */
Packit 577717
	} pmd48_63_ipear_mont_reg;
Packit 577717
Packit 577717
	/* 
Packit 577717
	 * execution trace buffer when used with IP-EAR with PMD48-63.ef=1
Packit 577717
	 *
Packit 577717
	 * The cycles field straddles pmdXX and corresponding extension in
Packit 577717
	 * pmd39 (pmd39_ipear_mont_reg). For instance, cycles for pmd48: 
Packit 577717
	 *
Packit 577717
	 * cycles= pmd39_ipear_mont_reg.etb_pmd48ext_cycles << 4
Packit 577717
	 *       | pmd48_63_etb_ipear_ef_mont_reg.etb_cycles
Packit 577717
	 */
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long	ipear_delay:8;	/* delay count           */
Packit 577717
		unsigned long	ipear_addr:52;	/* retired IP[61:12]     */
Packit 577717
		unsigned long	ipear_cycles:4;	/* lower 5 bit of cycles */
Packit 577717
	} pmd48_63_ipear_ef_mont_reg;
Packit 577717
Packit 577717
} pfm_mont_pmd_reg_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned int	  flags;	/* counter specific flags */
Packit 577717
	unsigned int 	  thres;	/* per event threshold */
Packit 577717
} pfmlib_mont_counter_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * counter specific flags
Packit 577717
 */
Packit 577717
#define PFMLIB_MONT_FL_EVT_NO_QUALCHECK	0x1 /* don't check qualifier constraints */
Packit 577717
#define PFMLIB_MONT_FL_EVT_ALL_THRD	0x2 /* event measured for both threads */
Packit 577717
#define PFMLIB_MONT_FL_EVT_ACTIVE_ONLY	0x4 /* measure the event only when the thread is active */
Packit 577717
#define PFMLIB_MONT_FL_EVT_ALWAYS	0x8 /* measure the event at all times (active or inactive) */
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 * The ETB can be configured via 4 different methods:
Packit 577717
 *
Packit 577717
 * 	- BRANCH_EVENT is in the event list, pfp_mont_etb.etb_used == 0:
Packit 577717
 * 		The ETB will be configured (PMC12) to record all branches AND a counting
Packit 577717
 * 		monitor will be setup to count BRANCH_EVENT.
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is in the event list, pfp_mont_etb.etb_used == 1:
Packit 577717
 * 		The ETB will be configured (PMC12) according to information in pfp_mont_etb AND
Packit 577717
 * 		a counter will be setup to count BRANCH_EVENT.
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is NOT in the event list, pfp_mont_etb.etb_used == 0:
Packit 577717
 * 	   	Nothing is programmed
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is NOT in the event list, pfp_mont_etb.etb_used == 1:
Packit 577717
 * 		The ETB will be configured (PMC12) according to information in pfp_mont_etb.
Packit 577717
 * 		This is the free running ETB mode.
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned char	 etb_used;	/* set to 1 if the ETB is used */
Packit 577717
	unsigned int	 etb_plm;	/* ETB privilege level mask */
Packit 577717
	unsigned char	 etb_tm;	/* taken mask */
Packit 577717
	unsigned char	 etb_ptm;	/* predicted target mask */
Packit 577717
	unsigned char	 etb_ppm;	/* predicted predicate mask */
Packit 577717
	unsigned char	 etb_brt;	/* branch type mask */
Packit 577717
} pfmlib_mont_etb_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * There are four ways to configure EAR:
Packit 577717
 *
Packit 577717
 * 	- an EAR event is in the event list AND pfp_mont_?ear.ear_used = 0:
Packit 577717
 * 		The EAR will be programmed (PMC37 or PMC40) based on the information encoded in the
Packit 577717
 * 		event (umask, cache, tlb,alat). A counting monitor will be programmed to
Packit 577717
 * 		count DATA_EAR_EVENTS or L1I_EAR_EVENTS depending on the type of EAR.
Packit 577717
 *
Packit 577717
 * 	- an EAR event is in the event list AND pfp_mont_?ear.ear_used = 1:
Packit 577717
 * 		The EAR will be programmed (PMC37 or PMC40) according to the information in the
Packit 577717
 * 		pfp_mont_?ear structure	because it contains more detailed information
Packit 577717
 * 		(such as priv level and instruction set). A counting monitor will be programmed
Packit 577717
 * 		to count DATA_EAR_EVENTS or L1I_EAR_EVENTS depending on the type of EAR.
Packit 577717
 *
Packit 577717
 * 	- no EAR event is in the event list AND pfp_mont_?ear.ear_used = 0:
Packit 577717
 * 	 	Nothing is programmed.
Packit 577717
 *
Packit 577717
 * 	- no EAR event is in the event list AND pfp_mont_?ear.ear_used = 1:
Packit 577717
 * 		The EAR will be programmed (PMC37 or PMC40) according to the information in the
Packit 577717
 * 		pfp_mont_?ear structure. This is the free running mode for EAR
Packit 577717
 */
Packit 577717
Packit 577717
typedef enum {
Packit 577717
	PFMLIB_MONT_EAR_CACHE_MODE= 0,	/* Cache mode : I-EAR and D-EAR */
Packit 577717
	PFMLIB_MONT_EAR_TLB_MODE  = 1, 	/* TLB mode   : I-EAR and D-EAR */
Packit 577717
	PFMLIB_MONT_EAR_ALAT_MODE = 2	/* ALAT mode  : D-EAR only      */
Packit 577717
} pfmlib_mont_ear_mode_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned char		ear_used;	/* when set will force definition of PMC[10] */
Packit 577717
Packit 577717
	pfmlib_mont_ear_mode_t	ear_mode;	/* EAR mode */
Packit 577717
	unsigned int		ear_plm;	/* IEAR privilege level mask */
Packit 577717
	unsigned long		ear_umask;	/* umask value for PMC10 */
Packit 577717
} pfmlib_mont_ear_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * describes one range. rr_plm is ignored for data ranges
Packit 577717
 * a range is interpreted as unused (not defined) when rr_start = rr_end = 0.
Packit 577717
 * if rr_plm is not set it will use the default settings set in the generic
Packit 577717
 * library param structure.
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned int		rr_plm;		/* privilege level (ignored for data ranges) */
Packit 577717
	unsigned long		rr_start;	/* start address */
Packit 577717
	unsigned long		rr_end;		/* end address (not included) */
Packit 577717
} pfmlib_mont_input_rr_desc_t;
Packit 577717
typedef struct {
Packit 577717
	unsigned long		rr_soff;	/* start offset from actual start */
Packit 577717
	unsigned long		rr_eoff;	/* end offset from actual end */
Packit 577717
} pfmlib_mont_output_rr_desc_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * rr_used must be set to true for the library to configure the debug registers.
Packit 577717
 * rr_inv only applies when the rr_limits table contains ONLY 1 range.
Packit 577717
 *
Packit 577717
 * If using less than 4 intervals, must mark the end with entry: rr_start = rr_end = 0
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned int			rr_flags;	/* set of flags for all ranges              */
Packit 577717
	pfmlib_mont_input_rr_desc_t	rr_limits[4];	/* at most 4 distinct intervals             */
Packit 577717
	unsigned char	 		rr_used;	/* set if address range restriction is used */
Packit 577717
} pfmlib_mont_input_rr_t;
Packit 577717
/*
Packit 577717
 * rr_flags values:
Packit 577717
 * 	PFMLIB_MONT_IRR_DEMAND_FETCH, PFMLIB_MONT_IRR_PREFETCH_MATCH to be used
Packit 577717
 * 	ONLY in conunction with any of the following (dual) events:
Packit 577717
 *
Packit 577717
 * 	- ISB_BUNPAIRS_IN, L1I_FETCH_RAB_HIT, L1I_FETCH_ISB_HIT, L1I_FILLS
Packit 577717
 * 
Packit 577717
 *	PFMLIB_MONT_IRR_DEMAND_FETCH: declared interest in demand fetched cache
Packit 577717
 *	line (force use of IBRP0)
Packit 577717
 *
Packit 577717
 *	PFMLIB_MONT_IRR_PREFETCH_MATCH: declared interest in regular prefetched cache
Packit 577717
 *	line (force use of IBRP1)
Packit 577717
 */
Packit 577717
#define PFMLIB_MONT_RR_INV		0x1 /* inverse instruction ranges (iranges only) */
Packit 577717
#define PFMLIB_MONT_RR_NO_FINE_MODE	0x2 /* force non fine mode for instruction ranges */
Packit 577717
#define PFMLIB_MONT_IRR_DEMAND_FETCH	0x4 /* demand fetch only for dual events */
Packit 577717
#define PFMLIB_MONT_IRR_PREFETCH_MATCH	0x8 /* regular prefetches for dual events */
Packit 577717
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned int			rr_nbr_used;	/* how many registers were used */
Packit 577717
	pfmlib_mont_output_rr_desc_t	rr_infos[4];	/* at most 4 distinct intervals */
Packit 577717
	pfmlib_reg_t			rr_br[8];	/* debug reg to configure       */
Packit 577717
} pfmlib_mont_output_rr_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned char		opcm_used;	/* set when opcm is used */
Packit 577717
	unsigned char		opcm_m;		/* M slot */
Packit 577717
	unsigned char		opcm_i;		/* I slot */
Packit 577717
	unsigned char		opcm_f;		/* F slot */
Packit 577717
	unsigned char		opcm_b;		/* B slot */
Packit 577717
	unsigned long		opcm_match;	/* match field */
Packit 577717
	unsigned long		opcm_mask;	/* mask field */
Packit 577717
} pfmlib_mont_opcm_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned char			ipear_used;	/* set when ipear is used */
Packit 577717
	unsigned int			ipear_plm;	/* IP-EAR privilege level mask */
Packit 577717
	unsigned short			ipear_delay;	/* delay in cycles */
Packit 577717
} pfmlib_mont_ipear_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * Montecito specific parameters for the library
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	pfmlib_mont_counter_t	pfp_mont_counters[PMU_MONT_NUM_COUNTERS];	/* extended counter features */
Packit 577717
Packit 577717
	unsigned long		pfp_mont_flags;		/* Montecito specific flags */
Packit 577717
Packit 577717
	pfmlib_mont_opcm_t	pfp_mont_opcm1;		/* pmc32/pmc33 (opcode matcher) configuration */
Packit 577717
	pfmlib_mont_opcm_t	pfp_mont_opcm2;		/* pmc34/pmc35 (opcode matcher) configuration */
Packit 577717
	pfmlib_mont_ear_t	pfp_mont_iear;		/* IEAR configuration */
Packit 577717
	pfmlib_mont_ear_t	pfp_mont_dear;		/* DEAR configuration */
Packit 577717
	pfmlib_mont_etb_t	pfp_mont_etb;		/* ETB configuration */
Packit 577717
	pfmlib_mont_ipear_t	pfp_mont_ipear;		/* IP-EAR configuration */
Packit 577717
	pfmlib_mont_input_rr_t	pfp_mont_drange;	/* data range restrictions */
Packit 577717
	pfmlib_mont_input_rr_t	pfp_mont_irange;	/* code range restrictions */
Packit 577717
	unsigned long		reserved[1];		/* for future use */
Packit 577717
} pfmlib_mont_input_param_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	pfmlib_mont_output_rr_t	pfp_mont_drange;	/* data range restrictions */
Packit 577717
	pfmlib_mont_output_rr_t	pfp_mont_irange;	/* code range restrictions */
Packit 577717
	unsigned long		reserved[6];		/* for future use */
Packit 577717
} pfmlib_mont_output_param_t;
Packit 577717
Packit 577717
extern int pfm_mont_is_ear(unsigned int i);
Packit 577717
extern int pfm_mont_is_dear(unsigned int i);
Packit 577717
extern int pfm_mont_is_dear_tlb(unsigned int i);
Packit 577717
extern int pfm_mont_is_dear_cache(unsigned int i);
Packit 577717
extern int pfm_mont_is_dear_alat(unsigned int i);
Packit 577717
extern int pfm_mont_is_iear(unsigned int i);
Packit 577717
extern int pfm_mont_is_iear_tlb(unsigned int i);
Packit 577717
extern int pfm_mont_is_iear_cache(unsigned int i);
Packit 577717
extern int pfm_mont_is_etb(unsigned int i);
Packit 577717
extern int pfm_mont_support_opcm(unsigned int i);
Packit 577717
extern int pfm_mont_support_iarr(unsigned int i);
Packit 577717
extern int pfm_mont_support_darr(unsigned int i);
Packit 577717
extern int pfm_mont_support_all(unsigned int i);
Packit 577717
extern int pfm_mont_get_ear_mode(unsigned int i, pfmlib_mont_ear_mode_t *m);
Packit 577717
extern int pfm_mont_irange_is_fine(pfmlib_output_param_t *outp, pfmlib_mont_output_param_t *mod_out);
Packit 577717
Packit 577717
extern int pfm_mont_get_event_maxincr(unsigned int i, unsigned int *maxincr);
Packit 577717
extern int pfm_mont_get_event_umask(unsigned int i, unsigned long *umask);
Packit 577717
extern int pfm_mont_get_event_group(unsigned int i, int *grp);
Packit 577717
extern int pfm_mont_get_event_set(unsigned int i, int *set);
Packit 577717
extern int pfm_mont_get_event_type(unsigned int i, int *type);
Packit 577717
Packit 577717
/*
Packit 577717
 * values of group (grp) returned by pfm_mont_get_event_group()
Packit 577717
 */
Packit 577717
#define PFMLIB_MONT_EVT_NO_GRP		 0 /* event does not belong to a group */
Packit 577717
#define PFMLIB_MONT_EVT_L1D_CACHE_GRP	 1 /* event belongs to L1D Cache group */
Packit 577717
#define PFMLIB_MONT_EVT_L2D_CACHE_GRP	 2 /* event belongs to L2D Cache group */
Packit 577717
Packit 577717
/*
Packit 577717
 * possible values returned in set by pfm_mont_get_event_set()
Packit 577717
 */
Packit 577717
#define PFMLIB_MONT_EVT_NO_SET		-1 /* event does not belong to a set */
Packit 577717
Packit 577717
/*
Packit 577717
 * values of type returned by pfm_mont_get_event_type()
Packit 577717
 */
Packit 577717
#define PFMLIB_MONT_EVT_ACTIVE		 0 /* event measures only when thread is active */
Packit 577717
#define PFMLIB_MONT_EVT_FLOATING	 1
Packit 577717
#define PFMLIB_MONT_EVT_CAUSAL		 2
Packit 577717
#define PFMLIB_MONT_EVT_SELF_FLOATING	 3 /* floating with .self, causal otherwise */
Packit 577717
Packit 577717
#ifdef __cplusplus /* extern C */
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
#endif /* __PFMLIB_MONTECITO_H__ */