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" 14db1015e9SEduardo Habkost #include "qom/object.h" 1582a29e30SPaul Durrant 1682a29e30SPaul Durrant typedef void (*XenWatchHandler)(void *opaque); 1782a29e30SPaul Durrant 18374752a2SPaul Durrant typedef struct XenWatchList XenWatchList; 1982a29e30SPaul Durrant typedef struct XenWatch XenWatch; 20c0b336eaSPaul Durrant typedef struct XenEventChannel XenEventChannel; 21108f7bbaSPaul Durrant 22db1015e9SEduardo Habkost struct XenDevice { 23108f7bbaSPaul Durrant DeviceState qdev; 24094a2239SPaul Durrant domid_t frontend_id; 25094a2239SPaul Durrant char *name; 26d198b711SPaul Durrant struct xs_handle *xsh; 27d198b711SPaul Durrant XenWatchList *watch_list; 28094a2239SPaul Durrant char *backend_path, *frontend_path; 29094a2239SPaul Durrant enum xenbus_state backend_state, frontend_state; 30094a2239SPaul Durrant Notifier exit; 31b6af8926SPaul Durrant XenWatch *backend_state_watch, *frontend_state_watch; 32b6af8926SPaul Durrant bool backend_online; 33b6af8926SPaul Durrant XenWatch *backend_online_watch; 344b34b5b1SPaul Durrant xengnttab_handle *xgth; 354b34b5b1SPaul Durrant bool feature_grant_copy; 363809f758SPaul Durrant bool inactive; 37c0b336eaSPaul Durrant QLIST_HEAD(, XenEventChannel) event_channels; 383809f758SPaul Durrant QLIST_ENTRY(XenDevice) list; 39db1015e9SEduardo Habkost }; 40db1015e9SEduardo Habkost typedef struct XenDevice XenDevice; 41108f7bbaSPaul Durrant 42094a2239SPaul Durrant typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp); 43108f7bbaSPaul Durrant typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp); 4482a29e30SPaul Durrant typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev, 4582a29e30SPaul Durrant enum xenbus_state frontend_state, 4682a29e30SPaul Durrant Error **errp); 47b69c3c21SMarkus Armbruster typedef void (*XenDeviceUnrealize)(XenDevice *xendev); 48108f7bbaSPaul Durrant 49db1015e9SEduardo Habkost struct XenDeviceClass { 50108f7bbaSPaul Durrant /*< private >*/ 51108f7bbaSPaul Durrant DeviceClass parent_class; 52108f7bbaSPaul Durrant /*< public >*/ 53094a2239SPaul Durrant const char *backend; 54094a2239SPaul Durrant const char *device; 55094a2239SPaul Durrant XenDeviceGetName get_name; 56108f7bbaSPaul Durrant XenDeviceRealize realize; 5782a29e30SPaul Durrant XenDeviceFrontendChanged frontend_changed; 58108f7bbaSPaul Durrant XenDeviceUnrealize unrealize; 59db1015e9SEduardo Habkost }; 60db1015e9SEduardo Habkost typedef struct XenDeviceClass XenDeviceClass; 61108f7bbaSPaul Durrant 62108f7bbaSPaul Durrant #define TYPE_XEN_DEVICE "xen-device" 63*8110fa1dSEduardo Habkost DECLARE_OBJ_CHECKERS(XenDevice, XenDeviceClass, 64*8110fa1dSEduardo Habkost XEN_DEVICE, TYPE_XEN_DEVICE) 65108f7bbaSPaul Durrant 66db1015e9SEduardo Habkost struct XenBus { 67108f7bbaSPaul Durrant BusState qbus; 68094a2239SPaul Durrant domid_t backend_id; 69094a2239SPaul Durrant struct xs_handle *xsh; 70374752a2SPaul Durrant XenWatchList *watch_list; 71a783f8adSPaul Durrant XenWatch *backend_watch; 723809f758SPaul Durrant QLIST_HEAD(, XenDevice) inactive_devices; 73db1015e9SEduardo Habkost }; 74db1015e9SEduardo Habkost typedef struct XenBus XenBus; 75108f7bbaSPaul Durrant 76db1015e9SEduardo Habkost struct XenBusClass { 77108f7bbaSPaul Durrant /*< private >*/ 78108f7bbaSPaul Durrant BusClass parent_class; 79db1015e9SEduardo Habkost }; 80db1015e9SEduardo Habkost typedef struct XenBusClass XenBusClass; 81108f7bbaSPaul Durrant 82108f7bbaSPaul Durrant #define TYPE_XEN_BUS "xen-bus" 83*8110fa1dSEduardo Habkost DECLARE_OBJ_CHECKERS(XenBus, XenBusClass, 84*8110fa1dSEduardo Habkost XEN_BUS, TYPE_XEN_BUS) 85108f7bbaSPaul Durrant 86108f7bbaSPaul Durrant void xen_bus_init(void); 87108f7bbaSPaul Durrant 8882a29e30SPaul Durrant void xen_device_backend_set_state(XenDevice *xendev, 8982a29e30SPaul Durrant enum xenbus_state state); 9082a29e30SPaul Durrant enum xenbus_state xen_device_backend_get_state(XenDevice *xendev); 9182a29e30SPaul Durrant 92b6af8926SPaul Durrant void xen_device_backend_printf(XenDevice *xendev, const char *key, 93b6af8926SPaul Durrant const char *fmt, ...) 94b6af8926SPaul Durrant GCC_FMT_ATTR(3, 4); 95b6af8926SPaul Durrant void xen_device_frontend_printf(XenDevice *xendev, const char *key, 96b6af8926SPaul Durrant const char *fmt, ...) 97b6af8926SPaul Durrant GCC_FMT_ATTR(3, 4); 98b6af8926SPaul Durrant 99b6af8926SPaul Durrant int xen_device_frontend_scanf(XenDevice *xendev, const char *key, 100b6af8926SPaul Durrant const char *fmt, ...); 101b6af8926SPaul Durrant 1024b34b5b1SPaul Durrant void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs, 1034b34b5b1SPaul Durrant Error **errp); 1044b34b5b1SPaul Durrant void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs, 1054b34b5b1SPaul Durrant unsigned int nr_refs, int prot, 1064b34b5b1SPaul Durrant Error **errp); 1074b34b5b1SPaul Durrant void xen_device_unmap_grant_refs(XenDevice *xendev, void *map, 1084b34b5b1SPaul Durrant unsigned int nr_refs, Error **errp); 1094b34b5b1SPaul Durrant 1104b34b5b1SPaul Durrant typedef struct XenDeviceGrantCopySegment { 1114b34b5b1SPaul Durrant union { 1124b34b5b1SPaul Durrant void *virt; 1134b34b5b1SPaul Durrant struct { 1144b34b5b1SPaul Durrant uint32_t ref; 1154b34b5b1SPaul Durrant off_t offset; 1164b34b5b1SPaul Durrant } foreign; 1174b34b5b1SPaul Durrant } source, dest; 1184b34b5b1SPaul Durrant size_t len; 1194b34b5b1SPaul Durrant } XenDeviceGrantCopySegment; 1204b34b5b1SPaul Durrant 1214b34b5b1SPaul Durrant void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain, 1224b34b5b1SPaul Durrant XenDeviceGrantCopySegment segs[], 1234b34b5b1SPaul Durrant unsigned int nr_segs, Error **errp); 1244b34b5b1SPaul Durrant 125345f42b4SPaul Durrant typedef bool (*XenEventHandler)(void *opaque); 126a3d669c8SPaul Durrant 127a3d669c8SPaul Durrant XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev, 128a3d669c8SPaul Durrant unsigned int port, 129a3d669c8SPaul Durrant XenEventHandler handler, 130a3d669c8SPaul Durrant void *opaque, Error **errp); 13132d0b7beSPaul Durrant void xen_device_set_event_channel_context(XenDevice *xendev, 13232d0b7beSPaul Durrant XenEventChannel *channel, 13332d0b7beSPaul Durrant AioContext *ctx, 13432d0b7beSPaul Durrant Error **errp); 135a3d669c8SPaul Durrant void xen_device_notify_event_channel(XenDevice *xendev, 136a3d669c8SPaul Durrant XenEventChannel *channel, 137a3d669c8SPaul Durrant Error **errp); 138a3d669c8SPaul Durrant void xen_device_unbind_event_channel(XenDevice *xendev, 139a3d669c8SPaul Durrant XenEventChannel *channel, 140a3d669c8SPaul Durrant Error **errp); 141a3d669c8SPaul Durrant 142108f7bbaSPaul Durrant #endif /* HW_XEN_BUS_H */ 143