1495e0022SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 29a489f45SDavid Vrabel /* 39a489f45SDavid Vrabel * Xen Event Channels (internal header) 49a489f45SDavid Vrabel * 59a489f45SDavid Vrabel * Copyright (C) 2013 Citrix Systems R&D Ltd. 69a489f45SDavid Vrabel */ 79a489f45SDavid Vrabel #ifndef __EVENTS_INTERNAL_H__ 89a489f45SDavid Vrabel #define __EVENTS_INTERNAL_H__ 99a489f45SDavid Vrabel 10e99502f7SJuergen Gross struct evtchn_loop_ctrl; 11e99502f7SJuergen Gross 12ab9a1ccaSDavid Vrabel struct evtchn_ops { 13d0b075ffSDavid Vrabel unsigned (*max_channels)(void); 14d0b075ffSDavid Vrabel unsigned (*nr_channels)(void); 15d0b075ffSDavid Vrabel 16*7e14cde1SJuergen Gross int (*setup)(evtchn_port_t port); 17*7e14cde1SJuergen Gross void (*bind_to_cpu)(evtchn_port_t evtchn, unsigned int cpu, 18*7e14cde1SJuergen Gross unsigned int old_cpu); 19ab9a1ccaSDavid Vrabel 200102e4efSYan Yankovskyi void (*clear_pending)(evtchn_port_t port); 210102e4efSYan Yankovskyi void (*set_pending)(evtchn_port_t port); 220102e4efSYan Yankovskyi bool (*is_pending)(evtchn_port_t port); 230102e4efSYan Yankovskyi bool (*test_and_set_mask)(evtchn_port_t port); 240102e4efSYan Yankovskyi void (*mask)(evtchn_port_t port); 250102e4efSYan Yankovskyi void (*unmask)(evtchn_port_t port); 26ab9a1ccaSDavid Vrabel 27e99502f7SJuergen Gross void (*handle_events)(unsigned cpu, struct evtchn_loop_ctrl *ctrl); 281fe56551SDavid Vrabel void (*resume)(void); 297beb290cSJuergen Gross 307beb290cSJuergen Gross int (*percpu_init)(unsigned int cpu); 317beb290cSJuergen Gross int (*percpu_deinit)(unsigned int cpu); 32ab9a1ccaSDavid Vrabel }; 33ab9a1ccaSDavid Vrabel 34ab9a1ccaSDavid Vrabel extern const struct evtchn_ops *evtchn_ops; 35ab9a1ccaSDavid Vrabel 360102e4efSYan Yankovskyi int get_evtchn_to_irq(evtchn_port_t evtchn); 37e99502f7SJuergen Gross void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl); 389a489f45SDavid Vrabel 390102e4efSYan Yankovskyi unsigned int cpu_from_evtchn(evtchn_port_t evtchn); 409a489f45SDavid Vrabel 41d0b075ffSDavid Vrabel static inline unsigned xen_evtchn_max_channels(void) 42d0b075ffSDavid Vrabel { 43d0b075ffSDavid Vrabel return evtchn_ops->max_channels(); 44d0b075ffSDavid Vrabel } 45d0b075ffSDavid Vrabel 4608385875SDavid Vrabel /* 4708385875SDavid Vrabel * Do any ABI specific setup for a bound event channel before it can 4808385875SDavid Vrabel * be unmasked and used. 4908385875SDavid Vrabel */ 50*7e14cde1SJuergen Gross static inline int xen_evtchn_port_setup(evtchn_port_t evtchn) 5108385875SDavid Vrabel { 5208385875SDavid Vrabel if (evtchn_ops->setup) 53*7e14cde1SJuergen Gross return evtchn_ops->setup(evtchn); 5408385875SDavid Vrabel return 0; 5508385875SDavid Vrabel } 5608385875SDavid Vrabel 57*7e14cde1SJuergen Gross static inline void xen_evtchn_port_bind_to_cpu(evtchn_port_t evtchn, 58*7e14cde1SJuergen Gross unsigned int cpu, 59*7e14cde1SJuergen Gross unsigned int old_cpu) 60ab9a1ccaSDavid Vrabel { 61*7e14cde1SJuergen Gross evtchn_ops->bind_to_cpu(evtchn, cpu, old_cpu); 62ab9a1ccaSDavid Vrabel } 639a489f45SDavid Vrabel 640102e4efSYan Yankovskyi static inline void clear_evtchn(evtchn_port_t port) 65ab9a1ccaSDavid Vrabel { 66ab9a1ccaSDavid Vrabel evtchn_ops->clear_pending(port); 67ab9a1ccaSDavid Vrabel } 689a489f45SDavid Vrabel 690102e4efSYan Yankovskyi static inline void set_evtchn(evtchn_port_t port) 70ab9a1ccaSDavid Vrabel { 71ab9a1ccaSDavid Vrabel evtchn_ops->set_pending(port); 72ab9a1ccaSDavid Vrabel } 73ab9a1ccaSDavid Vrabel 740102e4efSYan Yankovskyi static inline bool test_evtchn(evtchn_port_t port) 75ab9a1ccaSDavid Vrabel { 76ab9a1ccaSDavid Vrabel return evtchn_ops->is_pending(port); 77ab9a1ccaSDavid Vrabel } 78ab9a1ccaSDavid Vrabel 790102e4efSYan Yankovskyi static inline bool test_and_set_mask(evtchn_port_t port) 80ab9a1ccaSDavid Vrabel { 81ab9a1ccaSDavid Vrabel return evtchn_ops->test_and_set_mask(port); 82ab9a1ccaSDavid Vrabel } 83ab9a1ccaSDavid Vrabel 840102e4efSYan Yankovskyi static inline void mask_evtchn(evtchn_port_t port) 85ab9a1ccaSDavid Vrabel { 86ab9a1ccaSDavid Vrabel return evtchn_ops->mask(port); 87ab9a1ccaSDavid Vrabel } 88ab9a1ccaSDavid Vrabel 890102e4efSYan Yankovskyi static inline void unmask_evtchn(evtchn_port_t port) 90ab9a1ccaSDavid Vrabel { 91ab9a1ccaSDavid Vrabel return evtchn_ops->unmask(port); 92ab9a1ccaSDavid Vrabel } 93ab9a1ccaSDavid Vrabel 94e99502f7SJuergen Gross static inline void xen_evtchn_handle_events(unsigned cpu, 95e99502f7SJuergen Gross struct evtchn_loop_ctrl *ctrl) 96ab9a1ccaSDavid Vrabel { 97e99502f7SJuergen Gross return evtchn_ops->handle_events(cpu, ctrl); 98ab9a1ccaSDavid Vrabel } 99ab9a1ccaSDavid Vrabel 1001fe56551SDavid Vrabel static inline void xen_evtchn_resume(void) 1011fe56551SDavid Vrabel { 1021fe56551SDavid Vrabel if (evtchn_ops->resume) 1031fe56551SDavid Vrabel evtchn_ops->resume(); 1041fe56551SDavid Vrabel } 1051fe56551SDavid Vrabel 106ab9a1ccaSDavid Vrabel void xen_evtchn_2l_init(void); 1071fe56551SDavid Vrabel int xen_evtchn_fifo_init(void); 1089a489f45SDavid Vrabel 1099a489f45SDavid Vrabel #endif /* #ifndef __EVENTS_INTERNAL_H__ */ 110