#ifndef _SYS_EVTCHN_H
#define _SYS_EVTCHN_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/privregs.h>
#include <sys/systm.h>
#include <sys/traptrace.h>
#include <sys/ddi_intr.h>
#include <sys/ddi_intr_impl.h>
#include <sys/avintr.h>
#include <sys/cpuvar.h>
#include <sys/hypervisor.h>
#define IRQT_UNBOUND 0
#define IRQT_PIRQ 1
#define IRQT_VIRQ 2
#define IRQT_IPI 3
#define IRQT_EVTCHN 4
#define IRQT_DEV_EVTCHN 5
#define SET_EVTCHN_BIT(bit, arrayp) \
((arrayp)[bit >> EVTCHN_SHIFT] |= \
(1ul << ((bit) & ((1ul << EVTCHN_SHIFT) - 1))))
#define CLEAR_EVTCHN_BIT(bit, arrayp) \
((arrayp)[bit >> EVTCHN_SHIFT] &= \
~((1ul << ((bit) & ((1ul << EVTCHN_SHIFT) - 1)))))
#define TEST_EVTCHN_BIT(bit, arrayp) \
((arrayp)[bit >> EVTCHN_SHIFT] & \
(1ul << ((bit) & ((1ul << EVTCHN_SHIFT) - 1))))
#define INVALID_EVTCHN 0
#define IPL_DEBUG 15
#define IPL_CONS 9
#define IPL_VIF 6
#define IPL_VBD 5
#define IPL_EVTCHN 1
#define PIRQ_BASE 0
#define NR_PIRQS 256
#define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS)
#define NR_DYNIRQS 256
#define NR_IRQS (NR_PIRQS + NR_DYNIRQS)
#define PIRQ_TO_IRQ(pirq) ((pirq) + PIRQ_BASE)
#define IRQ_TO_PIRQ(irq) ((irq) - PIRQ_BASE)
#define DYNIRQ_TO_IRQ(dirq) ((dirq) + DYNIRQ_BASE)
#define IRQ_TO_DYNIRQ(irq) ((irq) - DYNIRQ_BASE)
#if defined(_LP64)
#define EVTCHN_SHIFT 6
#else
#define EVTCHN_SHIFT 5
#endif
#define INVALID_IRQ -1
extern int ec_dev_irq;
extern kmutex_t ec_lock;
typedef struct mec_info {
ushort_t mi_evtchns[NCPU];
short mi_irq;
char mi_shared;
} mec_info_t;
typedef struct irq_info {
union {
ushort_t evtchn;
ushort_t index;
} ii_u;
uchar_t ii_type;
union {
uchar_t ipl;
uchar_t has_handler;
} ii_u2;
} irq_info_t;
extern int ec_is_edge_pirq(int);
extern int ec_init(void);
extern void ec_init_debug_irq(void);
extern void ec_suspend(void);
extern void ec_resume(void);
extern void ec_wait_on_evtchn(int, int (*)(void *), void *);
extern void ec_wait_on_ipi(int, int (*)(void *), void *);
extern void ec_setup_pirq(int, int, cpuset_t *);
extern void ec_set_irq_affinity(int, cpuset_t);
extern int ec_set_irq_priority(int, int);
extern int ec_bind_ipi_to_irq(int, int);
extern void ec_bind_cpu_ipis(int);
extern int ec_bind_evtchn_to_irq(int);
extern int ec_bind_virq_to_irq(int, int);
extern void ec_unbind_irq(int irq);
extern void ec_send_ipi(int, int);
extern void ec_try_ipi(int, int);
extern void ec_clear_irq(int);
extern void ec_unmask_irq(int);
extern void ec_try_unmask_irq(int);
extern int ec_block_irq(int);
extern void ec_unpend_irq(int);
extern int ec_irq_needs_rebind(int, int);
extern int ec_irq_rebindable(int);
extern int ec_pending_irq(unsigned int);
extern void ec_enable_irq(unsigned int);
extern void ec_disable_irq(unsigned int);
extern int xen_bind_interdomain(int, int, int *);
extern int xen_bind_virq(unsigned int, processorid_t, int *);
extern int xen_alloc_unbound_evtchn(int, int *);
extern void ec_bind_vcpu(int, int);
extern int ec_mask_evtchn(unsigned int);
extern void ec_unmask_evtchn(unsigned int);
extern void ec_clear_evtchn(unsigned int);
extern void ec_notify_via_evtchn(unsigned int);
extern void ec_irq_add_evtchn(int, int);
extern void ec_irq_rm_evtchn(int, int);
extern int ec_dev_alloc_irq(void);
#ifdef __cplusplus
}
#endif
#endif