Message ID | 20160930161013.9832-6-rkrcmar@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 30 Sep 2016 18:10:10 +0200 Radim Krčmář <rkrcmar@redhat.com> wrote: > The default (auto) emulates the current behavior. > > Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > v3: > * use error_setg [Paolo] > * shorten the code [Peter] > --- > hw/i386/intel_iommu.c | 24 +++++++++++++++++++++--- > include/hw/i386/intel_iommu.h | 1 + > 2 files changed, 22 insertions(+), 3 deletions(-) > > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index 5b06b4091f36..17892b8c336b 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -2012,6 +2012,8 @@ static const MemoryRegionOps vtd_mem_ops = { > > static Property vtd_properties[] = { > DEFINE_PROP_UINT32("version", IntelIOMMUState, version, 0), > + DEFINE_PROP_ON_OFF_AUTO("eim", IntelIOMMUState, intr_eim, > + ON_OFF_AUTO_AUTO), > DEFINE_PROP_END_OF_LIST(), > }; > > @@ -2368,7 +2370,11 @@ static void vtd_init(IntelIOMMUState *s) > s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO; > > if (x86_iommu->intr_supported) { > - s->ecap |= VTD_ECAP_IR | VTD_ECAP_EIM | VTD_ECAP_MHMV; > + s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV; > + if (s->intr_eim == ON_OFF_AUTO_ON) { > + s->ecap |= VTD_ECAP_EIM; > + } > + assert(s->intr_eim != ON_OFF_AUTO_AUTO); > } > > vtd_reset_context_cache(s); > @@ -2449,8 +2455,10 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, void *opaque, int devfn) > return &vtd_as->as; > } > > -static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp) > +static bool vtd_decide_config(IntelIOMMUState *s, Error **errp) > { > + X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s); > + > /* Currently Intel IOMMU IR only support "kernel-irqchip={off|split}" */ > if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() && > !kvm_irqchip_is_split()) { > @@ -2458,6 +2466,16 @@ static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp) > "kernel-irqchip=on, please use 'split|off'."); > return false; > } > + if (s->intr_eim == ON_OFF_AUTO_ON && !x86_iommu->intr_supported) { > + error_setg(errp, "eim=on cannot be selected without intremap=on"); > + return false; > + } > + > + if (s->intr_eim == ON_OFF_AUTO_AUTO) { > + s->intr_eim = x86_iommu->intr_supported ? > + ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; > + } > + > return true; > } > > @@ -2471,7 +2489,7 @@ static void vtd_realize(DeviceState *dev, Error **errp) > VTD_DPRINTF(GENERAL, ""); > x86_iommu->type = TYPE_INTEL; > > - if (!vtd_check_config(x86_iommu, errp)) { > + if (!vtd_decide_config(s, errp)) { > return; > } > > diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h > index a42dbd745a70..b5ac60927b1f 100644 > --- a/include/hw/i386/intel_iommu.h > +++ b/include/hw/i386/intel_iommu.h > @@ -289,6 +289,7 @@ struct IntelIOMMUState { > dma_addr_t intr_root; /* Interrupt remapping table pointer */ > uint32_t intr_size; /* Number of IR table entries */ > bool intr_eime; /* Extended interrupt mode enabled */ > + OnOffAuto intr_eim; /* Toggle for EIM cabability */ > }; > > /* Find the VTD Address space associated with the given bus pointer,
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 5b06b4091f36..17892b8c336b 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2012,6 +2012,8 @@ static const MemoryRegionOps vtd_mem_ops = { static Property vtd_properties[] = { DEFINE_PROP_UINT32("version", IntelIOMMUState, version, 0), + DEFINE_PROP_ON_OFF_AUTO("eim", IntelIOMMUState, intr_eim, + ON_OFF_AUTO_AUTO), DEFINE_PROP_END_OF_LIST(), }; @@ -2368,7 +2370,11 @@ static void vtd_init(IntelIOMMUState *s) s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO; if (x86_iommu->intr_supported) { - s->ecap |= VTD_ECAP_IR | VTD_ECAP_EIM | VTD_ECAP_MHMV; + s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV; + if (s->intr_eim == ON_OFF_AUTO_ON) { + s->ecap |= VTD_ECAP_EIM; + } + assert(s->intr_eim != ON_OFF_AUTO_AUTO); } vtd_reset_context_cache(s); @@ -2449,8 +2455,10 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, void *opaque, int devfn) return &vtd_as->as; } -static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp) +static bool vtd_decide_config(IntelIOMMUState *s, Error **errp) { + X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s); + /* Currently Intel IOMMU IR only support "kernel-irqchip={off|split}" */ if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() && !kvm_irqchip_is_split()) { @@ -2458,6 +2466,16 @@ static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp) "kernel-irqchip=on, please use 'split|off'."); return false; } + if (s->intr_eim == ON_OFF_AUTO_ON && !x86_iommu->intr_supported) { + error_setg(errp, "eim=on cannot be selected without intremap=on"); + return false; + } + + if (s->intr_eim == ON_OFF_AUTO_AUTO) { + s->intr_eim = x86_iommu->intr_supported ? + ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; + } + return true; } @@ -2471,7 +2489,7 @@ static void vtd_realize(DeviceState *dev, Error **errp) VTD_DPRINTF(GENERAL, ""); x86_iommu->type = TYPE_INTEL; - if (!vtd_check_config(x86_iommu, errp)) { + if (!vtd_decide_config(s, errp)) { return; } diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index a42dbd745a70..b5ac60927b1f 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -289,6 +289,7 @@ struct IntelIOMMUState { dma_addr_t intr_root; /* Interrupt remapping table pointer */ uint32_t intr_size; /* Number of IR table entries */ bool intr_eime; /* Extended interrupt mode enabled */ + OnOffAuto intr_eim; /* Toggle for EIM cabability */ }; /* Find the VTD Address space associated with the given bus pointer,
The default (auto) emulates the current behavior. Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> --- v3: * use error_setg [Paolo] * shorten the code [Peter] --- hw/i386/intel_iommu.c | 24 +++++++++++++++++++++--- include/hw/i386/intel_iommu.h | 1 + 2 files changed, 22 insertions(+), 3 deletions(-)