]> xenbits.xensource.com Git - people/sstabellini/xen-unstable.git/.git/commitdiff
x86/ACPI: also parse AMD IOMMU tables early
authorJan Beulich <jbeulich@suse.com>
Mon, 8 Apr 2019 11:03:07 +0000 (13:03 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 8 Apr 2019 11:03:07 +0000 (13:03 +0200)
In order to be able to initialize x2APIC mode we need to parse
respective ACPI tables early. Split amd_iov_detect() into two parts for
this purpose, and call the initial part earlier on.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Brian Woods <brian.woods@amd.com>
xen/arch/x86/acpi/boot.c
xen/drivers/passthrough/amd/pci_amd_iommu.c
xen/include/asm-x86/acpi.h

index e6ab9fa3989b2c592f208da1ddbec5a7516347cb..1382b4dcd099138a499bf0eff8c71c99f64ff565 100644 (file)
@@ -733,7 +733,7 @@ int __init acpi_boot_init(void)
 
        acpi_mmcfg_init();
 
-       acpi_dmar_init();
+       acpi_iommu_init();
 
        erst_init();
 
index f6c17ba87a4ad191370d53c9bc7ab262b9216b6f..7dba47872089fd826f4d398604b36ae4f0f9a0d7 100644 (file)
@@ -23,6 +23,7 @@
 #include <xen/pci_regs.h>
 #include <xen/paging.h>
 #include <xen/softirq.h>
+#include <asm/acpi.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
 #include "../ats.h"
@@ -147,7 +148,7 @@ static void amd_iommu_setup_domain_device(
     }
 }
 
-int __init amd_iov_detect(void)
+int __init acpi_ivrs_init(void)
 {
     INIT_LIST_HEAD(&amd_iommu_head);
 
@@ -161,6 +162,14 @@ int __init amd_iov_detect(void)
         return -ENODEV;
     }
 
+    return 0;
+}
+
+int __init amd_iov_detect(void)
+{
+    if ( !iommu_enable && !iommu_intremap )
+        return 0;
+
     iommu_ops = amd_iommu_ops;
 
     if ( amd_iommu_init() != 0 )
index 3950b470e54ddb3dfb18fc9d38504671ce57125e..a105d1186c40dac13e5133c0ec73719e0d47266b 100644 (file)
@@ -26,6 +26,7 @@
 #include <acpi/pdc_intel.h>
 #include <acpi/acconfig.h>
 #include <acpi/actbl.h>
+#include <xen/errno.h>
 
 #define COMPILER_DEPENDENT_INT64   long long
 #define COMPILER_DEPENDENT_UINT64  unsigned long long
@@ -145,6 +146,15 @@ extern u32 pmtmr_ioport;
 extern unsigned int pmtmr_width;
 
 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. */