162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci * event_channel.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Event channels between domains.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2003-2004, K A Fraser.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__
1162306a36Sopenharmony_ci#define __XEN_PUBLIC_EVENT_CHANNEL_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <xen/interface/xen.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_citypedef uint32_t evtchn_port_t;
1662306a36Sopenharmony_ciDEFINE_GUEST_HANDLE(evtchn_port_t);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/*
1962306a36Sopenharmony_ci * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as
2062306a36Sopenharmony_ci * accepting interdomain bindings from domain <remote_dom>. A fresh port
2162306a36Sopenharmony_ci * is allocated in <dom> and returned as <port>.
2262306a36Sopenharmony_ci * NOTES:
2362306a36Sopenharmony_ci *  1. If the caller is unprivileged then <dom> must be DOMID_SELF.
2462306a36Sopenharmony_ci *  2. <rdom> may be DOMID_SELF, allowing loopback connections.
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci#define EVTCHNOP_alloc_unbound	  6
2762306a36Sopenharmony_cistruct evtchn_alloc_unbound {
2862306a36Sopenharmony_ci	/* IN parameters */
2962306a36Sopenharmony_ci	domid_t dom, remote_dom;
3062306a36Sopenharmony_ci	/* OUT parameters */
3162306a36Sopenharmony_ci	evtchn_port_t port;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/*
3562306a36Sopenharmony_ci * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between
3662306a36Sopenharmony_ci * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify
3762306a36Sopenharmony_ci * a port that is unbound and marked as accepting bindings from the calling
3862306a36Sopenharmony_ci * domain. A fresh port is allocated in the calling domain and returned as
3962306a36Sopenharmony_ci * <local_port>.
4062306a36Sopenharmony_ci * NOTES:
4162306a36Sopenharmony_ci *  2. <remote_dom> may be DOMID_SELF, allowing loopback connections.
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ci#define EVTCHNOP_bind_interdomain 0
4462306a36Sopenharmony_cistruct evtchn_bind_interdomain {
4562306a36Sopenharmony_ci	/* IN parameters. */
4662306a36Sopenharmony_ci	domid_t remote_dom;
4762306a36Sopenharmony_ci	evtchn_port_t remote_port;
4862306a36Sopenharmony_ci	/* OUT parameters. */
4962306a36Sopenharmony_ci	evtchn_port_t local_port;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/*
5362306a36Sopenharmony_ci * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified
5462306a36Sopenharmony_ci * vcpu.
5562306a36Sopenharmony_ci * NOTES:
5662306a36Sopenharmony_ci *  1. A virtual IRQ may be bound to at most one event channel per vcpu.
5762306a36Sopenharmony_ci *  2. The allocated event channel is bound to the specified vcpu. The binding
5862306a36Sopenharmony_ci *     may not be changed.
5962306a36Sopenharmony_ci */
6062306a36Sopenharmony_ci#define EVTCHNOP_bind_virq	  1
6162306a36Sopenharmony_cistruct evtchn_bind_virq {
6262306a36Sopenharmony_ci	/* IN parameters. */
6362306a36Sopenharmony_ci	uint32_t virq;
6462306a36Sopenharmony_ci	uint32_t vcpu;
6562306a36Sopenharmony_ci	/* OUT parameters. */
6662306a36Sopenharmony_ci	evtchn_port_t port;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/*
7062306a36Sopenharmony_ci * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>.
7162306a36Sopenharmony_ci * NOTES:
7262306a36Sopenharmony_ci *  1. A physical IRQ may be bound to at most one event channel per domain.
7362306a36Sopenharmony_ci *  2. Only a sufficiently-privileged domain may bind to a physical IRQ.
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_ci#define EVTCHNOP_bind_pirq	  2
7662306a36Sopenharmony_cistruct evtchn_bind_pirq {
7762306a36Sopenharmony_ci	/* IN parameters. */
7862306a36Sopenharmony_ci	uint32_t pirq;
7962306a36Sopenharmony_ci#define BIND_PIRQ__WILL_SHARE 1
8062306a36Sopenharmony_ci	uint32_t flags; /* BIND_PIRQ__* */
8162306a36Sopenharmony_ci	/* OUT parameters. */
8262306a36Sopenharmony_ci	evtchn_port_t port;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/*
8662306a36Sopenharmony_ci * EVTCHNOP_bind_ipi: Bind a local event channel to receive events.
8762306a36Sopenharmony_ci * NOTES:
8862306a36Sopenharmony_ci *  1. The allocated event channel is bound to the specified vcpu. The binding
8962306a36Sopenharmony_ci *     may not be changed.
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_ci#define EVTCHNOP_bind_ipi	  7
9262306a36Sopenharmony_cistruct evtchn_bind_ipi {
9362306a36Sopenharmony_ci	uint32_t vcpu;
9462306a36Sopenharmony_ci	/* OUT parameters. */
9562306a36Sopenharmony_ci	evtchn_port_t port;
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/*
9962306a36Sopenharmony_ci * EVTCHNOP_close: Close a local event channel <port>. If the channel is
10062306a36Sopenharmony_ci * interdomain then the remote end is placed in the unbound state
10162306a36Sopenharmony_ci * (EVTCHNSTAT_unbound), awaiting a new connection.
10262306a36Sopenharmony_ci */
10362306a36Sopenharmony_ci#define EVTCHNOP_close		  3
10462306a36Sopenharmony_cistruct evtchn_close {
10562306a36Sopenharmony_ci	/* IN parameters. */
10662306a36Sopenharmony_ci	evtchn_port_t port;
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/*
11062306a36Sopenharmony_ci * EVTCHNOP_send: Send an event to the remote end of the channel whose local
11162306a36Sopenharmony_ci * endpoint is <port>.
11262306a36Sopenharmony_ci */
11362306a36Sopenharmony_ci#define EVTCHNOP_send		  4
11462306a36Sopenharmony_cistruct evtchn_send {
11562306a36Sopenharmony_ci	/* IN parameters. */
11662306a36Sopenharmony_ci	evtchn_port_t port;
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/*
12062306a36Sopenharmony_ci * EVTCHNOP_status: Get the current status of the communication channel which
12162306a36Sopenharmony_ci * has an endpoint at <dom, port>.
12262306a36Sopenharmony_ci * NOTES:
12362306a36Sopenharmony_ci *  1. <dom> may be specified as DOMID_SELF.
12462306a36Sopenharmony_ci *  2. Only a sufficiently-privileged domain may obtain the status of an event
12562306a36Sopenharmony_ci *     channel for which <dom> is not DOMID_SELF.
12662306a36Sopenharmony_ci */
12762306a36Sopenharmony_ci#define EVTCHNOP_status		  5
12862306a36Sopenharmony_cistruct evtchn_status {
12962306a36Sopenharmony_ci	/* IN parameters */
13062306a36Sopenharmony_ci	domid_t  dom;
13162306a36Sopenharmony_ci	evtchn_port_t port;
13262306a36Sopenharmony_ci	/* OUT parameters */
13362306a36Sopenharmony_ci#define EVTCHNSTAT_closed	0  /* Channel is not in use.		     */
13462306a36Sopenharmony_ci#define EVTCHNSTAT_unbound	1  /* Channel is waiting interdom connection.*/
13562306a36Sopenharmony_ci#define EVTCHNSTAT_interdomain	2  /* Channel is connected to remote domain. */
13662306a36Sopenharmony_ci#define EVTCHNSTAT_pirq		3  /* Channel is bound to a phys IRQ line.   */
13762306a36Sopenharmony_ci#define EVTCHNSTAT_virq		4  /* Channel is bound to a virtual IRQ line */
13862306a36Sopenharmony_ci#define EVTCHNSTAT_ipi		5  /* Channel is bound to a virtual IPI line */
13962306a36Sopenharmony_ci	uint32_t status;
14062306a36Sopenharmony_ci	uint32_t vcpu;		   /* VCPU to which this channel is bound.   */
14162306a36Sopenharmony_ci	union {
14262306a36Sopenharmony_ci		struct {
14362306a36Sopenharmony_ci			domid_t dom;
14462306a36Sopenharmony_ci		} unbound; /* EVTCHNSTAT_unbound */
14562306a36Sopenharmony_ci		struct {
14662306a36Sopenharmony_ci			domid_t dom;
14762306a36Sopenharmony_ci			evtchn_port_t port;
14862306a36Sopenharmony_ci		} interdomain; /* EVTCHNSTAT_interdomain */
14962306a36Sopenharmony_ci		uint32_t pirq;	    /* EVTCHNSTAT_pirq	      */
15062306a36Sopenharmony_ci		uint32_t virq;	    /* EVTCHNSTAT_virq	      */
15162306a36Sopenharmony_ci	} u;
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/*
15562306a36Sopenharmony_ci * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an
15662306a36Sopenharmony_ci * event is pending.
15762306a36Sopenharmony_ci * NOTES:
15862306a36Sopenharmony_ci *  1. IPI- and VIRQ-bound channels always notify the vcpu that initialised
15962306a36Sopenharmony_ci *     the binding. This binding cannot be changed.
16062306a36Sopenharmony_ci *  2. All other channels notify vcpu0 by default. This default is set when
16162306a36Sopenharmony_ci *     the channel is allocated (a port that is freed and subsequently reused
16262306a36Sopenharmony_ci *     has its binding reset to vcpu0).
16362306a36Sopenharmony_ci */
16462306a36Sopenharmony_ci#define EVTCHNOP_bind_vcpu	  8
16562306a36Sopenharmony_cistruct evtchn_bind_vcpu {
16662306a36Sopenharmony_ci	/* IN parameters. */
16762306a36Sopenharmony_ci	evtchn_port_t port;
16862306a36Sopenharmony_ci	uint32_t vcpu;
16962306a36Sopenharmony_ci};
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/*
17262306a36Sopenharmony_ci * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver
17362306a36Sopenharmony_ci * a notification to the appropriate VCPU if an event is pending.
17462306a36Sopenharmony_ci */
17562306a36Sopenharmony_ci#define EVTCHNOP_unmask		  9
17662306a36Sopenharmony_cistruct evtchn_unmask {
17762306a36Sopenharmony_ci	/* IN parameters. */
17862306a36Sopenharmony_ci	evtchn_port_t port;
17962306a36Sopenharmony_ci};
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/*
18262306a36Sopenharmony_ci * EVTCHNOP_reset: Close all event channels associated with specified domain.
18362306a36Sopenharmony_ci * NOTES:
18462306a36Sopenharmony_ci *  1. <dom> may be specified as DOMID_SELF.
18562306a36Sopenharmony_ci *  2. Only a sufficiently-privileged domain may specify other than DOMID_SELF.
18662306a36Sopenharmony_ci */
18762306a36Sopenharmony_ci#define EVTCHNOP_reset		 10
18862306a36Sopenharmony_cistruct evtchn_reset {
18962306a36Sopenharmony_ci	/* IN parameters. */
19062306a36Sopenharmony_ci	domid_t dom;
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_citypedef struct evtchn_reset evtchn_reset_t;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/*
19562306a36Sopenharmony_ci * EVTCHNOP_init_control: initialize the control block for the FIFO ABI.
19662306a36Sopenharmony_ci */
19762306a36Sopenharmony_ci#define EVTCHNOP_init_control    11
19862306a36Sopenharmony_cistruct evtchn_init_control {
19962306a36Sopenharmony_ci	/* IN parameters. */
20062306a36Sopenharmony_ci	uint64_t control_gfn;
20162306a36Sopenharmony_ci	uint32_t offset;
20262306a36Sopenharmony_ci	uint32_t vcpu;
20362306a36Sopenharmony_ci	/* OUT parameters. */
20462306a36Sopenharmony_ci	uint8_t link_bits;
20562306a36Sopenharmony_ci	uint8_t _pad[7];
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/*
20962306a36Sopenharmony_ci * EVTCHNOP_expand_array: add an additional page to the event array.
21062306a36Sopenharmony_ci */
21162306a36Sopenharmony_ci#define EVTCHNOP_expand_array    12
21262306a36Sopenharmony_cistruct evtchn_expand_array {
21362306a36Sopenharmony_ci	/* IN parameters. */
21462306a36Sopenharmony_ci	uint64_t array_gfn;
21562306a36Sopenharmony_ci};
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci/*
21862306a36Sopenharmony_ci * EVTCHNOP_set_priority: set the priority for an event channel.
21962306a36Sopenharmony_ci */
22062306a36Sopenharmony_ci#define EVTCHNOP_set_priority    13
22162306a36Sopenharmony_cistruct evtchn_set_priority {
22262306a36Sopenharmony_ci	/* IN parameters. */
22362306a36Sopenharmony_ci	evtchn_port_t port;
22462306a36Sopenharmony_ci	uint32_t priority;
22562306a36Sopenharmony_ci};
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cistruct evtchn_op {
22862306a36Sopenharmony_ci	uint32_t cmd; /* EVTCHNOP_* */
22962306a36Sopenharmony_ci	union {
23062306a36Sopenharmony_ci		struct evtchn_alloc_unbound    alloc_unbound;
23162306a36Sopenharmony_ci		struct evtchn_bind_interdomain bind_interdomain;
23262306a36Sopenharmony_ci		struct evtchn_bind_virq	       bind_virq;
23362306a36Sopenharmony_ci		struct evtchn_bind_pirq	       bind_pirq;
23462306a36Sopenharmony_ci		struct evtchn_bind_ipi	       bind_ipi;
23562306a36Sopenharmony_ci		struct evtchn_close	       close;
23662306a36Sopenharmony_ci		struct evtchn_send	       send;
23762306a36Sopenharmony_ci		struct evtchn_status	       status;
23862306a36Sopenharmony_ci		struct evtchn_bind_vcpu	       bind_vcpu;
23962306a36Sopenharmony_ci		struct evtchn_unmask	       unmask;
24062306a36Sopenharmony_ci	} u;
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ciDEFINE_GUEST_HANDLE_STRUCT(evtchn_op);
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci/*
24562306a36Sopenharmony_ci * 2-level ABI
24662306a36Sopenharmony_ci */
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64)
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci/*
25162306a36Sopenharmony_ci * FIFO ABI
25262306a36Sopenharmony_ci */
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci/* Events may have priorities from 0 (highest) to 15 (lowest). */
25562306a36Sopenharmony_ci#define EVTCHN_FIFO_PRIORITY_MAX     0
25662306a36Sopenharmony_ci#define EVTCHN_FIFO_PRIORITY_DEFAULT 7
25762306a36Sopenharmony_ci#define EVTCHN_FIFO_PRIORITY_MIN     15
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1)
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_citypedef uint32_t event_word_t;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci#define EVTCHN_FIFO_PENDING 31
26462306a36Sopenharmony_ci#define EVTCHN_FIFO_MASKED  30
26562306a36Sopenharmony_ci#define EVTCHN_FIFO_LINKED  29
26662306a36Sopenharmony_ci#define EVTCHN_FIFO_BUSY    28
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci#define EVTCHN_FIFO_LINK_BITS 17
26962306a36Sopenharmony_ci#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1)
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS)
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cistruct evtchn_fifo_control_block {
27462306a36Sopenharmony_ci	uint32_t     ready;
27562306a36Sopenharmony_ci	uint32_t     _rsvd;
27662306a36Sopenharmony_ci	event_word_t head[EVTCHN_FIFO_MAX_QUEUES];
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */
280