diff mbox series

[3/7] x86/ACPI: also parse AMD IOMMU tables early

Message ID 5C9CDF140200007800222844@prv1-mh.provo.novell.com (mailing list archive)
State New, archived
Headers show
Series x86: eliminate Intel-isms from x2APIC setup | expand

Commit Message

Jan Beulich March 28, 2019, 2:49 p.m. UTC
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>

Comments

Andrew Cooper March 28, 2019, 4:43 p.m. UTC | #1
On 28/03/2019 14:49, Jan Beulich wrote:
> 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>

> --- a/xen/include/asm-x86/acpi.h
> +++ b/xen/include/asm-x86/acpi.h
> @@ -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;
> +}
> +

I suppose we really don't have any better option here than to try for
all APCI tables we may be interested in.  I certainly can't think of any
identifying information we could usefully switch() on instead.

~Andrew
Jan Beulich March 29, 2019, 9 a.m. UTC | #2
>>> On 28.03.19 at 17:43, <andrew.cooper3@citrix.com> wrote:
> On 28/03/2019 14:49, Jan Beulich wrote:
>> 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>

Thanks.

>> @@ -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;
>> +}
>> +
> 
> I suppose we really don't have any better option here than to try for
> all APCI tables we may be interested in.  I certainly can't think of any
> identifying information we could usefully switch() on instead.

Yeah, I've been trying to think of some way to sensibly avoid
either of the attempts, but keying this off of the CPU vendor
doesn't seem right. Since we can't tolerate a mixture of IOMMUs,
the above seemed the most reasonable thing we can do, thus
ensuring that even in a strange (virtualized?) environment
where both tables exist we'd enable only one of the two kinds.

Jan
Woods, Brian April 5, 2019, 2:28 p.m. UTC | #3
On 3/28/19 9:49 AM, Jan Beulich wrote:
> 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>
> 
Acked-by: Brian Woods <brian.woods@amd.com>
diff mbox series

Patch

--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -733,7 +733,7 @@  int __init acpi_boot_init(void)
 
 	acpi_mmcfg_init();
 
-	acpi_dmar_init();
+	acpi_iommu_init();
 
 	erst_init();
 
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -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"
@@ -170,7 +171,7 @@  static void amd_iommu_setup_domain_devic
     }
 }
 
-int __init amd_iov_detect(void)
+int __init acpi_ivrs_init(void)
 {
     INIT_LIST_HEAD(&amd_iommu_head);
 
@@ -184,6 +185,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 )
--- a/xen/include/asm-x86/acpi.h
+++ b/xen/include/asm-x86/acpi.h
@@ -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. */