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