#ifndef _SYS_CPC_IMPL_H
#define _SYS_CPC_IMPL_H
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ksynch.h>
#if defined(_KERNEL) && defined(_MULTI_DATAMODEL)
#include <sys/types32.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
char *ca_name;
uint64_t ca_val;
} cpc_attr_t;
#define CPC_BIND_LWP_INHERIT (0x1)
#define CPC_BIND_EMT_OVF (0x2)
#define CPC_MAX_IMPL_NAME 512
#define CPC_MAX_CPUREF 1024
#define CPC_OVF_NOTIFY_EMT 0x1
#define CPC_COUNT_USER 0x2
#define CPC_COUNT_SYSTEM 0x4
#define CPC_COUNT_HV 0x8
#define CPC_COUNT_SAMPLE_MODE 0x10
#define KCPC_REQ_ALL_FLAGS (CPC_OVF_NOTIFY_EMT | CPC_COUNT_USER | \
CPC_COUNT_SYSTEM | CPC_COUNT_HV | CPC_COUNT_SAMPLE_MODE)
#define KCPC_REQ_VALID_FLAGS(flags) \
(((flags) | KCPC_REQ_ALL_FLAGS) == KCPC_REQ_ALL_FLAGS)
#define CPC_CAP_OVERFLOW_INTERRUPT 0x1
#define CPC_CAP_OVERFLOW_PRECISE 0x2
#define CPC_SET_ALL_FLAGS 0x1
#define CPC_SET_VALID_FLAGS(flags) \
(((flags) | CPC_SET_ALL_FLAGS) == CPC_SET_ALL_FLAGS)
#define CPC_BIND 0
#define CPC_SAMPLE 1
#define CPC_INVALIDATE 2
#define CPC_RELE 3
#define CPC_EVLIST_SIZE 4
#define CPC_LIST_EVENTS 5
#define CPC_ATTRLIST_SIZE 6
#define CPC_LIST_ATTRS 7
#define CPC_IMPL_NAME 8
#define CPC_CPUREF 9
#define CPC_USR_EVENTS 10
#define CPC_SYS_EVENTS 11
#define CPC_NPIC 12
#define CPC_CAPS 13
#define CPC_ENABLE 14
#define CPC_DISABLE 15
#define CPC_PRESET 16
#define CPC_RESTART 17
#define _CPCIO_IOC ((((('c'<<8)|'p')<<8)|'c')<<8)
#define CPCIO_BIND (_CPCIO_IOC | 0x1)
#define CPCIO_SAMPLE (_CPCIO_IOC | 0x2)
#define CPCIO_RELE (_CPCIO_IOC | 0x3)
struct _kthread;
struct _kcpc_set;
#define CPC_MAX_EVENT_LEN 512
#define CPC_MAX_ATTR_LEN 32
typedef struct _kcpc_attr {
char ka_name[CPC_MAX_ATTR_LEN];
uint64_t ka_val;
} kcpc_attr_t;
typedef struct _kcpc_pic {
uint_t kp_flags;
struct _kcpc_request *kp_req;
} kcpc_pic_t;
typedef struct _kcpc_ctx kcpc_ctx_t;
struct _kcpc_ctx {
struct _kcpc_set *kc_set;
volatile uint_t kc_flags;
kcpc_pic_t *kc_pics;
hrtime_t kc_hrtime;
uint64_t kc_vtick;
uint64_t kc_rawtick;
struct _kthread *kc_thread;
int kc_cpuid;
kcpc_ctx_t *kc_next;
kmutex_t kc_lock;
kcondvar_t kc_condv;
};
typedef struct __cpc_args {
void *udata1;
void *udata2;
void *udata3;
} __cpc_args_t;
#ifdef _KERNEL
#ifdef _MULTI_DATAMODEL
typedef struct __cpc_args32 {
caddr32_t udata1;
caddr32_t udata2;
caddr32_t udata3;
} __cpc_args32_t;
#endif
#define KCPC_LOG2_HASH_BUCKETS 6
#define CPC_HASH_BUCKETS (1l << KCPC_LOG2_HASH_BUCKETS)
#define CPC_HASH_CTX(ctx) ((((long)(ctx)) >> 7) & \
(CPC_HASH_BUCKETS - 1))
#define KCPC_CTX_FREEZE 0x1
#define KCPC_CTX_SIGOVF 0x2
#define KCPC_CTX_NONPRIV 0x4
#define KCPC_CTX_LWPINHERIT 0x8
#define KCPC_CTX_INVALID 0x100
#define KCPC_CTX_INVALID_STOPPED 0x200
#define KCPC_CTX_RESTORE 0x400
#define KCPC_PIC_OVERFLOWED 0x1
enum dcpc_intr_state {
DCPC_INTR_INACTIVE,
DCPC_INTR_FREE,
DCPC_INTR_PROCESSING,
DCPC_INTR_CONFIG
};
enum dcpc_mask_attr {
DCPC_UMASK = 0x1,
DCPC_EMASK = 0x2
};
#ifdef __sparc
extern uint64_t ultra_gettick(void);
#define KCPC_GET_TICK ultra_gettick
#else
extern hrtime_t tsc_read(void);
#define KCPC_GET_TICK tsc_read
#endif
#define PCBE_NAMELEN 30
struct cpu;
extern uint_t cpc_ncounters;
extern krwlock_t kcpc_cpuctx_lock;
extern int kcpc_cpuctx;
extern void kcpc_invalidate_all(void);
extern void kcpc_passivate(void);
extern void kcpc_cpu_stop(struct cpu *, boolean_t);
extern int kcpc_pcbe_tryload(const char *, uint_t, uint_t, uint_t);
extern void kcpc_cpu_program(struct cpu *, kcpc_ctx_t *);
extern void kcpc_register_dcpc(void (*func)(uint64_t));
extern void kcpc_unregister_dcpc(void);
extern kcpc_ctx_t *kcpc_ctx_alloc(int);
extern int kcpc_assign_reqs(struct _kcpc_set *, kcpc_ctx_t *);
extern void kcpc_ctx_free(kcpc_ctx_t *);
extern int kcpc_configure_reqs(kcpc_ctx_t *, struct _kcpc_set *, int *);
extern void kcpc_free_configs(struct _kcpc_set *);
#endif
#define CPC_INVALID_EVENT 1
#define CPC_INVALID_PICNUM 2
#define CPC_INVALID_ATTRIBUTE 3
#define CPC_ATTRIBUTE_OUT_OF_RANGE 4
#define CPC_RESOURCE_UNAVAIL 5
#define CPC_PIC_NOT_CAPABLE 6
#define CPC_REQ_INVALID_FLAGS 7
#define CPC_CONFLICTING_REQS 8
#define CPC_ATTR_REQUIRES_PRIVILEGE 9
#define CPC_PBIND_FAILED 10
#define CPC_HV_NO_ACCESS 11
#ifdef __cplusplus
}
#endif
#endif