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 167e14cde1SJuergen Gross int (*setup)(evtchn_port_t port); 17*9e77d96bSJuergen Gross void (*remove)(evtchn_port_t port, unsigned int cpu); 187e14cde1SJuergen Gross void (*bind_to_cpu)(evtchn_port_t evtchn, unsigned int cpu, 197e14cde1SJuergen Gross unsigned int old_cpu); 20ab9a1ccaSDavid Vrabel 210102e4efSYan Yankovskyi void (*clear_pending)(evtchn_port_t port); 220102e4efSYan Yankovskyi void (*set_pending)(evtchn_port_t port); 230102e4efSYan Yankovskyi bool (*is_pending)(evtchn_port_t port); 240102e4efSYan Yankovskyi bool (*test_and_set_mask)(evtchn_port_t port); 250102e4efSYan Yankovskyi void (*mask)(evtchn_port_t port); 260102e4efSYan Yankovskyi void (*unmask)(evtchn_port_t port); 27ab9a1ccaSDavid Vrabel 28e99502f7SJuergen Gross void (*handle_events)(unsigned cpu, struct evtchn_loop_ctrl *ctrl); 291fe56551SDavid Vrabel void (*resume)(void); 307beb290cSJuergen Gross 317beb290cSJuergen Gross int (*percpu_init)(unsigned int cpu); 327beb290cSJuergen Gross int (*percpu_deinit)(unsigned int cpu); 33ab9a1ccaSDavid Vrabel }; 34ab9a1ccaSDavid Vrabel 35ab9a1ccaSDavid Vrabel extern const struct evtchn_ops *evtchn_ops; 36ab9a1ccaSDavid Vrabel 370102e4efSYan Yankovskyi int get_evtchn_to_irq(evtchn_port_t evtchn); 38e99502f7SJuergen Gross void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl); 399a489f45SDavid Vrabel 400102e4efSYan Yankovskyi unsigned int cpu_from_evtchn(evtchn_port_t evtchn); 419a489f45SDavid Vrabel 42d0b075ffSDavid Vrabel static inline unsigned xen_evtchn_max_channels(void) 43d0b075ffSDavid Vrabel { 44d0b075ffSDavid Vrabel return evtchn_ops->max_channels(); 45d0b075ffSDavid Vrabel } 46d0b075ffSDavid Vrabel 4708385875SDavid Vrabel /* 4808385875SDavid Vrabel * Do any ABI specific setup for a bound event channel before it can 4908385875SDavid Vrabel * be unmasked and used. 5008385875SDavid Vrabel */ 517e14cde1SJuergen Gross static inline int xen_evtchn_port_setup(evtchn_port_t evtchn) 5208385875SDavid Vrabel { 5308385875SDavid Vrabel if (evtchn_ops->setup) 547e14cde1SJuergen Gross return evtchn_ops->setup(evtchn); 5508385875SDavid Vrabel return 0; 5608385875SDavid Vrabel } 5708385875SDavid Vrabel 58*9e77d96bSJuergen Gross static inline void xen_evtchn_port_remove(evtchn_port_t evtchn, 59*9e77d96bSJuergen Gross unsigned int cpu) 60*9e77d96bSJuergen Gross { 61*9e77d96bSJuergen Gross if (evtchn_ops->remove) 62*9e77d96bSJuergen Gross evtchn_ops->remove(evtchn, cpu); 63*9e77d96bSJuergen Gross } 64*9e77d96bSJuergen Gross 657e14cde1SJuergen Gross static inline void xen_evtchn_port_bind_to_cpu(evtchn_port_t evtchn, 667e14cde1SJuergen Gross unsigned int cpu, 677e14cde1SJuergen Gross unsigned int old_cpu) 68ab9a1ccaSDavid Vrabel { 697e14cde1SJuergen Gross evtchn_ops->bind_to_cpu(evtchn, cpu, old_cpu); 70ab9a1ccaSDavid Vrabel } 719a489f45SDavid Vrabel 720102e4efSYan Yankovskyi static inline void clear_evtchn(evtchn_port_t port) 73ab9a1ccaSDavid Vrabel { 74ab9a1ccaSDavid Vrabel evtchn_ops->clear_pending(port); 75ab9a1ccaSDavid Vrabel } 769a489f45SDavid Vrabel 770102e4efSYan Yankovskyi static inline void set_evtchn(evtchn_port_t port) 78ab9a1ccaSDavid Vrabel { 79ab9a1ccaSDavid Vrabel evtchn_ops->set_pending(port); 80ab9a1ccaSDavid Vrabel } 81ab9a1ccaSDavid Vrabel 820102e4efSYan Yankovskyi static inline bool test_evtchn(evtchn_port_t port) 83ab9a1ccaSDavid Vrabel { 84ab9a1ccaSDavid Vrabel return evtchn_ops->is_pending(port); 85ab9a1ccaSDavid Vrabel } 86ab9a1ccaSDavid Vrabel 870102e4efSYan Yankovskyi static inline bool test_and_set_mask(evtchn_port_t port) 88ab9a1ccaSDavid Vrabel { 89ab9a1ccaSDavid Vrabel return evtchn_ops->test_and_set_mask(port); 90ab9a1ccaSDavid Vrabel } 91ab9a1ccaSDavid Vrabel 920102e4efSYan Yankovskyi static inline void mask_evtchn(evtchn_port_t port) 93ab9a1ccaSDavid Vrabel { 94ab9a1ccaSDavid Vrabel return evtchn_ops->mask(port); 95ab9a1ccaSDavid Vrabel } 96ab9a1ccaSDavid Vrabel 970102e4efSYan Yankovskyi static inline void unmask_evtchn(evtchn_port_t port) 98ab9a1ccaSDavid Vrabel { 99ab9a1ccaSDavid Vrabel return evtchn_ops->unmask(port); 100ab9a1ccaSDavid Vrabel } 101ab9a1ccaSDavid Vrabel 102e99502f7SJuergen Gross static inline void xen_evtchn_handle_events(unsigned cpu, 103e99502f7SJuergen Gross struct evtchn_loop_ctrl *ctrl) 104ab9a1ccaSDavid Vrabel { 105e99502f7SJuergen Gross return evtchn_ops->handle_events(cpu, ctrl); 106ab9a1ccaSDavid Vrabel } 107ab9a1ccaSDavid Vrabel 1081fe56551SDavid Vrabel static inline void xen_evtchn_resume(void) 1091fe56551SDavid Vrabel { 1101fe56551SDavid Vrabel if (evtchn_ops->resume) 1111fe56551SDavid Vrabel evtchn_ops->resume(); 1121fe56551SDavid Vrabel } 1131fe56551SDavid Vrabel 114ab9a1ccaSDavid Vrabel void xen_evtchn_2l_init(void); 1151fe56551SDavid Vrabel int xen_evtchn_fifo_init(void); 1169a489f45SDavid Vrabel 1179a489f45SDavid Vrabel #endif /* #ifndef __EVENTS_INTERNAL_H__ */ 118