Lines Matching full:vdev

26 #define VFIO_PLATFORM_IS_ACPI(vdev) ((vdev)->acpihid != NULL)  argument
50 static int vfio_platform_acpi_probe(struct vfio_platform_device *vdev, in vfio_platform_acpi_probe() argument
61 vdev->name); in vfio_platform_acpi_probe()
66 vdev->acpihid = acpi_device_hid(adev); in vfio_platform_acpi_probe()
68 return WARN_ON(!vdev->acpihid) ? -EINVAL : 0; in vfio_platform_acpi_probe()
71 static int vfio_platform_acpi_call_reset(struct vfio_platform_device *vdev, in vfio_platform_acpi_call_reset() argument
76 struct device *dev = vdev->device; in vfio_platform_acpi_call_reset()
93 static bool vfio_platform_acpi_has_reset(struct vfio_platform_device *vdev) in vfio_platform_acpi_has_reset() argument
96 struct device *dev = vdev->device; in vfio_platform_acpi_has_reset()
105 static bool vfio_platform_has_reset(struct vfio_platform_device *vdev) in vfio_platform_has_reset() argument
107 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_has_reset()
108 return vfio_platform_acpi_has_reset(vdev); in vfio_platform_has_reset()
110 return vdev->of_reset ? true : false; in vfio_platform_has_reset()
113 static int vfio_platform_get_reset(struct vfio_platform_device *vdev) in vfio_platform_get_reset() argument
115 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_get_reset()
116 return vfio_platform_acpi_has_reset(vdev) ? 0 : -ENOENT; in vfio_platform_get_reset()
118 vdev->of_reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
119 &vdev->reset_module); in vfio_platform_get_reset()
120 if (!vdev->of_reset) { in vfio_platform_get_reset()
121 request_module("vfio-reset:%s", vdev->compat); in vfio_platform_get_reset()
122 vdev->of_reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
123 &vdev->reset_module); in vfio_platform_get_reset()
126 return vdev->of_reset ? 0 : -ENOENT; in vfio_platform_get_reset()
129 static void vfio_platform_put_reset(struct vfio_platform_device *vdev) in vfio_platform_put_reset() argument
131 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_put_reset()
134 if (vdev->of_reset) in vfio_platform_put_reset()
135 module_put(vdev->reset_module); in vfio_platform_put_reset()
138 static int vfio_platform_regions_init(struct vfio_platform_device *vdev) in vfio_platform_regions_init() argument
142 while (vdev->get_resource(vdev, cnt)) in vfio_platform_regions_init()
145 vdev->regions = kcalloc(cnt, sizeof(struct vfio_platform_region), in vfio_platform_regions_init()
147 if (!vdev->regions) in vfio_platform_regions_init()
152 vdev->get_resource(vdev, i); in vfio_platform_regions_init()
157 vdev->regions[i].addr = res->start; in vfio_platform_regions_init()
158 vdev->regions[i].size = resource_size(res); in vfio_platform_regions_init()
159 vdev->regions[i].flags = 0; in vfio_platform_regions_init()
163 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_MMIO; in vfio_platform_regions_init()
164 vdev->regions[i].flags |= VFIO_REGION_INFO_FLAG_READ; in vfio_platform_regions_init()
166 vdev->regions[i].flags |= in vfio_platform_regions_init()
173 if (!(vdev->regions[i].addr & ~PAGE_MASK) && in vfio_platform_regions_init()
174 !(vdev->regions[i].size & ~PAGE_MASK)) in vfio_platform_regions_init()
175 vdev->regions[i].flags |= in vfio_platform_regions_init()
180 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_PIO; in vfio_platform_regions_init()
187 vdev->num_regions = cnt; in vfio_platform_regions_init()
191 kfree(vdev->regions); in vfio_platform_regions_init()
195 static void vfio_platform_regions_cleanup(struct vfio_platform_device *vdev) in vfio_platform_regions_cleanup() argument
199 for (i = 0; i < vdev->num_regions; i++) in vfio_platform_regions_cleanup()
200 iounmap(vdev->regions[i].ioaddr); in vfio_platform_regions_cleanup()
202 vdev->num_regions = 0; in vfio_platform_regions_cleanup()
203 kfree(vdev->regions); in vfio_platform_regions_cleanup()
206 static int vfio_platform_call_reset(struct vfio_platform_device *vdev, in vfio_platform_call_reset() argument
209 if (VFIO_PLATFORM_IS_ACPI(vdev)) { in vfio_platform_call_reset()
210 dev_info(vdev->device, "reset\n"); in vfio_platform_call_reset()
211 return vfio_platform_acpi_call_reset(vdev, extra_dbg); in vfio_platform_call_reset()
212 } else if (vdev->of_reset) { in vfio_platform_call_reset()
213 dev_info(vdev->device, "reset\n"); in vfio_platform_call_reset()
214 return vdev->of_reset(vdev); in vfio_platform_call_reset()
217 dev_warn(vdev->device, "no reset function found!\n"); in vfio_platform_call_reset()
223 struct vfio_platform_device *vdev = in vfio_platform_close_device() local
224 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_close_device()
228 ret = vfio_platform_call_reset(vdev, &extra_dbg); in vfio_platform_close_device()
229 if (WARN_ON(ret && vdev->reset_required)) { in vfio_platform_close_device()
231 vdev->device, in vfio_platform_close_device()
235 pm_runtime_put(vdev->device); in vfio_platform_close_device()
236 vfio_platform_regions_cleanup(vdev); in vfio_platform_close_device()
237 vfio_platform_irq_cleanup(vdev); in vfio_platform_close_device()
242 struct vfio_platform_device *vdev = in vfio_platform_open_device() local
243 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_open_device()
247 ret = vfio_platform_regions_init(vdev); in vfio_platform_open_device()
251 ret = vfio_platform_irq_init(vdev); in vfio_platform_open_device()
255 ret = pm_runtime_get_sync(vdev->device); in vfio_platform_open_device()
259 ret = vfio_platform_call_reset(vdev, &extra_dbg); in vfio_platform_open_device()
260 if (ret && vdev->reset_required) { in vfio_platform_open_device()
262 vdev->device, in vfio_platform_open_device()
270 pm_runtime_put(vdev->device); in vfio_platform_open_device()
271 vfio_platform_irq_cleanup(vdev); in vfio_platform_open_device()
273 vfio_platform_regions_cleanup(vdev); in vfio_platform_open_device()
280 struct vfio_platform_device *vdev = in vfio_platform_ioctl() local
281 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_ioctl()
296 if (vfio_platform_has_reset(vdev)) in vfio_platform_ioctl()
297 vdev->flags |= VFIO_DEVICE_FLAGS_RESET; in vfio_platform_ioctl()
298 info.flags = vdev->flags; in vfio_platform_ioctl()
299 info.num_regions = vdev->num_regions; in vfio_platform_ioctl()
300 info.num_irqs = vdev->num_irqs; in vfio_platform_ioctl()
316 if (info.index >= vdev->num_regions) in vfio_platform_ioctl()
321 info.size = vdev->regions[info.index].size; in vfio_platform_ioctl()
322 info.flags = vdev->regions[info.index].flags; in vfio_platform_ioctl()
338 if (info.index >= vdev->num_irqs) in vfio_platform_ioctl()
341 info.flags = vdev->irqs[info.index].flags; in vfio_platform_ioctl()
342 info.count = vdev->irqs[info.index].count; in vfio_platform_ioctl()
358 ret = vfio_set_irqs_validate_and_prepare(&hdr, vdev->num_irqs, in vfio_platform_ioctl()
359 vdev->num_irqs, &data_size); in vfio_platform_ioctl()
370 mutex_lock(&vdev->igate); in vfio_platform_ioctl()
372 ret = vfio_platform_set_irqs_ioctl(vdev, hdr.flags, hdr.index, in vfio_platform_ioctl()
374 mutex_unlock(&vdev->igate); in vfio_platform_ioctl()
380 return vfio_platform_call_reset(vdev, NULL); in vfio_platform_ioctl()
444 struct vfio_platform_device *vdev = in vfio_platform_read() local
445 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_read()
449 if (index >= vdev->num_regions) in vfio_platform_read()
452 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ)) in vfio_platform_read()
455 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_read()
456 return vfio_platform_read_mmio(&vdev->regions[index], in vfio_platform_read()
458 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_read()
521 struct vfio_platform_device *vdev = in vfio_platform_write() local
522 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_write()
526 if (index >= vdev->num_regions) in vfio_platform_write()
529 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE)) in vfio_platform_write()
532 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_write()
533 return vfio_platform_write_mmio(&vdev->regions[index], in vfio_platform_write()
535 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_write()
563 struct vfio_platform_device *vdev = in vfio_platform_mmap() local
564 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_mmap()
573 if (index >= vdev->num_regions) in vfio_platform_mmap()
580 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_MMAP)) in vfio_platform_mmap()
583 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ) in vfio_platform_mmap()
587 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE) in vfio_platform_mmap()
591 vma->vm_private_data = vdev; in vfio_platform_mmap()
593 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_mmap()
594 return vfio_platform_mmap_mmio(vdev->regions[index], vma); in vfio_platform_mmap()
596 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_mmap()
612 static int vfio_platform_of_probe(struct vfio_platform_device *vdev, in vfio_platform_of_probe() argument
618 &vdev->compat); in vfio_platform_of_probe()
620 dev_err(dev, "Cannot retrieve compat for %s\n", vdev->name); in vfio_platform_of_probe()
642 int vfio_platform_probe_common(struct vfio_platform_device *vdev, in vfio_platform_probe_common() argument
648 vfio_init_group_dev(&vdev->vdev, dev, &vfio_platform_ops); in vfio_platform_probe_common()
650 ret = vfio_platform_acpi_probe(vdev, dev); in vfio_platform_probe_common()
652 ret = vfio_platform_of_probe(vdev, dev); in vfio_platform_probe_common()
657 vdev->device = dev; in vfio_platform_probe_common()
659 ret = vfio_platform_get_reset(vdev); in vfio_platform_probe_common()
660 if (ret && vdev->reset_required) { in vfio_platform_probe_common()
662 vdev->name); in vfio_platform_probe_common()
668 dev_err(dev, "No IOMMU group for device %s\n", vdev->name); in vfio_platform_probe_common()
673 ret = vfio_register_group_dev(&vdev->vdev); in vfio_platform_probe_common()
677 mutex_init(&vdev->igate); in vfio_platform_probe_common()
685 vfio_platform_put_reset(vdev); in vfio_platform_probe_common()
687 vfio_uninit_group_dev(&vdev->vdev); in vfio_platform_probe_common()
692 void vfio_platform_remove_common(struct vfio_platform_device *vdev) in vfio_platform_remove_common() argument
694 vfio_unregister_group_dev(&vdev->vdev); in vfio_platform_remove_common()
696 pm_runtime_disable(vdev->device); in vfio_platform_remove_common()
697 vfio_platform_put_reset(vdev); in vfio_platform_remove_common()
698 vfio_uninit_group_dev(&vdev->vdev); in vfio_platform_remove_common()
699 vfio_iommu_group_put(vdev->vdev.dev->iommu_group, vdev->vdev.dev); in vfio_platform_remove_common()