xref: /linux/drivers/xen/events/events_internal.h (revision 9a489f45a155fe96b9b55fbbef2b757ef7737cfc)
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