xref: /openbmc/qemu/include/hw/virtio/vhost.h (revision dfbd2768)
1 #ifndef VHOST_H
2 #define VHOST_H
3 
4 #include "hw/hw.h"
5 #include "hw/virtio/vhost-backend.h"
6 #include "hw/virtio/virtio.h"
7 #include "exec/memory.h"
8 
9 /* Generic structures common for any vhost based device. */
10 struct vhost_virtqueue {
11     int kick;
12     int call;
13     void *desc;
14     void *avail;
15     void *used;
16     int num;
17     unsigned long long desc_phys;
18     unsigned desc_size;
19     unsigned long long avail_phys;
20     unsigned avail_size;
21     unsigned long long used_phys;
22     unsigned used_size;
23     EventNotifier masked_notifier;
24 };
25 
26 typedef unsigned long vhost_log_chunk_t;
27 #define VHOST_LOG_PAGE 0x1000
28 #define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t))
29 #define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS)
30 #define VHOST_INVALID_FEATURE_BIT   (0xff)
31 
32 struct vhost_log {
33     unsigned long long size;
34     int refcnt;
35     int fd;
36     vhost_log_chunk_t *log;
37 };
38 
39 struct vhost_memory;
40 struct vhost_dev {
41     MemoryListener memory_listener;
42     struct vhost_memory *mem;
43     int n_mem_sections;
44     MemoryRegionSection *mem_sections;
45     struct vhost_virtqueue *vqs;
46     int nvqs;
47     /* the first virtqueue which would be used by this vhost dev */
48     int vq_index;
49     uint64_t features;
50     uint64_t acked_features;
51     uint64_t backend_features;
52     uint64_t protocol_features;
53     uint64_t max_queues;
54     bool started;
55     bool log_enabled;
56     uint64_t log_size;
57     Error *migration_blocker;
58     bool memory_changed;
59     hwaddr mem_changed_start_addr;
60     hwaddr mem_changed_end_addr;
61     const VhostOps *vhost_ops;
62     void *opaque;
63     struct vhost_log *log;
64     QLIST_ENTRY(vhost_dev) entry;
65 };
66 
67 int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
68                    VhostBackendType backend_type,
69                    uint32_t busyloop_timeout);
70 void vhost_dev_cleanup(struct vhost_dev *hdev);
71 int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev);
72 void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev);
73 int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
74 void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
75 
76 /* Test and clear masked event pending status.
77  * Should be called after unmask to avoid losing events.
78  */
79 bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n);
80 
81 /* Mask/unmask events from this vq.
82  */
83 void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
84                           bool mask);
85 uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
86                             uint64_t features);
87 void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
88                         uint64_t features);
89 bool vhost_has_free_slot(void);
90 
91 int vhost_net_set_backend(struct vhost_dev *hdev,
92                           struct vhost_vring_file *file);
93 
94 #endif
95