mirror of https://github.com/xqemu/xqemu.git
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: Peter Xu <peterx@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
04af0e18bc
commit
1cf5fd573f
|
@ -52,7 +52,7 @@
|
||||||
#include "hw/i386/ich9.h"
|
#include "hw/i386/ich9.h"
|
||||||
#include "hw/pci/pci_bus.h"
|
#include "hw/pci/pci_bus.h"
|
||||||
#include "hw/pci-host/q35.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/timer/hpet.h"
|
||||||
|
|
||||||
#include "hw/acpi/aml-build.h"
|
#include "hw/acpi/aml-build.h"
|
||||||
|
@ -2539,12 +2539,7 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
|
||||||
|
|
||||||
static bool acpi_has_iommu(void)
|
static bool acpi_has_iommu(void)
|
||||||
{
|
{
|
||||||
bool ambiguous;
|
return !!x86_iommu_get_default();
|
||||||
Object *intel_iommu;
|
|
||||||
|
|
||||||
intel_iommu = object_resolve_path_type("", TYPE_INTEL_IOMMU_DEVICE,
|
|
||||||
&ambiguous);
|
|
||||||
return intel_iommu && !ambiguous;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
|
|
@ -21,6 +21,28 @@
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/i386/x86-iommu.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)
|
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) {
|
if (x86_class->realize) {
|
||||||
x86_class->realize(dev, errp);
|
x86_class->realize(dev, errp);
|
||||||
}
|
}
|
||||||
|
x86_iommu_set_default(X86_IOMMU_DEVICE(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x86_iommu_class_init(ObjectClass *klass, void *data)
|
static void x86_iommu_class_init(ObjectClass *klass, void *data)
|
||||||
|
|
|
@ -45,4 +45,10 @@ struct X86IOMMUState {
|
||||||
SysBusDevice busdev;
|
SysBusDevice busdev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* x86_iommu_get_default - get default IOMMU device
|
||||||
|
* @return: pointer to default IOMMU device
|
||||||
|
*/
|
||||||
|
X86IOMMUState *x86_iommu_get_default(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue