/**
 * @file op_x86_model.h
 * interface to x86 model-specific MSR operations
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author Graydon Hoare
 * @author Robert Richter <robert.richter@amd.com>
 */

#ifndef OP_X86_MODEL_H
#define OP_X86_MODEL_H

#include <asm/types.h>
#include <asm/perf_event.h>

struct op_msr {
	unsigned long	addr;
	u64		saved;
};

struct op_msrs {
	struct op_msr *counters;
	struct op_msr *controls;
	struct op_msr *multiplex;
};

struct pt_regs;

struct oprofile_operations;

/* The model vtable abstracts the differences between
 * various x86 CPU models' perfctr support.
 */
struct op_x86_model_spec {
	unsigned int	num_counters;
	unsigned int	num_controls;
	unsigned int	num_virt_counters;
	u64		reserved;
	u16		event_mask;
	int		(*init)(struct oprofile_operations *ops);
	int		(*fill_in_addresses)(struct op_msrs * const msrs);
	void		(*setup_ctrs)(struct op_x86_model_spec const *model,
				      struct op_msrs const * const msrs);
	void		(*cpu_down)(void);
	int		(*check_ctrs)(struct pt_regs * const regs,
				      struct op_msrs const * const msrs);
	void		(*start)(struct op_msrs const * const msrs);
	void		(*stop)(struct op_msrs const * const msrs);
	void		(*shutdown)(struct op_msrs const * const msrs);
#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
	void		(*switch_ctrl)(struct op_x86_model_spec const *model,
				       struct op_msrs const * const msrs);
#endif
};

struct op_counter_config;

static inline void op_x86_warn_in_use(int counter)
{
	/*
	 * The warning indicates an already running counter. If
	 * oprofile doesn't collect data, then try using a different
	 * performance counter on your platform to monitor the desired
	 * event. Delete counter #%d from the desired event by editing
	 * the /usr/share/oprofile/%s/<cpu>/events file. If the event
	 * cannot be monitored by any other counter, contact your
	 * hardware or BIOS vendor.
	 */
	pr_warning("oprofile: counter #%d on cpu #%d may already be used\n",
		   counter, smp_processor_id());
}

static inline void op_x86_warn_reserved(int counter)
{
	pr_warning("oprofile: counter #%d is already reserved\n", counter);
}

extern u64 op_x86_get_ctrl(struct op_x86_model_spec const *model,
			   struct op_counter_config *counter_config);
extern int op_x86_phys_to_virt(int phys);
extern int op_x86_virt_to_phys(int virt);

extern struct op_x86_model_spec op_ppro_spec;
extern struct op_x86_model_spec op_p4_spec;
extern struct op_x86_model_spec op_p4_ht2_spec;
extern struct op_x86_model_spec op_amd_spec;
extern struct op_x86_model_spec op_arch_perfmon_spec;

#endif /* OP_X86_MODEL_H */
