Lines Matching refs:vdev
33 struct vfio_pci_device *vdev = opaque; in vfio_send_intx_eventfd() local
35 if (likely(is_intx(vdev) && !vdev->virq_disabled)) in vfio_send_intx_eventfd()
36 eventfd_signal(vdev->ctx[0].trigger, 1); in vfio_send_intx_eventfd()
39 void vfio_pci_intx_mask(struct vfio_pci_device *vdev) in vfio_pci_intx_mask() argument
41 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_mask()
44 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_mask()
52 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_mask()
53 if (vdev->pci_2_3) in vfio_pci_intx_mask()
55 } else if (!vdev->ctx[0].masked) { in vfio_pci_intx_mask()
60 if (vdev->pci_2_3) in vfio_pci_intx_mask()
65 vdev->ctx[0].masked = true; in vfio_pci_intx_mask()
68 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_mask()
79 struct vfio_pci_device *vdev = opaque; in vfio_pci_intx_unmask_handler() local
80 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_unmask_handler()
84 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
90 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_unmask_handler()
91 if (vdev->pci_2_3) in vfio_pci_intx_unmask_handler()
93 } else if (vdev->ctx[0].masked && !vdev->virq_disabled) { in vfio_pci_intx_unmask_handler()
99 if (vdev->pci_2_3) { in vfio_pci_intx_unmask_handler()
105 vdev->ctx[0].masked = (ret > 0); in vfio_pci_intx_unmask_handler()
108 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
113 void vfio_pci_intx_unmask(struct vfio_pci_device *vdev) in vfio_pci_intx_unmask() argument
115 if (vfio_pci_intx_unmask_handler(vdev, NULL) > 0) in vfio_pci_intx_unmask()
116 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_intx_unmask()
121 struct vfio_pci_device *vdev = dev_id; in vfio_intx_handler() local
125 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_handler()
127 if (!vdev->pci_2_3) { in vfio_intx_handler()
128 disable_irq_nosync(vdev->pdev->irq); in vfio_intx_handler()
129 vdev->ctx[0].masked = true; in vfio_intx_handler()
131 } else if (!vdev->ctx[0].masked && /* may be shared */ in vfio_intx_handler()
132 pci_check_and_mask_intx(vdev->pdev)) { in vfio_intx_handler()
133 vdev->ctx[0].masked = true; in vfio_intx_handler()
137 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_handler()
140 vfio_send_intx_eventfd(vdev, NULL); in vfio_intx_handler()
145 static int vfio_intx_enable(struct vfio_pci_device *vdev) in vfio_intx_enable() argument
147 if (!is_irq_none(vdev)) in vfio_intx_enable()
150 if (!vdev->pdev->irq) in vfio_intx_enable()
153 vdev->ctx = kzalloc(sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL); in vfio_intx_enable()
154 if (!vdev->ctx) in vfio_intx_enable()
157 vdev->num_ctx = 1; in vfio_intx_enable()
165 vdev->ctx[0].masked = vdev->virq_disabled; in vfio_intx_enable()
166 if (vdev->pci_2_3) in vfio_intx_enable()
167 pci_intx(vdev->pdev, !vdev->ctx[0].masked); in vfio_intx_enable()
169 vdev->irq_type = VFIO_PCI_INTX_IRQ_INDEX; in vfio_intx_enable()
174 static int vfio_intx_set_signal(struct vfio_pci_device *vdev, int fd) in vfio_intx_set_signal() argument
176 struct pci_dev *pdev = vdev->pdev; in vfio_intx_set_signal()
182 if (vdev->ctx[0].trigger) { in vfio_intx_set_signal()
183 free_irq(pdev->irq, vdev); in vfio_intx_set_signal()
184 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
185 eventfd_ctx_put(vdev->ctx[0].trigger); in vfio_intx_set_signal()
186 vdev->ctx[0].trigger = NULL; in vfio_intx_set_signal()
192 vdev->ctx[0].name = kasprintf(GFP_KERNEL, "vfio-intx(%s)", in vfio_intx_set_signal()
194 if (!vdev->ctx[0].name) in vfio_intx_set_signal()
199 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
203 vdev->ctx[0].trigger = trigger; in vfio_intx_set_signal()
205 if (!vdev->pci_2_3) in vfio_intx_set_signal()
209 irqflags, vdev->ctx[0].name, vdev); in vfio_intx_set_signal()
211 vdev->ctx[0].trigger = NULL; in vfio_intx_set_signal()
212 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
221 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_set_signal()
222 if (!vdev->pci_2_3 && vdev->ctx[0].masked) in vfio_intx_set_signal()
224 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_set_signal()
229 static void vfio_intx_disable(struct vfio_pci_device *vdev) in vfio_intx_disable() argument
231 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_intx_disable()
232 vfio_virqfd_disable(&vdev->ctx[0].mask); in vfio_intx_disable()
233 vfio_intx_set_signal(vdev, -1); in vfio_intx_disable()
234 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_intx_disable()
235 vdev->num_ctx = 0; in vfio_intx_disable()
236 kfree(vdev->ctx); in vfio_intx_disable()
250 static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) in vfio_msi_enable() argument
252 struct pci_dev *pdev = vdev->pdev; in vfio_msi_enable()
256 if (!is_irq_none(vdev)) in vfio_msi_enable()
259 vdev->ctx = kcalloc(nvec, sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL); in vfio_msi_enable()
260 if (!vdev->ctx) in vfio_msi_enable()
268 kfree(vdev->ctx); in vfio_msi_enable()
272 vdev->num_ctx = nvec; in vfio_msi_enable()
273 vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX : in vfio_msi_enable()
281 vdev->msi_qmax = fls(nvec * 2 - 1) - 1; in vfio_msi_enable()
287 static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, in vfio_msi_set_vector_signal() argument
290 struct pci_dev *pdev = vdev->pdev; in vfio_msi_set_vector_signal()
294 if (vector < 0 || vector >= vdev->num_ctx) in vfio_msi_set_vector_signal()
299 if (vdev->ctx[vector].trigger) { in vfio_msi_set_vector_signal()
300 free_irq(irq, vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
301 irq_bypass_unregister_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
302 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
303 eventfd_ctx_put(vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
304 vdev->ctx[vector].trigger = NULL; in vfio_msi_set_vector_signal()
310 vdev->ctx[vector].name = kasprintf(GFP_KERNEL, "vfio-msi%s[%d](%s)", in vfio_msi_set_vector_signal()
313 if (!vdev->ctx[vector].name) in vfio_msi_set_vector_signal()
318 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
337 vdev->ctx[vector].name, trigger); in vfio_msi_set_vector_signal()
339 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
344 vdev->ctx[vector].producer.token = trigger; in vfio_msi_set_vector_signal()
345 vdev->ctx[vector].producer.irq = irq; in vfio_msi_set_vector_signal()
346 ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
350 vdev->ctx[vector].producer.token, ret); in vfio_msi_set_vector_signal()
352 vdev->ctx[vector].trigger = trigger; in vfio_msi_set_vector_signal()
357 static int vfio_msi_set_block(struct vfio_pci_device *vdev, unsigned start, in vfio_msi_set_block() argument
362 if (start >= vdev->num_ctx || start + count > vdev->num_ctx) in vfio_msi_set_block()
367 ret = vfio_msi_set_vector_signal(vdev, j, fd, msix); in vfio_msi_set_block()
372 vfio_msi_set_vector_signal(vdev, j, -1, msix); in vfio_msi_set_block()
378 static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix) in vfio_msi_disable() argument
380 struct pci_dev *pdev = vdev->pdev; in vfio_msi_disable()
383 for (i = 0; i < vdev->num_ctx; i++) { in vfio_msi_disable()
384 vfio_virqfd_disable(&vdev->ctx[i].unmask); in vfio_msi_disable()
385 vfio_virqfd_disable(&vdev->ctx[i].mask); in vfio_msi_disable()
388 vfio_msi_set_block(vdev, 0, vdev->num_ctx, NULL, msix); in vfio_msi_disable()
396 if (vdev->nointx) in vfio_msi_disable()
399 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_msi_disable()
400 vdev->num_ctx = 0; in vfio_msi_disable()
401 kfree(vdev->ctx); in vfio_msi_disable()
407 static int vfio_pci_set_intx_unmask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_unmask() argument
411 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_unmask()
415 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
419 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
423 return vfio_virqfd_enable((void *) vdev, in vfio_pci_set_intx_unmask()
426 &vdev->ctx[0].unmask, fd); in vfio_pci_set_intx_unmask()
428 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_pci_set_intx_unmask()
434 static int vfio_pci_set_intx_mask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_mask() argument
438 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_mask()
442 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
446 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
454 static int vfio_pci_set_intx_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_intx_trigger() argument
458 if (is_intx(vdev) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_intx_trigger()
459 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
463 if (!(is_intx(vdev) || is_irq_none(vdev)) || start != 0 || count != 1) in vfio_pci_set_intx_trigger()
470 if (is_intx(vdev)) in vfio_pci_set_intx_trigger()
471 return vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
473 ret = vfio_intx_enable(vdev); in vfio_pci_set_intx_trigger()
477 ret = vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
479 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
484 if (!is_intx(vdev)) in vfio_pci_set_intx_trigger()
488 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
492 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
497 static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_msi_trigger() argument
504 if (irq_is(vdev, index) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_msi_trigger()
505 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
509 if (!(irq_is(vdev, index) || is_irq_none(vdev))) in vfio_pci_set_msi_trigger()
516 if (vdev->irq_type == index) in vfio_pci_set_msi_trigger()
517 return vfio_msi_set_block(vdev, start, count, in vfio_pci_set_msi_trigger()
520 ret = vfio_msi_enable(vdev, start + count, msix); in vfio_pci_set_msi_trigger()
524 ret = vfio_msi_set_block(vdev, start, count, fds, msix); in vfio_pci_set_msi_trigger()
526 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
531 if (!irq_is(vdev, index) || start + count > vdev->num_ctx) in vfio_pci_set_msi_trigger()
535 if (!vdev->ctx[i].trigger) in vfio_pci_set_msi_trigger()
538 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
542 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
603 static int vfio_pci_set_err_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_err_trigger() argument
610 return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, in vfio_pci_set_err_trigger()
614 static int vfio_pci_set_req_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_req_trigger() argument
621 return vfio_pci_set_ctx_trigger_single(&vdev->req_trigger, in vfio_pci_set_req_trigger()
625 int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, in vfio_pci_set_irqs_ioctl() argument
629 int (*func)(struct vfio_pci_device *vdev, unsigned index, in vfio_pci_set_irqs_ioctl()
662 if (pci_is_pcie(vdev->pdev)) in vfio_pci_set_irqs_ioctl()
679 return func(vdev, index, start, count, flags, data); in vfio_pci_set_irqs_ioctl()