Commit 6afc7700 authored by Tony Krowiak's avatar Tony Krowiak Committed by Alexander Gordeev
Browse files

s390/vfio-ap: realize the VFIO_DEVICE_GET_IRQ_INFO ioctl



Realize the VFIO_DEVICE_GET_IRQ_INFO ioctl to retrieve the information for
the VFIO device request IRQ.

Signed-off-by: default avatarTony Krowiak <akrowiak@linux.ibm.com>
Acked-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Reviewed-by: default avatarCédric Le Goater <clg@redhat.com>
Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Tested-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Link: https://lore.kernel.org/r/20230530223538.279198-2-akrowiak@linux.ibm.com


Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent e23b4fdb
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -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;
+9 −0
Original line number Diff line number Diff line
@@ -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)