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