Lines Matching +full:use +full:- +full:case
10 * the COPYING file in the top-level directory.
12 * Based on qemu-kvm device-assignment:
18 * Copyright (C) 2008, IBM, Muli Ben-Yehuda (muli@il.ibm.com)
24 #include "hw/vfio/vfio-device.h"
29 #include "qemu/error-report.h"
32 #include "vfio-helpers.h"
38 * We want to differentiate hot reset of multiple in-use devices vs
39 * hot reset of a single in-use device. VFIO_DEVICE_RESET will already
40 * handle the case of doing hot resets when there is only a single
41 * device per bus. The in-use here refers to how many VFIODevices are
43 * single in-use device, means that we can call it from our bus
44 * ->reset() callback since the extent is effectively a single
45 * device. This allows us to make use of it in the hotplug path. When
46 * there are multiple in-use devices, we can only trigger the hot
50 * and ->reset() callback are used. Calling _one() will only do a hot
51 * reset for the one in-use devices case, calling _multi() will do
60 if (vbasedev->dev->realized) { in vfio_device_reset_handler()
61 vbasedev->ops->vfio_compute_needs_reset(vbasedev); in vfio_device_reset_handler()
66 if (vbasedev->dev->realized && vbasedev->needs_reset) { in vfio_device_reset_handler()
67 vbasedev->ops->vfio_hot_reset_multi(vbasedev); in vfio_device_reset_handler()
85 vbasedev->io_ops->set_irqs(vbasedev, &irq_set); in vfio_device_irq_disable()
98 vbasedev->io_ops->set_irqs(vbasedev, &irq_set); in vfio_device_irq_unmask()
111 vbasedev->io_ops->set_irqs(vbasedev, &irq_set); in vfio_device_irq_mask()
117 case VFIO_IRQ_SET_ACTION_MASK: in action_to_str()
119 case VFIO_IRQ_SET_ACTION_UNMASK: in action_to_str()
121 case VFIO_IRQ_SET_ACTION_TRIGGER: in action_to_str()
130 if (vbasedev->type != VFIO_DEVICE_TYPE_PCI) { in index_to_str()
135 case VFIO_PCI_INTX_IRQ_INDEX: in index_to_str()
137 case VFIO_PCI_MSI_IRQ_INDEX: in index_to_str()
139 case VFIO_PCI_MSIX_IRQ_INDEX: in index_to_str()
141 case VFIO_PCI_ERR_IRQ_INDEX: in index_to_str()
143 case VFIO_PCI_REQ_IRQ_INDEX: in index_to_str()
162 irq_set->argsz = argsz; in vfio_device_irq_set_signaling()
163 irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | action; in vfio_device_irq_set_signaling()
164 irq_set->index = index; in vfio_device_irq_set_signaling()
165 irq_set->start = subindex; in vfio_device_irq_set_signaling()
166 irq_set->count = 1; in vfio_device_irq_set_signaling()
167 pfd = (int32_t *)&irq_set->data; in vfio_device_irq_set_signaling()
170 if (!vbasedev->io_ops->set_irqs(vbasedev, irq_set)) { in vfio_device_irq_set_signaling()
178 error_prepend(errp, "%s-%d: ", name, subindex); in vfio_device_irq_set_signaling()
180 error_prepend(errp, "index %d-%d: ", index, subindex); in vfio_device_irq_set_signaling()
193 info->argsz = sizeof(*info); in vfio_device_get_irq_info()
194 info->index = index; in vfio_device_get_irq_info()
196 return vbasedev->io_ops->get_irq_info(vbasedev, info); in vfio_device_get_irq_info()
203 int fd = -1; in vfio_device_get_region_info()
207 if (vbasedev->reginfo[index] != NULL) { in vfio_device_get_region_info()
208 *info = vbasedev->reginfo[index]; in vfio_device_get_region_info()
214 (*info)->index = index; in vfio_device_get_region_info()
216 (*info)->argsz = argsz; in vfio_device_get_region_info()
218 ret = vbasedev->io_ops->get_region_info(vbasedev, *info, &fd); in vfio_device_get_region_info()
225 if ((*info)->argsz > argsz) { in vfio_device_get_region_info()
226 argsz = (*info)->argsz; in vfio_device_get_region_info()
229 if (fd != -1) { in vfio_device_get_region_info()
231 fd = -1; in vfio_device_get_region_info()
238 vbasedev->reginfo[index] = *info; in vfio_device_get_region_info()
239 if (vbasedev->region_fds != NULL) { in vfio_device_get_region_info()
240 vbasedev->region_fds[index] = fd; in vfio_device_get_region_info()
251 for (i = 0; i < vbasedev->num_regions; i++) { in vfio_device_get_region_info_type()
266 trace_vfio_device_get_region_info_type(vbasedev->name, i, in vfio_device_get_region_info_type()
267 cap_type->type, cap_type->subtype); in vfio_device_get_region_info_type()
269 if (cap_type->type == type && cap_type->subtype == subtype) { in vfio_device_get_region_info_type()
275 return -ENODEV; in vfio_device_get_region_info_type()
297 if (vbasedev->fd < 0) { in vfio_device_get_name()
298 if (stat(vbasedev->sysfsdev, &st) < 0) { in vfio_device_get_name()
300 error_prepend(errp, VFIO_MSG_PREFIX, vbasedev->sysfsdev); in vfio_device_get_name()
304 if (!vbasedev->name) { in vfio_device_get_name()
305 vbasedev->name = g_path_get_basename(vbasedev->sysfsdev); in vfio_device_get_name()
308 if (!vbasedev->iommufd) { in vfio_device_get_name()
309 error_setg(errp, "Use FD passing only with iommufd backend"); in vfio_device_get_name()
313 * Give a name with fd so any function printing out vbasedev->name in vfio_device_get_name()
316 if (!vbasedev->name) { in vfio_device_get_name()
317 vbasedev->name = g_strdup_printf("VFIO_FD%d", vbasedev->fd); in vfio_device_get_name()
333 vbasedev->fd = fd; in vfio_device_set_fd()
341 vbasedev->type = type; in vfio_device_init()
342 vbasedev->ops = ops; in vfio_device_init()
343 vbasedev->io_ops = &vfio_device_io_ops_ioctl; in vfio_device_init()
344 vbasedev->dev = dev; in vfio_device_init()
345 vbasedev->fd = -1; in vfio_device_init()
346 vbasedev->use_region_fds = false; in vfio_device_init()
348 vbasedev->ram_block_discard_allowed = ram_discard; in vfio_device_init()
356 * in this case HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX(64) is returned. in vfio_device_get_aw_bits()
358 GList *l = g_list_last(vdev->bcontainer->iova_ranges); in vfio_device_get_aw_bits()
361 Range *range = l->data; in vfio_device_get_aw_bits()
373 if (!vbasedev->sysfsdev) { in vfio_device_is_mdev()
377 tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); in vfio_device_is_mdev()
387 if (vbasedev->mdev) { in vfio_device_hiod_create_and_realize()
393 if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) { in vfio_device_hiod_create_and_realize()
398 vbasedev->hiod = hiod; in vfio_device_hiod_create_and_realize()
405 return &VFIO_PCI_BASE(obj)->vbasedev; in vfio_get_vfio_device()
420 return ops->attach_device(name, vbasedev, as, errp); in vfio_device_attach_by_iommu_type()
426 const char *iommu_type = vbasedev->iommufd ? in vfio_device_attach()
436 if (!vbasedev->bcontainer) { in vfio_device_detach()
439 VFIO_IOMMU_GET_CLASS(vbasedev->bcontainer)->detach_device(vbasedev); in vfio_device_detach()
445 vbasedev->num_irqs = info->num_irqs; in vfio_device_prepare()
446 vbasedev->num_regions = info->num_regions; in vfio_device_prepare()
447 vbasedev->flags = info->flags; in vfio_device_prepare()
448 vbasedev->reset_works = !!(info->flags & VFIO_DEVICE_FLAGS_RESET); in vfio_device_prepare()
450 vbasedev->bcontainer = bcontainer; in vfio_device_prepare()
451 QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next); in vfio_device_prepare()
455 vbasedev->reginfo = g_new0(struct vfio_region_info *, in vfio_device_prepare()
456 vbasedev->num_regions); in vfio_device_prepare()
457 if (vbasedev->use_region_fds) { in vfio_device_prepare()
458 vbasedev->region_fds = g_new0(int, vbasedev->num_regions); in vfio_device_prepare()
466 for (i = 0; i < vbasedev->num_regions; i++) { in vfio_device_unprepare()
467 g_free(vbasedev->reginfo[i]); in vfio_device_unprepare()
468 if (vbasedev->region_fds != NULL && vbasedev->region_fds[i] != -1) { in vfio_device_unprepare()
469 close(vbasedev->region_fds[i]); in vfio_device_unprepare()
474 g_clear_pointer(&vbasedev->reginfo, g_free); in vfio_device_unprepare()
475 g_clear_pointer(&vbasedev->region_fds, g_free); in vfio_device_unprepare()
479 vbasedev->bcontainer = NULL; in vfio_device_unprepare()
491 ret = ioctl(vbasedev->fd, VFIO_DEVICE_FEATURE, feature); in vfio_device_io_device_feature()
493 return ret < 0 ? -errno : ret; in vfio_device_io_device_feature()
502 *fd = -1; in vfio_device_io_get_region_info()
504 ret = ioctl(vbasedev->fd, VFIO_DEVICE_GET_REGION_INFO, info); in vfio_device_io_get_region_info()
506 return ret < 0 ? -errno : ret; in vfio_device_io_get_region_info()
514 ret = ioctl(vbasedev->fd, VFIO_DEVICE_GET_IRQ_INFO, info); in vfio_device_io_get_irq_info()
516 return ret < 0 ? -errno : ret; in vfio_device_io_get_irq_info()
524 ret = ioctl(vbasedev->fd, VFIO_DEVICE_SET_IRQS, irqs); in vfio_device_io_set_irqs()
526 return ret < 0 ? -errno : ret; in vfio_device_io_set_irqs()
540 ret = pread(vbasedev->fd, data, size, info->offset + off); in vfio_device_io_region_read()
542 return ret < 0 ? -errno : ret; in vfio_device_io_region_read()
557 ret = pwrite(vbasedev->fd, data, size, info->offset + off); in vfio_device_io_region_write()
559 return ret < 0 ? -errno : ret; in vfio_device_io_region_write()