Hi Antonios, On 10/27/2014 07:07 PM, Antonios Motakis wrote: > This patch forms the common skeleton code for platform devices support > with VFIO. This will include the core functionality of VFIO_PLATFORM, > however binding to the device and discovering the device resources will > be done with the help of a separate file where any Linux platform bus > specific code will reside. > > This will allow us to implement support for also discovering AMBA devices > and their resources, but still reuse a large part of the VFIO_PLATFORM > implementation. > > Signed-off-by: Antonios Motakis <a.motakis@xxxxxxxxxxxxxxxxxxxxxx> > --- > drivers/vfio/platform/vfio_platform_common.c | 126 ++++++++++++++++++++++++++ > drivers/vfio/platform/vfio_platform_private.h | 36 ++++++++ > 2 files changed, 162 insertions(+) > create mode 100644 drivers/vfio/platform/vfio_platform_common.c > create mode 100644 drivers/vfio/platform/vfio_platform_private.h > > diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c > new file mode 100644 > index 0000000..e0fdbc8 > --- /dev/null > +++ b/drivers/vfio/platform/vfio_platform_common.c > @@ -0,0 +1,126 @@ > +/* > + * Copyright (C) 2013 - Virtual Open Systems > + * Author: Antonios Motakis <a.motakis@xxxxxxxxxxxxxxxxxxxxxx> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License, version 2, as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <linux/device.h> > +#include <linux/interrupt.h> > +#include <linux/iommu.h> > +#include <linux/module.h> > +#include <linux/mutex.h> > +#include <linux/notifier.h> > +#include <linux/pm_runtime.h> > +#include <linux/slab.h> > +#include <linux/types.h> > +#include <linux/uaccess.h> > +#include <linux/vfio.h> > +#include <linux/io.h> not sure at that state all the above includes are needed. > + > +#include "vfio_platform_private.h" > + > +static void vfio_platform_release(void *device_data) > +{ > + module_put(THIS_MODULE); > +} > + > +static int vfio_platform_open(void *device_data) > +{ > + if (!try_module_get(THIS_MODULE)) > + return -ENODEV; > + > + return 0; > +} > + > +static long vfio_platform_ioctl(void *device_data, > + unsigned int cmd, unsigned long arg) a minor style comment/question that applies on all the series. Shouldn't subsequent argument lines rather be aligned with the first char after "(", as done in PCI code? > +{ > + if (cmd == VFIO_DEVICE_GET_INFO) > + return -EINVAL; > + > + else if (cmd == VFIO_DEVICE_GET_REGION_INFO) > + return -EINVAL; > + > + else if (cmd == VFIO_DEVICE_GET_IRQ_INFO) > + return -EINVAL; > + > + else if (cmd == VFIO_DEVICE_SET_IRQS) > + return -EINVAL; > + > + else if (cmd == VFIO_DEVICE_RESET) > + return -EINVAL; > + > + return -ENOTTY; > +} > + > +static ssize_t vfio_platform_read(void *device_data, char __user *buf, > + size_t count, loff_t *ppos) > +{ > + return -EINVAL; > +} > + > +static ssize_t vfio_platform_write(void *device_data, const char __user *buf, > + size_t count, loff_t *ppos) > +{ > + return -EINVAL; > +} > + > +static int vfio_platform_mmap(void *device_data, struct vm_area_struct *vma) > +{ > + return -EINVAL; > +} > + > +static const struct vfio_device_ops vfio_platform_ops = { > + .name = "vfio-platform", > + .open = vfio_platform_open, > + .release = vfio_platform_release, > + .ioctl = vfio_platform_ioctl, > + .read = vfio_platform_read, > + .write = vfio_platform_write, > + .mmap = vfio_platform_mmap, > +}; > + > +int vfio_platform_probe_common(struct vfio_platform_device *vdev, > + struct device *dev) > +{ > + struct iommu_group *group; > + int ret; > + > + if (!vdev) > + return -EINVAL; > + > + group = iommu_group_get(dev); > + if (!group) { > + pr_err("VFIO: No IOMMU group for device %s\n", vdev->name); > + return -EINVAL; > + } I saw the above check also is done at beginning of vfio_add_group_dev. Added value however is pr_err which is useful and PCI code does the check too. Eric > + > + ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev); > + if (ret) { > + iommu_group_put(group); > + return ret; > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(vfio_platform_probe_common); > + > +struct vfio_platform_device *vfio_platform_remove_common(struct device *dev) > +{ > + struct vfio_platform_device *vdev; > + > + vdev = vfio_del_group_dev(dev); > + if (vdev) > + iommu_group_put(dev->iommu_group); > + > + return vdev; > +} > +EXPORT_SYMBOL_GPL(vfio_platform_remove_common); > diff --git a/drivers/vfio/platform/vfio_platform_private.h b/drivers/vfio/platform/vfio_platform_private.h > new file mode 100644 > index 0000000..062b92d > --- /dev/null > +++ b/drivers/vfio/platform/vfio_platform_private.h > @@ -0,0 +1,36 @@ > +/* > + * Copyright (C) 2013 - Virtual Open Systems > + * Author: Antonios Motakis <a.motakis@xxxxxxxxxxxxxxxxxxxxxx> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License, version 2, as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#ifndef VFIO_PLATFORM_PRIVATE_H > +#define VFIO_PLATFORM_PRIVATE_H > + > +struct vfio_platform_device { > + /* > + * These fields should be filled by the bus specific binder > + */ > + void *opaque; > + const char *name; > + uint32_t flags; > + /* callbacks to discover device resources */ > + struct resource* > + (*get_resource)(struct vfio_platform_device *vdev, int i); > + int (*get_irq)(struct vfio_platform_device *vdev, int i); > +}; > + > +extern int vfio_platform_probe_common(struct vfio_platform_device *vdev, > + struct device *dev); > +extern struct vfio_platform_device *vfio_platform_remove_common > + (struct device *dev); > + > +#endif /* VFIO_PLATFORM_PRIVATE_H */ > _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm