s390/vfio-ap: realize the VFIO_DEVICE_GET_IRQ_INFO ioctl
authorTony Krowiak <akrowiak@linux.ibm.com>
Tue, 30 May 2023 22:35:36 +0000 (18:35 -0400)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 6 Jun 2023 11:42:06 +0000 (13:42 +0200)
Realize the VFIO_DEVICE_GET_IRQ_INFO ioctl to retrieve the information for
the VFIO device request IRQ.

Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Link: https://lore.kernel.org/r/20230530223538.279198-2-akrowiak@linux.ibm.com
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
drivers/s390/crypto/vfio_ap_ops.c
include/uapi/linux/vfio.h

index cfbcb864ab636d3c2825fdcfecc81beb7ab2fb4c..35cd90eee93779ddb291eaa17c9f6cd9af31dc2c 100644 (file)
@@ -1750,7 +1750,32 @@ static int vfio_ap_mdev_get_device_info(unsigned long arg)
 
        info.flags = VFIO_DEVICE_FLAGS_AP | VFIO_DEVICE_FLAGS_RESET;
        info.num_regions = 0;
-       info.num_irqs = 0;
+       info.num_irqs = VFIO_AP_NUM_IRQS;
+
+       return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0;
+}
+
+static ssize_t vfio_ap_get_irq_info(unsigned long arg)
+{
+       unsigned long minsz;
+       struct vfio_irq_info info;
+
+       minsz = offsetofend(struct vfio_irq_info, count);
+
+       if (copy_from_user(&info, (void __user *)arg, minsz))
+               return -EFAULT;
+
+       if (info.argsz < minsz || info.index >= VFIO_AP_NUM_IRQS)
+               return -EINVAL;
+
+       switch (info.index) {
+       case VFIO_AP_REQ_IRQ_INDEX:
+               info.count = 1;
+               info.flags = VFIO_IRQ_INFO_EVENTFD;
+               break;
+       default:
+               return -EINVAL;
+       }
 
        return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0;
 }
@@ -1770,6 +1795,9 @@ static ssize_t vfio_ap_mdev_ioctl(struct vfio_device *vdev,
        case VFIO_DEVICE_RESET:
                ret = vfio_ap_mdev_reset_queues(&matrix_mdev->qtable);
                break;
+       case VFIO_DEVICE_GET_IRQ_INFO:
+                       ret = vfio_ap_get_irq_info(arg);
+                       break;
        default:
                ret = -EOPNOTSUPP;
                break;
index 0552e8dcf0cbf0e269b7f6bad935beeaf6f40a92..b71276bd7f91608cdc088048258c82a317274378 100644 (file)
@@ -646,6 +646,15 @@ enum {
        VFIO_CCW_NUM_IRQS
 };
 
+/*
+ * The vfio-ap bus driver makes use of the following IRQ index mapping.
+ * Unimplemented IRQ types return a count of zero.
+ */
+enum {
+       VFIO_AP_REQ_IRQ_INDEX,
+       VFIO_AP_NUM_IRQS
+};
+
 /**
  * VFIO_DEVICE_GET_PCI_HOT_RESET_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 12,
  *                                           struct vfio_pci_hot_reset_info)