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; 274b34b5b1SPaul Durrant xengnttab_handle *xgth; 284b34b5b1SPaul Durrant bool feature_grant_copy; 29*a3d669c8SPaul Durrant xenevtchn_handle *xeh; 30*a3d669c8SPaul Durrant NotifierList event_notifiers; 31108f7bbaSPaul Durrant } XenDevice; 32108f7bbaSPaul Durrant 33094a2239SPaul Durrant typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp); 34108f7bbaSPaul Durrant typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp); 3582a29e30SPaul Durrant typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev, 3682a29e30SPaul Durrant enum xenbus_state frontend_state, 3782a29e30SPaul Durrant Error **errp); 38108f7bbaSPaul Durrant typedef void (*XenDeviceUnrealize)(XenDevice *xendev, Error **errp); 39108f7bbaSPaul Durrant 40108f7bbaSPaul Durrant typedef struct XenDeviceClass { 41108f7bbaSPaul Durrant /*< private >*/ 42108f7bbaSPaul Durrant DeviceClass parent_class; 43108f7bbaSPaul Durrant /*< public >*/ 44094a2239SPaul Durrant const char *backend; 45094a2239SPaul Durrant const char *device; 46094a2239SPaul Durrant XenDeviceGetName get_name; 47108f7bbaSPaul Durrant XenDeviceRealize realize; 4882a29e30SPaul Durrant XenDeviceFrontendChanged frontend_changed; 49108f7bbaSPaul Durrant XenDeviceUnrealize unrealize; 50108f7bbaSPaul Durrant } XenDeviceClass; 51108f7bbaSPaul Durrant 52108f7bbaSPaul Durrant #define TYPE_XEN_DEVICE "xen-device" 53108f7bbaSPaul Durrant #define XEN_DEVICE(obj) \ 54108f7bbaSPaul Durrant OBJECT_CHECK(XenDevice, (obj), TYPE_XEN_DEVICE) 55108f7bbaSPaul Durrant #define XEN_DEVICE_CLASS(class) \ 56108f7bbaSPaul Durrant OBJECT_CLASS_CHECK(XenDeviceClass, (class), TYPE_XEN_DEVICE) 57108f7bbaSPaul Durrant #define XEN_DEVICE_GET_CLASS(obj) \ 58108f7bbaSPaul Durrant OBJECT_GET_CLASS(XenDeviceClass, (obj), TYPE_XEN_DEVICE) 59108f7bbaSPaul Durrant 60108f7bbaSPaul Durrant typedef struct XenBus { 61108f7bbaSPaul Durrant BusState qbus; 62094a2239SPaul Durrant domid_t backend_id; 63094a2239SPaul Durrant struct xs_handle *xsh; 6482a29e30SPaul Durrant NotifierList watch_notifiers; 65108f7bbaSPaul Durrant } XenBus; 66108f7bbaSPaul Durrant 67108f7bbaSPaul Durrant typedef struct XenBusClass { 68108f7bbaSPaul Durrant /*< private >*/ 69108f7bbaSPaul Durrant BusClass parent_class; 70108f7bbaSPaul Durrant } XenBusClass; 71108f7bbaSPaul Durrant 72108f7bbaSPaul Durrant #define TYPE_XEN_BUS "xen-bus" 73108f7bbaSPaul Durrant #define XEN_BUS(obj) \ 74108f7bbaSPaul Durrant OBJECT_CHECK(XenBus, (obj), TYPE_XEN_BUS) 75108f7bbaSPaul Durrant #define XEN_BUS_CLASS(class) \ 76108f7bbaSPaul Durrant OBJECT_CLASS_CHECK(XenBusClass, (class), TYPE_XEN_BUS) 77108f7bbaSPaul Durrant #define XEN_BUS_GET_CLASS(obj) \ 78108f7bbaSPaul Durrant OBJECT_GET_CLASS(XenBusClass, (obj), TYPE_XEN_BUS) 79108f7bbaSPaul Durrant 80108f7bbaSPaul Durrant void xen_bus_init(void); 81108f7bbaSPaul Durrant 8282a29e30SPaul Durrant void xen_device_backend_set_state(XenDevice *xendev, 8382a29e30SPaul Durrant enum xenbus_state state); 8482a29e30SPaul Durrant enum xenbus_state xen_device_backend_get_state(XenDevice *xendev); 8582a29e30SPaul Durrant 864b34b5b1SPaul Durrant void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs, 874b34b5b1SPaul Durrant Error **errp); 884b34b5b1SPaul Durrant void *xen_device_map_grant_refs(XenDevice *xendev, uint32_t *refs, 894b34b5b1SPaul Durrant unsigned int nr_refs, int prot, 904b34b5b1SPaul Durrant Error **errp); 914b34b5b1SPaul Durrant void xen_device_unmap_grant_refs(XenDevice *xendev, void *map, 924b34b5b1SPaul Durrant unsigned int nr_refs, Error **errp); 934b34b5b1SPaul Durrant 944b34b5b1SPaul Durrant typedef struct XenDeviceGrantCopySegment { 954b34b5b1SPaul Durrant union { 964b34b5b1SPaul Durrant void *virt; 974b34b5b1SPaul Durrant struct { 984b34b5b1SPaul Durrant uint32_t ref; 994b34b5b1SPaul Durrant off_t offset; 1004b34b5b1SPaul Durrant } foreign; 1014b34b5b1SPaul Durrant } source, dest; 1024b34b5b1SPaul Durrant size_t len; 1034b34b5b1SPaul Durrant } XenDeviceGrantCopySegment; 1044b34b5b1SPaul Durrant 1054b34b5b1SPaul Durrant void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain, 1064b34b5b1SPaul Durrant XenDeviceGrantCopySegment segs[], 1074b34b5b1SPaul Durrant unsigned int nr_segs, Error **errp); 1084b34b5b1SPaul Durrant 109*a3d669c8SPaul Durrant typedef struct XenEventChannel XenEventChannel; 110*a3d669c8SPaul Durrant 111*a3d669c8SPaul Durrant typedef void (*XenEventHandler)(void *opaque); 112*a3d669c8SPaul Durrant 113*a3d669c8SPaul Durrant XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev, 114*a3d669c8SPaul Durrant unsigned int port, 115*a3d669c8SPaul Durrant XenEventHandler handler, 116*a3d669c8SPaul Durrant void *opaque, Error **errp); 117*a3d669c8SPaul Durrant void xen_device_notify_event_channel(XenDevice *xendev, 118*a3d669c8SPaul Durrant XenEventChannel *channel, 119*a3d669c8SPaul Durrant Error **errp); 120*a3d669c8SPaul Durrant void xen_device_unbind_event_channel(XenDevice *xendev, 121*a3d669c8SPaul Durrant XenEventChannel *channel, 122*a3d669c8SPaul Durrant Error **errp); 123*a3d669c8SPaul Durrant 124108f7bbaSPaul Durrant #endif /* HW_XEN_BUS_H */ 125