Commit 1cf5fd57 authored by Peter Xu's avatar Peter Xu Committed by Michael S. Tsirkin
Browse files

x86-iommu: provide x86_iommu_get_default



Instead of searching the device tree every time, one static variable is
declared for the default system x86 IOMMU device.

Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 04af0e18
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@
#include "hw/i386/ich9.h"
#include "hw/pci/pci_bus.h"
#include "hw/pci-host/q35.h"
#include "hw/i386/intel_iommu.h"
#include "hw/i386/x86-iommu.h"
#include "hw/timer/hpet.h"

#include "hw/acpi/aml-build.h"
@@ -2539,12 +2539,7 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)

static bool acpi_has_iommu(void)
{
    bool ambiguous;
    Object *intel_iommu;

    intel_iommu = object_resolve_path_type("", TYPE_INTEL_IOMMU_DEVICE,
                                           &ambiguous);
    return intel_iommu && !ambiguous;
    return !!x86_iommu_get_default();
}

static
+23 −0
Original line number Diff line number Diff line
@@ -21,6 +21,28 @@
#include "hw/sysbus.h"
#include "hw/boards.h"
#include "hw/i386/x86-iommu.h"
#include "qemu/error-report.h"

/* Default X86 IOMMU device */
static X86IOMMUState *x86_iommu_default = NULL;

static void x86_iommu_set_default(X86IOMMUState *x86_iommu)
{
    assert(x86_iommu);

    if (x86_iommu_default) {
        error_report("QEMU does not support multiple vIOMMUs "
                     "for x86 yet.");
        exit(1);
    }

    x86_iommu_default = x86_iommu;
}

X86IOMMUState *x86_iommu_get_default(void)
{
    return x86_iommu_default;
}

static void x86_iommu_realize(DeviceState *dev, Error **errp)
{
@@ -28,6 +50,7 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
    if (x86_class->realize) {
        x86_class->realize(dev, errp);
    }
    x86_iommu_set_default(X86_IOMMU_DEVICE(dev));
}

static void x86_iommu_class_init(ObjectClass *klass, void *data)
+6 −0
Original line number Diff line number Diff line
@@ -45,4 +45,10 @@ struct X86IOMMUState {
    SysBusDevice busdev;
};

/**
 * x86_iommu_get_default - get default IOMMU device
 * @return: pointer to default IOMMU device
 */
X86IOMMUState *x86_iommu_get_default(void);

#endif