On 1/25/21 6:22 PM, Moritz Fischer wrote: > On Mon, Jan 25, 2021 at 11:00:38AM -0800, Tom Rix wrote: Snip >> >>> + depends on FPGA_DFL >>> + help >>> + Generic DFL (Device Feature List) driver for Userspace I/O devices. >>> + It is useful to provide direct access to DFL devices from userspace. >>> + A sample userspace application using this driver is available for >>> + download in a git repository: >>> + >>> + git clone https://github.com/OPAE/opae-sdk.git >>> + >>> + If you compile this as a module, it will be called uio_dfl. > I'm not sure KConfig is the right place for this. More than half of the other configs do this. ex/ config UIO_MF624 tristate "Humusoft MF624 DAQ PCI card driver" depends on PCI help Userspace I/O interface for the Humusoft MF624 PCI card. A sample userspace application using this driver is available (among other MF624 related information and software components) for download in a git repository: git clone git://rtime.felk.cvut.cz/mf6xx.git If you compile this as a module, it will be called uio_mf624. Tom >> opae-sdk is pretty large and uncovered in the Documentation/fpga/dfl.rst. >> >> Where in opae-sdk is this example ? >> >> If you can point me at the example, I will turn it into a selftest. >> >> Tom >> >>> endif >>> diff --git a/drivers/uio/Makefile b/drivers/uio/Makefile >>> index c285dd2..f2f416a1 100644 >>> --- a/drivers/uio/Makefile >>> +++ b/drivers/uio/Makefile >>> @@ -11,3 +11,4 @@ obj-$(CONFIG_UIO_PRUSS) += uio_pruss.o >>> obj-$(CONFIG_UIO_MF624) += uio_mf624.o >>> obj-$(CONFIG_UIO_FSL_ELBC_GPCM) += uio_fsl_elbc_gpcm.o >>> obj-$(CONFIG_UIO_HV_GENERIC) += uio_hv_generic.o >>> +obj-$(CONFIG_UIO_DFL) += uio_dfl.o >>> diff --git a/drivers/uio/uio_dfl.c b/drivers/uio/uio_dfl.c >>> new file mode 100644 >>> index 0000000..89c0fc7 >>> --- /dev/null >>> +++ b/drivers/uio/uio_dfl.c >>> @@ -0,0 +1,66 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Generic DFL driver for Userspace I/O devicess >>> + * >>> + * Copyright (C) 2021 Intel Corporation, Inc. >>> + */ >>> +#include <linux/dfl.h> >>> +#include <linux/errno.h> >>> +#include <linux/module.h> >>> +#include <linux/uio_driver.h> >>> + >>> +#define DRIVER_NAME "uio_dfl" >>> + >>> +static int uio_dfl_probe(struct dfl_device *ddev) >>> +{ >>> + struct resource *r = &ddev->mmio_res; >>> + struct device *dev = &ddev->dev; >>> + struct uio_info *uioinfo; >>> + struct uio_mem *uiomem; >>> + int ret; >>> + >>> + uioinfo = devm_kzalloc(dev, sizeof(struct uio_info), GFP_KERNEL); >>> + if (!uioinfo) >>> + return -ENOMEM; >>> + >>> + uioinfo->name = DRIVER_NAME; >>> + uioinfo->version = "0"; >>> + >>> + uiomem = &uioinfo->mem[0]; >>> + uiomem->memtype = UIO_MEM_PHYS; >>> + uiomem->addr = r->start & PAGE_MASK; >>> + uiomem->offs = r->start & ~PAGE_MASK; >>> + uiomem->size = (uiomem->offs + resource_size(r) >>> + + PAGE_SIZE - 1) & PAGE_MASK; >>> + uiomem->name = r->name; >>> + >>> + /* Irq is yet to be supported */ >>> + uioinfo->irq = UIO_IRQ_NONE; >>> + >>> + ret = devm_uio_register_device(dev, uioinfo); >>> + if (ret) >>> + dev_err(dev, "unable to register uio device\n"); >>> + >>> + return ret; >>> +} >>> + >>> +#define FME_FEATURE_ID_ETH_GROUP 0x10 >>> + >>> +static const struct dfl_device_id uio_dfl_ids[] = { >>> + { FME_ID, FME_FEATURE_ID_ETH_GROUP }, >>> + { } >>> +}; >>> +MODULE_DEVICE_TABLE(dfl, uio_dfl_ids); >>> + >>> +static struct dfl_driver uio_dfl_driver = { >>> + .drv = { >>> + .name = DRIVER_NAME, >>> + }, >>> + .id_table = uio_dfl_ids, >>> + .probe = uio_dfl_probe, >>> +}; >>> +module_dfl_driver(uio_dfl_driver); >>> + >>> +MODULE_DESCRIPTION("Generic DFL driver for Userspace I/O devices"); >>> +MODULE_AUTHOR("Intel Corporation"); >>> +MODULE_LICENSE("GPL v2");