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