19a489f45SDavid Vrabel /* 29a489f45SDavid Vrabel * Xen Event Channels (internal header) 39a489f45SDavid Vrabel * 49a489f45SDavid Vrabel * Copyright (C) 2013 Citrix Systems R&D Ltd. 59a489f45SDavid Vrabel * 69a489f45SDavid Vrabel * This source code is licensed under the GNU General Public License, 79a489f45SDavid Vrabel * Version 2 or later. See the file COPYING for more details. 89a489f45SDavid Vrabel */ 99a489f45SDavid Vrabel #ifndef __EVENTS_INTERNAL_H__ 109a489f45SDavid Vrabel #define __EVENTS_INTERNAL_H__ 119a489f45SDavid Vrabel 129a489f45SDavid Vrabel /* Interrupt types. */ 139a489f45SDavid Vrabel enum xen_irq_type { 149a489f45SDavid Vrabel IRQT_UNBOUND = 0, 159a489f45SDavid Vrabel IRQT_PIRQ, 169a489f45SDavid Vrabel IRQT_VIRQ, 179a489f45SDavid Vrabel IRQT_IPI, 189a489f45SDavid Vrabel IRQT_EVTCHN 199a489f45SDavid Vrabel }; 209a489f45SDavid Vrabel 219a489f45SDavid Vrabel /* 229a489f45SDavid Vrabel * Packed IRQ information: 239a489f45SDavid Vrabel * type - enum xen_irq_type 249a489f45SDavid Vrabel * event channel - irq->event channel mapping 259a489f45SDavid Vrabel * cpu - cpu this event channel is bound to 269a489f45SDavid Vrabel * index - type-specific information: 279a489f45SDavid Vrabel * PIRQ - vector, with MSB being "needs EIO", or physical IRQ of the HVM 289a489f45SDavid Vrabel * guest, or GSI (real passthrough IRQ) of the device. 299a489f45SDavid Vrabel * VIRQ - virq number 309a489f45SDavid Vrabel * IPI - IPI vector 319a489f45SDavid Vrabel * EVTCHN - 329a489f45SDavid Vrabel */ 339a489f45SDavid Vrabel struct irq_info { 349a489f45SDavid Vrabel struct list_head list; 359a489f45SDavid Vrabel int refcnt; 369a489f45SDavid Vrabel enum xen_irq_type type; /* type */ 379a489f45SDavid Vrabel unsigned irq; 389a489f45SDavid Vrabel unsigned short evtchn; /* event channel */ 399a489f45SDavid Vrabel unsigned short cpu; /* cpu bound */ 409a489f45SDavid Vrabel 419a489f45SDavid Vrabel union { 429a489f45SDavid Vrabel unsigned short virq; 439a489f45SDavid Vrabel enum ipi_vector ipi; 449a489f45SDavid Vrabel struct { 459a489f45SDavid Vrabel unsigned short pirq; 469a489f45SDavid Vrabel unsigned short gsi; 479a489f45SDavid Vrabel unsigned char vector; 489a489f45SDavid Vrabel unsigned char flags; 499a489f45SDavid Vrabel uint16_t domid; 509a489f45SDavid Vrabel } pirq; 519a489f45SDavid Vrabel } u; 529a489f45SDavid Vrabel }; 539a489f45SDavid Vrabel 549a489f45SDavid Vrabel #define PIRQ_NEEDS_EOI (1 << 0) 559a489f45SDavid Vrabel #define PIRQ_SHAREABLE (1 << 1) 569a489f45SDavid Vrabel 57*ab9a1ccaSDavid Vrabel struct evtchn_ops { 58*ab9a1ccaSDavid Vrabel void (*bind_to_cpu)(struct irq_info *info, unsigned cpu); 59*ab9a1ccaSDavid Vrabel 60*ab9a1ccaSDavid Vrabel void (*clear_pending)(unsigned port); 61*ab9a1ccaSDavid Vrabel void (*set_pending)(unsigned port); 62*ab9a1ccaSDavid Vrabel bool (*is_pending)(unsigned port); 63*ab9a1ccaSDavid Vrabel bool (*test_and_set_mask)(unsigned port); 64*ab9a1ccaSDavid Vrabel void (*mask)(unsigned port); 65*ab9a1ccaSDavid Vrabel void (*unmask)(unsigned port); 66*ab9a1ccaSDavid Vrabel 67*ab9a1ccaSDavid Vrabel void (*handle_events)(unsigned cpu); 68*ab9a1ccaSDavid Vrabel }; 69*ab9a1ccaSDavid Vrabel 70*ab9a1ccaSDavid Vrabel extern const struct evtchn_ops *evtchn_ops; 71*ab9a1ccaSDavid Vrabel 729a489f45SDavid Vrabel extern int *evtchn_to_irq; 739a489f45SDavid Vrabel 749a489f45SDavid Vrabel struct irq_info *info_for_irq(unsigned irq); 759a489f45SDavid Vrabel unsigned cpu_from_irq(unsigned irq); 769a489f45SDavid Vrabel unsigned cpu_from_evtchn(unsigned int evtchn); 779a489f45SDavid Vrabel 78*ab9a1ccaSDavid Vrabel static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, 79*ab9a1ccaSDavid Vrabel unsigned cpu) 80*ab9a1ccaSDavid Vrabel { 81*ab9a1ccaSDavid Vrabel evtchn_ops->bind_to_cpu(info, cpu); 82*ab9a1ccaSDavid Vrabel } 839a489f45SDavid Vrabel 84*ab9a1ccaSDavid Vrabel static inline void clear_evtchn(unsigned port) 85*ab9a1ccaSDavid Vrabel { 86*ab9a1ccaSDavid Vrabel evtchn_ops->clear_pending(port); 87*ab9a1ccaSDavid Vrabel } 889a489f45SDavid Vrabel 89*ab9a1ccaSDavid Vrabel static inline void set_evtchn(unsigned port) 90*ab9a1ccaSDavid Vrabel { 91*ab9a1ccaSDavid Vrabel evtchn_ops->set_pending(port); 92*ab9a1ccaSDavid Vrabel } 93*ab9a1ccaSDavid Vrabel 94*ab9a1ccaSDavid Vrabel static inline bool test_evtchn(unsigned port) 95*ab9a1ccaSDavid Vrabel { 96*ab9a1ccaSDavid Vrabel return evtchn_ops->is_pending(port); 97*ab9a1ccaSDavid Vrabel } 98*ab9a1ccaSDavid Vrabel 99*ab9a1ccaSDavid Vrabel static inline bool test_and_set_mask(unsigned port) 100*ab9a1ccaSDavid Vrabel { 101*ab9a1ccaSDavid Vrabel return evtchn_ops->test_and_set_mask(port); 102*ab9a1ccaSDavid Vrabel } 103*ab9a1ccaSDavid Vrabel 104*ab9a1ccaSDavid Vrabel static inline void mask_evtchn(unsigned port) 105*ab9a1ccaSDavid Vrabel { 106*ab9a1ccaSDavid Vrabel return evtchn_ops->mask(port); 107*ab9a1ccaSDavid Vrabel } 108*ab9a1ccaSDavid Vrabel 109*ab9a1ccaSDavid Vrabel static inline void unmask_evtchn(unsigned port) 110*ab9a1ccaSDavid Vrabel { 111*ab9a1ccaSDavid Vrabel return evtchn_ops->unmask(port); 112*ab9a1ccaSDavid Vrabel } 113*ab9a1ccaSDavid Vrabel 114*ab9a1ccaSDavid Vrabel static inline void xen_evtchn_handle_events(unsigned cpu) 115*ab9a1ccaSDavid Vrabel { 116*ab9a1ccaSDavid Vrabel return evtchn_ops->handle_events(cpu); 117*ab9a1ccaSDavid Vrabel } 118*ab9a1ccaSDavid Vrabel 119*ab9a1ccaSDavid Vrabel void xen_evtchn_2l_init(void); 1209a489f45SDavid Vrabel 1219a489f45SDavid Vrabel #endif /* #ifndef __EVENTS_INTERNAL_H__ */ 122