xref: /openbmc/qemu/include/hw/xen/xen-bus.h (revision 0c4e9931)
1 /*
2  * Copyright (c) 2018  Citrix Systems Inc.
3  *
4  * This work is licensed under the terms of the GNU GPL, version 2 or later.
5  * See the COPYING file in the top-level directory.
6  */
7 
8 #ifndef HW_XEN_BUS_H
9 #define HW_XEN_BUS_H
10 
11 #include "hw/xen/xen_common.h"
12 #include "hw/sysbus.h"
13 #include "qemu/notify.h"
14 
15 typedef void (*XenWatchHandler)(void *opaque);
16 
17 typedef struct XenWatchList XenWatchList;
18 typedef struct XenWatch XenWatch;
19 typedef struct XenEventChannel XenEventChannel;
20 
21 typedef struct XenDevice {
22     DeviceState qdev;
23     domid_t frontend_id;
24     char *name;
25     struct xs_handle *xsh;
26     XenWatchList *watch_list;
27     char *backend_path, *frontend_path;
28     enum xenbus_state backend_state, frontend_state;
29     Notifier exit;
30     XenWatch *backend_state_watch, *frontend_state_watch;
31     bool backend_online;
32     XenWatch *backend_online_watch;
33     xengnttab_handle *xgth;
34     bool feature_grant_copy;
35     bool inactive;
36     QLIST_HEAD(, XenEventChannel) event_channels;
37     QLIST_ENTRY(XenDevice) list;
38 } XenDevice;
39 
40 typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp);
41 typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp);
42 typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev,
43                                          enum xenbus_state frontend_state,
44                                          Error **errp);
45 typedef void (*XenDeviceUnrealize)(XenDevice *xendev);
46 
47 typedef struct XenDeviceClass {
48     /*< private >*/
49     DeviceClass parent_class;
50     /*< public >*/
51     const char *backend;
52     const char *device;
53     XenDeviceGetName get_name;
54     XenDeviceRealize realize;
55     XenDeviceFrontendChanged frontend_changed;
56     XenDeviceUnrealize unrealize;
57 } XenDeviceClass;
58 
59 #define TYPE_XEN_DEVICE "xen-device"
60 #define XEN_DEVICE(obj) \
61      OBJECT_CHECK(XenDevice, (obj), TYPE_XEN_DEVICE)
62 #define XEN_DEVICE_CLASS(class) \
63      OBJECT_CLASS_CHECK(XenDeviceClass, (class), TYPE_XEN_DEVICE)
64 #define XEN_DEVICE_GET_CLASS(obj) \
65      OBJECT_GET_CLASS(XenDeviceClass, (obj), TYPE_XEN_DEVICE)
66 
67 typedef struct XenBus {
68     BusState qbus;
69     domid_t backend_id;
70     struct xs_handle *xsh;
71     XenWatchList *watch_list;
72     XenWatch *backend_watch;
73     QLIST_HEAD(, XenDevice) inactive_devices;
74 } XenBus;
75 
76 typedef struct XenBusClass {
77     /*< private >*/
78     BusClass parent_class;
79 } XenBusClass;
80 
81 #define TYPE_XEN_BUS "xen-bus"
82 #define XEN_BUS(obj) \
83     OBJECT_CHECK(XenBus, (obj), TYPE_XEN_BUS)
84 #define XEN_BUS_CLASS(class) \
85     OBJECT_CLASS_CHECK(XenBusClass, (class), TYPE_XEN_BUS)
86 #define XEN_BUS_GET_CLASS(obj) \
87     OBJECT_GET_CLASS(XenBusClass, (obj), TYPE_XEN_BUS)
88 
89 void xen_bus_init(void);
90 
91 void xen_device_backend_set_state(XenDevice *xendev,
92                                   enum xenbus_state state);
93 enum xenbus_state xen_device_backend_get_state(XenDevice *xendev);
94 
95 void xen_device_backend_printf(XenDevice *xendev, const char *key,
96                                const char *fmt, ...)
97     GCC_FMT_ATTR(3, 4);
98 void xen_device_frontend_printf(XenDevice *xendev, const char *key,
99                                 const char *fmt, ...)
100     GCC_FMT_ATTR(3, 4);
101 
102 int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
103                               const char *fmt, ...);
104 
105 void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs,
106                                    Error **errp);
107 void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs,
108                                 unsigned int nr_refs, int prot,
109                                 Error **errp);
110 void xen_device_unmap_grant_refs(XenDevice *xendev, void *map,
111                                  unsigned int nr_refs, Error **errp);
112 
113 typedef struct XenDeviceGrantCopySegment {
114     union {
115         void *virt;
116         struct {
117             uint32_t ref;
118             off_t offset;
119         } foreign;
120     } source, dest;
121     size_t len;
122 } XenDeviceGrantCopySegment;
123 
124 void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain,
125                                 XenDeviceGrantCopySegment segs[],
126                                 unsigned int nr_segs, Error **errp);
127 
128 typedef bool (*XenEventHandler)(void *opaque);
129 
130 XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
131                                                unsigned int port,
132                                                XenEventHandler handler,
133                                                void *opaque, Error **errp);
134 void xen_device_set_event_channel_context(XenDevice *xendev,
135                                           XenEventChannel *channel,
136                                           AioContext *ctx,
137                                           Error **errp);
138 void xen_device_notify_event_channel(XenDevice *xendev,
139                                      XenEventChannel *channel,
140                                      Error **errp);
141 void xen_device_unbind_event_channel(XenDevice *xendev,
142                                      XenEventChannel *channel,
143                                      Error **errp);
144 
145 #endif /* HW_XEN_BUS_H */
146