/* * vhost-vdpa.h * * Copyright(c) 2017-2018 Intel Corporation. * Copyright(c) 2020 Red Hat, Inc. * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #ifndef HW_VIRTIO_VHOST_VDPA_H #define HW_VIRTIO_VHOST_VDPA_H #include #include "hw/virtio/vhost-iova-tree.h" #include "hw/virtio/vhost-shadow-virtqueue.h" #include "hw/virtio/virtio.h" #include "standard-headers/linux/vhost_types.h" /* * ASID dedicated to map guest's addresses. If SVQ is disabled it maps GPA to * qemu's IOVA. If SVQ is enabled it maps also the SVQ vring here */ #define VHOST_VDPA_GUEST_PA_ASID 0 typedef struct VhostVDPAHostNotifier { MemoryRegion mr; void *addr; } VhostVDPAHostNotifier; typedef enum SVQTransitionState { SVQ_TSTATE_DISABLING = -1, SVQ_TSTATE_DONE, SVQ_TSTATE_ENABLING } SVQTransitionState; /* Info shared by all vhost_vdpa device models */ typedef struct vhost_vdpa_shared { int device_fd; MemoryListener listener; struct vhost_vdpa_iova_range iova_range; QLIST_HEAD(, vdpa_iommu) iommu_list; /* IOVA mapping used by the Shadow Virtqueue */ VhostIOVATree *iova_tree; /* Copy of backend features */ uint64_t backend_cap; bool iotlb_batch_begin_sent; /* Vdpa must send shadow addresses as IOTLB key for data queues, not GPA */ bool shadow_data; /* SVQ switching is in progress, or already completed? */ SVQTransitionState svq_switching; } VhostVDPAShared; typedef struct vhost_vdpa { int index; uint32_t address_space_id; uint64_t acked_features; bool shadow_vqs_enabled; /* Device suspended successfully */ bool suspended; VhostVDPAShared *shared; GPtrArray *shadow_vqs; const VhostShadowVirtqueueOps *shadow_vq_ops; void *shadow_vq_ops_opaque; struct vhost_dev *dev; Error *migration_blocker; VhostVDPAHostNotifier notifier[VIRTIO_QUEUE_MAX]; IOMMUNotifier n; } VhostVDPA; int vhost_vdpa_get_iova_range(int fd, struct vhost_vdpa_iova_range *iova_range); int vhost_vdpa_set_vring_ready(struct vhost_vdpa *v, unsigned idx); int vhost_vdpa_dma_map(VhostVDPAShared *s, uint32_t asid, hwaddr iova, hwaddr size, void *vaddr, bool readonly); int vhost_vdpa_dma_unmap(VhostVDPAShared *s, uint32_t asid, hwaddr iova, hwaddr size); typedef struct vdpa_iommu { VhostVDPAShared *dev_shared; IOMMUMemoryRegion *iommu_mr; hwaddr iommu_offset; IOMMUNotifier n; QLIST_ENTRY(vdpa_iommu) iommu_next; } VDPAIOMMUState; #endif