Blame src/perfctr-2.6.x/linux/include/asm-arm/perfctr.h

Packit Service a1973e
/* $Id: perfctr.h,v 1.1.2.2 2009/06/11 12:33:51 mikpe Exp $
Packit Service a1973e
 * ARM/XScale Performance-Monitoring Counters driver
Packit Service a1973e
 *
Packit Service a1973e
 * Copyright (C) 2005-2007, 2009  Mikael Pettersson
Packit Service a1973e
 */
Packit Service a1973e
#ifndef _ASM_ARM_PERFCTR_H
Packit Service a1973e
#define _ASM_ARM_PERFCTR_H
Packit Service a1973e
Packit Service a1973e
/* perfctr_info.cpu_type values */
Packit Service a1973e
#define PERFCTR_ARM_XSC1	1
Packit Service a1973e
#define PERFCTR_ARM_XSC2	2
Packit Service a1973e
Packit Service a1973e
struct perfctr_sum_ctrs {
Packit Service a1973e
	unsigned long long tsc;
Packit Service a1973e
	unsigned long long pmc[4];
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
struct perfctr_cpu_control {
Packit Service a1973e
	unsigned int tsc_on;
Packit Service a1973e
	unsigned int nractrs;		/* # of a-mode counters */
Packit Service a1973e
	unsigned int nrictrs;		/* # of i-mode counters */
Packit Service a1973e
	unsigned int pmc_map[4];
Packit Service a1973e
	unsigned int evntsel[4];	/* one per counter, even on P5 */
Packit Service a1973e
	int ireset[4];			/* < 0, for i-mode counters */
Packit Service a1973e
	unsigned int _reserved1;
Packit Service a1973e
	unsigned int _reserved2;
Packit Service a1973e
	unsigned int _reserved3;
Packit Service a1973e
	unsigned int _reserved4;
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
struct perfctr_cpu_state {
Packit Service a1973e
	unsigned int cstatus;
Packit Service a1973e
	struct {	/* k1 is opaque in the user ABI */
Packit Service a1973e
		unsigned int id;
Packit Service a1973e
		int isuspend_cpu;
Packit Service a1973e
	} k1;
Packit Service a1973e
	/* The two tsc fields must be inlined. Placing them in a
Packit Service a1973e
	   sub-struct causes unwanted internal padding on x86-64. */
Packit Service a1973e
	unsigned int tsc_start;
Packit Service a1973e
	unsigned long long tsc_sum;
Packit Service a1973e
	struct {
Packit Service a1973e
		unsigned int map;
Packit Service a1973e
		unsigned int start;
Packit Service a1973e
		unsigned long long sum;
Packit Service a1973e
	} pmc[4];	/* the size is not part of the user ABI */
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
	union {
Packit Service a1973e
		struct {
Packit Service a1973e
			unsigned int pmnc;
Packit Service a1973e
		} xsc1;
Packit Service a1973e
		struct {
Packit Service a1973e
			unsigned int evtsel;
Packit Service a1973e
			unsigned int inten;
Packit Service a1973e
		} xsc2;
Packit Service a1973e
	} arm;
Packit Service a1973e
	struct perfctr_cpu_control control;
Packit Service a1973e
#endif
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
/* cstatus is a re-encoding of control.tsc_on/nractrs/nrictrs
Packit Service a1973e
   which should have less overhead in most cases */
Packit Service a1973e
Packit Service a1973e
static inline
Packit Service a1973e
unsigned int perfctr_mk_cstatus(unsigned int tsc_on, unsigned int nractrs,
Packit Service a1973e
				unsigned int nrictrs)
Packit Service a1973e
{
Packit Service a1973e
	return (tsc_on<<31) | (nrictrs<<16) | ((nractrs+nrictrs)<<8) | nractrs;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_enabled(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline int perfctr_cstatus_has_tsc(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return (int)cstatus < 0;	/* test and jump on sign */
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_nractrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus & 0x7F;		/* and with imm8 */
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_nrctrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return (cstatus >> 8) & 0x7F;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_has_ictrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus & (0x7F << 16);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * 'struct siginfo' support for perfctr overflow signals.
Packit Service a1973e
 * In unbuffered mode, si_code is set to SI_PMC_OVF and a bitmask
Packit Service a1973e
 * describing which perfctrs overflowed is put in si_pmc_ovf_mask.
Packit Service a1973e
 * A bitmask is used since more than one perfctr can have overflowed
Packit Service a1973e
 * by the time the interrupt handler runs.
Packit Service a1973e
 *
Packit Service a1973e
 * glibc's <signal.h> doesn't seem to define __SI_FAULT or __SI_CODE(),
Packit Service a1973e
 * and including <asm/siginfo.h> as well may cause redefinition errors,
Packit Service a1973e
 * so the user and kernel values are different #defines here.
Packit Service a1973e
 */
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
#define SI_PMC_OVF	(__SI_FAULT|'P')
Packit Service a1973e
#else
Packit Service a1973e
#define SI_PMC_OVF	('P')
Packit Service a1973e
#endif
Packit Service a1973e
#define si_pmc_ovf_mask	_sifields._pad[0] /* XXX: use an unsigned field later */
Packit Service a1973e
Packit Service a1973e
/* version number for user-visible CPU-specific data */
Packit Service a1973e
#define PERFCTR_CPU_VERSION	0	/* XXX: not yet cast in stone */
Packit Service a1973e
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
Packit Service a1973e
#if defined(CONFIG_PERFCTR) || defined(CONFIG_PERFCTR_MODULE)
Packit Service a1973e
Packit Service a1973e
/* Driver init/exit. */
Packit Service a1973e
extern int perfctr_cpu_init(void);
Packit Service a1973e
extern void perfctr_cpu_exit(void);
Packit Service a1973e
Packit Service a1973e
/* CPU type name. */
Packit Service a1973e
extern char *perfctr_cpu_name;
Packit Service a1973e
Packit Service a1973e
/* Hardware reservation. */
Packit Service a1973e
extern const char *perfctr_cpu_reserve(const char *service);
Packit Service a1973e
extern void perfctr_cpu_release(const char *service);
Packit Service a1973e
Packit Service a1973e
/* PRE: state has no running interrupt-mode counters.
Packit Service a1973e
   Check that the new control data is valid.
Packit Service a1973e
   Update the driver's private control data.
Packit Service a1973e
   Returns a negative error code if the control data is invalid. */
Packit Service a1973e
extern int perfctr_cpu_update_control(struct perfctr_cpu_state *state, cpumask_t *cpumask);
Packit Service a1973e
Packit Service a1973e
/* Read a-mode counters. Subtract from start and accumulate into sums.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_suspend(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* Write control registers. Read a-mode counters into start.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_resume(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* Perform an efficient combined suspend/resume operation.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_sample(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* The type of a perfctr overflow interrupt handler.
Packit Service a1973e
   It will be called in IRQ context, with preemption disabled. */
Packit Service a1973e
typedef void (*perfctr_ihandler_t)(unsigned long pc);
Packit Service a1973e
Packit Service a1973e
/* Operations related to overflow interrupt handling. */
Packit Service a1973e
#ifdef CONFIG_PERFCTR_INTERRUPT_SUPPORT
Packit Service a1973e
extern void perfctr_cpu_set_ihandler(perfctr_ihandler_t);
Packit Service a1973e
extern void perfctr_cpu_ireload(struct perfctr_cpu_state*);
Packit Service a1973e
extern unsigned int perfctr_cpu_identify_overflow(struct perfctr_cpu_state*);
Packit Service a1973e
#else
Packit Service a1973e
static inline void perfctr_cpu_set_ihandler(perfctr_ihandler_t x) { }
Packit Service a1973e
#endif
Packit Service a1973e
static inline int perfctr_cpu_has_pending_interrupt(const struct perfctr_cpu_state *state)
Packit Service a1973e
{
Packit Service a1973e
	return 0;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
#endif	/* CONFIG_PERFCTR */
Packit Service a1973e
Packit Service a1973e
#endif	/* __KERNEL__ */
Packit Service a1973e
Packit Service a1973e
#endif	/* _ASM_ARM_PERFCTR_H */