diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch | 192 |
1 files changed, 0 insertions, 192 deletions
diff --git a/target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch b/target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch deleted file mode 100644 index 025b0371bd..0000000000 --- a/target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch +++ /dev/null @@ -1,192 +0,0 @@ -From aa8dac23408e24432f7d6c404cddc8997a142bd6 Mon Sep 17 00:00:00 2001 -From: Diana Craciun <diana.craciun@nxp.com> -Date: Mon, 30 Sep 2019 11:56:35 +0300 -Subject: [PATCH] vfio/fsl-mc: Add irq infrastructure for fsl-mc devices - -This patch adds the skeleton for interrupt support -for fsl-mc devices. The interrupts are not yet functional, -the functionality will be added by subsequent patches. - -Signed-off-by: Bharat Bhushan <Bharat.Bhushan@nxp.com> -Signed-off-by: Diana Craciun <diana.craciun@nxp.com> ---- - drivers/vfio/fsl-mc/Makefile | 2 +- - drivers/vfio/fsl-mc/vfio_fsl_mc.c | 71 ++++++++++++++++++++++++++++++- - drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c | 62 +++++++++++++++++++++++++++ - drivers/vfio/fsl-mc/vfio_fsl_mc_private.h | 5 +++ - 4 files changed, 137 insertions(+), 3 deletions(-) - create mode 100644 drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c - ---- a/drivers/vfio/fsl-mc/Makefile -+++ b/drivers/vfio/fsl-mc/Makefile -@@ -1,2 +1,2 @@ - vfio-fsl_mc-y := vfio_fsl_mc.o --obj-$(CONFIG_VFIO_FSL_MC) += vfio_fsl_mc.o -+obj-$(CONFIG_VFIO_FSL_MC) += vfio_fsl_mc.o vfio_fsl_mc_intr.o ---- a/drivers/vfio/fsl-mc/vfio_fsl_mc.c -+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c -@@ -208,11 +208,75 @@ static long vfio_fsl_mc_ioctl(void *devi - } - case VFIO_DEVICE_GET_IRQ_INFO: - { -- return -EINVAL; -+ 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) -+ return -EINVAL; -+ -+ if (info.index >= mc_dev->obj_desc.irq_count) -+ return -EINVAL; -+ -+ info.flags = VFIO_IRQ_INFO_EVENTFD; -+ info.count = 1; -+ -+ return copy_to_user((void __user *)arg, &info, minsz); - } - case VFIO_DEVICE_SET_IRQS: - { -- return -EINVAL; -+ struct vfio_irq_set hdr; -+ u8 *data = NULL; -+ int ret = 0; -+ -+ minsz = offsetofend(struct vfio_irq_set, count); -+ -+ if (copy_from_user(&hdr, (void __user *)arg, minsz)) -+ return -EFAULT; -+ -+ if (hdr.argsz < minsz) -+ return -EINVAL; -+ -+ if (hdr.index >= mc_dev->obj_desc.irq_count) -+ return -EINVAL; -+ -+ if (hdr.start != 0 || hdr.count > 1) -+ return -EINVAL; -+ -+ if (hdr.count == 0 && -+ (!(hdr.flags & VFIO_IRQ_SET_DATA_NONE) || -+ !(hdr.flags & VFIO_IRQ_SET_ACTION_TRIGGER))) -+ return -EINVAL; -+ -+ if (hdr.flags & ~(VFIO_IRQ_SET_DATA_TYPE_MASK | -+ VFIO_IRQ_SET_ACTION_TYPE_MASK)) -+ return -EINVAL; -+ -+ if (!(hdr.flags & VFIO_IRQ_SET_DATA_NONE)) { -+ size_t size; -+ -+ if (hdr.flags & VFIO_IRQ_SET_DATA_BOOL) -+ size = sizeof(uint8_t); -+ else if (hdr.flags & VFIO_IRQ_SET_DATA_EVENTFD) -+ size = sizeof(int32_t); -+ else -+ return -EINVAL; -+ -+ if (hdr.argsz - minsz < hdr.count * size) -+ return -EINVAL; -+ -+ data = memdup_user((void __user *)(arg + minsz), -+ hdr.count * size); -+ if (IS_ERR(data)) -+ return PTR_ERR(data); -+ } -+ -+ ret = vfio_fsl_mc_set_irqs_ioctl(vdev, hdr.flags, -+ hdr.index, hdr.start, -+ hdr.count, data); -+ return ret; - } - case VFIO_DEVICE_RESET: - { -@@ -304,6 +368,9 @@ static int vfio_fsl_mc_init_device(struc - int ret = 0; - unsigned int irq_count; - -+ /* innherit the msi domain from parent */ -+ dev_set_msi_domain(&mc_dev->dev, dev_get_msi_domain(mc_dev->dev.parent)); -+ - /* Non-dprc devices share mc_io from parent */ - if (!is_fsl_mc_bus_dprc(mc_dev)) { - struct fsl_mc_device *mc_cont = to_fsl_mc_device(mc_dev->dev.parent); ---- /dev/null -+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c -@@ -0,0 +1,62 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) -+/* -+ * Copyright 2013-2016 Freescale Semiconductor Inc. -+ * Copyright 2019 NXP -+ */ -+ -+#include <linux/vfio.h> -+#include <linux/slab.h> -+#include <linux/types.h> -+#include <linux/eventfd.h> -+#include <linux/msi.h> -+ -+#include "linux/fsl/mc.h" -+#include "vfio_fsl_mc_private.h" -+ -+static int vfio_fsl_mc_irq_mask(struct vfio_fsl_mc_device *vdev, -+ unsigned int index, unsigned int start, -+ unsigned int count, uint32_t flags, -+ void *data) -+{ -+ return -EINVAL; -+} -+ -+static int vfio_fsl_mc_irq_unmask(struct vfio_fsl_mc_device *vdev, -+ unsigned int index, unsigned int start, -+ unsigned int count, uint32_t flags, -+ void *data) -+{ -+ return -EINVAL; -+} -+ -+static int vfio_fsl_mc_set_irq_trigger(struct vfio_fsl_mc_device *vdev, -+ unsigned int index, unsigned int start, -+ unsigned int count, uint32_t flags, -+ void *data) -+{ -+ return -EINVAL; -+} -+int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev, -+ uint32_t flags, unsigned int index, -+ unsigned int start, unsigned int count, -+ void *data) -+{ -+ int ret = -ENOTTY; -+ -+ switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { -+ case VFIO_IRQ_SET_ACTION_MASK: -+ ret = vfio_fsl_mc_irq_mask(vdev, index, start, count, -+ flags, data); -+ break; -+ case VFIO_IRQ_SET_ACTION_UNMASK: -+ ret = vfio_fsl_mc_irq_unmask(vdev, index, start, count, -+ flags, data); -+ break; -+ case VFIO_IRQ_SET_ACTION_TRIGGER: -+ ret = vfio_fsl_mc_set_irq_trigger(vdev, index, start, -+ count, flags, data); -+ break; -+ } -+ -+ return ret; -+} ---- a/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h -+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h -@@ -35,4 +35,9 @@ struct vfio_fsl_mc_device { - struct vfio_fsl_mc_reflck *reflck; - }; - -+int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev, -+ uint32_t flags, unsigned int index, -+ unsigned int start, unsigned int count, -+ void *data); -+ - #endif /* VFIO_PCI_PRIVATE_H */ |