Lines Matching refs: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
75 struct device *dev = vdev->device; in vfio_platform_acpi_call_reset()
92 static bool vfio_platform_acpi_has_reset(struct vfio_platform_device *vdev) in vfio_platform_acpi_has_reset() argument
95 struct device *dev = vdev->device; in vfio_platform_acpi_has_reset()
104 static bool vfio_platform_has_reset(struct vfio_platform_device *vdev) in vfio_platform_has_reset() argument
106 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_has_reset()
107 return vfio_platform_acpi_has_reset(vdev); in vfio_platform_has_reset()
109 return vdev->of_reset ? true : false; in vfio_platform_has_reset()
112 static int vfio_platform_get_reset(struct vfio_platform_device *vdev) in vfio_platform_get_reset() argument
114 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_get_reset()
115 return vfio_platform_acpi_has_reset(vdev) ? 0 : -ENOENT; in vfio_platform_get_reset()
117 vdev->of_reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
118 &vdev->reset_module); in vfio_platform_get_reset()
119 if (!vdev->of_reset) { in vfio_platform_get_reset()
120 request_module("vfio-reset:%s", vdev->compat); in vfio_platform_get_reset()
121 vdev->of_reset = vfio_platform_lookup_reset(vdev->compat, in vfio_platform_get_reset()
122 &vdev->reset_module); in vfio_platform_get_reset()
125 return vdev->of_reset ? 0 : -ENOENT; in vfio_platform_get_reset()
128 static void vfio_platform_put_reset(struct vfio_platform_device *vdev) in vfio_platform_put_reset() argument
130 if (VFIO_PLATFORM_IS_ACPI(vdev)) in vfio_platform_put_reset()
133 if (vdev->of_reset) in vfio_platform_put_reset()
134 module_put(vdev->reset_module); in vfio_platform_put_reset()
137 static int vfio_platform_regions_init(struct vfio_platform_device *vdev) in vfio_platform_regions_init() argument
141 while (vdev->get_resource(vdev, cnt)) in vfio_platform_regions_init()
144 vdev->regions = kcalloc(cnt, sizeof(struct vfio_platform_region), in vfio_platform_regions_init()
146 if (!vdev->regions) in vfio_platform_regions_init()
151 vdev->get_resource(vdev, i); in vfio_platform_regions_init()
156 vdev->regions[i].addr = res->start; in vfio_platform_regions_init()
157 vdev->regions[i].size = resource_size(res); in vfio_platform_regions_init()
158 vdev->regions[i].flags = 0; in vfio_platform_regions_init()
162 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_MMIO; in vfio_platform_regions_init()
163 vdev->regions[i].flags |= VFIO_REGION_INFO_FLAG_READ; in vfio_platform_regions_init()
165 vdev->regions[i].flags |= in vfio_platform_regions_init()
172 if (!(vdev->regions[i].addr & ~PAGE_MASK) && in vfio_platform_regions_init()
173 !(vdev->regions[i].size & ~PAGE_MASK)) in vfio_platform_regions_init()
174 vdev->regions[i].flags |= in vfio_platform_regions_init()
179 vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_PIO; in vfio_platform_regions_init()
186 vdev->num_regions = cnt; in vfio_platform_regions_init()
190 kfree(vdev->regions); in vfio_platform_regions_init()
194 static void vfio_platform_regions_cleanup(struct vfio_platform_device *vdev) in vfio_platform_regions_cleanup() argument
198 for (i = 0; i < vdev->num_regions; i++) in vfio_platform_regions_cleanup()
199 iounmap(vdev->regions[i].ioaddr); in vfio_platform_regions_cleanup()
201 vdev->num_regions = 0; in vfio_platform_regions_cleanup()
202 kfree(vdev->regions); in vfio_platform_regions_cleanup()
205 static int vfio_platform_call_reset(struct vfio_platform_device *vdev, in vfio_platform_call_reset() argument
208 if (VFIO_PLATFORM_IS_ACPI(vdev)) { in vfio_platform_call_reset()
209 dev_info(vdev->device, "reset\n"); in vfio_platform_call_reset()
210 return vfio_platform_acpi_call_reset(vdev, extra_dbg); in vfio_platform_call_reset()
211 } else if (vdev->of_reset) { in vfio_platform_call_reset()
212 dev_info(vdev->device, "reset\n"); in vfio_platform_call_reset()
213 return vdev->of_reset(vdev); in vfio_platform_call_reset()
216 dev_warn(vdev->device, "no reset function found!\n"); in vfio_platform_call_reset()
222 struct vfio_platform_device *vdev = in vfio_platform_close_device() local
223 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_close_device()
227 ret = vfio_platform_call_reset(vdev, &extra_dbg); in vfio_platform_close_device()
228 if (WARN_ON(ret && vdev->reset_required)) { in vfio_platform_close_device()
230 vdev->device, in vfio_platform_close_device()
234 pm_runtime_put(vdev->device); in vfio_platform_close_device()
235 vfio_platform_regions_cleanup(vdev); in vfio_platform_close_device()
236 vfio_platform_irq_cleanup(vdev); in vfio_platform_close_device()
241 struct vfio_platform_device *vdev = in vfio_platform_open_device() local
242 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_open_device()
246 ret = vfio_platform_regions_init(vdev); in vfio_platform_open_device()
250 ret = vfio_platform_irq_init(vdev); in vfio_platform_open_device()
254 ret = pm_runtime_get_sync(vdev->device); in vfio_platform_open_device()
258 ret = vfio_platform_call_reset(vdev, &extra_dbg); in vfio_platform_open_device()
259 if (ret && vdev->reset_required) { in vfio_platform_open_device()
261 vdev->device, in vfio_platform_open_device()
269 pm_runtime_put(vdev->device); in vfio_platform_open_device()
270 vfio_platform_irq_cleanup(vdev); in vfio_platform_open_device()
272 vfio_platform_regions_cleanup(vdev); in vfio_platform_open_device()
279 struct vfio_platform_device *vdev = in vfio_platform_ioctl() local
280 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_ioctl()
295 if (vfio_platform_has_reset(vdev)) in vfio_platform_ioctl()
296 vdev->flags |= VFIO_DEVICE_FLAGS_RESET; in vfio_platform_ioctl()
297 info.flags = vdev->flags; in vfio_platform_ioctl()
298 info.num_regions = vdev->num_regions; in vfio_platform_ioctl()
299 info.num_irqs = vdev->num_irqs; in vfio_platform_ioctl()
315 if (info.index >= vdev->num_regions) in vfio_platform_ioctl()
320 info.size = vdev->regions[info.index].size; in vfio_platform_ioctl()
321 info.flags = vdev->regions[info.index].flags; in vfio_platform_ioctl()
337 if (info.index >= vdev->num_irqs) in vfio_platform_ioctl()
340 info.flags = vdev->irqs[info.index].flags; in vfio_platform_ioctl()
341 info.count = vdev->irqs[info.index].count; in vfio_platform_ioctl()
357 ret = vfio_set_irqs_validate_and_prepare(&hdr, vdev->num_irqs, in vfio_platform_ioctl()
358 vdev->num_irqs, &data_size); in vfio_platform_ioctl()
369 mutex_lock(&vdev->igate); in vfio_platform_ioctl()
371 ret = vfio_platform_set_irqs_ioctl(vdev, hdr.flags, hdr.index, in vfio_platform_ioctl()
373 mutex_unlock(&vdev->igate); in vfio_platform_ioctl()
379 return vfio_platform_call_reset(vdev, NULL); in vfio_platform_ioctl()
443 struct vfio_platform_device *vdev = in vfio_platform_read() local
444 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_read()
448 if (index >= vdev->num_regions) in vfio_platform_read()
451 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ)) in vfio_platform_read()
454 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_read()
455 return vfio_platform_read_mmio(&vdev->regions[index], in vfio_platform_read()
457 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_read()
520 struct vfio_platform_device *vdev = in vfio_platform_write() local
521 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_write()
525 if (index >= vdev->num_regions) in vfio_platform_write()
528 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE)) in vfio_platform_write()
531 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_write()
532 return vfio_platform_write_mmio(&vdev->regions[index], in vfio_platform_write()
534 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_write()
562 struct vfio_platform_device *vdev = in vfio_platform_mmap() local
563 container_of(core_vdev, struct vfio_platform_device, vdev); in vfio_platform_mmap()
572 if (index >= vdev->num_regions) in vfio_platform_mmap()
579 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_MMAP)) in vfio_platform_mmap()
582 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ) in vfio_platform_mmap()
586 if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE) in vfio_platform_mmap()
590 vma->vm_private_data = vdev; in vfio_platform_mmap()
592 if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO) in vfio_platform_mmap()
593 return vfio_platform_mmap_mmio(vdev->regions[index], vma); in vfio_platform_mmap()
595 else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO) in vfio_platform_mmap()
611 static int vfio_platform_of_probe(struct vfio_platform_device *vdev, in vfio_platform_of_probe() argument
617 &vdev->compat); in vfio_platform_of_probe()
619 dev_err(dev, "Cannot retrieve compat for %s\n", vdev->name); in vfio_platform_of_probe()
641 int vfio_platform_probe_common(struct vfio_platform_device *vdev, in vfio_platform_probe_common() argument
647 vfio_init_group_dev(&vdev->vdev, dev, &vfio_platform_ops); in vfio_platform_probe_common()
649 ret = vfio_platform_acpi_probe(vdev, dev); in vfio_platform_probe_common()
651 ret = vfio_platform_of_probe(vdev, dev); in vfio_platform_probe_common()
656 vdev->device = dev; in vfio_platform_probe_common()
658 ret = vfio_platform_get_reset(vdev); in vfio_platform_probe_common()
659 if (ret && vdev->reset_required) { in vfio_platform_probe_common()
661 vdev->name); in vfio_platform_probe_common()
667 dev_err(dev, "No IOMMU group for device %s\n", vdev->name); in vfio_platform_probe_common()
672 ret = vfio_register_group_dev(&vdev->vdev); in vfio_platform_probe_common()
676 mutex_init(&vdev->igate); in vfio_platform_probe_common()
684 vfio_platform_put_reset(vdev); in vfio_platform_probe_common()
686 vfio_uninit_group_dev(&vdev->vdev); in vfio_platform_probe_common()
691 void vfio_platform_remove_common(struct vfio_platform_device *vdev) in vfio_platform_remove_common() argument
693 vfio_unregister_group_dev(&vdev->vdev); in vfio_platform_remove_common()
695 pm_runtime_disable(vdev->device); in vfio_platform_remove_common()
696 vfio_platform_put_reset(vdev); in vfio_platform_remove_common()
697 vfio_uninit_group_dev(&vdev->vdev); in vfio_platform_remove_common()
698 vfio_iommu_group_put(vdev->vdev.dev->iommu_group, vdev->vdev.dev); in vfio_platform_remove_common()