Commit 19127340 authored by Jan Beulich's avatar Jan Beulich

x86/IOMMU: initialize iommu_ops in vendor-independent code

Move this into iommu_hardware_setup() and make that function non-
inline. Move its declaration into common code.
Signed-off-by: default avatarJan Beulich <jbeulich@suse.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarAndrew Cooper <andrew.cooper3@citrix.com>
Acked-by: default avatarBrian Woods <brian.woods@amd.com>
parent 6d786fdb
......@@ -31,7 +31,6 @@
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)
{
......@@ -173,8 +172,6 @@ static int __init iov_detect(void)
if ( !iommu_enable && !iommu_intremap )
return 0;
iommu_ops = amd_iommu_ops;
if ( amd_iommu_init() != 0 )
{
printk("AMD-Vi: Error initialization\n");
......@@ -545,7 +542,7 @@ static void amd_dump_p2m_table(struct domain *d)
amd_dump_p2m_table_level(hd->arch.root_table, hd->arch.paging_mode, 0, 0);
}
static const struct iommu_ops __initconstrel amd_iommu_ops = {
static const struct iommu_ops __initconstrel _iommu_ops = {
.init = amd_iommu_domain_init,
.hwdom_init = amd_iommu_hwdom_init,
.add_device = amd_iommu_add_device,
......@@ -572,5 +569,6 @@ static const struct iommu_ops __initconstrel amd_iommu_ops = {
};
static const struct iommu_init_ops __initconstrel _iommu_init_ops = {
.ops = &_iommu_ops,
.setup = iov_detect,
};
......@@ -2305,8 +2305,6 @@ static int __init vtd_setup(void)
goto error;
}
iommu_ops = intel_iommu_ops;
/* We enable the following features only if they are supported by all VT-d
* engines: Snoop Control, DMA passthrough, Queued Invalidation, Interrupt
* Remapping, and Posted Interrupt
......
......@@ -26,6 +26,20 @@
const struct iommu_init_ops *__initdata iommu_init_ops;
struct iommu_ops __read_mostly iommu_ops;
int __init iommu_hardware_setup(void)
{
if ( !iommu_init_ops )
return -ENODEV;
if ( !iommu_ops.init )
iommu_ops = *iommu_init_ops->ops;
else
/* x2apic setup may have previously initialised the struct. */
ASSERT(iommu_ops.init == iommu_init_ops->ops->init);
return iommu_init_ops->setup();
}
int iommu_enable_x2apic(void)
{
if ( system_state < SYS_STATE_active )
......
......@@ -26,8 +26,6 @@ struct arch_iommu
const struct iommu_ops *iommu_get_ops(void);
void iommu_set_ops(const struct iommu_ops *ops);
int iommu_hardware_setup(void);
#endif /* __ARCH_ARM_IOMMU_H__ */
/*
......
......@@ -73,11 +73,6 @@ struct iommu_init_ops {
extern const struct iommu_init_ops *iommu_init_ops;
static inline int iommu_hardware_setup(void)
{
return iommu_init_ops ? iommu_init_ops->setup() : -ENODEV;
}
/* Are we using the domain P2M table as its IOMMU pagetable? */
#define iommu_use_hap_pt(d) \
(hap_enabled(d) && has_iommu_pt(d) && iommu_hap_pt_share)
......
......@@ -65,6 +65,7 @@ extern int8_t iommu_hwdom_reserved;
extern unsigned int iommu_dev_iotlb_timeout;
int iommu_setup(void);
int iommu_hardware_setup(void);
int iommu_domain_init(struct domain *d);
void iommu_hwdom_init(struct domain *d);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment