Introduce a respective element in struct iommu_init_ops.
Take the liberty and also switch intel_iommu_supports_eim() to bool/
true/false, to fully match the hook's type.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
printk("x2APIC: Already enabled by BIOS: Ignoring cmdline disable.\n");
}
- if ( !iommu_supports_eim() )
+ if ( !iommu_supports_x2apic() )
{
if ( !x2apic_enabled )
{
- printk("Not enabling x2APIC: depends on iommu_supports_eim.\n");
+ printk("Not enabling x2APIC: depends on IOMMU support\n");
return;
}
- panic("x2APIC: already enabled by BIOS, but iommu_supports_eim failed\n");
+ panic("x2APIC: already enabled by BIOS, but no IOMMU support\n");
}
if ( (ioapic_entries = alloc_ioapic_entries()) == NULL )
void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn);
keyhandler_fn_t vtd_dump_iommu_info;
+bool intel_iommu_supports_eim(void);
+
int enable_qinval(struct iommu *iommu);
void disable_qinval(struct iommu *iommu);
int enable_intremap(struct iommu *iommu, int eim);
set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_13_IGNORE_3, hpetid_to_bdf(id));
}
-bool_t __init iommu_supports_eim(void)
+bool __init intel_iommu_supports_eim(void)
{
struct acpi_drhd_unit *drhd;
unsigned int apic;
if ( !iommu_qinval || !iommu_intremap || list_empty(&acpi_drhd_units) )
- return 0;
+ return false;
/* We MUST have a DRHD unit for each IOAPIC. */
for ( apic = 0; apic < nr_ioapics; apic++ )
dprintk(XENLOG_WARNING VTDPREFIX,
"There is not a DRHD for IOAPIC %#x (id: %#x)!\n",
apic, IO_APIC_ID(apic));
- return 0;
+ return false;
}
for_each_drhd_unit ( drhd )
if ( !ecap_queued_inval(drhd->iommu->ecap) ||
!ecap_intr_remap(drhd->iommu->ecap) ||
!ecap_eim(drhd->iommu->ecap) )
- return 0;
+ return false;
- return 1;
+ return true;
}
/*
if ( system_state < SYS_STATE_active )
{
- if ( !iommu_supports_eim() )
+ if ( !intel_iommu_supports_eim() )
return -EOPNOTSUPP;
if ( !platform_supports_x2apic() )
const struct iommu_init_ops __initconstrel intel_iommu_init_ops = {
.setup = vtd_setup,
+ .supports_x2apic = intel_iommu_supports_eim,
};
/*
struct iommu_init_ops {
int (*setup)(void);
+ bool (*supports_x2apic)(void);
};
extern const struct iommu_init_ops *iommu_init_ops;
int adjust_vtd_irq_affinities(void);
int __must_check iommu_pte_flush(struct domain *d, u64 gfn, u64 *pte,
int order, int present);
-bool_t iommu_supports_eim(void);
+
+static inline bool iommu_supports_x2apic(void)
+{
+ return iommu_init_ops && iommu_init_ops->supports_x2apic
+ ? iommu_init_ops->supports_x2apic()
+ : false;
+}
+
int iommu_enable_x2apic_IR(void);
void iommu_disable_x2apic_IR(void);