Commit 07877552 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Alex Williamson
Browse files

vfio/mtty: Provide a get_region_info op

parent f3fddb71
Loading
Loading
Loading
Loading
+29 −24
Original line number Diff line number Diff line
@@ -1785,45 +1785,48 @@ static int mtty_get_device_info(struct vfio_device_info *dev_info)
	return 0;
}

static long mtty_ioctl(struct vfio_device *vdev, unsigned int cmd,
			unsigned long arg)
static int mtty_ioctl_get_region_info(struct vfio_device *vdev,
				      struct vfio_region_info __user *arg)
{
	struct mdev_state *mdev_state =
		container_of(vdev, struct mdev_state, vdev);
	int ret = 0;
	struct vfio_region_info info;
	void *cap_type = NULL;
	u16 cap_type_id = 0;
	unsigned long minsz;
	int ret;

	switch (cmd) {
	case VFIO_DEVICE_GET_INFO:
	{
		struct vfio_device_info info;

		minsz = offsetofend(struct vfio_device_info, num_irqs);
	minsz = offsetofend(struct vfio_region_info, offset);

		if (copy_from_user(&info, (void __user *)arg, minsz))
	if (copy_from_user(&info, arg, minsz))
		return -EFAULT;

	if (info.argsz < minsz)
		return -EINVAL;

		ret = mtty_get_device_info(&info);
	ret = mtty_get_region_info(mdev_state, &info, &cap_type_id, &cap_type);
	if (ret)
		return ret;

		memcpy(&mdev_state->dev_info, &info, sizeof(info));

		if (copy_to_user((void __user *)arg, &info, minsz))
	if (copy_to_user(arg, &info, minsz))
		return -EFAULT;

	return 0;
}
	case VFIO_DEVICE_GET_REGION_INFO:

static long mtty_ioctl(struct vfio_device *vdev, unsigned int cmd,
			unsigned long arg)
{
		struct vfio_region_info info;
		u16 cap_type_id = 0;
		void *cap_type = NULL;
	struct mdev_state *mdev_state =
		container_of(vdev, struct mdev_state, vdev);
	int ret = 0;
	unsigned long minsz;

		minsz = offsetofend(struct vfio_region_info, offset);
	switch (cmd) {
	case VFIO_DEVICE_GET_INFO:
	{
		struct vfio_device_info info;

		minsz = offsetofend(struct vfio_device_info, num_irqs);

		if (copy_from_user(&info, (void __user *)arg, minsz))
			return -EFAULT;
@@ -1831,11 +1834,12 @@ static long mtty_ioctl(struct vfio_device *vdev, unsigned int cmd,
		if (info.argsz < minsz)
			return -EINVAL;

		ret = mtty_get_region_info(mdev_state, &info, &cap_type_id,
					   &cap_type);
		ret = mtty_get_device_info(&info);
		if (ret)
			return ret;

		memcpy(&mdev_state->dev_info, &info, sizeof(info));

		if (copy_to_user((void __user *)arg, &info, minsz))
			return -EFAULT;

@@ -1949,6 +1953,7 @@ static const struct vfio_device_ops mtty_dev_ops = {
	.read = mtty_read,
	.write = mtty_write,
	.ioctl = mtty_ioctl,
	.get_region_info = mtty_ioctl_get_region_info,
	.bind_iommufd	= vfio_iommufd_emulated_bind,
	.unbind_iommufd	= vfio_iommufd_emulated_unbind,
	.attach_ioas	= vfio_iommufd_emulated_attach_ioas,