|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] x86/IOMMU: introduce init-ops structure
commit 1b3cc8000c82edc9761c1e595928d6584e11f9f5
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Mon Apr 8 13:04:23 2019 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Apr 8 13:04:23 2019 +0200
x86/IOMMU: introduce init-ops structure
Do away with the CPU vendor dependency, and set the init ops pointer
based on which ACPI tables have been found.
Also take the opportunity and add __read_mostly to iommu_ops.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
Acked-by: Brian Woods <brian.woods@xxxxxxx>
---
xen/drivers/passthrough/amd/pci_amd_iommu.c | 9 ++++++++-
xen/drivers/passthrough/vtd/dmar.c | 4 ++++
xen/drivers/passthrough/vtd/extern.h | 1 +
xen/drivers/passthrough/vtd/iommu.c | 6 +++++-
xen/drivers/passthrough/x86/iommu.c | 3 ++-
xen/include/asm-x86/iommu.h | 19 +++++++------------
6 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c
b/xen/drivers/passthrough/amd/pci_amd_iommu.c
index 7dba478720..243a37663b 100644
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -30,6 +30,7 @@
static bool_t __read_mostly init_done;
+static const struct iommu_init_ops _iommu_init_ops;
static const struct iommu_ops amd_iommu_ops;
struct amd_iommu *find_iommu_for_device(int seg, int bdf)
@@ -162,10 +163,12 @@ int __init acpi_ivrs_init(void)
return -ENODEV;
}
+ iommu_init_ops = &_iommu_init_ops;
+
return 0;
}
-int __init amd_iov_detect(void)
+static int __init iov_detect(void)
{
if ( !iommu_enable && !iommu_intremap )
return 0;
@@ -567,3 +570,7 @@ static const struct iommu_ops __initconstrel amd_iommu_ops
= {
.crash_shutdown = amd_iommu_crash_shutdown,
.dump_p2m_table = amd_dump_p2m_table,
};
+
+static const struct iommu_init_ops __initconstrel _iommu_init_ops = {
+ .setup = iov_detect,
+};
diff --git a/xen/drivers/passthrough/vtd/dmar.c
b/xen/drivers/passthrough/vtd/dmar.c
index 2372cd2c74..9cc8623e53 100644
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -993,7 +993,11 @@ int __init acpi_dmar_init(void)
ret = parse_dmar_table(acpi_parse_dmar);
if ( !ret )
+ {
+ iommu_init_ops = &intel_iommu_init_ops;
+
return add_user_rmrr();
+ }
return ret;
}
diff --git a/xen/drivers/passthrough/vtd/extern.h
b/xen/drivers/passthrough/vtd/extern.h
index 16eada9fa2..83b9b3b80a 100644
--- a/xen/drivers/passthrough/vtd/extern.h
+++ b/xen/drivers/passthrough/vtd/extern.h
@@ -27,6 +27,7 @@
struct pci_ats_dev;
extern bool_t rwbf_quirk;
+extern const struct iommu_init_ops intel_iommu_init_ops;
extern const struct iommu_ops intel_iommu_ops;
void print_iommu_regs(struct acpi_drhd_unit *drhd);
diff --git a/xen/drivers/passthrough/vtd/iommu.c
b/xen/drivers/passthrough/vtd/iommu.c
index 50a0e25224..7b55ee5b28 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -2280,7 +2280,7 @@ static void __hwdom_init setup_hwdom_rmrr(struct domain
*d)
pcidevs_unlock();
}
-int __init intel_vtd_setup(void)
+static int __init vtd_setup(void)
{
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
@@ -2735,6 +2735,10 @@ const struct iommu_ops __initconstrel intel_iommu_ops = {
.dump_p2m_table = vtd_dump_p2m_table,
};
+const struct iommu_init_ops __initconstrel intel_iommu_init_ops = {
+ .setup = vtd_setup,
+};
+
/*
* Local variables:
* mode: C
diff --git a/xen/drivers/passthrough/x86/iommu.c
b/xen/drivers/passthrough/x86/iommu.c
index bd6529d419..c74b5cfea3 100644
--- a/xen/drivers/passthrough/x86/iommu.c
+++ b/xen/drivers/passthrough/x86/iommu.c
@@ -23,7 +23,8 @@
#include <asm/hvm/io.h>
#include <asm/setup.h>
-struct iommu_ops iommu_ops;
+const struct iommu_init_ops *__initdata iommu_init_ops;
+struct iommu_ops __read_mostly iommu_ops;
void iommu_update_ire_from_apic(
unsigned int apic, unsigned int reg, unsigned int value)
diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h
index 8dc392473d..d8f623cb0f 100644
--- a/xen/include/asm-x86/iommu.h
+++ b/xen/include/asm-x86/iommu.h
@@ -56,9 +56,6 @@ struct arch_iommu
struct guest_iommu *g_iommu;
};
-int intel_vtd_setup(void);
-int amd_iov_detect(void);
-
extern struct iommu_ops iommu_ops;
static inline const struct iommu_ops *iommu_get_ops(void)
@@ -67,17 +64,15 @@ static inline const struct iommu_ops *iommu_get_ops(void)
return &iommu_ops;
}
+struct iommu_init_ops {
+ int (*setup)(void);
+};
+
+extern const struct iommu_init_ops *iommu_init_ops;
+
static inline int iommu_hardware_setup(void)
{
- switch ( boot_cpu_data.x86_vendor )
- {
- case X86_VENDOR_INTEL:
- return intel_vtd_setup();
- case X86_VENDOR_AMD:
- return amd_iov_detect();
- }
-
- return -ENODEV;
+ return iommu_init_ops ? iommu_init_ops->setup() : -ENODEV;
}
/* Are we using the domain P2M table as its IOMMU pagetable? */
--
generated by git-patchbot for /home/xen/git/xen.git#staging
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |