|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH for-4.15] vtd: make sure QI/IR are disabled before initialisation
> From: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
> Sent: Monday, March 8, 2021 3:00 PM
>
> 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.
>
> 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: Kevin Tian <kevin.tian@xxxxxxxxx>
> ---
> 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 7497ddb..8ab8214 100644
> --- a/xen/arch/x86/apic.c
> +++ b/xen/arch/x86/apic.c
> @@ -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;
> diff --git a/xen/drivers/passthrough/vtd/iommu.c
> b/xen/drivers/passthrough/vtd/iommu.c
> index d136fe3..4aa7a31 100644
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -2080,7 +2080,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 )
> {
> @@ -2090,6 +2090,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 8ddb896..2fe54bb 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;
>
> --
> 2.7.4
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |