xref: /openbmc/qemu/hw/i386/kvm/xen_evtchn.h (revision d2dfe0b5)
1 /*
2  * QEMU Xen emulation: Event channel support
3  *
4  * Copyright © 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5  *
6  * Authors: David Woodhouse <dwmw2@infradead.org>
7  *
8  * This work is licensed under the terms of the GNU GPL, version 2 or later.
9  * See the COPYING file in the top-level directory.
10  */
11 
12 #ifndef QEMU_XEN_EVTCHN_H
13 #define QEMU_XEN_EVTCHN_H
14 
15 #include "hw/sysbus.h"
16 
17 typedef uint32_t evtchn_port_t;
18 
19 void xen_evtchn_create(void);
20 int xen_evtchn_soft_reset(void);
21 int xen_evtchn_set_callback_param(uint64_t param);
22 void xen_evtchn_connect_gsis(qemu_irq *system_gsis);
23 void xen_evtchn_set_callback_level(int level);
24 
25 int xen_evtchn_set_port(uint16_t port);
26 
27 bool xen_evtchn_set_gsi(int gsi, int level);
28 void xen_evtchn_snoop_msi(PCIDevice *dev, bool is_msix, unsigned int vector,
29                           uint64_t addr, uint32_t data, bool is_masked);
30 void xen_evtchn_remove_pci_device(PCIDevice *dev);
31 struct kvm_irq_routing_entry;
32 int xen_evtchn_translate_pirq_msi(struct kvm_irq_routing_entry *route,
33                                   uint64_t address, uint32_t data);
34 bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data);
35 
36 
37 /*
38  * These functions mirror the libxenevtchn library API, providing the QEMU
39  * backend side of "interdomain" event channels.
40  */
41 struct xenevtchn_handle;
42 struct xenevtchn_handle *xen_be_evtchn_open(void);
43 int xen_be_evtchn_bind_interdomain(struct xenevtchn_handle *xc, uint32_t domid,
44                                    evtchn_port_t guest_port);
45 int xen_be_evtchn_unbind(struct xenevtchn_handle *xc, evtchn_port_t port);
46 int xen_be_evtchn_close(struct xenevtchn_handle *xc);
47 int xen_be_evtchn_fd(struct xenevtchn_handle *xc);
48 int xen_be_evtchn_notify(struct xenevtchn_handle *xc, evtchn_port_t port);
49 int xen_be_evtchn_unmask(struct xenevtchn_handle *xc, evtchn_port_t port);
50 int xen_be_evtchn_pending(struct xenevtchn_handle *xc);
51 /* Apart from this which is a local addition */
52 int xen_be_evtchn_get_guest_port(struct xenevtchn_handle *xc);
53 
54 struct evtchn_status;
55 struct evtchn_close;
56 struct evtchn_unmask;
57 struct evtchn_bind_virq;
58 struct evtchn_bind_pirq;
59 struct evtchn_bind_ipi;
60 struct evtchn_send;
61 struct evtchn_alloc_unbound;
62 struct evtchn_bind_interdomain;
63 struct evtchn_bind_vcpu;
64 struct evtchn_reset;
65 int xen_evtchn_status_op(struct evtchn_status *status);
66 int xen_evtchn_close_op(struct evtchn_close *close);
67 int xen_evtchn_unmask_op(struct evtchn_unmask *unmask);
68 int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq);
69 int xen_evtchn_bind_pirq_op(struct evtchn_bind_pirq *pirq);
70 int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi);
71 int xen_evtchn_send_op(struct evtchn_send *send);
72 int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc);
73 int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdomain);
74 int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu);
75 int xen_evtchn_reset_op(struct evtchn_reset *reset);
76 
77 struct physdev_map_pirq;
78 struct physdev_unmap_pirq;
79 struct physdev_eoi;
80 struct physdev_irq_status_query;
81 struct physdev_get_free_pirq;
82 int xen_physdev_map_pirq(struct physdev_map_pirq *map);
83 int xen_physdev_unmap_pirq(struct physdev_unmap_pirq *unmap);
84 int xen_physdev_eoi_pirq(struct physdev_eoi *eoi);
85 int xen_physdev_query_pirq(struct physdev_irq_status_query *query);
86 int xen_physdev_get_free_pirq(struct physdev_get_free_pirq *get);
87 
88 #endif /* QEMU_XEN_EVTCHN_H */
89