On Tue, May 17, 2016 at 10:15 AM, Peter Xu <pet...@redhat.com> wrote: > Introducing parent class for intel-iommu devices named "x86-iommu". This > is preparation work to abstract shared functionalities out from Intel > and AMD IOMMUs. Currently, only the parent class is introduced. It does > nothing yet. > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- > hw/i386/Makefile.objs | 2 +- > hw/i386/intel_iommu.c | 5 ++-- > hw/i386/x86-iommu.c | 53 > +++++++++++++++++++++++++++++++++++++++++++ > include/hw/i386/intel_iommu.h | 3 ++- > include/hw/i386/x86-iommu.h | 46 +++++++++++++++++++++++++++++++++++++ > 5 files changed, 105 insertions(+), 4 deletions(-) > create mode 100644 hw/i386/x86-iommu.c > create mode 100644 include/hw/i386/x86-iommu.h > > diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs > index b52d5b8..90e94ff 100644 > --- a/hw/i386/Makefile.objs > +++ b/hw/i386/Makefile.objs > @@ -2,7 +2,7 @@ obj-$(CONFIG_KVM) += kvm/ > obj-y += multiboot.o > obj-y += pc.o pc_piix.o pc_q35.o > obj-y += pc_sysfw.o > -obj-y += intel_iommu.o > +obj-y += x86-iommu.o intel_iommu.o > obj-$(CONFIG_XEN) += ../xenpv/ xen/ > > obj-y += kvmvapic.o > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index 4d14124..0a70577 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -2120,16 +2120,17 @@ static void vtd_realize(DeviceState *dev, Error > **errp) > static void vtd_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > + X86IOMMUClass *x86_class = X86_IOMMU_CLASS(klass); > > dc->reset = vtd_reset; > - dc->realize = vtd_realize; > dc->vmsd = &vtd_vmstate; > dc->props = vtd_properties; > + x86_class->realize = vtd_realize; > } > > static const TypeInfo vtd_info = { > .name = TYPE_INTEL_IOMMU_DEVICE, > - .parent = TYPE_SYS_BUS_DEVICE, > + .parent = TYPE_X86_IOMMU_DEVICE, > .instance_size = sizeof(IntelIOMMUState), > .class_init = vtd_class_init, > }; > diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c > new file mode 100644 > index 0000000..d739afb > --- /dev/null > +++ b/hw/i386/x86-iommu.c > @@ -0,0 +1,53 @@ > +/* > + * QEMU emulation of common X86 IOMMU > + * > + * Copyright (C) 2016 Peter Xu, Red Hat <pet...@redhat.com> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + > + * 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. > + > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/sysbus.h" > +#include "hw/boards.h" > +#include "hw/i386/x86-iommu.h" > + > +static void x86_iommu_realize(DeviceState *dev, Error **errp) > +{ > + X86IOMMUClass *x86_class = X86_IOMMU_GET_CLASS(dev); > + if (x86_class->realize) { > + x86_class->realize(dev, errp); > + } > +} > + > +static void x86_iommu_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + dc->realize = x86_iommu_realize; > +} > + > +static const TypeInfo x86_iommu_info = { > + .name = TYPE_X86_IOMMU_DEVICE, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(X86IOMMUState), > + .class_init = x86_iommu_class_init, > + .class_size = sizeof(X86IOMMUClass), > + .abstract = true, > +};
As I suspected am having some trouble parenting a PCI device from a Bus device but I will investigate further to see if I can manage something. > + > +static void x86_iommu_register_types(void) > +{ > + type_register_static(&x86_iommu_info); > +} > + > +type_init(x86_iommu_register_types) > diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h > index 4914fe6..c88a931 100644 > --- a/include/hw/i386/intel_iommu.h > +++ b/include/hw/i386/intel_iommu.h > @@ -23,6 +23,7 @@ > #define INTEL_IOMMU_H > #include "hw/qdev.h" > #include "sysemu/dma.h" > +#include "hw/i386/x86-iommu.h" > > #define TYPE_INTEL_IOMMU_DEVICE "intel-iommu" > #define INTEL_IOMMU_DEVICE(obj) \ > @@ -152,7 +153,7 @@ union VTD_IR_MSIAddress { > > /* The iommu (DMAR) device state struct */ > struct IntelIOMMUState { > - SysBusDevice busdev; > + X86IOMMUState x86_iommu; > MemoryRegion csrmem; > uint8_t csr[DMAR_REG_SIZE]; /* register values */ > uint8_t wmask[DMAR_REG_SIZE]; /* R/W bytes */ > diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h > new file mode 100644 > index 0000000..924f39a > --- /dev/null > +++ b/include/hw/i386/x86-iommu.h > @@ -0,0 +1,46 @@ > +/* > + * Common IOMMU interface for X86 platform > + * > + * Copyright (C) 2016 Peter Xu, Red Hat <pet...@redhat.com> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + > + * 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. > + > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, see <http://www.gnu.org/licenses/>. > + */ > + > +#ifndef IOMMU_COMMON_H > +#define IOMMU_COMMON_H > + > +#include "hw/sysbus.h" > + > +#define TYPE_X86_IOMMU_DEVICE ("x86-iommu") > +#define X86_IOMMU_DEVICE(obj) \ > + OBJECT_CHECK(X86IOMMUState, (obj), TYPE_X86_IOMMU_DEVICE) > +#define X86_IOMMU_CLASS(klass) \ > + OBJECT_CLASS_CHECK(X86IOMMUClass, (klass), TYPE_X86_IOMMU_DEVICE) > +#define X86_IOMMU_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(X86IOMMUClass, obj, TYPE_X86_IOMMU_DEVICE) > + > +typedef struct X86IOMMUState X86IOMMUState; > +typedef struct X86IOMMUClass X86IOMMUClass; > + > +struct X86IOMMUClass { > + SysBusDeviceClass parent; > + /* Intel/AMD specific realize() hook */ > + DeviceRealize realize; > +}; > + > +struct X86IOMMUState { > + SysBusDevice busdev; > +}; > + > +#endif > -- > 2.4.11 >