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()
95 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_send_intx_eventfd()
106 static bool __vfio_pci_intx_mask(struct vfio_pci_core_device *vdev) in __vfio_pci_intx_mask() argument
108 struct pci_dev *pdev = vdev->pdev; in __vfio_pci_intx_mask()
113 lockdep_assert_held(&vdev->igate); in __vfio_pci_intx_mask()
115 spin_lock_irqsave(&vdev->irqlock, flags); in __vfio_pci_intx_mask()
123 if (unlikely(!is_intx(vdev))) { in __vfio_pci_intx_mask()
124 if (vdev->pci_2_3) in __vfio_pci_intx_mask()
129 ctx = vfio_irq_ctx_get(vdev, 0); in __vfio_pci_intx_mask()
138 if (vdev->pci_2_3) in __vfio_pci_intx_mask()
148 spin_unlock_irqrestore(&vdev->irqlock, flags); in __vfio_pci_intx_mask()
152 bool vfio_pci_intx_mask(struct vfio_pci_core_device *vdev) in vfio_pci_intx_mask() argument
156 mutex_lock(&vdev->igate); in vfio_pci_intx_mask()
157 mask_changed = __vfio_pci_intx_mask(vdev); in vfio_pci_intx_mask()
158 mutex_unlock(&vdev->igate); in vfio_pci_intx_mask()
171 struct vfio_pci_core_device *vdev = opaque; in vfio_pci_intx_unmask_handler() local
172 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_unmask_handler()
177 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
183 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_unmask_handler()
184 if (vdev->pci_2_3) in vfio_pci_intx_unmask_handler()
189 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_pci_intx_unmask_handler()
193 if (ctx->masked && !vdev->virq_disabled) { in vfio_pci_intx_unmask_handler()
199 if (vdev->pci_2_3) { in vfio_pci_intx_unmask_handler()
209 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
214 static void __vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev) in __vfio_pci_intx_unmask() argument
216 lockdep_assert_held(&vdev->igate); in __vfio_pci_intx_unmask()
218 if (vfio_pci_intx_unmask_handler(vdev, NULL) > 0) in __vfio_pci_intx_unmask()
219 vfio_send_intx_eventfd(vdev, NULL); in __vfio_pci_intx_unmask()
222 void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev) in vfio_pci_intx_unmask() argument
224 mutex_lock(&vdev->igate); in vfio_pci_intx_unmask()
225 __vfio_pci_intx_unmask(vdev); in vfio_pci_intx_unmask()
226 mutex_unlock(&vdev->igate); in vfio_pci_intx_unmask()
231 struct vfio_pci_core_device *vdev = dev_id; in vfio_intx_handler() local
236 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_handler()
240 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_handler()
242 if (!vdev->pci_2_3) { in vfio_intx_handler()
243 disable_irq_nosync(vdev->pdev->irq); in vfio_intx_handler()
247 pci_check_and_mask_intx(vdev->pdev)) { in vfio_intx_handler()
252 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_handler()
255 vfio_send_intx_eventfd(vdev, NULL); in vfio_intx_handler()
260 static int vfio_intx_enable(struct vfio_pci_core_device *vdev, in vfio_intx_enable() argument
263 struct pci_dev *pdev = vdev->pdev; in vfio_intx_enable()
269 if (!is_irq_none(vdev)) in vfio_intx_enable()
279 ctx = vfio_irq_ctx_alloc(vdev, 0); in vfio_intx_enable()
306 ctx->masked = vdev->virq_disabled; in vfio_intx_enable()
307 if (vdev->pci_2_3) { in vfio_intx_enable()
314 vdev->irq_type = VFIO_PCI_INTX_IRQ_INDEX; in vfio_intx_enable()
317 irqflags, ctx->name, vdev); in vfio_intx_enable()
319 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_intx_enable()
321 vfio_irq_ctx_free(vdev, ctx, 0); in vfio_intx_enable()
328 static int vfio_intx_set_signal(struct vfio_pci_core_device *vdev, in vfio_intx_set_signal() argument
331 struct pci_dev *pdev = vdev->pdev; in vfio_intx_set_signal()
335 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_set_signal()
353 static void vfio_intx_disable(struct vfio_pci_core_device *vdev) in vfio_intx_disable() argument
355 struct pci_dev *pdev = vdev->pdev; in vfio_intx_disable()
358 ctx = vfio_irq_ctx_get(vdev, 0); in vfio_intx_disable()
363 free_irq(pdev->irq, vdev); in vfio_intx_disable()
367 vfio_irq_ctx_free(vdev, ctx, 0); in vfio_intx_disable()
369 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_intx_disable()
383 static int vfio_msi_enable(struct vfio_pci_core_device *vdev, int nvec, bool msix) in vfio_msi_enable() argument
385 struct pci_dev *pdev = vdev->pdev; in vfio_msi_enable()
390 if (!is_irq_none(vdev)) in vfio_msi_enable()
394 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_enable()
399 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
402 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
404 vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX : in vfio_msi_enable()
412 vdev->msi_qmax = fls(nvec * 2 - 1) - 1; in vfio_msi_enable()
428 static int vfio_msi_alloc_irq(struct vfio_pci_core_device *vdev, in vfio_msi_alloc_irq() argument
431 struct pci_dev *pdev = vdev->pdev; in vfio_msi_alloc_irq()
439 if (irq > 0 || !msix || !vdev->has_dyn_msix) in vfio_msi_alloc_irq()
442 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_alloc_irq()
444 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_alloc_irq()
449 static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev, in vfio_msi_set_vector_signal() argument
452 struct pci_dev *pdev = vdev->pdev; in vfio_msi_set_vector_signal()
458 ctx = vfio_irq_ctx_get(vdev, vector); in vfio_msi_set_vector_signal()
463 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
465 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
469 vfio_irq_ctx_free(vdev, ctx, vector); in vfio_msi_set_vector_signal()
477 irq = vfio_msi_alloc_irq(vdev, vector, msix); in vfio_msi_set_vector_signal()
482 ctx = vfio_irq_ctx_alloc(vdev, vector); in vfio_msi_set_vector_signal()
504 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
513 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
536 vfio_irq_ctx_free(vdev, ctx, vector); in vfio_msi_set_vector_signal()
540 static int vfio_msi_set_block(struct vfio_pci_core_device *vdev, unsigned start, in vfio_msi_set_block() argument
548 ret = vfio_msi_set_vector_signal(vdev, j, fd, msix); in vfio_msi_set_block()
553 vfio_msi_set_vector_signal(vdev, i, -1, msix); in vfio_msi_set_block()
559 static void vfio_msi_disable(struct vfio_pci_core_device *vdev, bool msix) in vfio_msi_disable() argument
561 struct pci_dev *pdev = vdev->pdev; in vfio_msi_disable()
566 xa_for_each(&vdev->ctx, i, ctx) { in vfio_msi_disable()
569 vfio_msi_set_vector_signal(vdev, i, -1, msix); in vfio_msi_disable()
572 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_disable()
574 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_disable()
580 if (vdev->nointx) in vfio_msi_disable()
583 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_msi_disable()
589 static int vfio_pci_set_intx_unmask(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_unmask() argument
593 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_unmask()
597 __vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
601 __vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
603 struct vfio_pci_irq_ctx *ctx = vfio_irq_ctx_get(vdev, 0); in vfio_pci_set_intx_unmask()
609 return vfio_virqfd_enable((void *) vdev, in vfio_pci_set_intx_unmask()
620 static int vfio_pci_set_intx_mask(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_mask() argument
624 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_mask()
628 __vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
632 __vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
640 static int vfio_pci_set_intx_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_intx_trigger() argument
644 if (is_intx(vdev) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_intx_trigger()
645 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
649 if (!(is_intx(vdev) || is_irq_none(vdev)) || start != 0 || count != 1) in vfio_pci_set_intx_trigger()
663 if (is_intx(vdev)) in vfio_pci_set_intx_trigger()
664 ret = vfio_intx_set_signal(vdev, trigger); in vfio_pci_set_intx_trigger()
666 ret = vfio_intx_enable(vdev, trigger); in vfio_pci_set_intx_trigger()
674 if (!is_intx(vdev)) in vfio_pci_set_intx_trigger()
678 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
682 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
687 static int vfio_pci_set_msi_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_msi_trigger() argument
695 if (irq_is(vdev, index) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_msi_trigger()
696 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
700 if (!(irq_is(vdev, index) || is_irq_none(vdev))) in vfio_pci_set_msi_trigger()
707 if (vdev->irq_type == index) in vfio_pci_set_msi_trigger()
708 return vfio_msi_set_block(vdev, start, count, in vfio_pci_set_msi_trigger()
711 ret = vfio_msi_enable(vdev, start + count, msix); in vfio_pci_set_msi_trigger()
715 ret = vfio_msi_set_block(vdev, start, count, fds, msix); in vfio_pci_set_msi_trigger()
717 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
722 if (!irq_is(vdev, index)) in vfio_pci_set_msi_trigger()
726 ctx = vfio_irq_ctx_get(vdev, i); in vfio_pci_set_msi_trigger()
795 static int vfio_pci_set_err_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_err_trigger() argument
802 return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, in vfio_pci_set_err_trigger()
806 static int vfio_pci_set_req_trigger(struct vfio_pci_core_device *vdev, in vfio_pci_set_req_trigger() argument
813 return vfio_pci_set_ctx_trigger_single(&vdev->req_trigger, in vfio_pci_set_req_trigger()
817 int vfio_pci_set_irqs_ioctl(struct vfio_pci_core_device *vdev, uint32_t flags, in vfio_pci_set_irqs_ioctl() argument
821 int (*func)(struct vfio_pci_core_device *vdev, unsigned index, in vfio_pci_set_irqs_ioctl()
854 if (pci_is_pcie(vdev->pdev)) in vfio_pci_set_irqs_ioctl()
871 return func(vdev, index, start, count, flags, data); in vfio_pci_set_irqs_ioctl()