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