xref: /qemu/include/hw/virtio/vhost.h (revision 309750fad51f17d1ec6195c5d8ad7d741596ddb6)
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