xref: /freebsd/sys/xen/evtchn.h (revision 3a6d1fcf9c8ed864c98e449a0b7696be6c838aea)
13a6d1fcfSKip Macy /******************************************************************************
23a6d1fcfSKip Macy  * evtchn.h
33a6d1fcfSKip Macy  *
43a6d1fcfSKip Macy  * Communication via Xen event channels.
53a6d1fcfSKip Macy  * Also definitions for the device that demuxes notifications to userspace.
63a6d1fcfSKip Macy  *
73a6d1fcfSKip Macy  * Copyright (c) 2004, K A Fraser
83a6d1fcfSKip Macy  *
93a6d1fcfSKip Macy  * $FreeBSD$
103a6d1fcfSKip Macy  */
113a6d1fcfSKip Macy 
123a6d1fcfSKip Macy #ifndef __ASM_EVTCHN_H__
133a6d1fcfSKip Macy #define __ASM_EVTCHN_H__
143a6d1fcfSKip Macy #include <machine/pcpu.h>
153a6d1fcfSKip Macy #include <xen/hypervisor.h>
163a6d1fcfSKip Macy #include <machine/xen/synch_bitops.h>
173a6d1fcfSKip Macy #include <machine/frame.h>
183a6d1fcfSKip Macy 
193a6d1fcfSKip Macy /*
203a6d1fcfSKip Macy  * LOW-LEVEL DEFINITIONS
213a6d1fcfSKip Macy  */
223a6d1fcfSKip Macy 
233a6d1fcfSKip Macy /*
243a6d1fcfSKip Macy  * Unlike notify_remote_via_evtchn(), this is safe to use across
253a6d1fcfSKip Macy  * save/restore. Notifications on a broken connection are silently dropped.
263a6d1fcfSKip Macy  */
273a6d1fcfSKip Macy void notify_remote_via_irq(int irq);
283a6d1fcfSKip Macy 
293a6d1fcfSKip Macy 
303a6d1fcfSKip Macy /* Entry point for notifications into Linux subsystems. */
313a6d1fcfSKip Macy void evtchn_do_upcall(struct trapframe *frame);
323a6d1fcfSKip Macy 
333a6d1fcfSKip Macy /* Entry point for notifications into the userland character device. */
343a6d1fcfSKip Macy void evtchn_device_upcall(int port);
353a6d1fcfSKip Macy 
363a6d1fcfSKip Macy void mask_evtchn(int port);
373a6d1fcfSKip Macy 
383a6d1fcfSKip Macy void unmask_evtchn(int port);
393a6d1fcfSKip Macy 
403a6d1fcfSKip Macy #ifdef SMP
413a6d1fcfSKip Macy void rebind_evtchn_to_cpu(int port, unsigned int cpu);
423a6d1fcfSKip Macy #else
433a6d1fcfSKip Macy #define rebind_evtchn_to_cpu(port, cpu)	((void)0)
443a6d1fcfSKip Macy #endif
453a6d1fcfSKip Macy 
463a6d1fcfSKip Macy static inline
473a6d1fcfSKip Macy int test_and_set_evtchn_mask(int port)
483a6d1fcfSKip Macy {
493a6d1fcfSKip Macy 	shared_info_t *s = HYPERVISOR_shared_info;
503a6d1fcfSKip Macy 	return synch_test_and_set_bit(port, s->evtchn_mask);
513a6d1fcfSKip Macy }
523a6d1fcfSKip Macy 
533a6d1fcfSKip Macy static inline void
543a6d1fcfSKip Macy clear_evtchn(int port)
553a6d1fcfSKip Macy {
563a6d1fcfSKip Macy 	shared_info_t *s = HYPERVISOR_shared_info;
573a6d1fcfSKip Macy 	synch_clear_bit(port, &s->evtchn_pending[0]);
583a6d1fcfSKip Macy }
593a6d1fcfSKip Macy 
603a6d1fcfSKip Macy static inline void
613a6d1fcfSKip Macy notify_remote_via_evtchn(int port)
623a6d1fcfSKip Macy {
633a6d1fcfSKip Macy         struct evtchn_send send = { .port = port };
643a6d1fcfSKip Macy         (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
653a6d1fcfSKip Macy }
663a6d1fcfSKip Macy 
673a6d1fcfSKip Macy /*
683a6d1fcfSKip Macy  * Use these to access the event channel underlying the IRQ handle returned
693a6d1fcfSKip Macy  * by bind_*_to_irqhandler().
703a6d1fcfSKip Macy  */
713a6d1fcfSKip Macy int irq_to_evtchn_port(int irq);
723a6d1fcfSKip Macy 
733a6d1fcfSKip Macy void ipi_pcpu(unsigned int cpu, int vector);
743a6d1fcfSKip Macy 
753a6d1fcfSKip Macy /*
763a6d1fcfSKip Macy  * CHARACTER-DEVICE DEFINITIONS
773a6d1fcfSKip Macy  */
783a6d1fcfSKip Macy 
793a6d1fcfSKip Macy #define PORT_NORMAL    0x0000
803a6d1fcfSKip Macy #define PORT_EXCEPTION 0x8000
813a6d1fcfSKip Macy #define PORTIDX_MASK   0x7fff
823a6d1fcfSKip Macy 
833a6d1fcfSKip Macy /* /dev/xen/evtchn resides at device number major=10, minor=200 */
843a6d1fcfSKip Macy #define EVTCHN_MINOR 200
853a6d1fcfSKip Macy 
863a6d1fcfSKip Macy /* /dev/xen/evtchn ioctls: */
873a6d1fcfSKip Macy /* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */
883a6d1fcfSKip Macy #define EVTCHN_RESET  _IO('E', 1)
893a6d1fcfSKip Macy /* EVTCHN_BIND: Bind to the specified event-channel port. */
903a6d1fcfSKip Macy #define EVTCHN_BIND   _IO('E', 2)
913a6d1fcfSKip Macy /* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
923a6d1fcfSKip Macy #define EVTCHN_UNBIND _IO('E', 3)
933a6d1fcfSKip Macy 
943a6d1fcfSKip Macy #endif /* __ASM_EVTCHN_H__ */
95