[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [Xen-devel] [PATCH 5 of 7] IOMMU VTD BUG: disable Extended Interrupt Mode when disabling Interupt Remapping
> + /* If we are disabling Interrupt Remapping, make sure we dont stay in > + * Extended Interrupt Mode, as this is unaffected by the Interrupt > + * Remapping flag in each DMAR Global Control Register. > + * Specifically, local apics in xapic mode do not like interrupts > delivered > + * in x2apic mode. Any code turning interrupt remapping back on will set > + * EIME back correctly. > + */ > + if ( iommu_supports_eim() ) > + { > + u64 irta; > + irta = dmar_readl(iommu->reg, DMAR_IRTA_REG); > + dmar_writel(iommu->reg, DMAR_IRTA_REG, irta & ~IRTA_EIME); > + IOMMU_WAIT_OP(iommu, DMAR_IRTA_REG, dmar_readl, > + !(irta & IRTA_EIME), irta); > + } > + > spin_lock_irqsave(&iommu->register_lock, flags); > sts = dmar_readl(iommu->reg, DMAR_GSTS_REG); > if ( !(sts & DMA_GSTS_IRES) ) This new code should go after spin_lock_irqsave() call. You should also model your code after existing code that disables interrupt remapping in the same function, by checking whether EIME is enabled after the read before proceed to disable it. It's good to keep the software consistent in case we encounter any hardware bugs in the future. > #define IEC_GLOBAL_INVL 0 > #define IEC_INDEX_INVL 1 > -#define IRTA_REG_EIME_SHIFT 11 > +#define IRTA_EIME (1 << 11) Cast with u64 as follow like other defines in iommu.h. #define IRTA_EIME (((u64)1) << 11) Allen _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |