From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47758) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y1BYX-0007Me-QI for qemu-devel@nongnu.org; Wed, 17 Dec 2014 05:10:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y1BYR-0006gH-8F for qemu-devel@nongnu.org; Wed, 17 Dec 2014 05:10:09 -0500 Received: from mail-wi0-f176.google.com ([209.85.212.176]:58212) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y1BYQ-0006ew-Vv for qemu-devel@nongnu.org; Wed, 17 Dec 2014 05:10:03 -0500 Received: by mail-wi0-f176.google.com with SMTP id ex7so15085838wid.9 for ; Wed, 17 Dec 2014 02:10:02 -0800 (PST) From: Baptiste Reynal Date: Wed, 17 Dec 2014 11:09:41 +0100 Message-Id: <1418810981-9193-4-git-send-email-b.reynal@virtualopensystems.com> In-Reply-To: <1418810981-9193-1-git-send-email-b.reynal@virtualopensystems.com> References: <1418810981-9193-1-git-send-email-b.reynal@virtualopensystems.com> Subject: [Qemu-devel] [RFC PATCH 3/3] hw/vfio: add pl330 device support List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kvmarm@lists.cs.columbia.edu, qemu-devel@nongnu.org, eric.auger@linaro.org Cc: a.motakis@virtualopensystems.com, Alex Williamson , tech@virtualopensystems.com, Baptiste Reynal , Peter Maydell Create a meta-device for PL330 DMA. Signed-off-by: Baptiste Reynal --- hw/arm/sysbus-fdt.c | 2 ++ hw/vfio/Makefile.objs | 1 + hw/vfio/pl330.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/hw/vfio/vfio-pl330.h | 26 ++++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 hw/vfio/pl330.c create mode 100644 include/hw/vfio/vfio-pl330.h diff --git a/hw/arm/sysbus-fdt.c b/hw/arm/sysbus-fdt.c index 41b4c87..1141185 100644 --- a/hw/arm/sysbus-fdt.c +++ b/hw/arm/sysbus-fdt.c @@ -28,6 +28,7 @@ #include "sysemu/sysemu.h" #include "hw/vfio/vfio-platform.h" #include "hw/vfio/vfio-calxeda-xgmac.h" +#include "hw/vfio/vfio-pl330.h" /* * internal struct that contains the information to create dynamic @@ -163,6 +164,7 @@ fail: /* list of supported dynamic sysbus devices */ static const NodeCreationPair add_fdt_node_functions[] = { {TYPE_VFIO_CALXEDA_XGMAC, add_generic_fdt_node}, +{TYPE_VFIO_PL330, add_generic_fdt_node}, {"", NULL}, /*last element*/ }; diff --git a/hw/vfio/Makefile.objs b/hw/vfio/Makefile.objs index 913ab14..be3023b 100644 --- a/hw/vfio/Makefile.objs +++ b/hw/vfio/Makefile.objs @@ -3,4 +3,5 @@ obj-$(CONFIG_SOFTMMU) += common.o obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_SOFTMMU) += platform.o obj-$(CONFIG_SOFTMMU) += calxeda_xgmac.o +obj-$(CONFIG_SOFTMMU) += pl330.o endif diff --git a/hw/vfio/pl330.c b/hw/vfio/pl330.c new file mode 100644 index 0000000..a409024 --- /dev/null +++ b/hw/vfio/pl330.c @@ -0,0 +1,41 @@ +#include "hw/vfio/vfio-pl330.h" + +static void pl330_realize(DeviceState *dev, Error **errp) +{ + VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev); + VFIOPl330DeviceClass *k = VFIO_PL330_DEVICE_GET_CLASS(dev); + + vdev->compat = g_strdup("arm,pl330;arm,primecell"); + + k->parent_realize(dev, errp); +} + +static const VMStateDescription vfio_platform_vmstate = { + .name = TYPE_VFIO_PL330, + .unmigratable = 1, +}; + +static void vfio_pl330_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VFIOPl330DeviceClass *vpc = + VFIO_PL330_DEVICE_CLASS(klass); + vpc->parent_realize = dc->realize; + dc->realize = pl330_realize; + dc->desc = "VFIO PL330"; +} + +static const TypeInfo vfio_pl330_dev_info = { + .name = TYPE_VFIO_PL330, + .parent = TYPE_VFIO_PLATFORM, + .instance_size = sizeof(VFIOPl330Device), + .class_init = vfio_pl330_class_init, + .class_size = sizeof(VFIOPl330DeviceClass), +}; + +static void register_pl330_dev_type(void) +{ + type_register_static(&vfio_pl330_dev_info); +} + +type_init(register_pl330_dev_type) diff --git a/include/hw/vfio/vfio-pl330.h b/include/hw/vfio/vfio-pl330.h new file mode 100644 index 0000000..1cdf039 --- /dev/null +++ b/include/hw/vfio/vfio-pl330.h @@ -0,0 +1,26 @@ +#ifndef HW_VFIO_VFIO_PL330 +#define HW_VFIO_VFIO_PL330 + +#include "hw/vfio/vfio-platform.h" + +#define TYPE_VFIO_PL330 "vfio-pl330" + +typedef struct VFIOPl330Device { + VFIOPlatformDevice vdev; +} VFIOPl330Device; + +typedef struct VFIOPl330DeviceClass { + VFIOPlatformDeviceClass parent_class; + DeviceRealize parent_realize; +} VFIOPl330DeviceClass; + +#define VFIO_PL330_DEVICE(obj) \ + OBJECT_CHECK(VFIOPl330Device, (obj), TYPE_VFIO_PL330) +#define VFIO_PL330_DEVICE_CLASS(klass) \ + OBJECT_CLASS_CHECK(VFIOPl330DeviceClass, (klass), \ + TYPE_VFIO_PL330) +#define VFIO_PL330_DEVICE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(VFIOPl330DeviceClass, (obj), \ + TYPE_VFIO_PL330) + +#endif -- 2.1.3