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