From cddd4591404fb4c53dc0b3c0b15b942cdbed4356 Mon Sep 17 00:00:00 2001
From: Yangbo Lu <yangbo.lu@nxp.com>
Date: Fri, 10 Apr 2020 10:47:05 +0800
Subject: layerscape: add patches-5.4

Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release
which was tagged LSDK-20.04-V5.4.
https://source.codeaurora.org/external/qoriq/qoriq-components/linux/

For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in
LSDK, port the dts patches from 4.14.

The patches are sorted into the following categories:
  301-arch-xxxx
  302-dts-xxxx
  303-core-xxxx
  701-net-xxxx
  801-audio-xxxx
  802-can-xxxx
  803-clock-xxxx
  804-crypto-xxxx
  805-display-xxxx
  806-dma-xxxx
  807-gpio-xxxx
  808-i2c-xxxx
  809-jailhouse-xxxx
  810-keys-xxxx
  811-kvm-xxxx
  812-pcie-xxxx
  813-pm-xxxx
  814-qe-xxxx
  815-sata-xxxx
  816-sdhc-xxxx
  817-spi-xxxx
  818-thermal-xxxx
  819-uart-xxxx
  820-usb-xxxx
  821-vfio-xxxx

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
---
 ...-Add-irq-infrastructure-for-fsl-mc-device.patch | 192 +++++++++++++++++++++
 1 file changed, 192 insertions(+)
 create mode 100644 target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch

(limited to 'target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch')

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
new file mode 100644
index 0000000000..025b0371bd
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/821-vfio-0007-vfio-fsl-mc-Add-irq-infrastructure-for-fsl-mc-device.patch
@@ -0,0 +1,192 @@
+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 */
-- 
cgit v1.2.3