|
|
|
@ -115,7 +115,7 @@ static void vfio_intx_eoi(VFIODevice *vbasedev) |
|
|
|
|
|
|
|
vdev->intx.pending = false; |
|
|
|
pci_irq_deassert(&vdev->pdev); |
|
|
|
vfio_unmask_single_irqindex(vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_unmask(vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
} |
|
|
|
|
|
|
|
static bool vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
@ -131,7 +131,7 @@ static bool vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
|
|
|
|
/* Get to a known interrupt state */ |
|
|
|
qemu_set_fd_handler(irq_fd, NULL, NULL, vdev); |
|
|
|
vfio_mask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_mask(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vdev->intx.pending = false; |
|
|
|
pci_irq_deassert(&vdev->pdev); |
|
|
|
|
|
|
|
@ -149,15 +149,15 @@ static bool vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
goto fail_irqfd; |
|
|
|
} |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_UNMASK, |
|
|
|
event_notifier_get_fd(&vdev->intx.unmask), |
|
|
|
errp)) { |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_UNMASK, |
|
|
|
event_notifier_get_fd(&vdev->intx.unmask), |
|
|
|
errp)) { |
|
|
|
goto fail_vfio; |
|
|
|
} |
|
|
|
|
|
|
|
/* Let'em rip */ |
|
|
|
vfio_unmask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_unmask(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
|
|
|
|
vdev->intx.kvm_accel = true; |
|
|
|
|
|
|
|
@ -172,7 +172,7 @@ fail_irqfd: |
|
|
|
event_notifier_cleanup(&vdev->intx.unmask); |
|
|
|
fail: |
|
|
|
qemu_set_fd_handler(irq_fd, vfio_intx_interrupt, NULL, vdev); |
|
|
|
vfio_unmask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_unmask(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
return false; |
|
|
|
#else |
|
|
|
return true; |
|
|
|
@ -190,7 +190,7 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev) |
|
|
|
* Get to a known state, hardware masked, QEMU ready to accept new |
|
|
|
* interrupts, QEMU IRQ de-asserted. |
|
|
|
*/ |
|
|
|
vfio_mask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_mask(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vdev->intx.pending = false; |
|
|
|
pci_irq_deassert(&vdev->pdev); |
|
|
|
|
|
|
|
@ -210,7 +210,7 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev) |
|
|
|
vdev->intx.kvm_accel = false; |
|
|
|
|
|
|
|
/* If we've missed an event, let it re-fire through QEMU */ |
|
|
|
vfio_unmask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_unmask(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
|
|
|
|
trace_vfio_intx_disable_kvm(vdev->vbasedev.name); |
|
|
|
#endif |
|
|
|
@ -299,7 +299,7 @@ static bool vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
fd = event_notifier_get_fd(&vdev->intx.interrupt); |
|
|
|
qemu_set_fd_handler(fd, vfio_intx_interrupt, NULL, vdev); |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) { |
|
|
|
qemu_set_fd_handler(fd, NULL, NULL, vdev); |
|
|
|
event_notifier_cleanup(&vdev->intx.interrupt); |
|
|
|
@ -322,7 +322,7 @@ static void vfio_intx_disable(VFIOPCIDevice *vdev) |
|
|
|
|
|
|
|
timer_del(vdev->intx.mmap_timer); |
|
|
|
vfio_intx_disable_kvm(vdev); |
|
|
|
vfio_disable_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vfio_device_irq_disable(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); |
|
|
|
vdev->intx.pending = false; |
|
|
|
pci_irq_deassert(&vdev->pdev); |
|
|
|
vfio_mmap_set_enabled(vdev, true); |
|
|
|
@ -578,7 +578,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr, |
|
|
|
|
|
|
|
if (!vdev->defer_kvm_irq_routing) { |
|
|
|
if (vdev->msix->noresize && resizing) { |
|
|
|
vfio_disable_irqindex(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX); |
|
|
|
vfio_device_irq_disable(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX); |
|
|
|
ret = vfio_enable_vectors(vdev, true); |
|
|
|
if (ret) { |
|
|
|
error_report("vfio: failed to enable vectors, %d", ret); |
|
|
|
@ -593,7 +593,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr, |
|
|
|
fd = event_notifier_get_fd(&vector->interrupt); |
|
|
|
} |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, |
|
|
|
VFIO_PCI_MSIX_IRQ_INDEX, nr, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, |
|
|
|
&err)) { |
|
|
|
@ -638,7 +638,7 @@ static void vfio_msix_vector_release(PCIDevice *pdev, unsigned int nr) |
|
|
|
int32_t fd = event_notifier_get_fd(&vector->interrupt); |
|
|
|
Error *err = NULL; |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX, |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX, |
|
|
|
nr, VFIO_IRQ_SET_ACTION_TRIGGER, fd, |
|
|
|
&err)) { |
|
|
|
error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); |
|
|
|
@ -835,7 +835,7 @@ static void vfio_msix_disable(VFIOPCIDevice *vdev) |
|
|
|
* Always clear MSI-X IRQ index. A PF device could have enabled |
|
|
|
* MSI-X with no vectors. See vfio_msix_enable(). |
|
|
|
*/ |
|
|
|
vfio_disable_irqindex(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX); |
|
|
|
vfio_device_irq_disable(&vdev->vbasedev, VFIO_PCI_MSIX_IRQ_INDEX); |
|
|
|
|
|
|
|
vfio_msi_disable_common(vdev); |
|
|
|
if (!vfio_intx_enable(vdev, &err)) { |
|
|
|
@ -852,7 +852,7 @@ static void vfio_msi_disable(VFIOPCIDevice *vdev) |
|
|
|
{ |
|
|
|
Error *err = NULL; |
|
|
|
|
|
|
|
vfio_disable_irqindex(&vdev->vbasedev, VFIO_PCI_MSI_IRQ_INDEX); |
|
|
|
vfio_device_irq_disable(&vdev->vbasedev, VFIO_PCI_MSI_IRQ_INDEX); |
|
|
|
vfio_msi_disable_common(vdev); |
|
|
|
vfio_intx_enable(vdev, &err); |
|
|
|
if (err) { |
|
|
|
@ -886,8 +886,8 @@ static void vfio_pci_load_rom(VFIOPCIDevice *vdev) |
|
|
|
off_t off = 0; |
|
|
|
ssize_t bytes; |
|
|
|
|
|
|
|
if (vfio_get_region_info(&vdev->vbasedev, |
|
|
|
VFIO_PCI_ROM_REGION_INDEX, ®_info)) { |
|
|
|
if (vfio_device_get_region_info(&vdev->vbasedev, |
|
|
|
VFIO_PCI_ROM_REGION_INDEX, ®_info)) { |
|
|
|
error_report("vfio: Error getting ROM info: %m"); |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -1380,8 +1380,8 @@ static void vfio_pci_fixup_msix_region(VFIOPCIDevice *vdev) |
|
|
|
* If the host driver allows mapping of a MSIX data, we are going to |
|
|
|
* do map the entire BAR and emulate MSIX table on top of that. |
|
|
|
*/ |
|
|
|
if (vfio_has_region_cap(&vdev->vbasedev, region->nr, |
|
|
|
VFIO_REGION_INFO_CAP_MSIX_MAPPABLE)) { |
|
|
|
if (vfio_device_has_region_cap(&vdev->vbasedev, region->nr, |
|
|
|
VFIO_REGION_INFO_CAP_MSIX_MAPPABLE)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -2673,7 +2673,7 @@ bool vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
g_autofree struct vfio_region_info *reg_info = NULL; |
|
|
|
int ret; |
|
|
|
|
|
|
|
ret = vfio_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info); |
|
|
|
ret = vfio_device_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info); |
|
|
|
if (ret) { |
|
|
|
error_setg_errno(errp, -ret, |
|
|
|
"failed getting region info for VGA region index %d", |
|
|
|
@ -2771,8 +2771,8 @@ static bool vfio_populate_device(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
QLIST_INIT(&vdev->bars[i].quirks); |
|
|
|
} |
|
|
|
|
|
|
|
ret = vfio_get_region_info(vbasedev, |
|
|
|
VFIO_PCI_CONFIG_REGION_INDEX, ®_info); |
|
|
|
ret = vfio_device_get_region_info(vbasedev, |
|
|
|
VFIO_PCI_CONFIG_REGION_INDEX, ®_info); |
|
|
|
if (ret) { |
|
|
|
error_setg_errno(errp, -ret, "failed to get config info"); |
|
|
|
return false; |
|
|
|
@ -2816,7 +2816,7 @@ static bool vfio_populate_device(VFIOPCIDevice *vdev, Error **errp) |
|
|
|
|
|
|
|
static void vfio_pci_put_device(VFIOPCIDevice *vdev) |
|
|
|
{ |
|
|
|
vfio_detach_device(&vdev->vbasedev); |
|
|
|
vfio_device_detach(&vdev->vbasedev); |
|
|
|
|
|
|
|
g_free(vdev->vbasedev.name); |
|
|
|
g_free(vdev->msix); |
|
|
|
@ -2868,8 +2868,8 @@ static void vfio_register_err_notifier(VFIOPCIDevice *vdev) |
|
|
|
fd = event_notifier_get_fd(&vdev->err_notifier); |
|
|
|
qemu_set_fd_handler(fd, vfio_err_notifier_handler, NULL, vdev); |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_ERR_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_ERR_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { |
|
|
|
error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); |
|
|
|
qemu_set_fd_handler(fd, NULL, NULL, vdev); |
|
|
|
event_notifier_cleanup(&vdev->err_notifier); |
|
|
|
@ -2885,8 +2885,8 @@ static void vfio_unregister_err_notifier(VFIOPCIDevice *vdev) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_ERR_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err)) { |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_ERR_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err)) { |
|
|
|
error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); |
|
|
|
} |
|
|
|
qemu_set_fd_handler(event_notifier_get_fd(&vdev->err_notifier), |
|
|
|
@ -2933,8 +2933,8 @@ static void vfio_register_req_notifier(VFIOPCIDevice *vdev) |
|
|
|
fd = event_notifier_get_fd(&vdev->req_notifier); |
|
|
|
qemu_set_fd_handler(fd, vfio_req_notifier_handler, NULL, vdev); |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_REQ_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_REQ_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { |
|
|
|
error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); |
|
|
|
qemu_set_fd_handler(fd, NULL, NULL, vdev); |
|
|
|
event_notifier_cleanup(&vdev->req_notifier); |
|
|
|
@ -2951,8 +2951,8 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice *vdev) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_REQ_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err)) { |
|
|
|
if (!vfio_device_irq_set_signaling(&vdev->vbasedev, VFIO_PCI_REQ_IRQ_INDEX, 0, |
|
|
|
VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err)) { |
|
|
|
error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); |
|
|
|
} |
|
|
|
qemu_set_fd_handler(event_notifier_get_fd(&vdev->req_notifier), |
|
|
|
@ -3015,7 +3015,7 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) |
|
|
|
name = g_strdup(vbasedev->name); |
|
|
|
} |
|
|
|
|
|
|
|
if (!vfio_attach_device(name, vbasedev, |
|
|
|
if (!vfio_device_attach(name, vbasedev, |
|
|
|
pci_device_iommu_address_space(pdev), errp)) { |
|
|
|
goto error; |
|
|
|
} |
|
|
|
|