From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40142) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bq0Oo-0000zM-T8 for qemu-devel@nongnu.org; Fri, 30 Sep 2016 12:10:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bq0Om-0001S8-Pg for qemu-devel@nongnu.org; Fri, 30 Sep 2016 12:10:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35026) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bq0Om-0001Rs-Fp for qemu-devel@nongnu.org; Fri, 30 Sep 2016 12:10:56 -0400 From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Date: Fri, 30 Sep 2016 18:10:10 +0200 Message-Id: <20160930161013.9832-6-rkrcmar@redhat.com> In-Reply-To: <20160930161013.9832-1-rkrcmar@redhat.com> References: <20160930161013.9832-1-rkrcmar@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v3 5/8] intel_iommu: add OnOffAuto intr_eim as "eim" property List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Xu , Igor Mammedov , Paolo Bonzini , Richard Henderson , Eduardo Habkost , "Michael S. Tsirkin" The default (auto) emulates the current behavior. Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 --- 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 =3D { =20 static Property vtd_properties[] =3D { 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(), }; =20 @@ -2368,7 +2370,11 @@ static void vtd_init(IntelIOMMUState *s) s->ecap =3D VTD_ECAP_QI | VTD_ECAP_IRO; =20 if (x86_iommu->intr_supported) { - s->ecap |=3D VTD_ECAP_IR | VTD_ECAP_EIM | VTD_ECAP_MHMV; + s->ecap |=3D VTD_ECAP_IR | VTD_ECAP_MHMV; + if (s->intr_eim =3D=3D ON_OFF_AUTO_ON) { + s->ecap |=3D VTD_ECAP_EIM; + } + assert(s->intr_eim !=3D ON_OFF_AUTO_AUTO); } =20 vtd_reset_context_cache(s); @@ -2449,8 +2455,10 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bu= s, void *opaque, int devfn) return &vtd_as->as; } =20 -static bool vtd_check_config(X86IOMMUState *x86_iommu, Error **errp) +static bool vtd_decide_config(IntelIOMMUState *s, Error **errp) { + X86IOMMUState *x86_iommu =3D X86_IOMMU_DEVICE(s); + /* Currently Intel IOMMU IR only support "kernel-irqchip=3D{off|spli= t}" */ if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() && !kvm_irqchip_is_split()) { @@ -2458,6 +2466,16 @@ static bool vtd_check_config(X86IOMMUState *x86_io= mmu, Error **errp) "kernel-irqchip=3Don, please use 'split|off'.")= ; return false; } + if (s->intr_eim =3D=3D ON_OFF_AUTO_ON && !x86_iommu->intr_supported)= { + error_setg(errp, "eim=3Don cannot be selected without intremap=3D= on"); + return false; + } + + if (s->intr_eim =3D=3D ON_OFF_AUTO_AUTO) { + s->intr_eim =3D x86_iommu->intr_supported ? + ON_OFF_AUTO_ON : ON_OFF_AU= TO_OFF; + } + return true; } =20 @@ -2471,7 +2489,7 @@ static void vtd_realize(DeviceState *dev, Error **e= rrp) VTD_DPRINTF(GENERAL, ""); x86_iommu->type =3D TYPE_INTEL; =20 - if (!vtd_check_config(x86_iommu, errp)) { + if (!vtd_decide_config(s, errp)) { return; } =20 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 */ }; =20 /* Find the VTD Address space associated with the given bus pointer, --=20 2.10.0