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