lkml.org 
[lkml]   [2020]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 07/10] vfio/fsl-mc: Add irq infrastructure for fsl-mc devices
    Date
    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@oss.nxp.com>
    ---
    drivers/vfio/fsl-mc/Makefile | 2 +-
    drivers/vfio/fsl-mc/vfio_fsl_mc.c | 52 ++++++++++++++++++++++-
    drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c | 34 +++++++++++++++
    drivers/vfio/fsl-mc/vfio_fsl_mc_private.h | 6 +++
    4 files changed, 91 insertions(+), 3 deletions(-)
    create mode 100644 drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c

    diff --git a/drivers/vfio/fsl-mc/Makefile b/drivers/vfio/fsl-mc/Makefile
    index 0c6e5d2ddaae..cad6dbf0b735 100644
    --- a/drivers/vfio/fsl-mc/Makefile
    +++ b/drivers/vfio/fsl-mc/Makefile
    @@ -1,4 +1,4 @@
    # SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)

    -vfio-fsl-mc-y := vfio_fsl_mc.o
    +vfio-fsl-mc-y := vfio_fsl_mc.o vfio_fsl_mc_intr.o
    obj-$(CONFIG_VFIO_FSL_MC) += vfio-fsl-mc.o
    diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc.c b/drivers/vfio/fsl-mc/vfio_fsl_mc.c
    index b52407c4e1ea..7803a9d6bfd9 100644
    --- a/drivers/vfio/fsl-mc/vfio_fsl_mc.c
    +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c
    @@ -217,11 +217,55 @@ static long vfio_fsl_mc_ioctl(void *device_data, unsigned int cmd,
    }
    case VFIO_DEVICE_GET_IRQ_INFO:
    {
    - return -ENOTTY;
    + 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 -ENOTTY;
    + struct vfio_irq_set hdr;
    + u8 *data = NULL;
    + int ret = 0;
    + size_t data_size = 0;
    +
    + minsz = offsetofend(struct vfio_irq_set, count);
    +
    + if (copy_from_user(&hdr, (void __user *)arg, minsz))
    + return -EFAULT;
    +
    + ret = vfio_set_irqs_validate_and_prepare(&hdr, mc_dev->obj_desc.irq_count,
    + mc_dev->obj_desc.irq_count, &data_size);
    + if (ret)
    + return ret;
    +
    + if (data_size) {
    + data = memdup_user((void __user *)(arg + minsz),
    + data_size);
    + if (IS_ERR(data))
    + return PTR_ERR(data);
    + }
    +
    + mutex_lock(&vdev->igate);
    + ret = vfio_fsl_mc_set_irqs_ioctl(vdev, hdr.flags,
    + hdr.index, hdr.start,
    + hdr.count, data);
    + mutex_unlock(&vdev->igate);
    + kfree(data);
    +
    + return ret;
    }
    case VFIO_DEVICE_RESET:
    {
    @@ -423,6 +467,8 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev)
    if (ret)
    goto out_reflck;

    + mutex_init(&vdev->igate);
    +
    return 0;

    out_reflck:
    @@ -443,6 +489,8 @@ static int vfio_fsl_mc_remove(struct fsl_mc_device *mc_dev)
    if (!vdev)
    return -EINVAL;

    + mutex_destroy(&vdev->igate);
    +
    vfio_fsl_mc_reflck_put(vdev->reflck);

    if (is_fsl_mc_bus_dprc(mc_dev)) {
    diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
    new file mode 100644
    index 000000000000..5232f208e361
    --- /dev/null
    +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
    @@ -0,0 +1,34 @@
    +// 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_set_irq_trigger(struct vfio_fsl_mc_device *vdev,
    + unsigned int index, unsigned int start,
    + unsigned int count, u32 flags,
    + void *data)
    +{
    + return -EINVAL;
    +}
    +
    +int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev,
    + u32 flags, unsigned int index,
    + unsigned int start, unsigned int count,
    + void *data)
    +{
    + if (flags & VFIO_IRQ_SET_ACTION_TRIGGER)
    + return vfio_fsl_mc_set_irq_trigger(vdev, index, start,
    + count, flags, data);
    + else
    + return -EINVAL;
    +}
    diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
    index d47ef6215429..2c3f625a3240 100644
    --- a/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
    +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
    @@ -33,6 +33,12 @@ struct vfio_fsl_mc_device {
    int refcnt;
    struct vfio_fsl_mc_region *regions;
    struct vfio_fsl_mc_reflck *reflck;
    + struct mutex igate;
    };

    +extern int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev,
    + u32 flags, unsigned int index,
    + unsigned int start, unsigned int count,
    + void *data);
    +
    #endif /* VFIO_FSL_MC_PRIVATE_H */
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-10-05 19:37    [W:4.069 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site