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_intx_set_signal(vdev, -1); in vfio_intx_disable()
232 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_intx_disable()
233 vfio_virqfd_disable(&vdev->ctx[0].mask); 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()
255 if (!is_irq_none(vdev)) in vfio_msi_enable()
258 vdev->ctx = kzalloc(nvec * sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL); in vfio_msi_enable()
259 if (!vdev->ctx) in vfio_msi_enable()
265 vdev->msix = kzalloc(nvec * sizeof(struct msix_entry), in vfio_msi_enable()
267 if (!vdev->msix) { in vfio_msi_enable()
268 kfree(vdev->ctx); in vfio_msi_enable()
273 vdev->msix[i].entry = i; in vfio_msi_enable()
275 ret = pci_enable_msix_range(pdev, vdev->msix, 1, nvec); in vfio_msi_enable()
279 kfree(vdev->msix); in vfio_msi_enable()
280 kfree(vdev->ctx); in vfio_msi_enable()
288 kfree(vdev->ctx); in vfio_msi_enable()
293 vdev->num_ctx = nvec; in vfio_msi_enable()
294 vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX : in vfio_msi_enable()
302 vdev->msi_qmax = fls(nvec * 2 - 1) - 1; in vfio_msi_enable()
308 static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, in vfio_msi_set_vector_signal() argument
311 struct pci_dev *pdev = vdev->pdev; in vfio_msi_set_vector_signal()
312 int irq = msix ? vdev->msix[vector].vector : pdev->irq + vector; in vfio_msi_set_vector_signal()
317 if (vector >= vdev->num_ctx) in vfio_msi_set_vector_signal()
320 if (vdev->ctx[vector].trigger) { in vfio_msi_set_vector_signal()
321 free_irq(irq, vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
322 irq_bypass_unregister_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
323 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
324 eventfd_ctx_put(vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
325 vdev->ctx[vector].trigger = NULL; in vfio_msi_set_vector_signal()
331 vdev->ctx[vector].name = kasprintf(GFP_KERNEL, "%s[%d](%s)", in vfio_msi_set_vector_signal()
333 if (!vdev->ctx[vector].name) in vfio_msi_set_vector_signal()
338 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
357 vdev->ctx[vector].name, trigger); in vfio_msi_set_vector_signal()
359 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
364 vdev->ctx[vector].producer.token = trigger; in vfio_msi_set_vector_signal()
365 vdev->ctx[vector].producer.irq = irq; in vfio_msi_set_vector_signal()
366 ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
370 vdev->ctx[vector].producer.token, ret); in vfio_msi_set_vector_signal()
372 vdev->ctx[vector].trigger = trigger; in vfio_msi_set_vector_signal()
377 static int vfio_msi_set_block(struct vfio_pci_device *vdev, unsigned start, in vfio_msi_set_block() argument
382 if (start + count > vdev->num_ctx) in vfio_msi_set_block()
387 ret = vfio_msi_set_vector_signal(vdev, j, fd, msix); in vfio_msi_set_block()
392 vfio_msi_set_vector_signal(vdev, j, -1, msix); in vfio_msi_set_block()
398 static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix) in vfio_msi_disable() argument
400 struct pci_dev *pdev = vdev->pdev; in vfio_msi_disable()
403 vfio_msi_set_block(vdev, 0, vdev->num_ctx, NULL, msix); in vfio_msi_disable()
405 for (i = 0; i < vdev->num_ctx; i++) { in vfio_msi_disable()
406 vfio_virqfd_disable(&vdev->ctx[i].unmask); in vfio_msi_disable()
407 vfio_virqfd_disable(&vdev->ctx[i].mask); in vfio_msi_disable()
411 pci_disable_msix(vdev->pdev); in vfio_msi_disable()
412 kfree(vdev->msix); in vfio_msi_disable()
416 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_msi_disable()
417 vdev->num_ctx = 0; in vfio_msi_disable()
418 kfree(vdev->ctx); in vfio_msi_disable()
424 static int vfio_pci_set_intx_unmask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_unmask() argument
428 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_unmask()
432 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
436 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
440 return vfio_virqfd_enable((void *) vdev, in vfio_pci_set_intx_unmask()
443 &vdev->ctx[0].unmask, fd); in vfio_pci_set_intx_unmask()
445 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_pci_set_intx_unmask()
451 static int vfio_pci_set_intx_mask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_mask() argument
455 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_mask()
459 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
463 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
471 static int vfio_pci_set_intx_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_intx_trigger() argument
475 if (is_intx(vdev) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_intx_trigger()
476 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
480 if (!(is_intx(vdev) || is_irq_none(vdev)) || start != 0 || count != 1) in vfio_pci_set_intx_trigger()
487 if (is_intx(vdev)) in vfio_pci_set_intx_trigger()
488 return vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
490 ret = vfio_intx_enable(vdev); in vfio_pci_set_intx_trigger()
494 ret = vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
496 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
501 if (!is_intx(vdev)) in vfio_pci_set_intx_trigger()
505 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
509 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
514 static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_msi_trigger() argument
521 if (irq_is(vdev, index) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_msi_trigger()
522 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
526 if (!(irq_is(vdev, index) || is_irq_none(vdev))) in vfio_pci_set_msi_trigger()
533 if (vdev->irq_type == index) in vfio_pci_set_msi_trigger()
534 return vfio_msi_set_block(vdev, start, count, in vfio_pci_set_msi_trigger()
537 ret = vfio_msi_enable(vdev, start + count, msix); in vfio_pci_set_msi_trigger()
541 ret = vfio_msi_set_block(vdev, start, count, fds, msix); in vfio_pci_set_msi_trigger()
543 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
548 if (!irq_is(vdev, index) || start + count > vdev->num_ctx) in vfio_pci_set_msi_trigger()
552 if (!vdev->ctx[i].trigger) in vfio_pci_set_msi_trigger()
555 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
559 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
604 static int vfio_pci_set_err_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_err_trigger() argument
616 return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, flags, data); in vfio_pci_set_err_trigger()
619 static int vfio_pci_set_req_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_req_trigger() argument
626 return vfio_pci_set_ctx_trigger_single(&vdev->req_trigger, flags, data); in vfio_pci_set_req_trigger()
629 int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, in vfio_pci_set_irqs_ioctl() argument
633 int (*func)(struct vfio_pci_device *vdev, unsigned index, in vfio_pci_set_irqs_ioctl()
666 if (pci_is_pcie(vdev->pdev)) in vfio_pci_set_irqs_ioctl()
683 return func(vdev, index, start, count, flags, data); in vfio_pci_set_irqs_ioctl()