Lines Matching full:o

76 #define VFU_OBJECT_ERROR(o, fmt, ...)                                     \  argument
116 static void vfu_object_init_ctx(VfuObject *o, Error **errp);
148 VfuObject *o = VFU_OBJECT(obj); in vfu_object_set_socket() local
150 if (o->vfu_ctx) { in vfu_object_set_socket()
155 qapi_free_SocketAddress(o->socket); in vfu_object_set_socket()
157 o->socket = NULL; in vfu_object_set_socket()
159 visit_type_SocketAddress(v, name, &o->socket, errp); in vfu_object_set_socket()
161 if (o->socket->type != SOCKET_ADDRESS_TYPE_UNIX) { in vfu_object_set_socket()
163 SocketAddressType_str(o->socket->type)); in vfu_object_set_socket()
164 qapi_free_SocketAddress(o->socket); in vfu_object_set_socket()
165 o->socket = NULL; in vfu_object_set_socket()
169 trace_vfu_prop("socket", o->socket->u.q_unix.path); in vfu_object_set_socket()
171 vfu_object_init_ctx(o, errp); in vfu_object_set_socket()
176 VfuObject *o = VFU_OBJECT(obj); in vfu_object_set_device() local
178 if (o->vfu_ctx) { in vfu_object_set_device()
183 g_free(o->device); in vfu_object_set_device()
185 o->device = g_strdup(str); in vfu_object_set_device()
189 vfu_object_init_ctx(o, errp); in vfu_object_set_device()
194 VfuObject *o = opaque; in vfu_object_ctx_run() local
200 ret = vfu_run_ctx(o->vfu_ctx); in vfu_object_ctx_run()
205 vfu_id = object_get_canonical_path_component(OBJECT(o)); in vfu_object_ctx_run()
206 vfu_path = object_get_canonical_path(OBJECT(o)); in vfu_object_ctx_run()
207 g_assert(o->pci_dev); in vfu_object_ctx_run()
208 pci_dev_path = object_get_canonical_path(OBJECT(o->pci_dev)); in vfu_object_ctx_run()
209 /* o->device is a required property and is non-NULL here */ in vfu_object_ctx_run()
210 g_assert(o->device); in vfu_object_ctx_run()
212 o->device, pci_dev_path); in vfu_object_ctx_run()
213 qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL); in vfu_object_ctx_run()
214 o->vfu_poll_fd = -1; in vfu_object_ctx_run()
215 object_unparent(OBJECT(o)); in vfu_object_ctx_run()
220 VFU_OBJECT_ERROR(o, "vfu: Failed to run device %s - %s", in vfu_object_ctx_run()
221 o->device, strerror(errno)); in vfu_object_ctx_run()
230 VfuObject *o = opaque; in vfu_object_attach_ctx() local
234 qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL); in vfu_object_attach_ctx()
236 pfds[0].fd = o->vfu_poll_fd; in vfu_object_attach_ctx()
240 ret = vfu_attach_ctx(o->vfu_ctx); in vfu_object_attach_ctx()
250 VFU_OBJECT_ERROR(o, "vfu: Failed to attach device %s to context - %s", in vfu_object_attach_ctx()
251 o->device, strerror(errno)); in vfu_object_attach_ctx()
255 o->vfu_poll_fd = vfu_get_poll_fd(o->vfu_ctx); in vfu_object_attach_ctx()
256 if (o->vfu_poll_fd < 0) { in vfu_object_attach_ctx()
257 VFU_OBJECT_ERROR(o, "vfu: Failed to get poll fd %s", o->device); in vfu_object_attach_ctx()
261 qemu_set_fd_handler(o->vfu_poll_fd, vfu_object_ctx_run, NULL, o); in vfu_object_attach_ctx()
268 VfuObject *o = vfu_get_private(vfu_ctx); in vfu_object_cfg_access() local
285 pci_host_config_write_common(o->pci_dev, offset, in vfu_object_cfg_access()
286 pci_config_size(o->pci_dev), in vfu_object_cfg_access()
290 val = pci_host_config_read_common(o->pci_dev, offset, in vfu_object_cfg_access()
291 pci_config_size(o->pci_dev), len); in vfu_object_cfg_access()
305 VfuObject *o = vfu_get_private(vfu_ctx); in dma_register() local
315 name = g_strdup_printf("mem-%s-%"PRIx64"", o->device, in dma_register()
323 dma_as = pci_device_iommu_address_space(o->pci_dev); in dma_register()
332 VfuObject *o = vfu_get_private(vfu_ctx); in dma_unregister() local
342 dma_as = pci_device_iommu_address_space(o->pci_dev); in dma_unregister()
484 VfuObject *o = vfu_get_private(vfu_ctx); \
485 PCIDevice *pci_dev = o->pci_dev; \
558 * pci_find_device() performs at O(1) if the device is attached in vfu_object_set_irq()
561 * finding the parent PCI bus could take O(n) in vfu_object_set_irq()
591 static void vfu_object_setup_msi_cbs(VfuObject *o) in vfu_object_setup_msi_cbs() argument
593 o->default_msi_trigger = o->pci_dev->msi_trigger; in vfu_object_setup_msi_cbs()
594 o->default_msi_prepare_message = o->pci_dev->msi_prepare_message; in vfu_object_setup_msi_cbs()
595 o->default_msix_prepare_message = o->pci_dev->msix_prepare_message; in vfu_object_setup_msi_cbs()
597 o->pci_dev->msi_trigger = vfu_object_msi_trigger; in vfu_object_setup_msi_cbs()
598 o->pci_dev->msi_prepare_message = vfu_object_msi_prepare_msg; in vfu_object_setup_msi_cbs()
599 o->pci_dev->msix_prepare_message = vfu_object_msi_prepare_msg; in vfu_object_setup_msi_cbs()
602 static void vfu_object_restore_msi_cbs(VfuObject *o) in vfu_object_restore_msi_cbs() argument
604 o->pci_dev->msi_trigger = o->default_msi_trigger; in vfu_object_restore_msi_cbs()
605 o->pci_dev->msi_prepare_message = o->default_msi_prepare_message; in vfu_object_restore_msi_cbs()
606 o->pci_dev->msix_prepare_message = o->default_msix_prepare_message; in vfu_object_restore_msi_cbs()
612 VfuObject *o = vfu_get_private(vfu_ctx); in vfu_msix_irq_state() local
616 msix_set_mask(o->pci_dev, vector, mask); in vfu_msix_irq_state()
623 VfuObject *o = vfu_get_private(vfu_ctx); in vfu_msi_irq_state() local
628 msi_set_mask(o->pci_dev, vector, mask, &err); in vfu_msi_irq_state()
630 VFU_OBJECT_ERROR(o, "vfu: %s: %s", o->device, in vfu_msi_irq_state()
638 static int vfu_object_setup_irqs(VfuObject *o, PCIDevice *pci_dev) in vfu_object_setup_irqs() argument
640 vfu_ctx_t *vfu_ctx = o->vfu_ctx; in vfu_object_setup_irqs()
664 vfu_object_setup_msi_cbs(o); in vfu_object_setup_irqs()
682 VfuObject *o = vfu_get_private(vfu_ctx); in vfu_object_device_reset() local
689 device_cold_reset(DEVICE(o->pci_dev)); in vfu_object_device_reset()
704 VfuObject *o = container_of(notifier, VfuObject, machine_done); in vfu_object_machine_done() local
707 vfu_object_init_ctx(o, &err); in vfu_object_machine_done()
728 static void vfu_object_init_ctx(VfuObject *o, Error **errp) in vfu_object_init_ctx() argument
734 if (o->vfu_ctx || !o->socket || !o->device || in vfu_object_init_ctx()
739 if (o->err) { in vfu_object_init_ctx()
740 error_propagate(errp, o->err); in vfu_object_init_ctx()
741 o->err = NULL; in vfu_object_init_ctx()
745 o->vfu_ctx = vfu_create_ctx(VFU_TRANS_SOCK, o->socket->u.q_unix.path, in vfu_object_init_ctx()
747 o, VFU_DEV_TYPE_PCI); in vfu_object_init_ctx()
748 if (o->vfu_ctx == NULL) { in vfu_object_init_ctx()
753 dev = qdev_find_recursive(sysbus_get_default(), o->device); in vfu_object_init_ctx()
755 error_setg(errp, "vfu: Device %s not found", o->device); in vfu_object_init_ctx()
760 error_setg(errp, "vfu: %s not a PCI device", o->device); in vfu_object_init_ctx()
764 o->pci_dev = PCI_DEVICE(dev); in vfu_object_init_ctx()
766 object_ref(OBJECT(o->pci_dev)); in vfu_object_init_ctx()
768 if (pci_is_express(o->pci_dev)) { in vfu_object_init_ctx()
772 ret = vfu_pci_init(o->vfu_ctx, pci_type, PCI_HEADER_TYPE_NORMAL, 0); in vfu_object_init_ctx()
776 o->device, strerror(errno)); in vfu_object_init_ctx()
780 error_setg(&o->unplug_blocker, in vfu_object_init_ctx()
782 TYPE_VFU_OBJECT, o->device); in vfu_object_init_ctx()
783 qdev_add_unplug_blocker(DEVICE(o->pci_dev), o->unplug_blocker); in vfu_object_init_ctx()
785 ret = vfu_setup_region(o->vfu_ctx, VFU_PCI_DEV_CFG_REGION_IDX, in vfu_object_init_ctx()
786 pci_config_size(o->pci_dev), &vfu_object_cfg_access, in vfu_object_init_ctx()
792 o->device, strerror(errno)); in vfu_object_init_ctx()
796 ret = vfu_setup_device_dma(o->vfu_ctx, &dma_register, &dma_unregister); in vfu_object_init_ctx()
799 o->device); in vfu_object_init_ctx()
803 vfu_object_register_bars(o->vfu_ctx, o->pci_dev); in vfu_object_init_ctx()
805 ret = vfu_object_setup_irqs(o, o->pci_dev); in vfu_object_init_ctx()
808 o->device); in vfu_object_init_ctx()
812 ret = vfu_setup_device_reset_cb(o->vfu_ctx, &vfu_object_device_reset); in vfu_object_init_ctx()
818 ret = vfu_realize_ctx(o->vfu_ctx); in vfu_object_init_ctx()
821 o->device, strerror(errno)); in vfu_object_init_ctx()
825 o->vfu_poll_fd = vfu_get_poll_fd(o->vfu_ctx); in vfu_object_init_ctx()
826 if (o->vfu_poll_fd < 0) { in vfu_object_init_ctx()
827 error_setg(errp, "vfu: Failed to get poll fd %s", o->device); in vfu_object_init_ctx()
831 qemu_set_fd_handler(o->vfu_poll_fd, vfu_object_attach_ctx, NULL, o); in vfu_object_init_ctx()
836 vfu_destroy_ctx(o->vfu_ctx); in vfu_object_init_ctx()
837 if (o->unplug_blocker && o->pci_dev) { in vfu_object_init_ctx()
838 qdev_del_unplug_blocker(DEVICE(o->pci_dev), o->unplug_blocker); in vfu_object_init_ctx()
839 error_free(o->unplug_blocker); in vfu_object_init_ctx()
840 o->unplug_blocker = NULL; in vfu_object_init_ctx()
842 if (o->pci_dev) { in vfu_object_init_ctx()
843 vfu_object_restore_msi_cbs(o); in vfu_object_init_ctx()
844 o->pci_dev->irq_opaque = NULL; in vfu_object_init_ctx()
845 object_unref(OBJECT(o->pci_dev)); in vfu_object_init_ctx()
846 o->pci_dev = NULL; in vfu_object_init_ctx()
848 o->vfu_ctx = NULL; in vfu_object_init_ctx()
854 VfuObject *o = VFU_OBJECT(obj); in vfu_object_init() local
859 error_setg(&o->err, "vfu: %s only compatible with %s machine", in vfu_object_init()
865 o->machine_done.notify = vfu_object_machine_done; in vfu_object_init()
866 qemu_add_machine_init_done_notifier(&o->machine_done); in vfu_object_init()
869 o->vfu_poll_fd = -1; in vfu_object_init()
875 VfuObject *o = VFU_OBJECT(obj); in vfu_object_finalize() local
879 qapi_free_SocketAddress(o->socket); in vfu_object_finalize()
881 o->socket = NULL; in vfu_object_finalize()
883 if (o->vfu_poll_fd != -1) { in vfu_object_finalize()
884 qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL); in vfu_object_finalize()
885 o->vfu_poll_fd = -1; in vfu_object_finalize()
888 if (o->vfu_ctx) { in vfu_object_finalize()
889 vfu_destroy_ctx(o->vfu_ctx); in vfu_object_finalize()
890 o->vfu_ctx = NULL; in vfu_object_finalize()
893 g_free(o->device); in vfu_object_finalize()
895 o->device = NULL; in vfu_object_finalize()
897 if (o->unplug_blocker && o->pci_dev) { in vfu_object_finalize()
898 qdev_del_unplug_blocker(DEVICE(o->pci_dev), o->unplug_blocker); in vfu_object_finalize()
899 error_free(o->unplug_blocker); in vfu_object_finalize()
900 o->unplug_blocker = NULL; in vfu_object_finalize()
903 if (o->pci_dev) { in vfu_object_finalize()
904 vfu_object_restore_msi_cbs(o); in vfu_object_finalize()
905 o->pci_dev->irq_opaque = NULL; in vfu_object_finalize()
906 object_unref(OBJECT(o->pci_dev)); in vfu_object_finalize()
907 o->pci_dev = NULL; in vfu_object_finalize()
914 if (o->machine_done.notify) { in vfu_object_finalize()
915 qemu_remove_machine_init_done_notifier(&o->machine_done); in vfu_object_finalize()
916 o->machine_done.notify = NULL; in vfu_object_finalize()