[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v7 08/25] x86-iommu: introduce parent class
From: |
David Kiarie |
Subject: |
Re: [Qemu-devel] [PATCH v7 08/25] x86-iommu: introduce parent class |
Date: |
Mon, 23 May 2016 20:06:02 +0300 |
On Tue, May 17, 2016 at 10:15 AM, Peter Xu <address@hidden> 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 <address@hidden>
> ---
> 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 <address@hidden>
> + *
> + * 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 <address@hidden>
> + *
> + * 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
>
- [Qemu-devel] [PATCH v7 00/25] IOMMU: Enable interrupt remapping for Intel IOMMU, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 01/25] acpi: enable INTR for DMAR report structure, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 03/25] intel_iommu: set IR bit for ECAP register, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 02/25] intel_iommu: allow queued invalidation for IR, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 05/25] intel_iommu: define interrupt remap table addr register, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 04/25] acpi: add DMAR scope definition for root IOAPIC, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 06/25] intel_iommu: handle interrupt remap enable, Peter Xu, 2016/05/17
- [Qemu-devel] [PATCH v7 08/25] x86-iommu: introduce parent class, Peter Xu, 2016/05/17
- Re: [Qemu-devel] [PATCH v7 08/25] x86-iommu: introduce parent class,
David Kiarie <=
[Qemu-devel] [PATCH v7 07/25] intel_iommu: define several structs for IOMMU IR, Peter Xu, 2016/05/17