Lines Matching refs:vdev

52 static void vfio_platform_get_reset(struct vfio_platform_device *vdev)  in vfio_platform_get_reset()  argument
54 vdev->reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
55 &vdev->reset_module); in vfio_platform_get_reset()
56 if (!vdev->reset) { in vfio_platform_get_reset()
57 request_module("vfio-reset:%s", vdev->compat); in vfio_platform_get_reset()
58 vdev->reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
59 &vdev->reset_module); in vfio_platform_get_reset()
63 static void vfio_platform_put_reset(struct vfio_platform_device *vdev) in vfio_platform_put_reset() argument
65 if (vdev->reset) in vfio_platform_put_reset()
66 module_put(vdev->reset_module); in vfio_platform_put_reset()
69 static int vfio_platform_regions_init(struct vfio_platform_device *vdev) in vfio_platform_regions_init() argument
73 while (vdev->get_resource(vdev, cnt)) in vfio_platform_regions_init()
76 vdev->regions = kcalloc(cnt, sizeof(struct vfio_platform_region), in vfio_platform_regions_init()
78 if (!vdev->regions) in vfio_platform_regions_init()
83 vdev->get_resource(vdev, i); in vfio_platform_regions_init()
88 vdev->regions[i].addr = res->start; in vfio_platform_regions_init()
89 vdev->regions[i].size = resource_size(res); in vfio_platform_regions_init()
90 vdev->regions[i].flags = 0; in vfio_platform_regions_init()
94 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_MMIO; in vfio_platform_regions_init()
95 vdev->regions[i].flags |= VFIO_REGION_INFO_FLAG_READ; in vfio_platform_regions_init()
97 vdev->regions[i].flags |= in vfio_platform_regions_init()
104 if (!(vdev->regions[i].addr & ~PAGE_MASK) && in vfio_platform_regions_init()
105 !(vdev->regions[i].size & ~PAGE_MASK)) in vfio_platform_regions_init()
106 vdev->regions[i].flags |= in vfio_platform_regions_init()
111 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_PIO; in vfio_platform_regions_init()
118 vdev->num_regions = cnt; in vfio_platform_regions_init()
122 kfree(vdev->regions); in vfio_platform_regions_init()
126 static void vfio_platform_regions_cleanup(struct vfio_platform_device *vdev) in vfio_platform_regions_cleanup() argument
130 for (i = 0; i < vdev->num_regions; i++) in vfio_platform_regions_cleanup()
131 iounmap(vdev->regions[i].ioaddr); in vfio_platform_regions_cleanup()
133 vdev->num_regions = 0; in vfio_platform_regions_cleanup()
134 kfree(vdev->regions); in vfio_platform_regions_cleanup()
139 struct vfio_platform_device *vdev = device_data; in vfio_platform_release() local
143 if (!(--vdev->refcnt)) { in vfio_platform_release()
144 if (vdev->reset) { in vfio_platform_release()
145 dev_info(vdev->device, "reset\n"); in vfio_platform_release()
146 vdev->reset(vdev); in vfio_platform_release()
148 dev_warn(vdev->device, "no reset function found!\n"); in vfio_platform_release()
150 vfio_platform_regions_cleanup(vdev); in vfio_platform_release()
151 vfio_platform_irq_cleanup(vdev); in vfio_platform_release()
156 module_put(vdev->parent_module); in vfio_platform_release()
161 struct vfio_platform_device *vdev = device_data; in vfio_platform_open() local
164 if (!try_module_get(vdev->parent_module)) in vfio_platform_open()
169 if (!vdev->refcnt) { in vfio_platform_open()
170 ret = vfio_platform_regions_init(vdev); in vfio_platform_open()
174 ret = vfio_platform_irq_init(vdev); in vfio_platform_open()
178 if (vdev->reset) { in vfio_platform_open()
179 dev_info(vdev->device, "reset\n"); in vfio_platform_open()
180 vdev->reset(vdev); in vfio_platform_open()
182 dev_warn(vdev->device, "no reset function found!\n"); in vfio_platform_open()
186 vdev->refcnt++; in vfio_platform_open()
192 vfio_platform_regions_cleanup(vdev); in vfio_platform_open()
202 struct vfio_platform_device *vdev = device_data; in vfio_platform_ioctl() local
216 if (vdev->reset) in vfio_platform_ioctl()
217 vdev->flags |= VFIO_DEVICE_FLAGS_RESET; in vfio_platform_ioctl()
218 info.flags = vdev->flags; in vfio_platform_ioctl()
219 info.num_regions = vdev->num_regions; in vfio_platform_ioctl()
220 info.num_irqs = vdev->num_irqs; in vfio_platform_ioctl()
236 if (info.index >= vdev->num_regions) in vfio_platform_ioctl()
241 info.size = vdev->regions[info.index].size; in vfio_platform_ioctl()
242 info.flags = vdev->regions[info.index].flags; in vfio_platform_ioctl()
258 if (info.index >= vdev->num_irqs) in vfio_platform_ioctl()
261 info.flags = vdev->irqs[info.index].flags; in vfio_platform_ioctl()
262 info.count = vdev->irqs[info.index].count; in vfio_platform_ioctl()
280 if (hdr.index >= vdev->num_irqs) in vfio_platform_ioctl()
305 mutex_lock(&vdev->igate); in vfio_platform_ioctl()
307 ret = vfio_platform_set_irqs_ioctl(vdev, hdr.flags, hdr.index, in vfio_platform_ioctl()
309 mutex_unlock(&vdev->igate); in vfio_platform_ioctl()
315 if (vdev->reset) in vfio_platform_ioctl()
316 return vdev->reset(vdev); in vfio_platform_ioctl()
382 struct vfio_platform_device *vdev = device_data; in vfio_platform_read() local
386 if (index >= vdev->num_regions) in vfio_platform_read()
389 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ)) in vfio_platform_read()
392 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_read()
393 return vfio_platform_read_mmio(&vdev->regions[index], in vfio_platform_read()
395 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_read()
458 struct vfio_platform_device *vdev = device_data; in vfio_platform_write() local
462 if (index >= vdev->num_regions) in vfio_platform_write()
465 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE)) in vfio_platform_write()
468 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_write()
469 return vfio_platform_write_mmio(&vdev->regions[index], in vfio_platform_write()
471 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_write()
499 struct vfio_platform_device *vdev = device_data; in vfio_platform_mmap() local
508 if (index >= vdev->num_regions) in vfio_platform_mmap()
515 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_MMAP)) in vfio_platform_mmap()
518 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ) in vfio_platform_mmap()
522 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE) in vfio_platform_mmap()
526 vma->vm_private_data = vdev; in vfio_platform_mmap()
528 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_mmap()
529 return vfio_platform_mmap_mmio(vdev->regions[index], vma); in vfio_platform_mmap()
531 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_mmap()
547 int vfio_platform_probe_common(struct vfio_platform_device *vdev, in vfio_platform_probe_common() argument
553 if (!vdev) in vfio_platform_probe_common()
556 ret = device_property_read_string(dev, "compatible", &vdev->compat); in vfio_platform_probe_common()
558 pr_err("VFIO: cannot retrieve compat for %s\n", vdev->name); in vfio_platform_probe_common()
562 vdev->device = dev; in vfio_platform_probe_common()
566 pr_err("VFIO: No IOMMU group for device %s\n", vdev->name); in vfio_platform_probe_common()
570 ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev); in vfio_platform_probe_common()
576 vfio_platform_get_reset(vdev); in vfio_platform_probe_common()
578 mutex_init(&vdev->igate); in vfio_platform_probe_common()
586 struct vfio_platform_device *vdev; in vfio_platform_remove_common() local
588 vdev = vfio_del_group_dev(dev); in vfio_platform_remove_common()
590 if (vdev) { in vfio_platform_remove_common()
591 vfio_platform_put_reset(vdev); in vfio_platform_remove_common()
595 return vdev; in vfio_platform_remove_common()