@ -239,9 +239,12 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type)
return ( flags & PCI_MSIX_FLAGS_QSIZE ) + 1 ;
}
} else if ( irq_type = = VFIO_PCI_ERR_IRQ_INDEX )
} else if ( irq_type = = VFIO_PCI_ERR_IRQ_INDEX ) {
if ( pci_is_pcie ( vdev - > pdev ) )
return 1 ;
} else if ( irq_type = = VFIO_PCI_REQ_IRQ_INDEX ) {
return 1 ;
}
return 0 ;
}
@ -464,6 +467,7 @@ static long vfio_pci_ioctl(void *device_data,
switch ( info . index ) {
case VFIO_PCI_INTX_IRQ_INDEX . . . VFIO_PCI_MSIX_IRQ_INDEX :
case VFIO_PCI_REQ_IRQ_INDEX :
break ;
case VFIO_PCI_ERR_IRQ_INDEX :
if ( pci_is_pcie ( vdev - > pdev ) )
@ -828,6 +832,20 @@ static int vfio_pci_mmap(void *device_data, struct vm_area_struct *vma)
req_len , vma - > vm_page_prot ) ;
}
static void vfio_pci_request ( void * device_data , unsigned int count )
{
struct vfio_pci_device * vdev = device_data ;
mutex_lock ( & vdev - > igate ) ;
if ( vdev - > req_trigger ) {
dev_dbg ( & vdev - > pdev - > dev , " Requesting device from user \n " ) ;
eventfd_signal ( vdev - > req_trigger , 1 ) ;
}
mutex_unlock ( & vdev - > igate ) ;
}
static const struct vfio_device_ops vfio_pci_ops = {
. name = " vfio-pci " ,
. open = vfio_pci_open ,
@ -836,6 +854,7 @@ static const struct vfio_device_ops vfio_pci_ops = {
. read = vfio_pci_read ,
. write = vfio_pci_write ,
. mmap = vfio_pci_mmap ,
. request = vfio_pci_request ,
} ;
static int vfio_pci_probe ( struct pci_dev * pdev , const struct pci_device_id * id )