[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging-4.14] vtd: make sure QI/IR are disabled before initialisation
commit 57ced58d26b2131e61b0b1b7c22de1e8ff712861 Author: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx> AuthorDate: Thu Mar 18 15:02:15 2021 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Mar 18 15:02:15 2021 +0100 vtd: make sure QI/IR are disabled before initialisation BIOS might pass control to Xen leaving QI and/or IR in enabled and/or partially configured state. In case of x2APIC code path where EIM is enabled early in boot - those are correctly disabled by Xen before any attempt to configure. But for xAPIC that step is missing which was proven to cause QI initialization failures on some ICX based platforms where QI is left pre-enabled and partially configured by BIOS. That problem becomes hard to avoid since those platforms are shipped with x2APIC opt out being advertised by default at the same time by firmware. Unify the behaviour between x2APIC and xAPIC code paths keeping that in line with what Linux does. Signed-off-by: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> master commit: 04181c6fb543db01f635227c7681ced4073109ba master date: 2021-03-12 17:01:52 +0100 --- xen/arch/x86/apic.c | 2 +- xen/drivers/passthrough/vtd/iommu.c | 12 +++++++++++- xen/include/asm-x86/apic.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index 60627fd6e6..4a2740ccea 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -46,7 +46,7 @@ static bool __read_mostly tdt_enabled; static bool __initdata tdt_enable = true; boolean_param("tdt", tdt_enable); -static bool __read_mostly iommu_x2apic_enabled; +bool __read_mostly iommu_x2apic_enabled; static struct { int active; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 2a99cd208f..58128be8b5 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2121,7 +2121,7 @@ static int __must_check init_vtd_hw(void) u32 sts; /* - * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults. + * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults, etc. */ for_each_drhd_unit ( drhd ) { @@ -2131,6 +2131,16 @@ static int __must_check init_vtd_hw(void) clear_fault_bits(iommu); + /* + * Disable interrupt remapping and queued invalidation if + * already enabled by BIOS in case we've not initialized it yet. + */ + if ( !iommu_x2apic_enabled ) + { + disable_intremap(iommu); + disable_qinval(iommu); + } + spin_lock_irqsave(&iommu->register_lock, flags); sts = dmar_readl(iommu->reg, DMAR_FECTL_REG); sts &= ~DMA_FECTL_IM; diff --git a/xen/include/asm-x86/apic.h b/xen/include/asm-x86/apic.h index 8ddb896ee9..2fe54bbf1c 100644 --- a/xen/include/asm-x86/apic.h +++ b/xen/include/asm-x86/apic.h @@ -24,6 +24,7 @@ enum apic_mode { APIC_MODE_X2APIC /* x2APIC mode - common for large MP machines */ }; +extern bool iommu_x2apic_enabled; extern u8 apic_verbosity; extern bool directed_eoi_enabled; -- generated by git-patchbot for /home/xen/git/xen.git#staging-4.14
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |