Lines Matching defs:vdpasim
65 #define VDPASIM_NAME "vdpasim-netdev"
72 struct vdpasim;
77 void (*get_config)(struct vdpasim *vdpasim, void *config);
80 /* State of each vdpasim device */
81 struct vdpasim {
100 static inline bool vdpasim_is_little_endian(struct vdpasim *vdpasim)
103 (vdpasim->features & (1ULL << VIRTIO_F_VERSION_1));
106 static inline u16 vdpasim16_to_cpu(struct vdpasim *vdpasim, __virtio16 val)
108 return __virtio16_to_cpu(vdpasim_is_little_endian(vdpasim), val);
111 static inline __virtio16 cpu_to_vdpasim16(struct vdpasim *vdpasim, u16 val)
113 return __cpu_to_virtio16(vdpasim_is_little_endian(vdpasim), val);
116 static struct vdpasim *vdpasim_dev;
118 static struct vdpasim *vdpa_to_sim(struct vdpa_device *vdpa)
120 return container_of(vdpa, struct vdpasim, vdpa);
123 static struct vdpasim *dev_to_sim(struct device *dev)
130 static void vdpasim_queue_ready(struct vdpasim *vdpasim, unsigned int idx)
132 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
155 static void vdpasim_reset(struct vdpasim *vdpasim)
159 for (i = 0; i < vdpasim->dev_attr.nvqs; i++)
160 vdpasim_vq_reset(&vdpasim->vqs[i]);
162 spin_lock(&vdpasim->iommu_lock);
163 vhost_iotlb_reset(vdpasim->iommu);
164 spin_unlock(&vdpasim->iommu_lock);
166 vdpasim->features = 0;
167 vdpasim->status = 0;
168 ++vdpasim->generation;
173 struct vdpasim *vdpasim = container_of(work, struct
174 vdpasim, work);
175 struct vdpasim_virtqueue *txq = &vdpasim->vqs[1];
176 struct vdpasim_virtqueue *rxq = &vdpasim->vqs[0];
182 spin_lock(&vdpasim->lock);
184 if (!(vdpasim->status & VIRTIO_CONFIG_S_DRIVER_OK))
206 vdpasim->buffer,
212 vdpasim->buffer, read);
236 schedule_work(&vdpasim->work);
242 spin_unlock(&vdpasim->lock);
271 struct vdpasim *vdpasim = dev_to_sim(dev);
272 struct vhost_iotlb *iommu = vdpasim->iommu;
282 spin_lock(&vdpasim->iommu_lock);
285 spin_unlock(&vdpasim->iommu_lock);
296 struct vdpasim *vdpasim = dev_to_sim(dev);
297 struct vhost_iotlb *iommu = vdpasim->iommu;
299 spin_lock(&vdpasim->iommu_lock);
302 spin_unlock(&vdpasim->iommu_lock);
309 struct vdpasim *vdpasim = dev_to_sim(dev);
310 struct vhost_iotlb *iommu = vdpasim->iommu;
314 spin_lock(&vdpasim->iommu_lock);
330 spin_unlock(&vdpasim->iommu_lock);
339 struct vdpasim *vdpasim = dev_to_sim(dev);
340 struct vhost_iotlb *iommu = vdpasim->iommu;
342 spin_lock(&vdpasim->iommu_lock);
345 spin_unlock(&vdpasim->iommu_lock);
360 static struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr)
363 struct vdpasim *vdpasim;
372 vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops,
374 if (!vdpasim)
377 vdpasim->dev_attr = *dev_attr;
378 INIT_WORK(&vdpasim->work, vdpasim_work);
379 spin_lock_init(&vdpasim->lock);
380 spin_lock_init(&vdpasim->iommu_lock);
382 dev = &vdpasim->vdpa.dev;
388 vdpasim->config = kzalloc(dev_attr->config_size, GFP_KERNEL);
389 if (!vdpasim->config)
392 vdpasim->vqs = kcalloc(dev_attr->nvqs, sizeof(struct vdpasim_virtqueue),
394 if (!vdpasim->vqs)
397 vdpasim->iommu = vhost_iotlb_alloc(2048, 0);
398 if (!vdpasim->iommu)
401 vdpasim->buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
402 if (!vdpasim->buffer)
416 vringh_set_iotlb(&vdpasim->vqs[i].vring, vdpasim->iommu);
418 vdpasim->vdpa.dma_dev = dev;
419 ret = vdpa_register_device(&vdpasim->vdpa);
423 return vdpasim;
435 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
436 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
447 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
448 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
455 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
456 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
459 schedule_work(&vdpasim->work);
465 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
466 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
474 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
475 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
478 spin_lock(&vdpasim->lock);
482 vdpasim_queue_ready(vdpasim, idx);
484 spin_unlock(&vdpasim->lock);
489 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
490 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
498 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
499 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
502 spin_lock(&vdpasim->lock);
504 spin_unlock(&vdpasim->lock);
512 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
513 struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
532 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
538 vdpasim->features = features & vdpasim_features;
566 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
569 spin_lock(&vdpasim->lock);
570 status = vdpasim->status;
571 spin_unlock(&vdpasim->lock);
578 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
580 spin_lock(&vdpasim->lock);
581 vdpasim->status = status;
583 vdpasim_reset(vdpasim);
584 spin_unlock(&vdpasim->lock);
590 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
592 if (offset + len > vdpasim->dev_attr.config_size)
595 if (vdpasim->dev_attr.get_config)
596 vdpasim->dev_attr.get_config(vdpasim, vdpasim->config);
598 memcpy(buf, vdpasim->config + offset, len);
604 /* No writable config supportted by vdpasim */
609 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
611 return vdpasim->generation;
627 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
632 spin_lock(&vdpasim->iommu_lock);
633 vhost_iotlb_reset(vdpasim->iommu);
637 ret = vhost_iotlb_add_range(vdpasim->iommu, map->start,
642 spin_unlock(&vdpasim->iommu_lock);
646 vhost_iotlb_reset(vdpasim->iommu);
647 spin_unlock(&vdpasim->iommu_lock);
654 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
657 spin_lock(&vdpasim->iommu_lock);
658 ret = vhost_iotlb_add_range(vdpasim->iommu, iova, iova + size - 1, pa,
660 spin_unlock(&vdpasim->iommu_lock);
667 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
669 spin_lock(&vdpasim->iommu_lock);
670 vhost_iotlb_del_range(vdpasim->iommu, iova, iova + size - 1);
671 spin_unlock(&vdpasim->iommu_lock);
678 struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
680 cancel_work_sync(&vdpasim->work);
681 kfree(vdpasim->buffer);
682 if (vdpasim->iommu)
683 vhost_iotlb_free(vdpasim->iommu);
684 kfree(vdpasim->vqs);
685 kfree(vdpasim->config);
741 static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config)
746 net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
747 net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);