xref: /qemu/include/hw/virtio/vhost.h (revision 9b1d929adb24bc4e613447c0fcc70479154e488f)
1d5970055SMichael S. Tsirkin #ifndef VHOST_H
2d5970055SMichael S. Tsirkin #define VHOST_H
3d5970055SMichael S. Tsirkin 
424d1eb33SNikolay Nikolaev #include "hw/virtio/vhost-backend.h"
50d09e41aSPaolo Bonzini #include "hw/virtio/virtio.h"
6022c62cbSPaolo Bonzini #include "exec/memory.h"
7d5970055SMichael S. Tsirkin 
8d5970055SMichael S. Tsirkin /* Generic structures common for any vhost based device. */
95ad204bfSXie Yongji 
105ad204bfSXie Yongji struct vhost_inflight {
115ad204bfSXie Yongji     int fd;
125ad204bfSXie Yongji     void *addr;
135ad204bfSXie Yongji     uint64_t size;
145ad204bfSXie Yongji     uint64_t offset;
155ad204bfSXie Yongji     uint16_t queue_size;
165ad204bfSXie Yongji };
175ad204bfSXie Yongji 
18d5970055SMichael S. Tsirkin struct vhost_virtqueue {
19d5970055SMichael S. Tsirkin     int kick;
20d5970055SMichael S. Tsirkin     int call;
21d5970055SMichael S. Tsirkin     void *desc;
22d5970055SMichael S. Tsirkin     void *avail;
23d5970055SMichael S. Tsirkin     void *used;
24d5970055SMichael S. Tsirkin     int num;
25f1f9e6c5SGreg Kurz     unsigned long long desc_phys;
26f1f9e6c5SGreg Kurz     unsigned desc_size;
27f1f9e6c5SGreg Kurz     unsigned long long avail_phys;
28f1f9e6c5SGreg Kurz     unsigned avail_size;
29d5970055SMichael S. Tsirkin     unsigned long long used_phys;
30d5970055SMichael S. Tsirkin     unsigned used_size;
31f56a1247SMichael S. Tsirkin     EventNotifier masked_notifier;
32c471ad0eSJason Wang     struct vhost_dev *dev;
33d5970055SMichael S. Tsirkin };
34d5970055SMichael S. Tsirkin 
35d5970055SMichael S. Tsirkin typedef unsigned long vhost_log_chunk_t;
36d5970055SMichael S. Tsirkin #define VHOST_LOG_PAGE 0x1000
37d5970055SMichael S. Tsirkin #define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t))
38d5970055SMichael S. Tsirkin #define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS)
392e6d46d7SNikolay Nikolaev #define VHOST_INVALID_FEATURE_BIT   (0xff)
40d5970055SMichael S. Tsirkin 
41309750faSJason Wang struct vhost_log {
42309750faSJason Wang     unsigned long long size;
43309750faSJason Wang     int refcnt;
4415324404SMarc-André Lureau     int fd;
4515324404SMarc-André Lureau     vhost_log_chunk_t *log;
46309750faSJason Wang };
47309750faSJason Wang 
48375f74f4SJason Wang struct vhost_dev;
49375f74f4SJason Wang struct vhost_iommu {
50375f74f4SJason Wang     struct vhost_dev *hdev;
51375f74f4SJason Wang     MemoryRegion *mr;
52375f74f4SJason Wang     hwaddr iommu_offset;
53375f74f4SJason Wang     IOMMUNotifier n;
54375f74f4SJason Wang     QLIST_ENTRY(vhost_iommu) iommu_next;
55375f74f4SJason Wang };
56375f74f4SJason Wang 
574c3e257bSChangpeng Liu typedef struct VhostDevConfigOps {
584c3e257bSChangpeng Liu     /* Vhost device config space changed callback
594c3e257bSChangpeng Liu      */
604c3e257bSChangpeng Liu     int (*vhost_dev_config_notifier)(struct vhost_dev *dev);
614c3e257bSChangpeng Liu } VhostDevConfigOps;
624c3e257bSChangpeng Liu 
63d5970055SMichael S. Tsirkin struct vhost_memory;
64d5970055SMichael S. Tsirkin struct vhost_dev {
65c471ad0eSJason Wang     VirtIODevice *vdev;
6604097f7cSAvi Kivity     MemoryListener memory_listener;
67375f74f4SJason Wang     MemoryListener iommu_listener;
68d5970055SMichael S. Tsirkin     struct vhost_memory *mem;
692817b260SAvi Kivity     int n_mem_sections;
702817b260SAvi Kivity     MemoryRegionSection *mem_sections;
71c44317efSDr. David Alan Gilbert     int n_tmp_sections;
72c44317efSDr. David Alan Gilbert     MemoryRegionSection *tmp_sections;
73d5970055SMichael S. Tsirkin     struct vhost_virtqueue *vqs;
74d5970055SMichael S. Tsirkin     int nvqs;
759be6e69fSGreg Kurz     /* the first virtqueue which would be used by this vhost dev */
76a9f98bb5SJason Wang     int vq_index;
77c90bd505SKevin Wolf     /* if non-zero, minimum required value for max_queues */
78c90bd505SKevin Wolf     int num_queues;
7921e70425SMarc-André Lureau     uint64_t features;
8021e70425SMarc-André Lureau     uint64_t acked_features;
8121e70425SMarc-André Lureau     uint64_t backend_features;
8221e70425SMarc-André Lureau     uint64_t protocol_features;
8321e70425SMarc-André Lureau     uint64_t max_queues;
84b37556edSJason Wang     uint64_t backend_cap;
85d5970055SMichael S. Tsirkin     bool started;
86d5970055SMichael S. Tsirkin     bool log_enabled;
8721e70425SMarc-André Lureau     uint64_t log_size;
887145872eSMichael S. Tsirkin     Error *migration_blocker;
8924d1eb33SNikolay Nikolaev     const VhostOps *vhost_ops;
901a1bfac9SNikolay Nikolaev     void *opaque;
91309750faSJason Wang     struct vhost_log *log;
922ce68e4cSIgor Mammedov     QLIST_ENTRY(vhost_dev) entry;
93375f74f4SJason Wang     QLIST_HEAD(, vhost_iommu) iommu_list;
94c471ad0eSJason Wang     IOMMUNotifier n;
954c3e257bSChangpeng Liu     const VhostDevConfigOps *config_ops;
96d5970055SMichael S. Tsirkin };
97d5970055SMichael S. Tsirkin 
98*9b1d929aSTiberiu Georgescu extern const VhostOps kernel_ops;
99*9b1d929aSTiberiu Georgescu extern const VhostOps user_ops;
100*9b1d929aSTiberiu Georgescu extern const VhostOps vdpa_ops;
101*9b1d929aSTiberiu Georgescu 
102108a6481SCindy Lu struct vhost_net {
103108a6481SCindy Lu     struct vhost_dev dev;
104108a6481SCindy Lu     struct vhost_virtqueue vqs[2];
105108a6481SCindy Lu     int backend;
106108a6481SCindy Lu     NetClientState *nc;
107108a6481SCindy Lu };
108108a6481SCindy Lu 
10981647a65SNikolay Nikolaev int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
11069e87b32SJason Wang                    VhostBackendType backend_type,
111a6945f22SKevin Wolf                    uint32_t busyloop_timeout, Error **errp);
112d5970055SMichael S. Tsirkin void vhost_dev_cleanup(struct vhost_dev *hdev);
113d5970055SMichael S. Tsirkin int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev);
114d5970055SMichael S. Tsirkin void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev);
115b0b3db79SMichael S. Tsirkin int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
116b0b3db79SMichael S. Tsirkin void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
117d5970055SMichael S. Tsirkin 
118f56a1247SMichael S. Tsirkin /* Test and clear masked event pending status.
119f56a1247SMichael S. Tsirkin  * Should be called after unmask to avoid losing events.
120f56a1247SMichael S. Tsirkin  */
121f56a1247SMichael S. Tsirkin bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n);
122f56a1247SMichael S. Tsirkin 
123f56a1247SMichael S. Tsirkin /* Mask/unmask events from this vq.
124f56a1247SMichael S. Tsirkin  */
125f56a1247SMichael S. Tsirkin void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
126f56a1247SMichael S. Tsirkin                           bool mask);
1279a2ba823SCornelia Huck uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
1289a2ba823SCornelia Huck                             uint64_t features);
1292e6d46d7SNikolay Nikolaev void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
1309a2ba823SCornelia Huck                         uint64_t features);
1312ce68e4cSIgor Mammedov bool vhost_has_free_slot(void);
132950d94baSMarc-André Lureau 
133950d94baSMarc-André Lureau int vhost_net_set_backend(struct vhost_dev *hdev,
134950d94baSMarc-André Lureau                           struct vhost_vring_file *file);
135950d94baSMarc-André Lureau 
136fc58bd0dSMaxime Coquelin int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
13750de5138SKevin Wolf int vhost_dev_get_config(struct vhost_dev *hdev, uint8_t *config,
13850de5138SKevin Wolf                          uint32_t config_len, Error **errp);
1394c3e257bSChangpeng Liu int vhost_dev_set_config(struct vhost_dev *dev, const uint8_t *data,
1404c3e257bSChangpeng Liu                          uint32_t offset, uint32_t size, uint32_t flags);
1414c3e257bSChangpeng Liu /* notifier callback in case vhost device config space changed
1424c3e257bSChangpeng Liu  */
1434c3e257bSChangpeng Liu void vhost_dev_set_config_notifier(struct vhost_dev *dev,
1444c3e257bSChangpeng Liu                                    const VhostDevConfigOps *ops);
1455ad204bfSXie Yongji 
1465ad204bfSXie Yongji void vhost_dev_reset_inflight(struct vhost_inflight *inflight);
1475ad204bfSXie Yongji void vhost_dev_free_inflight(struct vhost_inflight *inflight);
1485ad204bfSXie Yongji void vhost_dev_save_inflight(struct vhost_inflight *inflight, QEMUFile *f);
1495ad204bfSXie Yongji int vhost_dev_load_inflight(struct vhost_inflight *inflight, QEMUFile *f);
1501b0063b3SJin Yu int vhost_dev_prepare_inflight(struct vhost_dev *hdev, VirtIODevice *vdev);
1515ad204bfSXie Yongji int vhost_dev_set_inflight(struct vhost_dev *dev,
1525ad204bfSXie Yongji                            struct vhost_inflight *inflight);
1535ad204bfSXie Yongji int vhost_dev_get_inflight(struct vhost_dev *dev, uint16_t queue_size,
1545ad204bfSXie Yongji                            struct vhost_inflight *inflight);
155d5970055SMichael S. Tsirkin #endif
156