mirror of https://github.com/xqemu/xqemu.git
intel_iommu: redo configuraton check in realize
* there no point in configuring the device if realization is going to fail, so move the check to the beginning, * create a separate function for the check, * use error_setg() instead error_report(). Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
329460191d
commit
6333e93c77
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "intel_iommu_internal.h"
|
#include "intel_iommu_internal.h"
|
||||||
|
@ -2460,6 +2461,18 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||||
return &vtd_as->as;
|
return &vtd_as->as;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp)
|
||||||
|
{
|
||||||
|
/* Currently Intel IOMMU IR only support "kernel-irqchip={off|split}" */
|
||||||
|
if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() &&
|
||||||
|
!kvm_irqchip_is_split()) {
|
||||||
|
error_setg(errp, "Intel Interrupt Remapping cannot work with "
|
||||||
|
"kernel-irqchip=on, please use 'split|off'.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void vtd_realize(DeviceState *dev, Error **errp)
|
static void vtd_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
|
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
|
||||||
|
@ -2469,6 +2482,11 @@ static void vtd_realize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
VTD_DPRINTF(GENERAL, "");
|
VTD_DPRINTF(GENERAL, "");
|
||||||
x86_iommu->type = TYPE_INTEL;
|
x86_iommu->type = TYPE_INTEL;
|
||||||
|
|
||||||
|
if (!vtd_check_config(x86_iommu, errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
|
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
|
||||||
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
|
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
|
||||||
"intel_iommu", DMAR_REG_SIZE);
|
"intel_iommu", DMAR_REG_SIZE);
|
||||||
|
@ -2483,14 +2501,6 @@ static void vtd_realize(DeviceState *dev, Error **errp)
|
||||||
pci_setup_iommu(bus, vtd_host_dma_iommu, dev);
|
pci_setup_iommu(bus, vtd_host_dma_iommu, dev);
|
||||||
/* Pseudo address space under root PCI bus. */
|
/* Pseudo address space under root PCI bus. */
|
||||||
pcms->ioapic_as = vtd_host_dma_iommu(bus, s, Q35_PSEUDO_DEVFN_IOAPIC);
|
pcms->ioapic_as = vtd_host_dma_iommu(bus, s, Q35_PSEUDO_DEVFN_IOAPIC);
|
||||||
|
|
||||||
/* Currently Intel IOMMU IR only support "kernel-irqchip={off|split}" */
|
|
||||||
if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() &&
|
|
||||||
!kvm_irqchip_is_split()) {
|
|
||||||
error_report("Intel Interrupt Remapping cannot work with "
|
|
||||||
"kernel-irqchip=on, please use 'split|off'.");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vtd_class_init(ObjectClass *klass, void *data)
|
static void vtd_class_init(ObjectClass *klass, void *data)
|
||||||
|
|
Loading…
Reference in New Issue