vdpa_sim: add supported_features field in vdpasim_dev_attr
Introduce a new VDPASIM_FEATURES macro with the generic features supported by the vDPA simulator, and VDPASIM_NET_FEATURES macro with vDPA-net features. Add 'supported_features' field in vdpasim_dev_attr, to allow devices to specify their features. Co-developed-by: Max Gurtovoy <mgurtovoy@nvidia.com> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Link: https://lore.kernel.org/r/20201215144256.155342-9-sgarzare@redhat.com Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
2f8f461888
commit
011c35bac5
|
@ -59,12 +59,15 @@ struct vdpasim_virtqueue {
|
|||
#define VDPASIM_VQ_NUM 0x2
|
||||
#define VDPASIM_NAME "vdpasim-netdev"
|
||||
|
||||
static u64 vdpasim_features = (1ULL << VIRTIO_F_ANY_LAYOUT) |
|
||||
(1ULL << VIRTIO_F_VERSION_1) |
|
||||
(1ULL << VIRTIO_F_ACCESS_PLATFORM) |
|
||||
(1ULL << VIRTIO_NET_F_MAC);
|
||||
#define VDPASIM_FEATURES ((1ULL << VIRTIO_F_ANY_LAYOUT) | \
|
||||
(1ULL << VIRTIO_F_VERSION_1) | \
|
||||
(1ULL << VIRTIO_F_ACCESS_PLATFORM))
|
||||
|
||||
#define VDPASIM_NET_FEATURES (VDPASIM_FEATURES | \
|
||||
(1ULL << VIRTIO_NET_F_MAC))
|
||||
|
||||
struct vdpasim_dev_attr {
|
||||
u64 supported_features;
|
||||
int nvqs;
|
||||
u32 id;
|
||||
};
|
||||
|
@ -122,7 +125,7 @@ static void vdpasim_queue_ready(struct vdpasim *vdpasim, unsigned int idx)
|
|||
{
|
||||
struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
|
||||
|
||||
vringh_init_iotlb(&vq->vring, vdpasim_features,
|
||||
vringh_init_iotlb(&vq->vring, vdpasim->dev_attr.supported_features,
|
||||
VDPASIM_QUEUE_MAX, false,
|
||||
(struct vring_desc *)(uintptr_t)vq->desc_addr,
|
||||
(struct vring_avail *)
|
||||
|
@ -131,7 +134,8 @@ static void vdpasim_queue_ready(struct vdpasim *vdpasim, unsigned int idx)
|
|||
(uintptr_t)vq->device_addr);
|
||||
}
|
||||
|
||||
static void vdpasim_vq_reset(struct vdpasim_virtqueue *vq)
|
||||
static void vdpasim_vq_reset(struct vdpasim *vdpasim,
|
||||
struct vdpasim_virtqueue *vq)
|
||||
{
|
||||
vq->ready = false;
|
||||
vq->desc_addr = 0;
|
||||
|
@ -139,8 +143,8 @@ static void vdpasim_vq_reset(struct vdpasim_virtqueue *vq)
|
|||
vq->device_addr = 0;
|
||||
vq->cb = NULL;
|
||||
vq->private = NULL;
|
||||
vringh_init_iotlb(&vq->vring, vdpasim_features, VDPASIM_QUEUE_MAX,
|
||||
false, NULL, NULL, NULL);
|
||||
vringh_init_iotlb(&vq->vring, vdpasim->dev_attr.supported_features,
|
||||
VDPASIM_QUEUE_MAX, false, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static void vdpasim_reset(struct vdpasim *vdpasim)
|
||||
|
@ -148,7 +152,7 @@ static void vdpasim_reset(struct vdpasim *vdpasim)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < vdpasim->dev_attr.nvqs; i++)
|
||||
vdpasim_vq_reset(&vdpasim->vqs[i]);
|
||||
vdpasim_vq_reset(vdpasim, &vdpasim->vqs[i]);
|
||||
|
||||
spin_lock(&vdpasim->iommu_lock);
|
||||
vhost_iotlb_reset(vdpasim->iommu);
|
||||
|
@ -508,7 +512,9 @@ static u32 vdpasim_get_vq_align(struct vdpa_device *vdpa)
|
|||
|
||||
static u64 vdpasim_get_features(struct vdpa_device *vdpa)
|
||||
{
|
||||
return vdpasim_features;
|
||||
struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
|
||||
|
||||
return vdpasim->dev_attr.supported_features;
|
||||
}
|
||||
|
||||
static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
|
||||
|
@ -520,7 +526,7 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
|
|||
if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)))
|
||||
return -EINVAL;
|
||||
|
||||
vdpasim->features = features & vdpasim_features;
|
||||
vdpasim->features = features & vdpasim->dev_attr.supported_features;
|
||||
|
||||
/* We generally only know whether guest is using the legacy interface
|
||||
* here, so generally that's the earliest we can set config fields.
|
||||
|
@ -732,6 +738,7 @@ static int __init vdpasim_dev_init(void)
|
|||
struct vdpasim_dev_attr dev_attr = {};
|
||||
|
||||
dev_attr.id = VIRTIO_ID_NET;
|
||||
dev_attr.supported_features = VDPASIM_NET_FEATURES;
|
||||
dev_attr.nvqs = VDPASIM_VQ_NUM;
|
||||
|
||||
vdpasim_dev = vdpasim_create(&dev_attr);
|
||||
|
|
Loading…
Reference in New Issue