Will be used in following patches. DISABLING(-1) means SVQ is being switched off to passthrough mode. ENABLING(1) means passthrough VQs are being switched to SVQ. DONE(0) means SVQ switching is completed. Message-Id: <1707910082-10243-11-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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 <gmodule.h>
 | 
						|
 | 
						|
#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
 |