xen-devel
RE: [Xen-devel] [PATCH 5 of 7] IOMMU VTD BUG: disable Extended Interrupt
> + /* 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
|
|
|