162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Xen Event Channels (internal header)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2013 Citrix Systems R&D Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef __EVENTS_INTERNAL_H__
862306a36Sopenharmony_ci#define __EVENTS_INTERNAL_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct evtchn_loop_ctrl;
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct evtchn_ops {
1362306a36Sopenharmony_ci	unsigned (*max_channels)(void);
1462306a36Sopenharmony_ci	unsigned (*nr_channels)(void);
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	int (*setup)(evtchn_port_t port);
1762306a36Sopenharmony_ci	void (*remove)(evtchn_port_t port, unsigned int cpu);
1862306a36Sopenharmony_ci	void (*bind_to_cpu)(evtchn_port_t evtchn, unsigned int cpu,
1962306a36Sopenharmony_ci			    unsigned int old_cpu);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	void (*clear_pending)(evtchn_port_t port);
2262306a36Sopenharmony_ci	void (*set_pending)(evtchn_port_t port);
2362306a36Sopenharmony_ci	bool (*is_pending)(evtchn_port_t port);
2462306a36Sopenharmony_ci	void (*mask)(evtchn_port_t port);
2562306a36Sopenharmony_ci	void (*unmask)(evtchn_port_t port);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	void (*handle_events)(unsigned cpu, struct evtchn_loop_ctrl *ctrl);
2862306a36Sopenharmony_ci	void (*resume)(void);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	int (*percpu_init)(unsigned int cpu);
3162306a36Sopenharmony_ci	int (*percpu_deinit)(unsigned int cpu);
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciextern const struct evtchn_ops *evtchn_ops;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_civoid handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciunsigned int cpu_from_evtchn(evtchn_port_t evtchn);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline unsigned xen_evtchn_max_channels(void)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	return evtchn_ops->max_channels();
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/*
4662306a36Sopenharmony_ci * Do any ABI specific setup for a bound event channel before it can
4762306a36Sopenharmony_ci * be unmasked and used.
4862306a36Sopenharmony_ci */
4962306a36Sopenharmony_cistatic inline int xen_evtchn_port_setup(evtchn_port_t evtchn)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	if (evtchn_ops->setup)
5262306a36Sopenharmony_ci		return evtchn_ops->setup(evtchn);
5362306a36Sopenharmony_ci	return 0;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void xen_evtchn_port_remove(evtchn_port_t evtchn,
5762306a36Sopenharmony_ci					  unsigned int cpu)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	if (evtchn_ops->remove)
6062306a36Sopenharmony_ci		evtchn_ops->remove(evtchn, cpu);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic inline void xen_evtchn_port_bind_to_cpu(evtchn_port_t evtchn,
6462306a36Sopenharmony_ci					       unsigned int cpu,
6562306a36Sopenharmony_ci					       unsigned int old_cpu)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	evtchn_ops->bind_to_cpu(evtchn, cpu, old_cpu);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic inline void clear_evtchn(evtchn_port_t port)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	evtchn_ops->clear_pending(port);
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic inline void set_evtchn(evtchn_port_t port)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	evtchn_ops->set_pending(port);
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline bool test_evtchn(evtchn_port_t port)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	return evtchn_ops->is_pending(port);
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic inline void mask_evtchn(evtchn_port_t port)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return evtchn_ops->mask(port);
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline void unmask_evtchn(evtchn_port_t port)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	return evtchn_ops->unmask(port);
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistatic inline void xen_evtchn_handle_events(unsigned cpu,
9662306a36Sopenharmony_ci					    struct evtchn_loop_ctrl *ctrl)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	return evtchn_ops->handle_events(cpu, ctrl);
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistatic inline void xen_evtchn_resume(void)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	if (evtchn_ops->resume)
10462306a36Sopenharmony_ci		evtchn_ops->resume();
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_civoid xen_evtchn_2l_init(void);
10862306a36Sopenharmony_ciint xen_evtchn_fifo_init(void);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#endif /* #ifndef __EVENTS_INTERNAL_H__ */
111