Skip to content

Commit

Permalink
vtd: make sure QI/IR are disabled before initialisation
Browse files Browse the repository at this point in the history
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@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Release-Acked-by: Ian Jackson <iwj@xenproject.org>
  • Loading branch information
Igor Druzhinin authored and jbeulich committed Mar 12, 2021
1 parent 0570d7f commit 04181c6
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
2 changes: 1 addition & 1 deletion xen/arch/x86/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,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;
Expand Down
12 changes: 11 additions & 1 deletion xen/drivers/passthrough/vtd/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2101,7 +2101,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 )
{
Expand All @@ -2111,6 +2111,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;
Expand Down
1 change: 1 addition & 0 deletions xen/include/asm-x86/apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 04181c6

Please sign in to comment.