1d5970055SMichael S. Tsirkin #ifndef VHOST_H 2d5970055SMichael S. Tsirkin #define VHOST_H 3d5970055SMichael S. Tsirkin 4d5970055SMichael S. Tsirkin #include "hw/hw.h" 524d1eb33SNikolay Nikolaev #include "hw/virtio/vhost-backend.h" 60d09e41aSPaolo Bonzini #include "hw/virtio/virtio.h" 7022c62cbSPaolo Bonzini #include "exec/memory.h" 8d5970055SMichael S. Tsirkin 9d5970055SMichael S. Tsirkin /* Generic structures common for any vhost based device. */ 10d5970055SMichael S. Tsirkin struct vhost_virtqueue { 11d5970055SMichael S. Tsirkin int kick; 12d5970055SMichael S. Tsirkin int call; 13d5970055SMichael S. Tsirkin void *desc; 14d5970055SMichael S. Tsirkin void *avail; 15d5970055SMichael S. Tsirkin void *used; 16d5970055SMichael S. Tsirkin int num; 17d5970055SMichael S. Tsirkin unsigned long long used_phys; 18d5970055SMichael S. Tsirkin unsigned used_size; 19d5970055SMichael S. Tsirkin void *ring; 20d5970055SMichael S. Tsirkin unsigned long long ring_phys; 21d5970055SMichael S. Tsirkin unsigned ring_size; 22f56a1247SMichael S. Tsirkin EventNotifier masked_notifier; 23d5970055SMichael S. Tsirkin }; 24d5970055SMichael S. Tsirkin 25d5970055SMichael S. Tsirkin typedef unsigned long vhost_log_chunk_t; 26d5970055SMichael S. Tsirkin #define VHOST_LOG_PAGE 0x1000 27d5970055SMichael S. Tsirkin #define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t)) 28d5970055SMichael S. Tsirkin #define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS) 292e6d46d7SNikolay Nikolaev #define VHOST_INVALID_FEATURE_BIT (0xff) 30d5970055SMichael S. Tsirkin 31*309750faSJason Wang struct vhost_log { 32*309750faSJason Wang unsigned long long size; 33*309750faSJason Wang int refcnt; 34*309750faSJason Wang vhost_log_chunk_t log[0]; 35*309750faSJason Wang }; 36*309750faSJason Wang 37d5970055SMichael S. Tsirkin struct vhost_memory; 38d5970055SMichael S. Tsirkin struct vhost_dev { 3904097f7cSAvi Kivity MemoryListener memory_listener; 40d5970055SMichael S. Tsirkin struct vhost_memory *mem; 412817b260SAvi Kivity int n_mem_sections; 422817b260SAvi Kivity MemoryRegionSection *mem_sections; 43d5970055SMichael S. Tsirkin struct vhost_virtqueue *vqs; 44d5970055SMichael S. Tsirkin int nvqs; 459be6e69fSGreg Kurz /* the first virtqueue which would be used by this vhost dev */ 46a9f98bb5SJason Wang int vq_index; 47d5970055SMichael S. Tsirkin unsigned long long features; 48d5970055SMichael S. Tsirkin unsigned long long acked_features; 49d5970055SMichael S. Tsirkin unsigned long long backend_features; 50d5970055SMichael S. Tsirkin bool started; 51d5970055SMichael S. Tsirkin bool log_enabled; 52d5970055SMichael S. Tsirkin unsigned long long log_size; 537145872eSMichael S. Tsirkin Error *migration_blocker; 545430a28fSmst@redhat.com bool force; 55af603142SNicholas Bellinger bool memory_changed; 56af603142SNicholas Bellinger hwaddr mem_changed_start_addr; 57af603142SNicholas Bellinger hwaddr mem_changed_end_addr; 5824d1eb33SNikolay Nikolaev const VhostOps *vhost_ops; 591a1bfac9SNikolay Nikolaev void *opaque; 60*309750faSJason Wang struct vhost_log *log; 61d5970055SMichael S. Tsirkin }; 62d5970055SMichael S. Tsirkin 6381647a65SNikolay Nikolaev int vhost_dev_init(struct vhost_dev *hdev, void *opaque, 641a1bfac9SNikolay Nikolaev VhostBackendType backend_type, bool force); 65d5970055SMichael S. Tsirkin void vhost_dev_cleanup(struct vhost_dev *hdev); 665430a28fSmst@redhat.com bool vhost_dev_query(struct vhost_dev *hdev, VirtIODevice *vdev); 67d5970055SMichael S. Tsirkin int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev); 68d5970055SMichael S. Tsirkin void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev); 69b0b3db79SMichael S. Tsirkin int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); 70b0b3db79SMichael S. Tsirkin void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); 71d5970055SMichael S. Tsirkin 72f56a1247SMichael S. Tsirkin /* Test and clear masked event pending status. 73f56a1247SMichael S. Tsirkin * Should be called after unmask to avoid losing events. 74f56a1247SMichael S. Tsirkin */ 75f56a1247SMichael S. Tsirkin bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n); 76f56a1247SMichael S. Tsirkin 77f56a1247SMichael S. Tsirkin /* Mask/unmask events from this vq. 78f56a1247SMichael S. Tsirkin */ 79f56a1247SMichael S. Tsirkin void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, 80f56a1247SMichael S. Tsirkin bool mask); 812e6d46d7SNikolay Nikolaev unsigned vhost_get_features(struct vhost_dev *hdev, const int *feature_bits, 822e6d46d7SNikolay Nikolaev unsigned features); 832e6d46d7SNikolay Nikolaev void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits, 842e6d46d7SNikolay Nikolaev unsigned features); 85d5970055SMichael S. Tsirkin #endif 86