Lines Matching refs:vdev
30 struct vfio_pci_device *vdev = opaque; in vfio_send_intx_eventfd() local
32 if (likely(is_intx(vdev) && !vdev->virq_disabled)) in vfio_send_intx_eventfd()
33 eventfd_signal(vdev->ctx[0].trigger, 1); in vfio_send_intx_eventfd()
36 void vfio_pci_intx_mask(struct vfio_pci_device *vdev) in vfio_pci_intx_mask() argument
38 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_mask()
41 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_mask()
49 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_mask()
50 if (vdev->pci_2_3) in vfio_pci_intx_mask()
52 } else if (!vdev->ctx[0].masked) { in vfio_pci_intx_mask()
57 if (vdev->pci_2_3) in vfio_pci_intx_mask()
62 vdev->ctx[0].masked = true; in vfio_pci_intx_mask()
65 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_mask()
76 struct vfio_pci_device *vdev = opaque; in vfio_pci_intx_unmask_handler() local
77 struct pci_dev *pdev = vdev->pdev; in vfio_pci_intx_unmask_handler()
81 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
87 if (unlikely(!is_intx(vdev))) { in vfio_pci_intx_unmask_handler()
88 if (vdev->pci_2_3) in vfio_pci_intx_unmask_handler()
90 } else if (vdev->ctx[0].masked && !vdev->virq_disabled) { in vfio_pci_intx_unmask_handler()
96 if (vdev->pci_2_3) { in vfio_pci_intx_unmask_handler()
102 vdev->ctx[0].masked = (ret > 0); in vfio_pci_intx_unmask_handler()
105 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_pci_intx_unmask_handler()
110 void vfio_pci_intx_unmask(struct vfio_pci_device *vdev) in vfio_pci_intx_unmask() argument
112 if (vfio_pci_intx_unmask_handler(vdev, NULL) > 0) in vfio_pci_intx_unmask()
113 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_intx_unmask()
118 struct vfio_pci_device *vdev = dev_id; in vfio_intx_handler() local
122 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_handler()
124 if (!vdev->pci_2_3) { in vfio_intx_handler()
125 disable_irq_nosync(vdev->pdev->irq); in vfio_intx_handler()
126 vdev->ctx[0].masked = true; in vfio_intx_handler()
128 } else if (!vdev->ctx[0].masked && /* may be shared */ in vfio_intx_handler()
129 pci_check_and_mask_intx(vdev->pdev)) { in vfio_intx_handler()
130 vdev->ctx[0].masked = true; in vfio_intx_handler()
134 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_handler()
137 vfio_send_intx_eventfd(vdev, NULL); in vfio_intx_handler()
142 static int vfio_intx_enable(struct vfio_pci_device *vdev) in vfio_intx_enable() argument
144 if (!is_irq_none(vdev)) in vfio_intx_enable()
147 if (!vdev->pdev->irq) in vfio_intx_enable()
150 vdev->ctx = kzalloc(sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL); in vfio_intx_enable()
151 if (!vdev->ctx) in vfio_intx_enable()
154 vdev->num_ctx = 1; in vfio_intx_enable()
162 vdev->ctx[0].masked = vdev->virq_disabled; in vfio_intx_enable()
163 if (vdev->pci_2_3) in vfio_intx_enable()
164 pci_intx(vdev->pdev, !vdev->ctx[0].masked); in vfio_intx_enable()
166 vdev->irq_type = VFIO_PCI_INTX_IRQ_INDEX; in vfio_intx_enable()
171 static int vfio_intx_set_signal(struct vfio_pci_device *vdev, int fd) in vfio_intx_set_signal() argument
173 struct pci_dev *pdev = vdev->pdev; in vfio_intx_set_signal()
179 if (vdev->ctx[0].trigger) { in vfio_intx_set_signal()
180 free_irq(pdev->irq, vdev); in vfio_intx_set_signal()
181 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
182 eventfd_ctx_put(vdev->ctx[0].trigger); in vfio_intx_set_signal()
183 vdev->ctx[0].trigger = NULL; in vfio_intx_set_signal()
189 vdev->ctx[0].name = kasprintf(GFP_KERNEL, "vfio-intx(%s)", in vfio_intx_set_signal()
191 if (!vdev->ctx[0].name) in vfio_intx_set_signal()
196 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
200 vdev->ctx[0].trigger = trigger; in vfio_intx_set_signal()
202 if (!vdev->pci_2_3) in vfio_intx_set_signal()
206 irqflags, vdev->ctx[0].name, vdev); in vfio_intx_set_signal()
208 vdev->ctx[0].trigger = NULL; in vfio_intx_set_signal()
209 kfree(vdev->ctx[0].name); in vfio_intx_set_signal()
218 spin_lock_irqsave(&vdev->irqlock, flags); in vfio_intx_set_signal()
219 if (!vdev->pci_2_3 && vdev->ctx[0].masked) in vfio_intx_set_signal()
221 spin_unlock_irqrestore(&vdev->irqlock, flags); in vfio_intx_set_signal()
226 static void vfio_intx_disable(struct vfio_pci_device *vdev) in vfio_intx_disable() argument
228 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_intx_disable()
229 vfio_virqfd_disable(&vdev->ctx[0].mask); in vfio_intx_disable()
230 vfio_intx_set_signal(vdev, -1); in vfio_intx_disable()
231 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_intx_disable()
232 vdev->num_ctx = 0; in vfio_intx_disable()
233 kfree(vdev->ctx); in vfio_intx_disable()
247 static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) in vfio_msi_enable() argument
249 struct pci_dev *pdev = vdev->pdev; in vfio_msi_enable()
254 if (!is_irq_none(vdev)) in vfio_msi_enable()
257 vdev->ctx = kcalloc(nvec, sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL); in vfio_msi_enable()
258 if (!vdev->ctx) in vfio_msi_enable()
262 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_enable()
267 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
268 kfree(vdev->ctx); in vfio_msi_enable()
271 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_enable()
273 vdev->num_ctx = nvec; in vfio_msi_enable()
274 vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX : in vfio_msi_enable()
282 vdev->msi_qmax = fls(nvec * 2 - 1) - 1; in vfio_msi_enable()
288 static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, in vfio_msi_set_vector_signal() argument
291 struct pci_dev *pdev = vdev->pdev; in vfio_msi_set_vector_signal()
296 if (vector < 0 || vector >= vdev->num_ctx) in vfio_msi_set_vector_signal()
301 if (vdev->ctx[vector].trigger) { in vfio_msi_set_vector_signal()
302 irq_bypass_unregister_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
304 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
305 free_irq(irq, vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
306 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
308 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
309 eventfd_ctx_put(vdev->ctx[vector].trigger); in vfio_msi_set_vector_signal()
310 vdev->ctx[vector].trigger = NULL; in vfio_msi_set_vector_signal()
316 vdev->ctx[vector].name = kasprintf(GFP_KERNEL, "vfio-msi%s[%d](%s)", in vfio_msi_set_vector_signal()
319 if (!vdev->ctx[vector].name) in vfio_msi_set_vector_signal()
324 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
335 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_set_vector_signal()
344 vdev->ctx[vector].name, trigger); in vfio_msi_set_vector_signal()
345 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_set_vector_signal()
347 kfree(vdev->ctx[vector].name); in vfio_msi_set_vector_signal()
352 vdev->ctx[vector].producer.token = trigger; in vfio_msi_set_vector_signal()
353 vdev->ctx[vector].producer.irq = irq; in vfio_msi_set_vector_signal()
354 ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); in vfio_msi_set_vector_signal()
358 vdev->ctx[vector].producer.token, ret); in vfio_msi_set_vector_signal()
360 vdev->ctx[vector].producer.token = NULL; in vfio_msi_set_vector_signal()
362 vdev->ctx[vector].trigger = trigger; in vfio_msi_set_vector_signal()
367 static int vfio_msi_set_block(struct vfio_pci_device *vdev, unsigned start, in vfio_msi_set_block() argument
372 if (start >= vdev->num_ctx || start + count > vdev->num_ctx) in vfio_msi_set_block()
377 ret = vfio_msi_set_vector_signal(vdev, j, fd, msix); in vfio_msi_set_block()
382 vfio_msi_set_vector_signal(vdev, j, -1, msix); in vfio_msi_set_block()
388 static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix) in vfio_msi_disable() argument
390 struct pci_dev *pdev = vdev->pdev; in vfio_msi_disable()
394 for (i = 0; i < vdev->num_ctx; i++) { in vfio_msi_disable()
395 vfio_virqfd_disable(&vdev->ctx[i].unmask); in vfio_msi_disable()
396 vfio_virqfd_disable(&vdev->ctx[i].mask); in vfio_msi_disable()
399 vfio_msi_set_block(vdev, 0, vdev->num_ctx, NULL, msix); in vfio_msi_disable()
401 cmd = vfio_pci_memory_lock_and_enable(vdev); in vfio_msi_disable()
403 vfio_pci_memory_unlock_and_restore(vdev, cmd); in vfio_msi_disable()
409 if (vdev->nointx) in vfio_msi_disable()
412 vdev->irq_type = VFIO_PCI_NUM_IRQS; in vfio_msi_disable()
413 vdev->num_ctx = 0; in vfio_msi_disable()
414 kfree(vdev->ctx); in vfio_msi_disable()
420 static int vfio_pci_set_intx_unmask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_unmask() argument
424 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_unmask()
428 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
432 vfio_pci_intx_unmask(vdev); in vfio_pci_set_intx_unmask()
436 return vfio_virqfd_enable((void *) vdev, in vfio_pci_set_intx_unmask()
439 &vdev->ctx[0].unmask, fd); in vfio_pci_set_intx_unmask()
441 vfio_virqfd_disable(&vdev->ctx[0].unmask); in vfio_pci_set_intx_unmask()
447 static int vfio_pci_set_intx_mask(struct vfio_pci_device *vdev, in vfio_pci_set_intx_mask() argument
451 if (!is_intx(vdev) || start != 0 || count != 1) in vfio_pci_set_intx_mask()
455 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
459 vfio_pci_intx_mask(vdev); in vfio_pci_set_intx_mask()
467 static int vfio_pci_set_intx_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_intx_trigger() argument
471 if (is_intx(vdev) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_intx_trigger()
472 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
476 if (!(is_intx(vdev) || is_irq_none(vdev)) || start != 0 || count != 1) in vfio_pci_set_intx_trigger()
483 if (is_intx(vdev)) in vfio_pci_set_intx_trigger()
484 return vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
486 ret = vfio_intx_enable(vdev); in vfio_pci_set_intx_trigger()
490 ret = vfio_intx_set_signal(vdev, fd); in vfio_pci_set_intx_trigger()
492 vfio_intx_disable(vdev); in vfio_pci_set_intx_trigger()
497 if (!is_intx(vdev)) in vfio_pci_set_intx_trigger()
501 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
505 vfio_send_intx_eventfd(vdev, NULL); in vfio_pci_set_intx_trigger()
510 static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_msi_trigger() argument
517 if (irq_is(vdev, index) && !count && (flags & VFIO_IRQ_SET_DATA_NONE)) { in vfio_pci_set_msi_trigger()
518 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
522 if (!(irq_is(vdev, index) || is_irq_none(vdev))) in vfio_pci_set_msi_trigger()
529 if (vdev->irq_type == index) in vfio_pci_set_msi_trigger()
530 return vfio_msi_set_block(vdev, start, count, in vfio_pci_set_msi_trigger()
533 ret = vfio_msi_enable(vdev, start + count, msix); in vfio_pci_set_msi_trigger()
537 ret = vfio_msi_set_block(vdev, start, count, fds, msix); in vfio_pci_set_msi_trigger()
539 vfio_msi_disable(vdev, msix); in vfio_pci_set_msi_trigger()
544 if (!irq_is(vdev, index) || start + count > vdev->num_ctx) in vfio_pci_set_msi_trigger()
548 if (!vdev->ctx[i].trigger) in vfio_pci_set_msi_trigger()
551 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
555 eventfd_signal(vdev->ctx[i].trigger, 1); in vfio_pci_set_msi_trigger()
616 static int vfio_pci_set_err_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_err_trigger() argument
623 return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, in vfio_pci_set_err_trigger()
627 static int vfio_pci_set_req_trigger(struct vfio_pci_device *vdev, in vfio_pci_set_req_trigger() argument
634 return vfio_pci_set_ctx_trigger_single(&vdev->req_trigger, in vfio_pci_set_req_trigger()
638 int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, in vfio_pci_set_irqs_ioctl() argument
642 int (*func)(struct vfio_pci_device *vdev, unsigned index, in vfio_pci_set_irqs_ioctl()
675 if (pci_is_pcie(vdev->pdev)) in vfio_pci_set_irqs_ioctl()
692 return func(vdev, index, start, count, flags, data); in vfio_pci_set_irqs_ioctl()