Lines Matching +full:irq +full:- +full:start
1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
3 * Copyright 2013-2016 Freescale Semiconductor Inc.
17 struct fsl_mc_device *mc_dev = vdev->mc_dev; in vfio_fsl_mc_irqs_allocate()
23 if (mc_dev->obj_desc.irq_count == 0) in vfio_fsl_mc_irqs_allocate()
27 if (vdev->mc_irqs) in vfio_fsl_mc_irqs_allocate()
30 irq_count = mc_dev->obj_desc.irq_count; in vfio_fsl_mc_irqs_allocate()
34 return -ENOMEM; in vfio_fsl_mc_irqs_allocate()
48 vdev->mc_irqs = mc_irq; in vfio_fsl_mc_irqs_allocate()
57 eventfd_signal(mc_irq->trigger); in vfio_fsl_mc_irq_handler()
64 struct vfio_fsl_mc_irq *irq = &vdev->mc_irqs[index]; in vfio_set_trigger() local
69 hwirq = vdev->mc_dev->irqs[index]->virq; in vfio_set_trigger()
70 if (irq->trigger) { in vfio_set_trigger()
71 free_irq(hwirq, irq); in vfio_set_trigger()
72 kfree(irq->name); in vfio_set_trigger()
73 eventfd_ctx_put(irq->trigger); in vfio_set_trigger()
74 irq->trigger = NULL; in vfio_set_trigger()
80 irq->name = kasprintf(GFP_KERNEL_ACCOUNT, "vfio-irq[%d](%s)", in vfio_set_trigger()
81 hwirq, dev_name(&vdev->mc_dev->dev)); in vfio_set_trigger()
82 if (!irq->name) in vfio_set_trigger()
83 return -ENOMEM; in vfio_set_trigger()
87 kfree(irq->name); in vfio_set_trigger()
91 irq->trigger = trigger; in vfio_set_trigger()
94 irq->name, irq); in vfio_set_trigger()
96 kfree(irq->name); in vfio_set_trigger()
98 irq->trigger = NULL; in vfio_set_trigger()
106 unsigned int index, unsigned int start, in vfio_fsl_mc_set_irq_trigger() argument
110 struct fsl_mc_device *mc_dev = vdev->mc_dev; in vfio_fsl_mc_set_irq_trigger()
111 struct vfio_fsl_mc_irq *irq; in vfio_fsl_mc_set_irq_trigger() local
112 struct device *cont_dev = fsl_mc_cont_dev(&mc_dev->dev); in vfio_fsl_mc_set_irq_trigger()
117 return vfio_set_trigger(vdev, index, -1); in vfio_fsl_mc_set_irq_trigger()
119 if (start != 0 || count != 1) in vfio_fsl_mc_set_irq_trigger()
120 return -EINVAL; in vfio_fsl_mc_set_irq_trigger()
122 mutex_lock(&vdev->vdev.dev_set->lock); in vfio_fsl_mc_set_irq_trigger()
131 mutex_unlock(&vdev->vdev.dev_set->lock); in vfio_fsl_mc_set_irq_trigger()
139 irq = &vdev->mc_irqs[index]; in vfio_fsl_mc_set_irq_trigger()
142 if (irq->trigger) in vfio_fsl_mc_set_irq_trigger()
143 eventfd_signal(irq->trigger); in vfio_fsl_mc_set_irq_trigger()
148 if (trigger && irq->trigger) in vfio_fsl_mc_set_irq_trigger()
149 eventfd_signal(irq->trigger); in vfio_fsl_mc_set_irq_trigger()
155 mutex_unlock(&vdev->vdev.dev_set->lock); in vfio_fsl_mc_set_irq_trigger()
162 unsigned int start, unsigned int count, in vfio_fsl_mc_set_irqs_ioctl() argument
166 return vfio_fsl_mc_set_irq_trigger(vdev, index, start, in vfio_fsl_mc_set_irqs_ioctl()
169 return -EINVAL; in vfio_fsl_mc_set_irqs_ioctl()
175 struct fsl_mc_device *mc_dev = vdev->mc_dev; in vfio_fsl_mc_irqs_cleanup()
176 int irq_count = mc_dev->obj_desc.irq_count; in vfio_fsl_mc_irqs_cleanup()
183 if (!vdev->mc_irqs) in vfio_fsl_mc_irqs_cleanup()
187 vfio_set_trigger(vdev, i, -1); in vfio_fsl_mc_irqs_cleanup()
190 kfree(vdev->mc_irqs); in vfio_fsl_mc_irqs_cleanup()
191 vdev->mc_irqs = NULL; in vfio_fsl_mc_irqs_cleanup()