vfio_enable_intx

 

 

/* enable legacy (INTx) interrupts */
static int
vfio_enable_intx(const struct rte_intr_handle *intr_handle) {
        struct vfio_irq_set *irq_set;
        char irq_set_buf[IRQ_SET_BUF_LEN];
        int len, ret;
        int *fd_ptr;

        len = sizeof(irq_set_buf);

        /* enable INTx */
        irq_set = (struct vfio_irq_set *) irq_set_buf;
        irq_set->argsz = len;
        irq_set->count = 1;
        irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
        irq_set->index = VFIO_PCI_INTX_IRQ_INDEX;
        irq_set->start = 0;
        fd_ptr = (int *) &irq_set->data;
        *fd_ptr = intr_handle->fd;

        ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);

        if (ret) {
                RTE_LOG(ERR, EAL, "Error enabling INTx interrupts for fd %d\n",
                                                intr_handle->fd);
                return -1;
        }

        /* unmask INTx after enabling */
        memset(irq_set, 0, len);
        len = sizeof(struct vfio_irq_set);
        irq_set->argsz = len;
        irq_set->count = 1;
        irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_UNMASK;
        irq_set->index = VFIO_PCI_INTX_IRQ_INDEX;
        irq_set->start = 0;

        ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);

        if (ret) {
                RTE_LOG(ERR, EAL, "Error unmasking INTx interrupts for fd %d\n",
                                                intr_handle->fd);
                return -1;
        }
        return 0;
}

/* disable legacy (INTx) interrupts */
static int
vfio_disable_intx(const struct rte_intr_handle *intr_handle) {
        struct vfio_irq_set *irq_set;
        char irq_set_buf[IRQ_SET_BUF_LEN];
        int len, ret;

        len = sizeof(struct vfio_irq_set);

        /* mask interrupts before disabling */
        irq_set = (struct vfio_irq_set *) irq_set_buf;
        irq_set->argsz = len;
        irq_set->count = 1;
        irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_MASK;
        irq_set->index = VFIO_PCI_INTX_IRQ_INDEX;
        irq_set->start = 0;

        ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);

        if (ret) {
                RTE_LOG(ERR, EAL, "Error masking INTx interrupts for fd %d\n",
                                                intr_handle->fd);
                return -1;
        }

        /* disable INTx*/
        memset(irq_set, 0, len);
        irq_set->argsz = len;
        irq_set->count = 0;
        irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;
        irq_set->index = VFIO_PCI_INTX_IRQ_INDEX;
        irq_set->start = 0;

        ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);

        if (ret) {
                RTE_LOG(ERR, EAL,
                        "Error disabling INTx interrupts for fd %d\n", intr_handle->fd);
                return -1;
        }
        return 0;
}

 

posted on 2020-08-26 20:11  tycoon3  阅读(270)  评论(0)    收藏  举报

导航