Lines Matching refs:vdev
28 static int vfio_platform_regions_init(struct vfio_platform_device *vdev) in vfio_platform_regions_init() argument
32 while (vdev->get_resource(vdev, cnt)) in vfio_platform_regions_init()
35 vdev->regions = kcalloc(cnt, sizeof(struct vfio_platform_region), in vfio_platform_regions_init()
37 if (!vdev->regions) in vfio_platform_regions_init()
42 vdev->get_resource(vdev, i); in vfio_platform_regions_init()
47 vdev->regions[i].addr = res->start; in vfio_platform_regions_init()
48 vdev->regions[i].size = resource_size(res); in vfio_platform_regions_init()
49 vdev->regions[i].flags = 0; in vfio_platform_regions_init()
53 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_MMIO; in vfio_platform_regions_init()
54 vdev->regions[i].flags |= VFIO_REGION_INFO_FLAG_READ; in vfio_platform_regions_init()
56 vdev->regions[i].flags |= in vfio_platform_regions_init()
63 if (!(vdev->regions[i].addr & ~PAGE_MASK) && in vfio_platform_regions_init()
64 !(vdev->regions[i].size & ~PAGE_MASK)) in vfio_platform_regions_init()
65 vdev->regions[i].flags |= in vfio_platform_regions_init()
70 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_PIO; in vfio_platform_regions_init()
77 vdev->num_regions = cnt; in vfio_platform_regions_init()
81 kfree(vdev->regions); in vfio_platform_regions_init()
85 static void vfio_platform_regions_cleanup(struct vfio_platform_device *vdev) in vfio_platform_regions_cleanup() argument
89 for (i = 0; i < vdev->num_regions; i++) in vfio_platform_regions_cleanup()
90 iounmap(vdev->regions[i].ioaddr); in vfio_platform_regions_cleanup()
92 vdev->num_regions = 0; in vfio_platform_regions_cleanup()
93 kfree(vdev->regions); in vfio_platform_regions_cleanup()
98 struct vfio_platform_device *vdev = device_data; in vfio_platform_release() local
102 if (!(--vdev->refcnt)) { in vfio_platform_release()
103 vfio_platform_regions_cleanup(vdev); in vfio_platform_release()
104 vfio_platform_irq_cleanup(vdev); in vfio_platform_release()
114 struct vfio_platform_device *vdev = device_data; in vfio_platform_open() local
122 if (!vdev->refcnt) { in vfio_platform_open()
123 ret = vfio_platform_regions_init(vdev); in vfio_platform_open()
127 ret = vfio_platform_irq_init(vdev); in vfio_platform_open()
132 vdev->refcnt++; in vfio_platform_open()
138 vfio_platform_regions_cleanup(vdev); in vfio_platform_open()
148 struct vfio_platform_device *vdev = device_data; in vfio_platform_ioctl() local
162 info.flags = vdev->flags; in vfio_platform_ioctl()
163 info.num_regions = vdev->num_regions; in vfio_platform_ioctl()
164 info.num_irqs = vdev->num_irqs; in vfio_platform_ioctl()
180 if (info.index >= vdev->num_regions) in vfio_platform_ioctl()
185 info.size = vdev->regions[info.index].size; in vfio_platform_ioctl()
186 info.flags = vdev->regions[info.index].flags; in vfio_platform_ioctl()
202 if (info.index >= vdev->num_irqs) in vfio_platform_ioctl()
205 info.flags = vdev->irqs[info.index].flags; in vfio_platform_ioctl()
206 info.count = vdev->irqs[info.index].count; in vfio_platform_ioctl()
224 if (hdr.index >= vdev->num_irqs) in vfio_platform_ioctl()
249 mutex_lock(&vdev->igate); in vfio_platform_ioctl()
251 ret = vfio_platform_set_irqs_ioctl(vdev, hdr.flags, hdr.index, in vfio_platform_ioctl()
253 mutex_unlock(&vdev->igate); in vfio_platform_ioctl()
322 struct vfio_platform_device *vdev = device_data; in vfio_platform_read() local
326 if (index >= vdev->num_regions) in vfio_platform_read()
329 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ)) in vfio_platform_read()
332 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_read()
333 return vfio_platform_read_mmio(vdev->regions[index], in vfio_platform_read()
335 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_read()
398 struct vfio_platform_device *vdev = device_data; in vfio_platform_write() local
402 if (index >= vdev->num_regions) in vfio_platform_write()
405 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE)) in vfio_platform_write()
408 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_write()
409 return vfio_platform_write_mmio(vdev->regions[index], in vfio_platform_write()
411 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_write()
439 struct vfio_platform_device *vdev = device_data; in vfio_platform_mmap() local
448 if (index >= vdev->num_regions) in vfio_platform_mmap()
455 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_MMAP)) in vfio_platform_mmap()
458 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ) in vfio_platform_mmap()
462 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE) in vfio_platform_mmap()
466 vma->vm_private_data = vdev; in vfio_platform_mmap()
468 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_mmap()
469 return vfio_platform_mmap_mmio(vdev->regions[index], vma); in vfio_platform_mmap()
471 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_mmap()
487 int vfio_platform_probe_common(struct vfio_platform_device *vdev, in vfio_platform_probe_common() argument
493 if (!vdev) in vfio_platform_probe_common()
498 pr_err("VFIO: No IOMMU group for device %s\n", vdev->name); in vfio_platform_probe_common()
502 ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev); in vfio_platform_probe_common()
508 mutex_init(&vdev->igate); in vfio_platform_probe_common()
516 struct vfio_platform_device *vdev; in vfio_platform_remove_common() local
518 vdev = vfio_del_group_dev(dev); in vfio_platform_remove_common()
519 if (vdev) in vfio_platform_remove_common()
522 return vdev; in vfio_platform_remove_common()