xref: /qemu/include/hw/xen/xen-bus.h (revision f5e6e13124440797308d2c044f44d9e655fcb74d)
1108f7bbaSPaul Durrant /*
2108f7bbaSPaul Durrant  * Copyright (c) 2018  Citrix Systems Inc.
3108f7bbaSPaul Durrant  *
4108f7bbaSPaul Durrant  * This work is licensed under the terms of the GNU GPL, version 2 or later.
5108f7bbaSPaul Durrant  * See the COPYING file in the top-level directory.
6108f7bbaSPaul Durrant  */
7108f7bbaSPaul Durrant 
8108f7bbaSPaul Durrant #ifndef HW_XEN_BUS_H
9108f7bbaSPaul Durrant #define HW_XEN_BUS_H
10108f7bbaSPaul Durrant 
11*cc2b1c5bSPhilippe Mathieu-Daudé #include "hw/qdev-core.h"
12b6cacfeaSDavid Woodhouse #include "hw/xen/xen_backend_ops.h"
1382a29e30SPaul Durrant #include "qemu/notify.h"
14*cc2b1c5bSPhilippe Mathieu-Daudé #include "qemu/queue.h"
15db1015e9SEduardo Habkost #include "qom/object.h"
1682a29e30SPaul Durrant 
17c0b336eaSPaul Durrant typedef struct XenEventChannel XenEventChannel;
18108f7bbaSPaul Durrant 
19db1015e9SEduardo Habkost struct XenDevice {
20108f7bbaSPaul Durrant     DeviceState qdev;
21094a2239SPaul Durrant     domid_t frontend_id;
22094a2239SPaul Durrant     char *name;
23ba2a92dbSPaul Durrant     struct qemu_xs_handle *xsh;
24094a2239SPaul Durrant     char *backend_path, *frontend_path;
25094a2239SPaul Durrant     enum xenbus_state backend_state, frontend_state;
26094a2239SPaul Durrant     Notifier exit;
27ba2a92dbSPaul Durrant     struct qemu_xs_watch *backend_state_watch, *frontend_state_watch;
28b6af8926SPaul Durrant     bool backend_online;
29ba2a92dbSPaul Durrant     struct qemu_xs_watch *backend_online_watch;
304b34b5b1SPaul Durrant     xengnttab_handle *xgth;
313809f758SPaul Durrant     bool inactive;
32c0b336eaSPaul Durrant     QLIST_HEAD(, XenEventChannel) event_channels;
333809f758SPaul Durrant     QLIST_ENTRY(XenDevice) list;
34db1015e9SEduardo Habkost };
35db1015e9SEduardo Habkost typedef struct XenDevice XenDevice;
36108f7bbaSPaul Durrant 
37523b6b3aSDavid Woodhouse typedef char *(*XenDeviceGetFrontendPath)(XenDevice *xendev, Error **errp);
38094a2239SPaul Durrant typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp);
39108f7bbaSPaul Durrant typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp);
4082a29e30SPaul Durrant typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev,
4182a29e30SPaul Durrant                                          enum xenbus_state frontend_state,
4282a29e30SPaul Durrant                                          Error **errp);
43b69c3c21SMarkus Armbruster typedef void (*XenDeviceUnrealize)(XenDevice *xendev);
44108f7bbaSPaul Durrant 
45db1015e9SEduardo Habkost struct XenDeviceClass {
46108f7bbaSPaul Durrant     /*< private >*/
47108f7bbaSPaul Durrant     DeviceClass parent_class;
48108f7bbaSPaul Durrant     /*< public >*/
49094a2239SPaul Durrant     const char *backend;
50094a2239SPaul Durrant     const char *device;
51523b6b3aSDavid Woodhouse     XenDeviceGetFrontendPath get_frontend_path;
52094a2239SPaul Durrant     XenDeviceGetName get_name;
53108f7bbaSPaul Durrant     XenDeviceRealize realize;
5482a29e30SPaul Durrant     XenDeviceFrontendChanged frontend_changed;
55108f7bbaSPaul Durrant     XenDeviceUnrealize unrealize;
56db1015e9SEduardo Habkost };
57108f7bbaSPaul Durrant 
58108f7bbaSPaul Durrant #define TYPE_XEN_DEVICE "xen-device"
59a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(XenDevice, XenDeviceClass, XEN_DEVICE)
60108f7bbaSPaul Durrant 
61db1015e9SEduardo Habkost struct XenBus {
62108f7bbaSPaul Durrant     BusState qbus;
63094a2239SPaul Durrant     domid_t backend_id;
64ba2a92dbSPaul Durrant     struct qemu_xs_handle *xsh;
65c4583c8cSPaul Durrant     unsigned int backend_types;
66ba2a92dbSPaul Durrant     struct qemu_xs_watch **backend_watch;
673809f758SPaul Durrant     QLIST_HEAD(, XenDevice) inactive_devices;
68db1015e9SEduardo Habkost };
69108f7bbaSPaul Durrant 
70db1015e9SEduardo Habkost struct XenBusClass {
71108f7bbaSPaul Durrant     /*< private >*/
72108f7bbaSPaul Durrant     BusClass parent_class;
73db1015e9SEduardo Habkost };
74108f7bbaSPaul Durrant 
75108f7bbaSPaul Durrant #define TYPE_XEN_BUS "xen-bus"
76c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(XenBus, XenBusClass,
7730b5707cSEduardo Habkost                     XEN_BUS)
78108f7bbaSPaul Durrant 
797d6eff13SDavid Woodhouse void xen_bus_init(void);
80108f7bbaSPaul Durrant 
8182a29e30SPaul Durrant void xen_device_backend_set_state(XenDevice *xendev,
8282a29e30SPaul Durrant                                   enum xenbus_state state);
8382a29e30SPaul Durrant enum xenbus_state xen_device_backend_get_state(XenDevice *xendev);
8482a29e30SPaul Durrant 
85b6af8926SPaul Durrant void xen_device_backend_printf(XenDevice *xendev, const char *key,
86b6af8926SPaul Durrant                                const char *fmt, ...)
879edc6313SMarc-André Lureau     G_GNUC_PRINTF(3, 4);
88b6af8926SPaul Durrant void xen_device_frontend_printf(XenDevice *xendev, const char *key,
89b6af8926SPaul Durrant                                 const char *fmt, ...)
909edc6313SMarc-André Lureau     G_GNUC_PRINTF(3, 4);
91b6af8926SPaul Durrant 
92b6af8926SPaul Durrant int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
93d62449daSDaniel P. Berrangé                               const char *fmt, ...)
94d62449daSDaniel P. Berrangé     G_GNUC_SCANF(3, 4);
957a0b74d8SRoger Pau Monne char *xen_device_frontend_read(XenDevice *xendev, const char *key);
96b6af8926SPaul Durrant 
974b34b5b1SPaul Durrant void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs,
984b34b5b1SPaul Durrant                                    Error **errp);
994b34b5b1SPaul Durrant void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs,
1004b34b5b1SPaul Durrant                                 unsigned int nr_refs, int prot,
1014b34b5b1SPaul Durrant                                 Error **errp);
102f80fad16SDavid Woodhouse void xen_device_unmap_grant_refs(XenDevice *xendev, void *map, uint32_t *refs,
1034b34b5b1SPaul Durrant                                  unsigned int nr_refs, Error **errp);
1044b34b5b1SPaul Durrant 
1054b34b5b1SPaul Durrant typedef struct XenDeviceGrantCopySegment {
1064b34b5b1SPaul Durrant     union {
1074b34b5b1SPaul Durrant         void *virt;
1084b34b5b1SPaul Durrant         struct {
1094b34b5b1SPaul Durrant             uint32_t ref;
1104b34b5b1SPaul Durrant             off_t offset;
1114b34b5b1SPaul Durrant         } foreign;
1124b34b5b1SPaul Durrant     } source, dest;
1134b34b5b1SPaul Durrant     size_t len;
1144b34b5b1SPaul Durrant } XenDeviceGrantCopySegment;
1154b34b5b1SPaul Durrant 
1164b34b5b1SPaul Durrant void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain,
1174b34b5b1SPaul Durrant                                 XenDeviceGrantCopySegment segs[],
1184b34b5b1SPaul Durrant                                 unsigned int nr_segs, Error **errp);
1194b34b5b1SPaul Durrant 
120345f42b4SPaul Durrant typedef bool (*XenEventHandler)(void *opaque);
121a3d669c8SPaul Durrant 
122a3d669c8SPaul Durrant XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
123a3d669c8SPaul Durrant                                                unsigned int port,
124a3d669c8SPaul Durrant                                                XenEventHandler handler,
125a3d669c8SPaul Durrant                                                void *opaque, Error **errp);
12632d0b7beSPaul Durrant void xen_device_set_event_channel_context(XenDevice *xendev,
12732d0b7beSPaul Durrant                                           XenEventChannel *channel,
12832d0b7beSPaul Durrant                                           AioContext *ctx,
12932d0b7beSPaul Durrant                                           Error **errp);
130a3d669c8SPaul Durrant void xen_device_notify_event_channel(XenDevice *xendev,
131a3d669c8SPaul Durrant                                      XenEventChannel *channel,
132a3d669c8SPaul Durrant                                      Error **errp);
133a3d669c8SPaul Durrant void xen_device_unbind_event_channel(XenDevice *xendev,
134a3d669c8SPaul Durrant                                      XenEventChannel *channel,
135a3d669c8SPaul Durrant                                      Error **errp);
136a72ccc7fSDavid Woodhouse unsigned int xen_event_channel_get_local_port(XenEventChannel *channel);
137a3d669c8SPaul Durrant 
138108f7bbaSPaul Durrant #endif /* HW_XEN_BUS_H */
139