From: Xu Yilun <yilun.xu@intel.com>
To: mdf@kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: gregkh@linuxfoundation.org, trix@redhat.com, lgoncalv@redhat.com,
yilun.xu@intel.com, hao.wu@intel.com
Subject: [PATCH 2/2] fpga: dfl: add the userspace I/O device support for DFL devices
Date: Fri, 16 Oct 2020 14:02:31 +0800 [thread overview]
Message-ID: <1602828151-24784-3-git-send-email-yilun.xu@intel.com> (raw)
In-Reply-To: <1602828151-24784-1-git-send-email-yilun.xu@intel.com>
This patch supports the DFL drivers be written in userspace. This is
realized by exposing the userspace I/O device interfaces. The driver
leverages the uio_pdrv_genirq, it adds the uio_pdrv_genirq platform
device with the DFL device's resources, and let the generic UIO platform
device driver provide support to userspace access to kernel interrupts
and memory locations.
Signed-off-by: Xu Yilun <yilun.xu@intel.com>
---
drivers/fpga/Kconfig | 10 ++++++
drivers/fpga/Makefile | 1 +
drivers/fpga/dfl-uio-pdev.c | 83 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 94 insertions(+)
create mode 100644 drivers/fpga/dfl-uio-pdev.c
diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig
index 5d7f0ae..e054722 100644
--- a/drivers/fpga/Kconfig
+++ b/drivers/fpga/Kconfig
@@ -202,6 +202,16 @@ config FPGA_DFL_NIOS_INTEL_PAC_N3000
the card. It also instantiates the SPI master (spi-altera) for
the card's BMC (Board Management Controller).
+config FPGA_DFL_UIO_PDEV
+ tristate "FPGA DFL Driver for Userspace I/O platform devices"
+ depends on FPGA_DFL && UIO_PDRV_GENIRQ
+ help
+ Enable this to allow some DFL drivers be written in userspace. It
+ adds the uio_pdrv_genirq platform device with the DFL device's
+ resources, and let the generic UIO platform device driver provide
+ support to userspace access to kernel interrupts and memory
+ locations.
+
config FPGA_DFL_PCI
tristate "FPGA DFL PCIe Device Driver"
depends on PCI && FPGA_DFL
diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile
index 18dc9885..e07b3d5 100644
--- a/drivers/fpga/Makefile
+++ b/drivers/fpga/Makefile
@@ -45,6 +45,7 @@ dfl-afu-objs := dfl-afu-main.o dfl-afu-region.o dfl-afu-dma-region.o
dfl-afu-objs += dfl-afu-error.o
obj-$(CONFIG_FPGA_DFL_NIOS_INTEL_PAC_N3000) += dfl-n3000-nios.o
+obj-$(CONFIG_FPGA_DFL_UIO_PDEV) += dfl-uio-pdev.o
# Drivers for FPGAs which implement DFL
obj-$(CONFIG_FPGA_DFL_PCI) += dfl-pci.o
diff --git a/drivers/fpga/dfl-uio-pdev.c b/drivers/fpga/dfl-uio-pdev.c
new file mode 100644
index 0000000..d35b846
--- /dev/null
+++ b/drivers/fpga/dfl-uio-pdev.c
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * DFL driver for Userspace I/O platform devices
+ *
+ * Copyright (C) 2020 Intel Corporation, Inc.
+ */
+#include <linux/dfl.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/uio_driver.h>
+
+#define DRIVER_NAME "dfl-uio-pdev"
+
+static int dfl_uio_pdev_probe(struct dfl_device *ddev)
+{
+ struct device *dev = &ddev->dev;
+ struct platform_device_info pdevinfo = { 0 };
+ struct uio_info uio_pdata = { 0 };
+ struct platform_device *uio_pdev;
+ struct resource *res;
+ int i, idx = 0;
+
+ pdevinfo.name = "uio_pdrv_genirq";
+
+ res = kcalloc(ddev->num_irqs + 1, sizeof(*res), GFP_KERNEL);
+ if (!res)
+ return -ENOMEM;
+
+ res[idx].parent = &ddev->mmio_res;
+ res[idx].flags = IORESOURCE_MEM;
+ res[idx].start = ddev->mmio_res.start;
+ res[idx].end = ddev->mmio_res.end;
+ ++idx;
+
+ /* then add irq resource */
+ for (i = 0; i < ddev->num_irqs; i++) {
+ res[idx].flags = IORESOURCE_IRQ;
+ res[idx].start = ddev->irqs[i];
+ res[idx].end = ddev->irqs[i];
+ ++idx;
+ }
+
+ uio_pdata.name = DRIVER_NAME;
+ uio_pdata.version = "0";
+
+ pdevinfo.res = res;
+ pdevinfo.num_res = idx;
+ pdevinfo.parent = &ddev->dev;
+ pdevinfo.id = PLATFORM_DEVID_AUTO;
+ pdevinfo.data = &uio_pdata;
+ pdevinfo.size_data = sizeof(uio_pdata);
+
+ uio_pdev = platform_device_register_full(&pdevinfo);
+ if (!IS_ERR(uio_pdev))
+ dev_set_drvdata(dev, uio_pdev);
+
+ kfree(res);
+
+ return PTR_ERR_OR_ZERO(uio_pdev);
+}
+
+static void dfl_uio_pdev_remove(struct dfl_device *ddev)
+{
+ struct platform_device *uio_pdev = dev_get_drvdata(&ddev->dev);
+
+ platform_device_unregister(uio_pdev);
+}
+
+static struct dfl_driver dfl_uio_pdev_driver = {
+ .drv = {
+ .name = DRIVER_NAME,
+ },
+ .probe = dfl_uio_pdev_probe,
+ .remove = dfl_uio_pdev_remove,
+};
+module_dfl_driver(dfl_uio_pdev_driver);
+
+MODULE_DESCRIPTION("DFL driver for Userspace I/O platform devices");
+MODULE_AUTHOR("Intel Corporation");
+MODULE_LICENSE("GPL v2");
--
2.7.4
next prev parent reply other threads:[~2020-10-16 6:07 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-16 6:02 [PATCH 0/2] UIO support for dfl devices Xu Yilun
2020-10-16 6:02 ` [PATCH 1/2] fpga: dfl: add driver_override support Xu Yilun
2020-10-16 16:21 ` Tom Rix
2020-10-19 4:06 ` Xu Yilun
2020-10-19 7:46 ` Wu, Hao
2020-10-19 7:50 ` Xu Yilun
2020-10-19 8:53 ` gregkh
2020-10-19 8:52 ` Xu Yilun
2020-10-19 9:03 ` Greg KH
2020-10-20 0:42 ` Xu Yilun
2020-10-19 13:55 ` Tom Rix
2020-10-20 7:11 ` Xu Yilun
2020-10-20 7:32 ` Greg KH
2020-10-20 8:57 ` Xu Yilun
2020-10-20 9:21 ` Greg KH
2020-10-21 7:25 ` Xu Yilun
2020-11-09 2:30 ` Xu Yilun
2020-10-20 14:13 ` Tom Rix
2020-10-16 6:02 ` Xu Yilun [this message]
2020-10-16 16:36 ` [PATCH 2/2] fpga: dfl: add the userspace I/O device support for DFL devices Tom Rix
2020-10-19 4:16 ` Xu Yilun
2020-10-19 14:01 ` Tom Rix
2020-10-16 16:40 ` [PATCH 0/2] UIO support for dfl devices Tom Rix
2020-10-19 4:17 ` Xu Yilun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1602828151-24784-3-git-send-email-yilun.xu@intel.com \
--to=yilun.xu@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=hao.wu@intel.com \
--cc=lgoncalv@redhat.com \
--cc=linux-fpga@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mdf@kernel.org \
--cc=trix@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).