xref: /qemu/include/hw/xen/xen-bus.h (revision b69c3c21a5d11075d42100d5cfe0a736593fae6b)
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 
11094a2239SPaul Durrant #include "hw/xen/xen_common.h"
12108f7bbaSPaul Durrant #include "hw/sysbus.h"
1382a29e30SPaul Durrant #include "qemu/notify.h"
1482a29e30SPaul Durrant 
1582a29e30SPaul Durrant typedef void (*XenWatchHandler)(void *opaque);
1682a29e30SPaul Durrant 
17374752a2SPaul Durrant typedef struct XenWatchList XenWatchList;
1882a29e30SPaul Durrant typedef struct XenWatch XenWatch;
19c0b336eaSPaul Durrant typedef struct XenEventChannel XenEventChannel;
20108f7bbaSPaul Durrant 
21108f7bbaSPaul Durrant typedef struct XenDevice {
22108f7bbaSPaul Durrant     DeviceState qdev;
23094a2239SPaul Durrant     domid_t frontend_id;
24094a2239SPaul Durrant     char *name;
25d198b711SPaul Durrant     struct xs_handle *xsh;
26d198b711SPaul Durrant     XenWatchList *watch_list;
27094a2239SPaul Durrant     char *backend_path, *frontend_path;
28094a2239SPaul Durrant     enum xenbus_state backend_state, frontend_state;
29094a2239SPaul Durrant     Notifier exit;
30b6af8926SPaul Durrant     XenWatch *backend_state_watch, *frontend_state_watch;
31b6af8926SPaul Durrant     bool backend_online;
32b6af8926SPaul Durrant     XenWatch *backend_online_watch;
334b34b5b1SPaul Durrant     xengnttab_handle *xgth;
344b34b5b1SPaul Durrant     bool feature_grant_copy;
353809f758SPaul Durrant     bool inactive;
36c0b336eaSPaul Durrant     QLIST_HEAD(, XenEventChannel) event_channels;
373809f758SPaul Durrant     QLIST_ENTRY(XenDevice) list;
38108f7bbaSPaul Durrant } XenDevice;
39108f7bbaSPaul Durrant 
40094a2239SPaul Durrant typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp);
41108f7bbaSPaul Durrant typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp);
4282a29e30SPaul Durrant typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev,
4382a29e30SPaul Durrant                                          enum xenbus_state frontend_state,
4482a29e30SPaul Durrant                                          Error **errp);
45*b69c3c21SMarkus Armbruster typedef void (*XenDeviceUnrealize)(XenDevice *xendev);
46108f7bbaSPaul Durrant 
47108f7bbaSPaul Durrant typedef struct XenDeviceClass {
48108f7bbaSPaul Durrant     /*< private >*/
49108f7bbaSPaul Durrant     DeviceClass parent_class;
50108f7bbaSPaul Durrant     /*< public >*/
51094a2239SPaul Durrant     const char *backend;
52094a2239SPaul Durrant     const char *device;
53094a2239SPaul Durrant     XenDeviceGetName get_name;
54108f7bbaSPaul Durrant     XenDeviceRealize realize;
5582a29e30SPaul Durrant     XenDeviceFrontendChanged frontend_changed;
56108f7bbaSPaul Durrant     XenDeviceUnrealize unrealize;
57108f7bbaSPaul Durrant } XenDeviceClass;
58108f7bbaSPaul Durrant 
59108f7bbaSPaul Durrant #define TYPE_XEN_DEVICE "xen-device"
60108f7bbaSPaul Durrant #define XEN_DEVICE(obj) \
61108f7bbaSPaul Durrant      OBJECT_CHECK(XenDevice, (obj), TYPE_XEN_DEVICE)
62108f7bbaSPaul Durrant #define XEN_DEVICE_CLASS(class) \
63108f7bbaSPaul Durrant      OBJECT_CLASS_CHECK(XenDeviceClass, (class), TYPE_XEN_DEVICE)
64108f7bbaSPaul Durrant #define XEN_DEVICE_GET_CLASS(obj) \
65108f7bbaSPaul Durrant      OBJECT_GET_CLASS(XenDeviceClass, (obj), TYPE_XEN_DEVICE)
66108f7bbaSPaul Durrant 
67108f7bbaSPaul Durrant typedef struct XenBus {
68108f7bbaSPaul Durrant     BusState qbus;
69094a2239SPaul Durrant     domid_t backend_id;
70094a2239SPaul Durrant     struct xs_handle *xsh;
71374752a2SPaul Durrant     XenWatchList *watch_list;
72a783f8adSPaul Durrant     XenWatch *backend_watch;
733809f758SPaul Durrant     QLIST_HEAD(, XenDevice) inactive_devices;
74108f7bbaSPaul Durrant } XenBus;
75108f7bbaSPaul Durrant 
76108f7bbaSPaul Durrant typedef struct XenBusClass {
77108f7bbaSPaul Durrant     /*< private >*/
78108f7bbaSPaul Durrant     BusClass parent_class;
79108f7bbaSPaul Durrant } XenBusClass;
80108f7bbaSPaul Durrant 
81108f7bbaSPaul Durrant #define TYPE_XEN_BUS "xen-bus"
82108f7bbaSPaul Durrant #define XEN_BUS(obj) \
83108f7bbaSPaul Durrant     OBJECT_CHECK(XenBus, (obj), TYPE_XEN_BUS)
84108f7bbaSPaul Durrant #define XEN_BUS_CLASS(class) \
85108f7bbaSPaul Durrant     OBJECT_CLASS_CHECK(XenBusClass, (class), TYPE_XEN_BUS)
86108f7bbaSPaul Durrant #define XEN_BUS_GET_CLASS(obj) \
87108f7bbaSPaul Durrant     OBJECT_GET_CLASS(XenBusClass, (obj), TYPE_XEN_BUS)
88108f7bbaSPaul Durrant 
89108f7bbaSPaul Durrant void xen_bus_init(void);
90108f7bbaSPaul Durrant 
9182a29e30SPaul Durrant void xen_device_backend_set_state(XenDevice *xendev,
9282a29e30SPaul Durrant                                   enum xenbus_state state);
9382a29e30SPaul Durrant enum xenbus_state xen_device_backend_get_state(XenDevice *xendev);
9482a29e30SPaul Durrant 
95b6af8926SPaul Durrant void xen_device_backend_printf(XenDevice *xendev, const char *key,
96b6af8926SPaul Durrant                                const char *fmt, ...)
97b6af8926SPaul Durrant     GCC_FMT_ATTR(3, 4);
98b6af8926SPaul Durrant void xen_device_frontend_printf(XenDevice *xendev, const char *key,
99b6af8926SPaul Durrant                                 const char *fmt, ...)
100b6af8926SPaul Durrant     GCC_FMT_ATTR(3, 4);
101b6af8926SPaul Durrant 
102b6af8926SPaul Durrant int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
103b6af8926SPaul Durrant                               const char *fmt, ...);
104b6af8926SPaul Durrant 
1054b34b5b1SPaul Durrant void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs,
1064b34b5b1SPaul Durrant                                    Error **errp);
1074b34b5b1SPaul Durrant void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs,
1084b34b5b1SPaul Durrant                                 unsigned int nr_refs, int prot,
1094b34b5b1SPaul Durrant                                 Error **errp);
1104b34b5b1SPaul Durrant void xen_device_unmap_grant_refs(XenDevice *xendev, void *map,
1114b34b5b1SPaul Durrant                                  unsigned int nr_refs, Error **errp);
1124b34b5b1SPaul Durrant 
1134b34b5b1SPaul Durrant typedef struct XenDeviceGrantCopySegment {
1144b34b5b1SPaul Durrant     union {
1154b34b5b1SPaul Durrant         void *virt;
1164b34b5b1SPaul Durrant         struct {
1174b34b5b1SPaul Durrant             uint32_t ref;
1184b34b5b1SPaul Durrant             off_t offset;
1194b34b5b1SPaul Durrant         } foreign;
1204b34b5b1SPaul Durrant     } source, dest;
1214b34b5b1SPaul Durrant     size_t len;
1224b34b5b1SPaul Durrant } XenDeviceGrantCopySegment;
1234b34b5b1SPaul Durrant 
1244b34b5b1SPaul Durrant void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain,
1254b34b5b1SPaul Durrant                                 XenDeviceGrantCopySegment segs[],
1264b34b5b1SPaul Durrant                                 unsigned int nr_segs, Error **errp);
1274b34b5b1SPaul Durrant 
128345f42b4SPaul Durrant typedef bool (*XenEventHandler)(void *opaque);
129a3d669c8SPaul Durrant 
130a3d669c8SPaul Durrant XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
131a3d669c8SPaul Durrant                                                unsigned int port,
132a3d669c8SPaul Durrant                                                XenEventHandler handler,
133a3d669c8SPaul Durrant                                                void *opaque, Error **errp);
13432d0b7beSPaul Durrant void xen_device_set_event_channel_context(XenDevice *xendev,
13532d0b7beSPaul Durrant                                           XenEventChannel *channel,
13632d0b7beSPaul Durrant                                           AioContext *ctx,
13732d0b7beSPaul Durrant                                           Error **errp);
138a3d669c8SPaul Durrant void xen_device_notify_event_channel(XenDevice *xendev,
139a3d669c8SPaul Durrant                                      XenEventChannel *channel,
140a3d669c8SPaul Durrant                                      Error **errp);
141a3d669c8SPaul Durrant void xen_device_unbind_event_channel(XenDevice *xendev,
142a3d669c8SPaul Durrant                                      XenEventChannel *channel,
143a3d669c8SPaul Durrant                                      Error **errp);
144a3d669c8SPaul Durrant 
145108f7bbaSPaul Durrant #endif /* HW_XEN_BUS_H */
146