]> xenbits.xensource.com Git - xen.git/commitdiff
x86/IOMMU: mark IOMMU / intremap not in use when ACPI tables are missing
authorJan Beulich <jbeulich@suse.com>
Fri, 19 Nov 2021 08:41:09 +0000 (09:41 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 19 Nov 2021 08:41:09 +0000 (09:41 +0100)
x2apic_bsp_setup() gets called ahead of iommu_setup(), and since x2APIC
mode (physical vs clustered) depends on iommu_intremap, that variable
needs to be set to off as soon as we know we can't / won't enable
interrupt remapping, i.e. in particular when parsing of the respective
ACPI tables failed. Move the turning off of iommu_intremap from AMD
specific code into acpi_iommu_init(), accompanying it by clearing of
iommu_enable.

Take the opportunity and also fully skip ACPI table parsing logic on
VT-d when both "iommu=off" and "iommu=no-intremap" are in effect anyway,
like was already the case for AMD.

The tag below only references the commit uncovering a pre-existing
anomaly.

Fixes: d8bd82327b0f ("AMD/IOMMU: obtain IVHD type to use earlier")
Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
master commit: 46c4061cd2bf69e8039021af615c2bdb94e50088
master date: 2021-11-04 14:44:01 +0100

xen/drivers/passthrough/amd/pci_amd_iommu.c
xen/drivers/passthrough/vtd/dmar.c
xen/drivers/passthrough/x86/iommu.c
xen/include/asm-x86/acpi.h

index 3f632e5e10576495fd2bc6d140c1a2103e502e6d..627ed795087c4c0bd3473a365030104a320fe964 100644 (file)
@@ -155,14 +155,8 @@ static void amd_iommu_setup_domain_device(
 
 int __init acpi_ivrs_init(void)
 {
-    if ( !iommu_enable && !iommu_intremap )
-        return 0;
-
     if ( (amd_iommu_detect_acpi() !=0) || (iommu_found() == 0) )
-    {
-        iommu_intremap = iommu_intremap_off;
         return -ENODEV;
-    }
 
     iommu_init_ops = &_iommu_init_ops;
 
index 29cd5c5d70e76080edc1aac3bb5ac62c3638837e..06d8d7dbe632adbd97a76573ca45992e43400b93 100644 (file)
@@ -760,11 +760,7 @@ static int __init acpi_parse_dmar(struct acpi_table_header *table)
     dmar = (struct acpi_table_dmar *)table;
     dmar_flags = dmar->flags;
 
-    if ( !iommu_enable && !iommu_intremap )
-    {
-        ret = -EINVAL;
-        goto out;
-    }
+    ASSERT(iommu_enable || iommu_intremap);
 
     if ( !dmar->width )
     {
index 1d7cebcc0601560c1a6d7a68ae0692d6d9f7043d..2db74e5a54115cf35daf402704ac3508ef276bba 100644 (file)
@@ -39,6 +39,24 @@ enum iommu_intremap __read_mostly iommu_intremap = iommu_intremap_full;
 bool __read_mostly iommu_intpost;
 #endif
 
+void __init acpi_iommu_init(void)
+{
+    int ret;
+
+    if ( !iommu_enable && !iommu_intremap )
+        return;
+
+    ret = acpi_dmar_init();
+    if ( ret == -ENODEV )
+        ret = acpi_ivrs_init();
+
+    if ( ret )
+    {
+        iommu_enable = false;
+        iommu_intremap = iommu_intremap_off;
+    }
+}
+
 int __init iommu_hardware_setup(void)
 {
     struct IO_APIC_route_entry **ioapic_entries = NULL;
index 7032f3a001dae622f18a3dd51491b6ce024b8d54..9a9cc4c2403a8194b0e724b0e61f2b7c4e31bbda 100644 (file)
@@ -141,16 +141,10 @@ extern u32 x86_acpiid_to_apicid[];
 extern u32 pmtmr_ioport;
 extern unsigned int pmtmr_width;
 
+void acpi_iommu_init(void);
 int acpi_dmar_init(void);
 int acpi_ivrs_init(void);
 
-static inline int acpi_iommu_init(void)
-{
-    int ret = acpi_dmar_init();
-
-    return ret == -ENODEV ? acpi_ivrs_init() : ret;
-}
-
 void acpi_mmcfg_init(void);
 
 /* Incremented whenever we transition through S3. Value is 1 during boot. */