Lines Matching full:vdev
34 static bool irq_is(struct vfio_pci_core_device *vdev, int type) in irq_is() argument
36 return vdev->irq_type == type; in irq_is()
39 static bool is_intx(struct vfio_pci_core_device *vdev) in is_intx() argument
41 return vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX; in is_intx()
44 static bool is_irq_none(struct vfio_pci_core_device *vdev) in is_irq_none() argument
46 return !(vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX || in is_irq_none()
47 vdev->irq_type == VFIO_PCI_MSI_IRQ_INDEX || in is_irq_none()
48 vdev->irq_type == VFIO_PCI_MSIX_IRQ_INDEX); in is_irq_none()
52 struct vfio_pci_irq_ctx *vfio_irq_ctx_get(struct vfio_pci_core_device *vdev, in vfio_irq_ctx_get() argument
55 return xa_load(&vdev->ctx, index); in vfio_irq_ctx_get()
58 static void vfio_irq_ctx_free(struct vfio_pci_core_device *vdev, in vfio_irq_ctx_free() argument
61 xa_erase(&vdev->ctx, index); in vfio_irq_ctx_free()
66 vfio_irq_ctx_alloc(struct vfio_pci_core_device *vdev, unsigned long index) in vfio_irq_ctx_alloc() argument
75 ret = xa_insert(&vdev->ctx, index, ctx, GFP_KERNEL_ACCOUNT); in vfio_irq_ctx_alloc()
89 struct vfio_pci_core_device *vdev = opaque; in vfio_send_intx_eventfd() local
91 if (likely(is_intx(vdev) && !vdev->virq_disabled)) { in vfio_send_intx_eventfd()
94 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_send_intx_eventfd()
102 bool vfio_pci_intx_mask(struct vfio_pci_core_device *vdev) in vfio_pci_intx_mask() argument
104 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_mask()
109 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_mask()
117 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_mask()
118 if (vdev->pci_2_3) in vfio_pci_intx_mask()
123 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_pci_intx_mask()
132 if (vdev->pci_2_3) in vfio_pci_intx_mask()
142 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_mask()
154 struct vfio_pci_core_device *vdev = opaque; in vfio_pci_intx_unmask_handler() local
155 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_unmask_handler()
160 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
166 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_unmask_handler()
167 if (vdev->pci_2_3) in vfio_pci_intx_unmask_handler()
172 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_pci_intx_unmask_handler()
176 if (ctx->masked && !vdev->virq_disabled) { in vfio_pci_intx_unmask_handler()
182 if (vdev->pci_2_3) { in vfio_pci_intx_unmask_handler()
192 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
197 void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev) in vfio_pci_intx_unmask() argument
199 if (vfio_pci_intx_unmask_handler(vdev, NULL) > 0) in vfio_pci_intx_unmask()
200 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_intx_unmask()
205 struct vfio_pci_core_device *vdev = dev_id; in vfio_intx_handler() local
210 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_handler()
214 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_handler()
216 if (!vdev->pci_2_3) { in vfio_intx_handler()
217 disable_irq_nosync(vdev->pdev->irq); in vfio_intx_handler()
221 pci_check_and_mask_intx(vdev->pdev)) { in vfio_intx_handler()
226 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_handler()
229 vfio_send_intx_eventfd(vdev, NULL); in vfio_intx_handler()
234 static int vfio_intx_enable(struct vfio_pci_core_device *vdev) in vfio_intx_enable() argument
238 if (!is_irq_none(vdev)) in vfio_intx_enable()
241 if (!vdev->pdev->irq) in vfio_intx_enable()
244 ctx = vfio_irq_ctx_alloc(vdev, 0); in vfio_intx_enable()
254 ctx->masked = vdev->virq_disabled; in vfio_intx_enable()
255 if (vdev->pci_2_3) in vfio_intx_enable()
256 pci_intx(vdev->pdev, !ctx->masked); in vfio_intx_enable()
258 vdev->irq_type = VFIO_PCI_INTX_IRQ_INDEX; in vfio_intx_enable()
263 static int vfio_intx_set_signal(struct vfio_pci_core_device *vdev, int fd) in vfio_intx_set_signal() argument
265 struct pci_dev *pdev = vdev->pdev; in vfio_intx_set_signal()
272 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_set_signal()
277 free_irq(pdev->irq, vdev); in vfio_intx_set_signal()
299 if (!vdev->pci_2_3) in vfio_intx_set_signal()
303 irqflags, ctx->name, vdev); in vfio_intx_set_signal()
315 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_set_signal()
316 if (!vdev->pci_2_3 && ctx->masked) in vfio_intx_set_signal()
318 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_set_signal()
323 static void vfio_intx_disable(struct vfio_pci_core_device *vdev) in vfio_intx_disable() argument
327 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_disable()
333 vfio_intx_set_signal(vdev, -1); in vfio_intx_disable()
334 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_intx_disable()
335 vfio_irq_ctx_free(vdev, ctx, 0); in vfio_intx_disable()
349 static int vfio_msi_enable(struct vfio_pci_core_device *vdev, int nvec, bool msix) in vfio_msi_enable() argument
351 struct pci_dev *pdev = vdev->pdev; in vfio_msi_enable()
356 if (!is_irq_none(vdev)) in vfio_msi_enable()
360 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_enable()
365 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
368 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
370 vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX : in vfio_msi_enable()
378 vdev->msi_qmax = fls(nvec * 2 - 1) - 1; in vfio_msi_enable()
394 static int vfio_msi_alloc_irq(struct vfio_pci_core_device *vdev, in vfio_msi_alloc_irq() argument
397 struct pci_dev *pdev = vdev->pdev; in vfio_msi_alloc_irq()
405 if (irq > 0 || !msix || !vdev->has_dyn_msix) in vfio_msi_alloc_irq()
408 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_alloc_irq()
410 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_alloc_irq()
415 static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev, in vfio_msi_set_vector_signal() argument
418 struct pci_dev *pdev = vdev->pdev; in vfio_msi_set_vector_signal()
424 ctx = vfio_irq_ctx_get(vdev, vector); in vfio_msi_set_vector_signal()
429 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
431 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
435 vfio_irq_ctx_free(vdev, ctx, vector); in vfio_msi_set_vector_signal()
443 irq = vfio_msi_alloc_irq(vdev, vector, msix); in vfio_msi_set_vector_signal()
448 ctx = vfio_irq_ctx_alloc(vdev, vector); in vfio_msi_set_vector_signal()
470 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
479 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
502 vfio_irq_ctx_free(vdev, ctx, vector); in vfio_msi_set_vector_signal()
506 static int vfio_msi_set_block(struct vfio_pci_core_device *vdev, unsigned start, in vfio_msi_set_block() argument
514 ret = vfio_msi_set_vector_signal(vdev, j, fd, msix); in vfio_msi_set_block()
519 vfio_msi_set_vector_signal(vdev, i, -1, msix); in vfio_msi_set_block()
525 static void vfio_msi_disable(struct vfio_pci_core_device *vdev, bool msix) in vfio_msi_disable() argument
527 struct pci_dev *pdev = vdev->pdev; in vfio_msi_disable()
532 xa_for_each(&vdev->ctx, i, ctx) { in vfio_msi_disable()
535 vfio_msi_set_vector_signal(vdev, i, -1, msix); in vfio_msi_disable()
538 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_disable()
540 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_disable()
546 if (vdev->nointx) in vfio_msi_disable()
549 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_msi_disable()
555 static int vfio_pci_set_intx_unmask(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_unmask() argument
559 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_unmask()
563 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
567 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
569 struct vfio_pci_irq_ctx *ctx = vfio_irq_ctx_get(vdev, 0); in vfio_pci_set_intx_unmask()
575 return vfio_virqfd_enable((void *) vdev, in vfio_pci_set_intx_unmask()
586 static int vfio_pci_set_intx_mask(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_mask() argument
590 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_mask()
594 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
598 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
606 static int vfio_pci_set_intx_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_trigger() argument
610 if (is_intx(vdev) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_intx_trigger()
611 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
615 if (!(is_intx(vdev) || is_irq_none(vdev)) || start != 0 || count != 1) in vfio_pci_set_intx_trigger()
622 if (is_intx(vdev)) in vfio_pci_set_intx_trigger()
623 return vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
625 ret = vfio_intx_enable(vdev); in vfio_pci_set_intx_trigger()
629 ret = vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
631 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
636 if (!is_intx(vdev)) in vfio_pci_set_intx_trigger()
640 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
644 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
649 static int vfio_pci_set_msi_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_msi_trigger() argument
657 if (irq_is(vdev, index) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_msi_trigger()
658 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
662 if (!(irq_is(vdev, index) || is_irq_none(vdev))) in vfio_pci_set_msi_trigger()
669 if (vdev->irq_type == index) in vfio_pci_set_msi_trigger()
670 return vfio_msi_set_block(vdev, start, count, in vfio_pci_set_msi_trigger()
673 ret = vfio_msi_enable(vdev, start + count, msix); in vfio_pci_set_msi_trigger()
677 ret = vfio_msi_set_block(vdev, start, count, fds, msix); in vfio_pci_set_msi_trigger()
679 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
684 if (!irq_is(vdev, index)) in vfio_pci_set_msi_trigger()
688 ctx = vfio_irq_ctx_get(vdev, i); in vfio_pci_set_msi_trigger()
757 static int vfio_pci_set_err_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_err_trigger() argument
764 return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, in vfio_pci_set_err_trigger()
768 static int vfio_pci_set_req_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_req_trigger() argument
775 return vfio_pci_set_ctx_trigger_single(&vdev->req_trigger, in vfio_pci_set_req_trigger()
779 int vfio_pci_set_irqs_ioctl(struct vfio_pci_core_device *vdev, uint32_t flags, in vfio_pci_set_irqs_ioctl() argument
783 int (*func)(struct vfio_pci_core_device *vdev, unsigned index, in vfio_pci_set_irqs_ioctl()
816 if (pci_is_pcie(vdev->pdev)) in vfio_pci_set_irqs_ioctl()
833 return func(vdev, index, start, count, flags, data); in vfio_pci_set_irqs_ioctl()