diff options
-rw-r--r-- | xen/arch/x86/msi.c | 6 | ||||
-rw-r--r-- | xen/drivers/passthrough/iommu.c | 5 | ||||
-rw-r--r-- | xen/drivers/passthrough/vtd/iommu.c | 3 | ||||
-rw-r--r-- | xen/include/asm-x86/io_apic.h | 2 |
4 files changed, 12 insertions, 4 deletions
diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index ef332fb11e..ef3e4bdb12 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -201,7 +201,7 @@ static void read_msi_msg(struct msi_desc *entry, struct msi_msg *msg) BUG(); } - if ( iommu_enabled ) + if ( iommu_intremap ) iommu_read_msi_from_ire(entry, msg); } @@ -222,7 +222,7 @@ static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg) { entry->msg = *msg; - if ( iommu_enabled ) + if ( iommu_intremap ) { ASSERT(msg != &entry->msg); iommu_update_ire_from_msi(entry, msg); @@ -438,7 +438,7 @@ int msi_free_irq(struct msi_desc *entry) } /* Free the unused IRTE if intr remap enabled */ - if ( iommu_enabled ) + if ( iommu_intremap ) iommu_update_ire_from_msi(entry, NULL); list_del(&entry->list); diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 456014af95..cf506e2ecd 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -323,6 +323,8 @@ int __init iommu_setup(void) rc = iommu_hardware_setup(); iommu_enabled = (rc == 0); } + if ( !iommu_enabled ) + iommu_intremap = 0; if ( (force_iommu && !iommu_enabled) || (force_intremap && !iommu_intremap) ) @@ -339,9 +341,12 @@ int __init iommu_setup(void) } printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis"); if ( iommu_enabled ) + { printk(" - Dom0 mode: %s\n", iommu_passthrough ? "Passthrough" : iommu_dom0_strict ? "Strict" : "Relaxed"); + printk("Interrupt remapping %sabled\n", iommu_intremap ? "en" : "dis"); + } return rc; } diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index c218ec3af8..22e757c3db 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2101,6 +2101,9 @@ static int init_vtd_hw(void) break; } } + if ( !iommu_intremap ) + for_each_drhd_unit ( drhd ) + disable_intremap(drhd->iommu); } /* diff --git a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h index 1b42f85d8f..bbb6f3869f 100644 --- a/xen/include/asm-x86/io_apic.h +++ b/xen/include/asm-x86/io_apic.h @@ -129,7 +129,7 @@ struct IO_APIC_route_entry { extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS]; /* Only need to remap ioapic RTE (reg: 10~3Fh) */ -#define ioapic_reg_remapped(reg) (iommu_enabled && ((reg) >= 0x10)) +#define ioapic_reg_remapped(reg) (iommu_intremap && ((reg) >= 0x10)) static inline unsigned int __io_apic_read(unsigned int apic, unsigned int reg) { |