1*9a489f45SDavid Vrabel /* 2*9a489f45SDavid Vrabel * Xen Event Channels (internal header) 3*9a489f45SDavid Vrabel * 4*9a489f45SDavid Vrabel * Copyright (C) 2013 Citrix Systems R&D Ltd. 5*9a489f45SDavid Vrabel * 6*9a489f45SDavid Vrabel * This source code is licensed under the GNU General Public License, 7*9a489f45SDavid Vrabel * Version 2 or later. See the file COPYING for more details. 8*9a489f45SDavid Vrabel */ 9*9a489f45SDavid Vrabel #ifndef __EVENTS_INTERNAL_H__ 10*9a489f45SDavid Vrabel #define __EVENTS_INTERNAL_H__ 11*9a489f45SDavid Vrabel 12*9a489f45SDavid Vrabel /* Interrupt types. */ 13*9a489f45SDavid Vrabel enum xen_irq_type { 14*9a489f45SDavid Vrabel IRQT_UNBOUND = 0, 15*9a489f45SDavid Vrabel IRQT_PIRQ, 16*9a489f45SDavid Vrabel IRQT_VIRQ, 17*9a489f45SDavid Vrabel IRQT_IPI, 18*9a489f45SDavid Vrabel IRQT_EVTCHN 19*9a489f45SDavid Vrabel }; 20*9a489f45SDavid Vrabel 21*9a489f45SDavid Vrabel /* 22*9a489f45SDavid Vrabel * Packed IRQ information: 23*9a489f45SDavid Vrabel * type - enum xen_irq_type 24*9a489f45SDavid Vrabel * event channel - irq->event channel mapping 25*9a489f45SDavid Vrabel * cpu - cpu this event channel is bound to 26*9a489f45SDavid Vrabel * index - type-specific information: 27*9a489f45SDavid Vrabel * PIRQ - vector, with MSB being "needs EIO", or physical IRQ of the HVM 28*9a489f45SDavid Vrabel * guest, or GSI (real passthrough IRQ) of the device. 29*9a489f45SDavid Vrabel * VIRQ - virq number 30*9a489f45SDavid Vrabel * IPI - IPI vector 31*9a489f45SDavid Vrabel * EVTCHN - 32*9a489f45SDavid Vrabel */ 33*9a489f45SDavid Vrabel struct irq_info { 34*9a489f45SDavid Vrabel struct list_head list; 35*9a489f45SDavid Vrabel int refcnt; 36*9a489f45SDavid Vrabel enum xen_irq_type type; /* type */ 37*9a489f45SDavid Vrabel unsigned irq; 38*9a489f45SDavid Vrabel unsigned short evtchn; /* event channel */ 39*9a489f45SDavid Vrabel unsigned short cpu; /* cpu bound */ 40*9a489f45SDavid Vrabel 41*9a489f45SDavid Vrabel union { 42*9a489f45SDavid Vrabel unsigned short virq; 43*9a489f45SDavid Vrabel enum ipi_vector ipi; 44*9a489f45SDavid Vrabel struct { 45*9a489f45SDavid Vrabel unsigned short pirq; 46*9a489f45SDavid Vrabel unsigned short gsi; 47*9a489f45SDavid Vrabel unsigned char vector; 48*9a489f45SDavid Vrabel unsigned char flags; 49*9a489f45SDavid Vrabel uint16_t domid; 50*9a489f45SDavid Vrabel } pirq; 51*9a489f45SDavid Vrabel } u; 52*9a489f45SDavid Vrabel }; 53*9a489f45SDavid Vrabel 54*9a489f45SDavid Vrabel #define PIRQ_NEEDS_EOI (1 << 0) 55*9a489f45SDavid Vrabel #define PIRQ_SHAREABLE (1 << 1) 56*9a489f45SDavid Vrabel 57*9a489f45SDavid Vrabel extern int *evtchn_to_irq; 58*9a489f45SDavid Vrabel 59*9a489f45SDavid Vrabel struct irq_info *info_for_irq(unsigned irq); 60*9a489f45SDavid Vrabel unsigned cpu_from_irq(unsigned irq); 61*9a489f45SDavid Vrabel unsigned cpu_from_evtchn(unsigned int evtchn); 62*9a489f45SDavid Vrabel 63*9a489f45SDavid Vrabel void xen_evtchn_port_bind_to_cpu(struct irq_info *info, int cpu); 64*9a489f45SDavid Vrabel 65*9a489f45SDavid Vrabel void clear_evtchn(int port); 66*9a489f45SDavid Vrabel void set_evtchn(int port); 67*9a489f45SDavid Vrabel int test_evtchn(int port); 68*9a489f45SDavid Vrabel int test_and_set_mask(int port); 69*9a489f45SDavid Vrabel void mask_evtchn(int port); 70*9a489f45SDavid Vrabel void unmask_evtchn(int port); 71*9a489f45SDavid Vrabel 72*9a489f45SDavid Vrabel void xen_evtchn_handle_events(int cpu); 73*9a489f45SDavid Vrabel 74*9a489f45SDavid Vrabel #endif /* #ifndef __EVENTS_INTERNAL_H__ */ 75