[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [BUG] After upgrade to Xen 4.12.0 iommu=no-igfx
On Tue, Aug 06, 2019 at 02:48:51PM -0700, Roman Shaposhnik wrote: > On Tue, Aug 6, 2019 at 9:18 AM Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote: > > > > On Fri, Aug 02, 2019 at 10:05:40AM +0200, Roger Pau Monné wrote: > > > On Thu, Aug 01, 2019 at 11:25:04AM -0700, Roman Shaposhnik wrote: > > > > This patch completely fixes the problem for me! > > > > > > > > Thanks Roger! I'd love to see this in Xen 4.13 > > > > > > Thanks for testing! > > > > > > It's still not clear to me why the previous approach didn't work, but > > > I think this patch is better because it removes the usage of > > > {set/clear}_identity_p2m_entry from PV domains. I will submit this > > > formally now. > > > > Sorry to bother again, but since we still don't understand why the > > previous fix didn't work for you, and I can't reproduce this with my > > hardware, could you give the attached patch a try? > > No worries -- and thanks for helping to get it over the finish line -- > this is much appreciated! > > I'm happy to say that this latest patch is also working just fine. So > I guess this is the one that's going to land in Xen 4.13? No, not really, sorry this was still a debug patch. So I think the behaviour you are seeing can only be explained if the IOMMU is already enabled by the firmware when booting into Xen, can this be the case? I have a patch I would like you to try to confirm this, can you please give it a spin and report back (ideally with the Xen boot log). Thanks, Roger. ---8<--- diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index fef97c82f6..3605614aaf 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1341,7 +1341,7 @@ int set_identity_p2m_entry(struct domain *d, unsigned long gfn_l, if ( !paging_mode_translate(p2m->domain) ) { - if ( !need_iommu_pt_sync(d) ) + if ( !has_iommu_pt(d) ) return 0; return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l), PAGE_ORDER_4K, IOMMUF_readable | IOMMUF_writable); @@ -1432,7 +1432,7 @@ int clear_identity_p2m_entry(struct domain *d, unsigned long gfn_l) if ( !paging_mode_translate(d) ) { - if ( !need_iommu_pt_sync(d) ) + if ( !has_iommu_pt(d) ) return 0; return iommu_legacy_unmap(d, _dfn(gfn_l), PAGE_ORDER_4K); } diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 5d72270c5b..9dd0ed7f63 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2316,6 +2316,9 @@ static int __init vtd_setup(void) */ for_each_drhd_unit ( drhd ) { + unsigned long flags; + uint32_t val; + iommu = drhd->iommu; printk("Intel VT-d iommu %"PRIu32" supported page sizes: 4kB", @@ -2351,6 +2354,22 @@ static int __init vtd_setup(void) if ( !vtd_ept_page_compatible(iommu) ) iommu_hap_pt_share = 0; + spin_lock_irqsave(&iommu->register_lock, flags); + val = dmar_readl(iommu->reg, DMAR_GSTS_REG); + /* + * TODO: needs to be revisited once Xen supports booting with an + * already enabled IOMMU. + */ + if ( val & DMA_GSTS_TES ) + { + printk(XENLOG_WARNING VTDPREFIX + "IOMMU: DMA remapping already enabled, disabling it\n"); + dmar_writel(iommu->reg, DMAR_GCMD_REG, val & ~DMA_GCMD_TE); + IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, dmar_readl, + !(val & DMA_GSTS_TES), val); + } + spin_unlock_irqrestore(&iommu->register_lock, flags); + ret = iommu_set_interrupt(drhd); if ( ret ) { _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |