xref: /qemu/include/hw/xen/xen-bus.h (revision 4b34b5b14054edded15888448b0aad3723b99c29)
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 
1782a29e30SPaul Durrant typedef struct XenWatch XenWatch;
18108f7bbaSPaul Durrant 
19108f7bbaSPaul Durrant typedef struct XenDevice {
20108f7bbaSPaul Durrant     DeviceState qdev;
21094a2239SPaul Durrant     domid_t frontend_id;
22094a2239SPaul Durrant     char *name;
23094a2239SPaul Durrant     char *backend_path, *frontend_path;
24094a2239SPaul Durrant     enum xenbus_state backend_state, frontend_state;
25094a2239SPaul Durrant     Notifier exit;
2682a29e30SPaul Durrant     XenWatch *frontend_state_watch;
27*4b34b5b1SPaul Durrant     xengnttab_handle *xgth;
28*4b34b5b1SPaul Durrant     bool feature_grant_copy;
29108f7bbaSPaul Durrant } XenDevice;
30108f7bbaSPaul Durrant 
31094a2239SPaul Durrant typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp);
32108f7bbaSPaul Durrant typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp);
3382a29e30SPaul Durrant typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev,
3482a29e30SPaul Durrant                                          enum xenbus_state frontend_state,
3582a29e30SPaul Durrant                                          Error **errp);
36108f7bbaSPaul Durrant typedef void (*XenDeviceUnrealize)(XenDevice *xendev, Error **errp);
37108f7bbaSPaul Durrant 
38108f7bbaSPaul Durrant typedef struct XenDeviceClass {
39108f7bbaSPaul Durrant     /*< private >*/
40108f7bbaSPaul Durrant     DeviceClass parent_class;
41108f7bbaSPaul Durrant     /*< public >*/
42094a2239SPaul Durrant     const char *backend;
43094a2239SPaul Durrant     const char *device;
44094a2239SPaul Durrant     XenDeviceGetName get_name;
45108f7bbaSPaul Durrant     XenDeviceRealize realize;
4682a29e30SPaul Durrant     XenDeviceFrontendChanged frontend_changed;
47108f7bbaSPaul Durrant     XenDeviceUnrealize unrealize;
48108f7bbaSPaul Durrant } XenDeviceClass;
49108f7bbaSPaul Durrant 
50108f7bbaSPaul Durrant #define TYPE_XEN_DEVICE "xen-device"
51108f7bbaSPaul Durrant #define XEN_DEVICE(obj) \
52108f7bbaSPaul Durrant      OBJECT_CHECK(XenDevice, (obj), TYPE_XEN_DEVICE)
53108f7bbaSPaul Durrant #define XEN_DEVICE_CLASS(class) \
54108f7bbaSPaul Durrant      OBJECT_CLASS_CHECK(XenDeviceClass, (class), TYPE_XEN_DEVICE)
55108f7bbaSPaul Durrant #define XEN_DEVICE_GET_CLASS(obj) \
56108f7bbaSPaul Durrant      OBJECT_GET_CLASS(XenDeviceClass, (obj), TYPE_XEN_DEVICE)
57108f7bbaSPaul Durrant 
58108f7bbaSPaul Durrant typedef struct XenBus {
59108f7bbaSPaul Durrant     BusState qbus;
60094a2239SPaul Durrant     domid_t backend_id;
61094a2239SPaul Durrant     struct xs_handle *xsh;
6282a29e30SPaul Durrant     NotifierList watch_notifiers;
63108f7bbaSPaul Durrant } XenBus;
64108f7bbaSPaul Durrant 
65108f7bbaSPaul Durrant typedef struct XenBusClass {
66108f7bbaSPaul Durrant     /*< private >*/
67108f7bbaSPaul Durrant     BusClass parent_class;
68108f7bbaSPaul Durrant } XenBusClass;
69108f7bbaSPaul Durrant 
70108f7bbaSPaul Durrant #define TYPE_XEN_BUS "xen-bus"
71108f7bbaSPaul Durrant #define XEN_BUS(obj) \
72108f7bbaSPaul Durrant     OBJECT_CHECK(XenBus, (obj), TYPE_XEN_BUS)
73108f7bbaSPaul Durrant #define XEN_BUS_CLASS(class) \
74108f7bbaSPaul Durrant     OBJECT_CLASS_CHECK(XenBusClass, (class), TYPE_XEN_BUS)
75108f7bbaSPaul Durrant #define XEN_BUS_GET_CLASS(obj) \
76108f7bbaSPaul Durrant     OBJECT_GET_CLASS(XenBusClass, (obj), TYPE_XEN_BUS)
77108f7bbaSPaul Durrant 
78108f7bbaSPaul Durrant void xen_bus_init(void);
79108f7bbaSPaul Durrant 
8082a29e30SPaul Durrant void xen_device_backend_set_state(XenDevice *xendev,
8182a29e30SPaul Durrant                                   enum xenbus_state state);
8282a29e30SPaul Durrant enum xenbus_state xen_device_backend_get_state(XenDevice *xendev);
8382a29e30SPaul Durrant 
84*4b34b5b1SPaul Durrant void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs,
85*4b34b5b1SPaul Durrant                                    Error **errp);
86*4b34b5b1SPaul Durrant void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs,
87*4b34b5b1SPaul Durrant                                 unsigned int nr_refs, int prot,
88*4b34b5b1SPaul Durrant                                 Error **errp);
89*4b34b5b1SPaul Durrant void xen_device_unmap_grant_refs(XenDevice *xendev, void *map,
90*4b34b5b1SPaul Durrant                                  unsigned int nr_refs, Error **errp);
91*4b34b5b1SPaul Durrant 
92*4b34b5b1SPaul Durrant typedef struct XenDeviceGrantCopySegment {
93*4b34b5b1SPaul Durrant     union {
94*4b34b5b1SPaul Durrant         void *virt;
95*4b34b5b1SPaul Durrant         struct {
96*4b34b5b1SPaul Durrant             uint32_t ref;
97*4b34b5b1SPaul Durrant             off_t offset;
98*4b34b5b1SPaul Durrant         } foreign;
99*4b34b5b1SPaul Durrant     } source, dest;
100*4b34b5b1SPaul Durrant     size_t len;
101*4b34b5b1SPaul Durrant } XenDeviceGrantCopySegment;
102*4b34b5b1SPaul Durrant 
103*4b34b5b1SPaul Durrant void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain,
104*4b34b5b1SPaul Durrant                                 XenDeviceGrantCopySegment segs[],
105*4b34b5b1SPaul Durrant                                 unsigned int nr_segs, Error **errp);
106*4b34b5b1SPaul Durrant 
107108f7bbaSPaul Durrant #endif /* HW_XEN_BUS_H */
108