Message ID | 1602828151-24784-3-git-send-email-yilun.xu@intel.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | UIO support for dfl devices | expand |
On 10/15/20 11:02 PM, Xu Yilun wrote: > 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 'and lets the' > + 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; idx is not needed. > + > + 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[0].parent = > + 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[i+1].flags = Tom > + 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");
On Fri, Oct 16, 2020 at 09:36:00AM -0700, Tom Rix wrote: > > On 10/15/20 11:02 PM, Xu Yilun wrote: > > 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 > 'and lets the' Yes. > > + 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; > > idx is not needed. I could remove the idx. But I think I could ++res during the resource filling. Thanks, Yilun > > > + > > + 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[0].parent = > > + 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[i+1].flags = > > Tom > > > + 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");
On 10/18/20 9:16 PM, Xu Yilun wrote: > On Fri, Oct 16, 2020 at 09:36:00AM -0700, Tom Rix wrote: >> On 10/15/20 11:02 PM, Xu Yilun wrote: >>> 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 >> 'and lets the' > Yes. > >>> + 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; >> idx is not needed. > I could remove the idx. But I think I could ++res during the resource > filling. ok. You may want to check the code generation, my feeling is ++res will be worse. Tom > > Thanks, > Yilun > >>> + >>> + 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[0].parent = >>> + 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[i+1].flags = >> >> Tom >> >>> + 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");
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");
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