vfio-ccw: Refactor IRQ handlers
authorEric Farman <farman@linux.ibm.com>
Tue, 5 May 2020 12:27:42 +0000 (14:27 +0200)
committerCornelia Huck <cohuck@redhat.com>
Tue, 2 Jun 2020 11:14:08 +0000 (13:14 +0200)
To simplify future expansion.

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200505122745.53208-6-farman@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
drivers/s390/cio/vfio_ccw_ops.c

index 22988d67b6bb382bc0bd8a41fe3dffac375d11de..c3a74ab7bb868ef8c4e90568be659bd36de63efa 100644 (file)
@@ -387,17 +387,21 @@ static int vfio_ccw_mdev_get_region_info(struct vfio_region_info *info,
 
 static int vfio_ccw_mdev_get_irq_info(struct vfio_irq_info *info)
 {
-       if (info->index != VFIO_CCW_IO_IRQ_INDEX)
+       switch (info->index) {
+       case VFIO_CCW_IO_IRQ_INDEX:
+               info->count = 1;
+               info->flags = VFIO_IRQ_INFO_EVENTFD;
+               break;
+       default:
                return -EINVAL;
-
-       info->count = 1;
-       info->flags = VFIO_IRQ_INFO_EVENTFD;
+       }
 
        return 0;
 }
 
 static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev,
                                  uint32_t flags,
+                                 uint32_t index,
                                  void __user *data)
 {
        struct vfio_ccw_private *private;
@@ -407,7 +411,14 @@ static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev,
                return -EINVAL;
 
        private = dev_get_drvdata(mdev_parent_dev(mdev));
-       ctx = &private->io_trigger;
+
+       switch (index) {
+       case VFIO_CCW_IO_IRQ_INDEX:
+               ctx = &private->io_trigger;
+               break;
+       default:
+               return -EINVAL;
+       }
 
        switch (flags & VFIO_IRQ_SET_DATA_TYPE_MASK) {
        case VFIO_IRQ_SET_DATA_NONE:
@@ -579,7 +590,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev,
                        return ret;
 
                data = (void __user *)(arg + minsz);
-               return vfio_ccw_mdev_set_irqs(mdev, hdr.flags, data);
+               return vfio_ccw_mdev_set_irqs(mdev, hdr.flags, hdr.index, data);
        }
        case VFIO_DEVICE_RESET:
                return vfio_ccw_mdev_reset(mdev);