From cddd4591404fb4c53dc0b3c0b15b942cdbed4356 Mon Sep 17 00:00:00 2001 From: Yangbo Lu 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 --- ...-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch | 252 +++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 target/linux/layerscape/patches-5.4/821-vfio-0001-vfio-fsl-mc-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch (limited to 'target/linux/layerscape/patches-5.4/821-vfio-0001-vfio-fsl-mc-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch') diff --git a/target/linux/layerscape/patches-5.4/821-vfio-0001-vfio-fsl-mc-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch b/target/linux/layerscape/patches-5.4/821-vfio-0001-vfio-fsl-mc-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch new file mode 100644 index 0000000000..5dc86f71ad --- /dev/null +++ b/target/linux/layerscape/patches-5.4/821-vfio-0001-vfio-fsl-mc-Add-VFIO-framework-skeleton-for-fsl-mc-d.patch @@ -0,0 +1,252 @@ +From 8b9efd00727523c56eb9d17ad42338b6090b4b8e Mon Sep 17 00:00:00 2001 +From: Bharat Bhushan +Date: Fri, 12 May 2017 10:27:07 +0530 +Subject: [PATCH] vfio/fsl-mc: Add VFIO framework skeleton for fsl-mc devices + +This patch adds the infrastructure for VFIO support for fsl-mc +devices. Subsequent patches will add support for binding and secure +assigning these devices using VFIO. + +FSL-MC is a new bus (driver/bus/fsl-mc/) which is different +from PCI and Platform bus. + +Signed-off-by: Bharat Bhushan +Signed-off-by: Diana Craciun +--- + drivers/vfio/Kconfig | 1 + + drivers/vfio/Makefile | 1 + + drivers/vfio/fsl-mc/Kconfig | 9 ++ + drivers/vfio/fsl-mc/Makefile | 2 + + drivers/vfio/fsl-mc/vfio_fsl_mc.c | 162 ++++++++++++++++++++++++++++++ + drivers/vfio/fsl-mc/vfio_fsl_mc_private.h | 14 +++ + include/uapi/linux/vfio.h | 1 + + 7 files changed, 190 insertions(+) + create mode 100644 drivers/vfio/fsl-mc/Kconfig + create mode 100644 drivers/vfio/fsl-mc/Makefile + create mode 100644 drivers/vfio/fsl-mc/vfio_fsl_mc.c + create mode 100644 drivers/vfio/fsl-mc/vfio_fsl_mc_private.h + +--- a/drivers/vfio/Kconfig ++++ b/drivers/vfio/Kconfig +@@ -47,4 +47,5 @@ menuconfig VFIO_NOIOMMU + source "drivers/vfio/pci/Kconfig" + source "drivers/vfio/platform/Kconfig" + source "drivers/vfio/mdev/Kconfig" ++source "drivers/vfio/fsl-mc/Kconfig" + source "virt/lib/Kconfig" +--- a/drivers/vfio/Makefile ++++ b/drivers/vfio/Makefile +@@ -9,3 +9,4 @@ obj-$(CONFIG_VFIO_SPAPR_EEH) += vfio_spa + obj-$(CONFIG_VFIO_PCI) += pci/ + obj-$(CONFIG_VFIO_PLATFORM) += platform/ + obj-$(CONFIG_VFIO_MDEV) += mdev/ ++obj-$(CONFIG_VFIO_FSL_MC) += fsl-mc/ +--- /dev/null ++++ b/drivers/vfio/fsl-mc/Kconfig +@@ -0,0 +1,9 @@ ++config VFIO_FSL_MC ++ tristate "VFIO support for QorIQ DPAA2 fsl-mc bus devices" ++ depends on VFIO && FSL_MC_BUS && EVENTFD ++ help ++ Driver to enable support for the VFIO QorIQ DPAA2 fsl-mc ++ (Management Complex) devices. This is required to passthrough ++ fsl-mc bus devices using the VFIO framework. ++ ++ If you don't know what to do here, say N. +--- /dev/null ++++ b/drivers/vfio/fsl-mc/Makefile +@@ -0,0 +1,2 @@ ++vfio-fsl_mc-y := vfio_fsl_mc.o ++obj-$(CONFIG_VFIO_FSL_MC) += vfio_fsl_mc.o +--- /dev/null ++++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c +@@ -0,0 +1,162 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * Copyright 2013-2016 Freescale Semiconductor Inc. ++ * Copyright 2016-2017,2019 NXP ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "vfio_fsl_mc_private.h" ++ ++ ++static int vfio_fsl_mc_open(void *device_data) ++{ ++ if (!try_module_get(THIS_MODULE)) ++ return -ENODEV; ++ ++ return 0; ++} ++ ++static void vfio_fsl_mc_release(void *device_data) ++{ ++ module_put(THIS_MODULE); ++} ++ ++static long vfio_fsl_mc_ioctl(void *device_data, unsigned int cmd, ++ unsigned long arg) ++{ ++ switch (cmd) { ++ case VFIO_DEVICE_GET_INFO: ++ { ++ return -EINVAL; ++ } ++ case VFIO_DEVICE_GET_REGION_INFO: ++ { ++ return -EINVAL; ++ } ++ case VFIO_DEVICE_GET_IRQ_INFO: ++ { ++ return -EINVAL; ++ } ++ case VFIO_DEVICE_SET_IRQS: ++ { ++ return -EINVAL; ++ } ++ case VFIO_DEVICE_RESET: ++ { ++ return -EINVAL; ++ } ++ default: ++ return -EINVAL; ++ } ++} ++ ++static ssize_t vfio_fsl_mc_read(void *device_data, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ return -EINVAL; ++} ++ ++static ssize_t vfio_fsl_mc_write(void *device_data, const char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ return -EINVAL; ++} ++ ++static int vfio_fsl_mc_mmap(void *device_data, struct vm_area_struct *vma) ++{ ++ return -EINVAL; ++} ++ ++static const struct vfio_device_ops vfio_fsl_mc_ops = { ++ .name = "vfio-fsl-mc", ++ .open = vfio_fsl_mc_open, ++ .release = vfio_fsl_mc_release, ++ .ioctl = vfio_fsl_mc_ioctl, ++ .read = vfio_fsl_mc_read, ++ .write = vfio_fsl_mc_write, ++ .mmap = vfio_fsl_mc_mmap, ++}; ++ ++static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev) ++{ ++ struct iommu_group *group; ++ struct vfio_fsl_mc_device *vdev; ++ struct device *dev = &mc_dev->dev; ++ int ret; ++ ++ group = vfio_iommu_group_get(dev); ++ if (!group) { ++ dev_err(dev, "%s: VFIO: No IOMMU group\n", __func__); ++ return -EINVAL; ++ } ++ ++ vdev = devm_kzalloc(dev, sizeof(*vdev), GFP_KERNEL); ++ if (!vdev) { ++ vfio_iommu_group_put(group, dev); ++ return -ENOMEM; ++ } ++ ++ vdev->mc_dev = mc_dev; ++ ++ ret = vfio_add_group_dev(dev, &vfio_fsl_mc_ops, vdev); ++ if (ret) { ++ dev_err(dev, "%s: Failed to add to vfio group\n", __func__); ++ vfio_iommu_group_put(group, dev); ++ return ret; ++ } ++ ++ return ret; ++} ++ ++static int vfio_fsl_mc_remove(struct fsl_mc_device *mc_dev) ++{ ++ struct vfio_fsl_mc_device *vdev; ++ struct device *dev = &mc_dev->dev; ++ ++ vdev = vfio_del_group_dev(dev); ++ if (!vdev) ++ return -EINVAL; ++ ++ vfio_iommu_group_put(mc_dev->dev.iommu_group, dev); ++ devm_kfree(dev, vdev); ++ ++ return 0; ++} ++ ++/* ++ * vfio-fsl_mc is a meta-driver, so use driver_override interface to ++ * bind a fsl_mc container with this driver and match_id_table is NULL. ++ */ ++static struct fsl_mc_driver vfio_fsl_mc_driver = { ++ .probe = vfio_fsl_mc_probe, ++ .remove = vfio_fsl_mc_remove, ++ .match_id_table = NULL, ++ .driver = { ++ .name = "vfio-fsl-mc", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init vfio_fsl_mc_driver_init(void) ++{ ++ return fsl_mc_driver_register(&vfio_fsl_mc_driver); ++} ++ ++static void __exit vfio_fsl_mc_driver_exit(void) ++{ ++ fsl_mc_driver_unregister(&vfio_fsl_mc_driver); ++} ++ ++module_init(vfio_fsl_mc_driver_init); ++module_exit(vfio_fsl_mc_driver_exit); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_DESCRIPTION("VFIO for FSL-MC devices - User Level meta-driver"); +--- /dev/null ++++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ ++/* ++ * Copyright 2013-2016 Freescale Semiconductor Inc. ++ * Copyright 2016,2019 NXP ++ */ ++ ++#ifndef VFIO_FSL_MC_PRIVATE_H ++#define VFIO_FSL_MC_PRIVATE_H ++ ++struct vfio_fsl_mc_device { ++ struct fsl_mc_device *mc_dev; ++}; ++ ++#endif /* VFIO_PCI_PRIVATE_H */ +--- a/include/uapi/linux/vfio.h ++++ b/include/uapi/linux/vfio.h +@@ -201,6 +201,7 @@ struct vfio_device_info { + #define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ + #define VFIO_DEVICE_FLAGS_CCW (1 << 4) /* vfio-ccw device */ + #define VFIO_DEVICE_FLAGS_AP (1 << 5) /* vfio-ap device */ ++#define VFIO_DEVICE_FLAGS_FSL_MC (1 << 6) /* vfio-fsl-mc device */ + __u32 num_regions; /* Max region index + 1 */ + __u32 num_irqs; /* Max IRQ index + 1 */ + }; -- cgit v1.2.3