#ifndef __KERN_KPC_H__
#define __KERN_KPC_H__
#include <machine/machine_kpc.h>
#define KPC_CLASS_FIXED (0)
#define KPC_CLASS_CONFIGURABLE (1)
#define KPC_CLASS_POWER (2)
#define KPC_CLASS_FIXED_MASK (1<<KPC_CLASS_FIXED)
#define KPC_CLASS_CONFIGURABLE_MASK (1<<KPC_CLASS_CONFIGURABLE)
#define KPC_ALL_CPUS (1 << 31)
extern void kpc_init(void);
extern uint32_t kpc_get_classes(void);
extern uint32_t kpc_get_running(void);
extern int kpc_set_running(uint32_t classes);
extern int kpc_get_cpu_counters(boolean_t all_cpus, uint32_t classes,
int *curcpu, uint64_t *buf);
extern int kpc_get_shadow_counters( boolean_t all_cpus, uint32_t classes,
int *curcpu, uint64_t *buf );
extern int kpc_get_curthread_counters(uint32_t *inoutcount, uint64_t *buf);
extern uint32_t kpc_get_counter_count(uint32_t classes);
extern uint32_t kpc_get_config_count(uint32_t classes);
extern uint32_t kpc_get_thread_counting(void);
extern int kpc_set_thread_counting(uint32_t classes);
extern int kpc_get_config(uint32_t classes, kpc_config_t *current_config);
extern int kpc_set_config(uint32_t classes, kpc_config_t *new_config);
extern int kpc_get_period(uint32_t classes, uint64_t *period);
extern int kpc_set_period(uint32_t classes, uint64_t *period);
extern int kpc_get_actionid(uint32_t classes, uint32_t *actionid);
extern int kpc_set_actionid(uint32_t classes, uint32_t *actionid);
extern void kpc_thread_create(thread_t thread);
extern void kpc_thread_destroy(thread_t thread);
extern uint64_t *kpc_counterbuf_alloc(void);
extern void kpc_counterbuf_free(uint64_t*);
extern int kpc_threads_counting;
extern void kpc_thread_ast_handler( thread_t thread );
extern void kpc_switch_context( thread_t old, thread_t new );
extern int kpc_get_whitelist_disabled( void );
extern int kpc_disable_whitelist( int val );
extern boolean_t kpc_register_pm_handler(void (*handler)(boolean_t));
extern void kpc_idle(void);
extern void kpc_idle_exit(void);
extern uint32_t kpc_actionid[KPC_MAX_COUNTERS];
struct kpc_config_remote
{
uint32_t classes;
kpc_config_t *configv;
};
extern int kpc_get_fixed_counters(uint64_t *counterv);
extern int kpc_get_configurable_counters(uint64_t *counterv);
extern boolean_t kpc_is_running_fixed(void);
extern boolean_t kpc_is_running_configurable(void);
extern uint32_t kpc_fixed_count(void);
extern uint32_t kpc_configurable_count(void);
extern uint32_t kpc_fixed_config_count(void);
extern uint32_t kpc_configurable_config_count(void);
extern int kpc_get_fixed_config(kpc_config_t *configv);
extern int kpc_get_configurable_config(kpc_config_t *configv);
extern uint64_t kpc_fixed_max(void);
extern uint64_t kpc_configurable_max(void);
extern int kpc_set_config_arch(struct kpc_config_remote *mp_config);
extern int kpc_set_period_arch(struct kpc_config_remote *mp_config);
extern void kpc_sample_kperf(uint32_t actionid);
struct kpc_driver
{
uint32_t (*get_classes)(void);
uint32_t (*get_running)(void);
int (*set_running)(uint32_t classes);
int (*get_cpu_counters)(boolean_t all_cpus, uint32_t classes,
int *curcpu, uint64_t *buf);
int (*get_curthread_counters)(uint32_t *inoutcount, uint64_t *buf);
uint32_t (*get_counter_count)(uint32_t classes);
uint32_t (*get_config_count)(uint32_t classes);
int (*get_config)(uint32_t classes, kpc_config_t *current_config);
int (*set_config)(uint32_t classes, kpc_config_t *new_config);
int (*get_period)(uint32_t classes, uint64_t *period);
int (*set_period)(uint32_t classes, uint64_t *period);
};
#endif