* [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus [not found] ` <1413205825-6370-1-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> @ 2014-10-13 13:10 ` Antonios Motakis [not found] ` <1413205825-6370-3-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> 2014-10-13 13:10 ` [PATCH v8 04/18] vfio: amba: VFIO support for AMBA devices Antonios Motakis 1 sibling, 1 reply; 5+ messages in thread From: Antonios Motakis @ 2014-10-13 13:10 UTC (permalink / raw) To: kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, alex.williamson-H+wXaHxf7aLQT0dZR+AlfA Cc: open list:VFIO DRIVER, eric.auger-QSEj5FYQhm4dnm+yROfE0A, marc.zyngier-5wv7dgnIgG8, open list:ABI/API, will.deacon-5wv7dgnIgG8, open list, Antonios Motakis, tech-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J, christoffer.dall-QSEj5FYQhm4dnm+yROfE0A Driver to bind to Linux platform devices, and callbacks to discover their resources to be used by the main VFIO PLATFORM code. Signed-off-by: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> --- drivers/vfio/platform/vfio_platform.c | 107 ++++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 1 + 2 files changed, 108 insertions(+) create mode 100644 drivers/vfio/platform/vfio_platform.c diff --git a/drivers/vfio/platform/vfio_platform.c b/drivers/vfio/platform/vfio_platform.c new file mode 100644 index 0000000..baeb7da --- /dev/null +++ b/drivers/vfio/platform/vfio_platform.c @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2013 - Virtual Open Systems + * Author: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> + * + * 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/eventfd.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> +#include <linux/platform_device.h> +#include <linux/irq.h> + +#include "vfio_platform_private.h" + +#define DRIVER_VERSION "0.8" +#define DRIVER_AUTHOR "Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>" +#define DRIVER_DESC "VFIO for platform devices - User Level meta-driver" + +/* probing devices from the linux platform bus */ + +static struct resource *get_platform_resource(struct vfio_platform_device *vdev, + int num) +{ + struct platform_device *dev = (struct platform_device *) vdev->opaque; + int i; + + for (i = 0; i < dev->num_resources; i++) { + struct resource *r = &dev->resource[i]; + + if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) { + num--; + + if (!num) + return r; + } + } + return NULL; +} + +static int get_platform_irq(struct vfio_platform_device *vdev, int i) +{ + struct platform_device *pdev = (struct platform_device *) vdev->opaque; + + return platform_get_irq(pdev, i); +} + + +static int vfio_platform_probe(struct platform_device *pdev) +{ + struct vfio_platform_device *vdev; + int ret; + + vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); + if (!vdev) + return -ENOMEM; + + vdev->opaque = (void *) pdev; + vdev->name = pdev->name; + vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; + vdev->get_resource = get_platform_resource; + vdev->get_irq = get_platform_irq; + + ret = vfio_platform_probe_common(vdev, &pdev->dev); + if (ret) + kfree(vdev); + + return ret; +} + +static int vfio_platform_remove(struct platform_device *pdev) +{ + return vfio_platform_remove_common(&pdev->dev); +} + +static struct platform_driver vfio_platform_driver = { + .probe = vfio_platform_probe, + .remove = vfio_platform_remove, + .driver = { + .name = "vfio-platform", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(vfio_platform_driver); + +MODULE_VERSION(DRIVER_VERSION); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 111b5e8..aca6d3e 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -158,6 +158,7 @@ struct vfio_device_info { __u32 flags; #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ +#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ __u32 num_regions; /* Max region index + 1 */ __u32 num_irqs; /* Max IRQ index + 1 */ }; -- 2.1.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
[parent not found: <1413205825-6370-3-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>]
* Re: [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus [not found] ` <1413205825-6370-3-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> @ 2014-10-21 16:17 ` Alex Williamson [not found] ` <1413908269.4202.135.camel-85EaTFmN5p//9pzu0YdTqQ@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Alex Williamson @ 2014-10-21 16:17 UTC (permalink / raw) To: Antonios Motakis Cc: open list:VFIO DRIVER, eric.auger-QSEj5FYQhm4dnm+yROfE0A, marc.zyngier-5wv7dgnIgG8, open list:ABI/API, will.deacon-5wv7dgnIgG8, open list, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, tech-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J, kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg, christoffer.dall-QSEj5FYQhm4dnm+yROfE0A On Mon, 2014-10-13 at 15:10 +0200, Antonios Motakis wrote: > Driver to bind to Linux platform devices, and callbacks to discover their > resources to be used by the main VFIO PLATFORM code. > > Signed-off-by: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> > --- > drivers/vfio/platform/vfio_platform.c | 107 ++++++++++++++++++++++++++++++++++ > include/uapi/linux/vfio.h | 1 + > 2 files changed, 108 insertions(+) > create mode 100644 drivers/vfio/platform/vfio_platform.c > > diff --git a/drivers/vfio/platform/vfio_platform.c b/drivers/vfio/platform/vfio_platform.c > new file mode 100644 > index 0000000..baeb7da > --- /dev/null > +++ b/drivers/vfio/platform/vfio_platform.c > @@ -0,0 +1,107 @@ > +/* > + * Copyright (C) 2013 - Virtual Open Systems > + * Author: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> > + * > + * 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/eventfd.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> > +#include <linux/platform_device.h> > +#include <linux/irq.h> > + > +#include "vfio_platform_private.h" > + > +#define DRIVER_VERSION "0.8" > +#define DRIVER_AUTHOR "Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>" > +#define DRIVER_DESC "VFIO for platform devices - User Level meta-driver" > + > +/* probing devices from the linux platform bus */ > + > +static struct resource *get_platform_resource(struct vfio_platform_device *vdev, > + int num) > +{ > + struct platform_device *dev = (struct platform_device *) vdev->opaque; > + int i; > + > + for (i = 0; i < dev->num_resources; i++) { > + struct resource *r = &dev->resource[i]; > + > + if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) { > + num--; > + > + if (!num) > + return r; Has this been tested? What happens when we call this with num = 0? > + } > + } > + return NULL; > +} > + > +static int get_platform_irq(struct vfio_platform_device *vdev, int i) > +{ > + struct platform_device *pdev = (struct platform_device *) vdev->opaque; > + > + return platform_get_irq(pdev, i); > +} > + > + > +static int vfio_platform_probe(struct platform_device *pdev) > +{ > + struct vfio_platform_device *vdev; > + int ret; > + > + vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); > + if (!vdev) > + return -ENOMEM; > + > + vdev->opaque = (void *) pdev; > + vdev->name = pdev->name; > + vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; > + vdev->get_resource = get_platform_resource; > + vdev->get_irq = get_platform_irq; > + > + ret = vfio_platform_probe_common(vdev, &pdev->dev); > + if (ret) > + kfree(vdev); > + > + return ret; > +} > + > +static int vfio_platform_remove(struct platform_device *pdev) > +{ > + return vfio_platform_remove_common(&pdev->dev); > +} > + > +static struct platform_driver vfio_platform_driver = { > + .probe = vfio_platform_probe, > + .remove = vfio_platform_remove, > + .driver = { > + .name = "vfio-platform", > + .owner = THIS_MODULE, > + }, > +}; > + > +module_platform_driver(vfio_platform_driver); > + > +MODULE_VERSION(DRIVER_VERSION); > +MODULE_LICENSE("GPL v2"); > +MODULE_AUTHOR(DRIVER_AUTHOR); > +MODULE_DESCRIPTION(DRIVER_DESC); > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > index 111b5e8..aca6d3e 100644 > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -158,6 +158,7 @@ struct vfio_device_info { > __u32 flags; > #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ > #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ > +#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ > __u32 num_regions; /* Max region index + 1 */ > __u32 num_irqs; /* Max IRQ index + 1 */ > }; ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <1413908269.4202.135.camel-85EaTFmN5p//9pzu0YdTqQ@public.gmane.org>]
* Re: [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus [not found] ` <1413908269.4202.135.camel-85EaTFmN5p//9pzu0YdTqQ@public.gmane.org> @ 2014-10-21 16:37 ` Eric Auger [not found] ` <54468BDA.6050606-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Eric Auger @ 2014-10-21 16:37 UTC (permalink / raw) To: Alex Williamson, Antonios Motakis Cc: VFIO DRIVER, marc.zyngier-5wv7dgnIgG8, ABI/API, will.deacon-5wv7dgnIgG8, open list, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, tech-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J, kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg, christoffer.dall-QSEj5FYQhm4dnm+yROfE0A On 10/21/2014 06:17 PM, Alex Williamson wrote: > On Mon, 2014-10-13 at 15:10 +0200, Antonios Motakis wrote: >> Driver to bind to Linux platform devices, and callbacks to discover their >> resources to be used by the main VFIO PLATFORM code. >> >> Signed-off-by: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> >> --- >> drivers/vfio/platform/vfio_platform.c | 107 ++++++++++++++++++++++++++++++++++ >> include/uapi/linux/vfio.h | 1 + >> 2 files changed, 108 insertions(+) >> create mode 100644 drivers/vfio/platform/vfio_platform.c >> >> diff --git a/drivers/vfio/platform/vfio_platform.c b/drivers/vfio/platform/vfio_platform.c >> new file mode 100644 >> index 0000000..baeb7da >> --- /dev/null >> +++ b/drivers/vfio/platform/vfio_platform.c >> @@ -0,0 +1,107 @@ >> +/* >> + * Copyright (C) 2013 - Virtual Open Systems >> + * Author: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> >> + * >> + * 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/eventfd.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> >> +#include <linux/platform_device.h> >> +#include <linux/irq.h> >> + >> +#include "vfio_platform_private.h" >> + >> +#define DRIVER_VERSION "0.8" >> +#define DRIVER_AUTHOR "Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>" >> +#define DRIVER_DESC "VFIO for platform devices - User Level meta-driver" >> + >> +/* probing devices from the linux platform bus */ >> + >> +static struct resource *get_platform_resource(struct vfio_platform_device *vdev, >> + int num) >> +{ >> + struct platform_device *dev = (struct platform_device *) vdev->opaque; >> + int i; >> + >> + for (i = 0; i < dev->num_resources; i++) { >> + struct resource *r = &dev->resource[i]; >> + >> + if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) { >> + num--; >> + >> + if (!num) >> + return r; > > Has this been tested? What happens when we call this with num = 0? Yep. I confirm I enter that case with my xgmac where the IORESOURCE_MEM is the 1st resource. I Just ended to the same cause ;-) Best Regards Eric > >> + } >> + } >> + return NULL; >> +} >> + >> +static int get_platform_irq(struct vfio_platform_device *vdev, int i) >> +{ >> + struct platform_device *pdev = (struct platform_device *) vdev->opaque; >> + >> + return platform_get_irq(pdev, i); >> +} >> + >> + >> +static int vfio_platform_probe(struct platform_device *pdev) >> +{ >> + struct vfio_platform_device *vdev; >> + int ret; >> + >> + vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); >> + if (!vdev) >> + return -ENOMEM; >> + >> + vdev->opaque = (void *) pdev; >> + vdev->name = pdev->name; >> + vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; >> + vdev->get_resource = get_platform_resource; >> + vdev->get_irq = get_platform_irq; >> + >> + ret = vfio_platform_probe_common(vdev, &pdev->dev); >> + if (ret) >> + kfree(vdev); >> + >> + return ret; >> +} >> + >> +static int vfio_platform_remove(struct platform_device *pdev) >> +{ >> + return vfio_platform_remove_common(&pdev->dev); >> +} >> + >> +static struct platform_driver vfio_platform_driver = { >> + .probe = vfio_platform_probe, >> + .remove = vfio_platform_remove, >> + .driver = { >> + .name = "vfio-platform", >> + .owner = THIS_MODULE, >> + }, >> +}; >> + >> +module_platform_driver(vfio_platform_driver); >> + >> +MODULE_VERSION(DRIVER_VERSION); >> +MODULE_LICENSE("GPL v2"); >> +MODULE_AUTHOR(DRIVER_AUTHOR); >> +MODULE_DESCRIPTION(DRIVER_DESC); >> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h >> index 111b5e8..aca6d3e 100644 >> --- a/include/uapi/linux/vfio.h >> +++ b/include/uapi/linux/vfio.h >> @@ -158,6 +158,7 @@ struct vfio_device_info { >> __u32 flags; >> #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ >> #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ >> +#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ >> __u32 num_regions; /* Max region index + 1 */ >> __u32 num_irqs; /* Max IRQ index + 1 */ >> }; > > > ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <54468BDA.6050606-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus [not found] ` <54468BDA.6050606-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2014-10-22 13:53 ` Antonios Motakis 0 siblings, 0 replies; 5+ messages in thread From: Antonios Motakis @ 2014-10-22 13:53 UTC (permalink / raw) To: Eric Auger Cc: Alex Williamson, kvm-arm, Linux IOMMU, Will Deacon, VirtualOpenSystems Technical Team, Christoffer Dall, Kim Phillips, Marc Zyngier, open list, open list:VFIO DRIVER <kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, open list:ABI/API On Tue, Oct 21, 2014 at 6:37 PM, Eric Auger <eric.auger-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote: > On 10/21/2014 06:17 PM, Alex Williamson wrote: >> On Mon, 2014-10-13 at 15:10 +0200, Antonios Motakis wrote: >>> Driver to bind to Linux platform devices, and callbacks to discover their >>> resources to be used by the main VFIO PLATFORM code. >>> >>> Signed-off-by: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> >>> --- >>> drivers/vfio/platform/vfio_platform.c | 107 ++++++++++++++++++++++++++++++++++ >>> include/uapi/linux/vfio.h | 1 + >>> 2 files changed, 108 insertions(+) >>> create mode 100644 drivers/vfio/platform/vfio_platform.c >>> >>> diff --git a/drivers/vfio/platform/vfio_platform.c b/drivers/vfio/platform/vfio_platform.c >>> new file mode 100644 >>> index 0000000..baeb7da >>> --- /dev/null >>> +++ b/drivers/vfio/platform/vfio_platform.c >>> @@ -0,0 +1,107 @@ >>> +/* >>> + * Copyright (C) 2013 - Virtual Open Systems >>> + * Author: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> >>> + * >>> + * 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/eventfd.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> >>> +#include <linux/platform_device.h> >>> +#include <linux/irq.h> >>> + >>> +#include "vfio_platform_private.h" >>> + >>> +#define DRIVER_VERSION "0.8" >>> +#define DRIVER_AUTHOR "Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>" >>> +#define DRIVER_DESC "VFIO for platform devices - User Level meta-driver" >>> + >>> +/* probing devices from the linux platform bus */ >>> + >>> +static struct resource *get_platform_resource(struct vfio_platform_device *vdev, >>> + int num) >>> +{ >>> + struct platform_device *dev = (struct platform_device *) vdev->opaque; >>> + int i; >>> + >>> + for (i = 0; i < dev->num_resources; i++) { >>> + struct resource *r = &dev->resource[i]; >>> + >>> + if (resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) { >>> + num--; >>> + >>> + if (!num) >>> + return r; >> >> Has this been tested? What happens when we call this with num = 0? > Yep. I confirm I enter that case with my xgmac where the IORESOURCE_MEM > is the 1st resource. I Just ended to the same cause ;-) Right, num-- should be after the check, or we miss one region. > > Best Regards > > Eric >> >>> + } >>> + } >>> + return NULL; >>> +} >>> + >>> +static int get_platform_irq(struct vfio_platform_device *vdev, int i) >>> +{ >>> + struct platform_device *pdev = (struct platform_device *) vdev->opaque; >>> + >>> + return platform_get_irq(pdev, i); >>> +} >>> + >>> + >>> +static int vfio_platform_probe(struct platform_device *pdev) >>> +{ >>> + struct vfio_platform_device *vdev; >>> + int ret; >>> + >>> + vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); >>> + if (!vdev) >>> + return -ENOMEM; >>> + >>> + vdev->opaque = (void *) pdev; >>> + vdev->name = pdev->name; >>> + vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; >>> + vdev->get_resource = get_platform_resource; >>> + vdev->get_irq = get_platform_irq; >>> + >>> + ret = vfio_platform_probe_common(vdev, &pdev->dev); >>> + if (ret) >>> + kfree(vdev); >>> + >>> + return ret; >>> +} >>> + >>> +static int vfio_platform_remove(struct platform_device *pdev) >>> +{ >>> + return vfio_platform_remove_common(&pdev->dev); >>> +} >>> + >>> +static struct platform_driver vfio_platform_driver = { >>> + .probe = vfio_platform_probe, >>> + .remove = vfio_platform_remove, >>> + .driver = { >>> + .name = "vfio-platform", >>> + .owner = THIS_MODULE, >>> + }, >>> +}; >>> + >>> +module_platform_driver(vfio_platform_driver); >>> + >>> +MODULE_VERSION(DRIVER_VERSION); >>> +MODULE_LICENSE("GPL v2"); >>> +MODULE_AUTHOR(DRIVER_AUTHOR); >>> +MODULE_DESCRIPTION(DRIVER_DESC); >>> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h >>> index 111b5e8..aca6d3e 100644 >>> --- a/include/uapi/linux/vfio.h >>> +++ b/include/uapi/linux/vfio.h >>> @@ -158,6 +158,7 @@ struct vfio_device_info { >>> __u32 flags; >>> #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ >>> #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ >>> +#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ >>> __u32 num_regions; /* Max region index + 1 */ >>> __u32 num_irqs; /* Max IRQ index + 1 */ >>> }; >> >> >> > -- Antonios Motakis Virtual Open Systems ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v8 04/18] vfio: amba: VFIO support for AMBA devices [not found] ` <1413205825-6370-1-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> 2014-10-13 13:10 ` [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus Antonios Motakis @ 2014-10-13 13:10 ` Antonios Motakis 1 sibling, 0 replies; 5+ messages in thread From: Antonios Motakis @ 2014-10-13 13:10 UTC (permalink / raw) To: kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, alex.williamson-H+wXaHxf7aLQT0dZR+AlfA Cc: open list:VFIO DRIVER, eric.auger-QSEj5FYQhm4dnm+yROfE0A, marc.zyngier-5wv7dgnIgG8, open list:ABI/API, will.deacon-5wv7dgnIgG8, open list, Antonios Motakis, tech-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J, christoffer.dall-QSEj5FYQhm4dnm+yROfE0A Add support for discovering AMBA devices with VFIO and handle them similarly to Linux platform devices. Signed-off-by: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> --- drivers/vfio/platform/vfio_amba.c | 108 ++++++++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 1 + 2 files changed, 109 insertions(+) create mode 100644 drivers/vfio/platform/vfio_amba.c diff --git a/drivers/vfio/platform/vfio_amba.c b/drivers/vfio/platform/vfio_amba.c new file mode 100644 index 0000000..b16a40d --- /dev/null +++ b/drivers/vfio/platform/vfio_amba.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2013 - Virtual Open Systems + * Author: Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> + * + * 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> +#include <linux/irq.h> +#include <linux/amba/bus.h> + +#include "vfio_platform_private.h" + +#define DRIVER_VERSION "0.8" +#define DRIVER_AUTHOR "Antonios Motakis <a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org>" +#define DRIVER_DESC "VFIO for AMBA devices - User Level meta-driver" + +/* probing devices from the AMBA bus */ + +static struct resource *get_amba_resource(struct vfio_platform_device *vdev, + int i) +{ + struct amba_device *adev = (struct amba_device *) vdev->opaque; + + if (i == 0) + return &adev->res; + + return NULL; +} + +static int get_amba_irq(struct vfio_platform_device *vdev, int i) +{ + struct amba_device *adev = (struct amba_device *) vdev->opaque; + + if (i < AMBA_NR_IRQS) + return adev->irq[i]; + + return 0; +} + +static int vfio_amba_probe(struct amba_device *adev, const struct amba_id *id) +{ + + struct vfio_platform_device *vdev; + int ret; + + vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); + if (!vdev) + return -ENOMEM; + + vdev->opaque = (void *) adev; + vdev->name = "vfio-amba-dev"; + vdev->flags = VFIO_DEVICE_FLAGS_AMBA; + vdev->get_resource = get_amba_resource; + vdev->get_irq = get_amba_irq; + + ret = vfio_platform_probe_common(vdev, &adev->dev); + if (ret) + kfree(vdev); + + return ret; +} + +static int vfio_amba_remove(struct amba_device *adev) +{ + return vfio_platform_remove_common(&adev->dev); +} + +static struct amba_id pl330_ids[] = { + { 0, 0 }, +}; + +MODULE_DEVICE_TABLE(amba, pl330_ids); + +static struct amba_driver vfio_amba_driver = { + .probe = vfio_amba_probe, + .remove = vfio_amba_remove, + .id_table = pl330_ids, + .drv = { + .name = "vfio-amba", + .owner = THIS_MODULE, + }, +}; + +module_amba_driver(vfio_amba_driver); + +MODULE_VERSION(DRIVER_VERSION); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index aca6d3e..1a5986c 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -159,6 +159,7 @@ struct vfio_device_info { #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ +#define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ __u32 num_regions; /* Max region index + 1 */ __u32 num_irqs; /* Max IRQ index + 1 */ }; -- 2.1.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-10-22 13:53 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1413205825-6370-1-git-send-email-a.motakis@virtualopensystems.com> [not found] ` <1413205825-6370-1-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> 2014-10-13 13:10 ` [PATCH v8 02/18] vfio: platform: probe to devices on the platform bus Antonios Motakis [not found] ` <1413205825-6370-3-git-send-email-a.motakis-lrHrjnjw1UfHK3s98zE1ajGjJy/sRE9J@public.gmane.org> 2014-10-21 16:17 ` Alex Williamson [not found] ` <1413908269.4202.135.camel-85EaTFmN5p//9pzu0YdTqQ@public.gmane.org> 2014-10-21 16:37 ` Eric Auger [not found] ` <54468BDA.6050606-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-10-22 13:53 ` Antonios Motakis 2014-10-13 13:10 ` [PATCH v8 04/18] vfio: amba: VFIO support for AMBA devices Antonios Motakis
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).