1 /* 2 * QEMU Hyper-V VMBus 3 * 4 * Copyright (c) 2017-2018 Virtuozzo International GmbH. 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or later. 7 * See the COPYING file in the top-level directory. 8 */ 9 10 #ifndef HW_HYPERV_VMBUS_H 11 #define HW_HYPERV_VMBUS_H 12 13 #include "sysemu/sysemu.h" 14 #include "sysemu/dma.h" 15 #include "hw/qdev-core.h" 16 #include "migration/vmstate.h" 17 #include "hw/hyperv/vmbus-proto.h" 18 #include "qemu/uuid.h" 19 20 #define TYPE_VMBUS_DEVICE "vmbus-dev" 21 22 #define VMBUS_DEVICE(obj) \ 23 OBJECT_CHECK(VMBusDevice, (obj), TYPE_VMBUS_DEVICE) 24 #define VMBUS_DEVICE_CLASS(klass) \ 25 OBJECT_CLASS_CHECK(VMBusDeviceClass, (klass), TYPE_VMBUS_DEVICE) 26 #define VMBUS_DEVICE_GET_CLASS(obj) \ 27 OBJECT_GET_CLASS(VMBusDeviceClass, (obj), TYPE_VMBUS_DEVICE) 28 29 #define TYPE_VMBUS "vmbus" 30 typedef struct VMBus VMBus; 31 #define VMBUS(obj) OBJECT_CHECK(VMBus, (obj), TYPE_VMBUS) 32 33 /* 34 * Object wrapping a GPADL -- GPA Descriptor List -- an array of guest physical 35 * pages, to be used for various buffers shared between the host and the guest. 36 */ 37 typedef struct VMBusGpadl VMBusGpadl; 38 /* 39 * VMBus channel -- a pair of ring buffers for either direction, placed within 40 * one GPADL, and the associated notification means. 41 */ 42 typedef struct VMBusChannel VMBusChannel; 43 /* 44 * Base class for VMBus devices. Includes one or more channels. Identified by 45 * class GUID and instance GUID. 46 */ 47 typedef struct VMBusDevice VMBusDevice; 48 49 typedef void(*VMBusChannelNotifyCb)(struct VMBusChannel *chan); 50 51 typedef struct VMBusDeviceClass { 52 DeviceClass parent; 53 54 QemuUUID classid; 55 QemuUUID instanceid; /* Fixed UUID for singleton devices */ 56 uint16_t channel_flags; 57 uint16_t mmio_size_mb; 58 59 /* Extentions to standard device callbacks */ 60 void (*vmdev_realize)(VMBusDevice *vdev, Error **errp); 61 void (*vmdev_unrealize)(VMBusDevice *vdev); 62 void (*vmdev_reset)(VMBusDevice *vdev); 63 /* 64 * Calculate the number of channels based on the device properties. Called 65 * at realize time. 66 **/ 67 uint16_t (*num_channels)(VMBusDevice *vdev); 68 /* 69 * Device-specific actions to complete the otherwise successful process of 70 * opening a channel. 71 * Return 0 on success, -errno on failure. 72 */ 73 int (*open_channel)(VMBusChannel *chan); 74 /* 75 * Device-specific actions to perform before closing a channel. 76 */ 77 void (*close_channel)(VMBusChannel *chan); 78 /* 79 * Main device worker; invoked in response to notifications from either 80 * side, when there's work to do with the data in the channel ring buffers. 81 */ 82 VMBusChannelNotifyCb chan_notify_cb; 83 } VMBusDeviceClass; 84 85 struct VMBusDevice { 86 DeviceState parent; 87 QemuUUID instanceid; 88 uint16_t num_channels; 89 VMBusChannel *channels; 90 AddressSpace *dma_as; 91 }; 92 93 extern const VMStateDescription vmstate_vmbus_dev; 94 95 /* 96 * A unit of work parsed out of a message in the receive (i.e. guest->host) 97 * ring buffer of a channel. It's supposed to be subclassed (through 98 * embedding) by the specific devices. 99 */ 100 typedef struct VMBusChanReq { 101 VMBusChannel *chan; 102 uint16_t pkt_type; 103 uint32_t msglen; 104 void *msg; 105 uint64_t transaction_id; 106 bool need_comp; 107 QEMUSGList sgl; 108 } VMBusChanReq; 109 110 VMBusDevice *vmbus_channel_device(VMBusChannel *chan); 111 VMBusChannel *vmbus_device_channel(VMBusDevice *dev, uint32_t chan_idx); 112 uint32_t vmbus_channel_idx(VMBusChannel *chan); 113 bool vmbus_channel_is_open(VMBusChannel *chan); 114 115 /* 116 * Notify (on guest's behalf) the host side of the channel that there's data in 117 * the ringbuffer to process. 118 */ 119 void vmbus_channel_notify_host(VMBusChannel *chan); 120 121 /* 122 * Reserve space for a packet in the send (i.e. host->guest) ringbuffer. If 123 * there isn't enough room, indicate that to the guest, to be notified when it 124 * becomes available. 125 * Return 0 on success, negative errno on failure. 126 * The ringbuffer indices are NOT updated, the requested space indicator may. 127 */ 128 int vmbus_channel_reserve(VMBusChannel *chan, 129 uint32_t desclen, uint32_t msglen); 130 131 /* 132 * Send a packet to the guest. The space for the packet MUST be reserved 133 * first. 134 * Return total number of bytes placed in the send ringbuffer on success, 135 * negative errno on failure. 136 * The ringbuffer indices are updated on success, and the guest is signaled if 137 * needed. 138 */ 139 ssize_t vmbus_channel_send(VMBusChannel *chan, uint16_t pkt_type, 140 void *desc, uint32_t desclen, 141 void *msg, uint32_t msglen, 142 bool need_comp, uint64_t transaction_id); 143 144 /* 145 * Prepare to fetch a batch of packets from the receive ring buffer. 146 * Return 0 on success, negative errno on failure. 147 */ 148 int vmbus_channel_recv_start(VMBusChannel *chan); 149 150 /* 151 * Shortcut for a common case of sending a simple completion packet with no 152 * auxiliary descriptors. 153 */ 154 ssize_t vmbus_channel_send_completion(VMBusChanReq *req, 155 void *msg, uint32_t msglen); 156 157 /* 158 * Peek at the receive (i.e. guest->host) ring buffer and extract a unit of 159 * work (a device-specific subclass of VMBusChanReq) from a packet if there's 160 * one. 161 * Return an allocated buffer, containing the request of @size with filled 162 * VMBusChanReq at the beginning, followed by the message payload, or NULL on 163 * failure. 164 * The ringbuffer indices are NOT updated, nor is the private copy of the read 165 * index. 166 */ 167 void *vmbus_channel_recv_peek(VMBusChannel *chan, uint32_t size); 168 169 /* 170 * Update the private copy of the read index once the preceding peek is deemed 171 * successful. 172 * The ringbuffer indices are NOT updated. 173 */ 174 void vmbus_channel_recv_pop(VMBusChannel *chan); 175 176 /* 177 * Propagate the private copy of the read index into the receive ring buffer, 178 * and thus complete the reception of a series of packets. Notify guest if 179 * needed. 180 * Return the number of bytes popped off the receive ring buffer by the 181 * preceding recv_peek/recv_pop calls on success, negative errno on failure. 182 */ 183 ssize_t vmbus_channel_recv_done(VMBusChannel *chan); 184 185 /* 186 * Free the request allocated by vmbus_channel_recv_peek, together with its 187 * fields. 188 */ 189 void vmbus_free_req(void *req); 190 191 /* 192 * Find and reference a GPADL by @gpadl_id. 193 * If not found return NULL. 194 */ 195 VMBusGpadl *vmbus_get_gpadl(VMBusChannel *chan, uint32_t gpadl_id); 196 197 /* 198 * Unreference @gpadl. If the reference count drops to zero, free it. 199 * @gpadl may be NULL, in which case nothing is done. 200 */ 201 void vmbus_put_gpadl(VMBusGpadl *gpadl); 202 203 /* 204 * Calculate total length in bytes of @gpadl. 205 * @gpadl must be valid. 206 */ 207 uint32_t vmbus_gpadl_len(VMBusGpadl *gpadl); 208 209 /* 210 * Copy data from @iov to @gpadl at offset @off. 211 * Return the number of bytes copied, or a negative status on failure. 212 */ 213 ssize_t vmbus_iov_to_gpadl(VMBusChannel *chan, VMBusGpadl *gpadl, uint32_t off, 214 const struct iovec *iov, size_t iov_cnt); 215 216 /* 217 * Map SGList contained in the request @req, at offset @off and no more than 218 * @len bytes, for io in direction @dir, and populate @iov with the mapped 219 * iovecs. 220 * Return the number of iovecs mapped, or negative status on failure. 221 */ 222 int vmbus_map_sgl(VMBusChanReq *req, DMADirection dir, struct iovec *iov, 223 unsigned iov_cnt, size_t len, size_t off); 224 225 /* 226 * Unmap *iov mapped with vmbus_map_sgl, marking the number of bytes @accessed. 227 */ 228 void vmbus_unmap_sgl(VMBusChanReq *req, DMADirection dir, struct iovec *iov, 229 unsigned iov_cnt, size_t accessed); 230 231 void vmbus_save_req(QEMUFile *f, VMBusChanReq *req); 232 void *vmbus_load_req(QEMUFile *f, VMBusDevice *dev, uint32_t size); 233 234 #endif 235