# HG changeset patch # User George Dunlap # Date 1311701852 -3600 # Node ID fa4e2ca9ecffbc432b451f495ad0a403644a6be8 # Parent 2e0cf9428554da666616982cd0074024ff85b221 xen: AMD IOMMU: Automatically enable per-device vector maps Automatically enable per-device vector maps when using IOMMU, unless disabled specifically by an IOMMU parameter. Signed-off-by: George Dunlap diff -r e017a9a2f27c xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Tue Jul 26 18:37:16 2011 +0100 +++ b/xen/arch/x86/irq.c Fri Oct 21 15:15:13 2011 -0400 @@ -32,6 +32,7 @@ unsigned int __read_mostly nr_irqs; integer_param("nr_irqs", nr_irqs); +/* This default may be changed by the AMD IOMMU code */ bool_t __read_mostly opt_irq_perdev_vector_map = 0; boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map); diff -r e017a9a2f27c xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Tue Jul 26 18:37:16 2011 +0100 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Oct 21 15:15:13 2011 -0400 @@ -24,6 +24,9 @@ #include #include #include + +extern bool_t __read_mostly opt_irq_perdev_vector_map; +extern bool_t __read_mostly iommu_amd_perdev_vector_map; extern unsigned short ivrs_bdf_entries; extern struct ivrs_mappings *ivrs_mappings; @@ -164,6 +167,18 @@ { printk("AMD-Vi: Error initialization\n"); return -ENODEV; + } + + /* Enable use of per-device vector map unless otherwise + * specified */ + if ( iommu_amd_perdev_vector_map ) + { + printk("AMD-Vi: Enabling per-device vector maps\n"); + opt_irq_perdev_vector_map=1; + } + else + { + printk("AMD-Vi: WARNING - not enabling per-device vector maps\n"); } return scan_pci_devices(); diff -r e017a9a2f27c xen/drivers/passthrough/iommu.c --- a/xen/drivers/passthrough/iommu.c Tue Jul 26 18:37:16 2011 +0100 +++ b/xen/drivers/passthrough/iommu.c Fri Oct 21 15:15:13 2011 -0400 @@ -49,6 +49,7 @@ bool_t __read_mostly iommu_intremap = 1; bool_t __read_mostly iommu_hap_pt_share; bool_t __read_mostly amd_iommu_debug; +bool_t __read_mostly iommu_amd_perdev_vector_map = 1; bool_t __read_mostly amd_iommu_perdev_intremap; static void __init parse_iommu_param(char *s) @@ -84,6 +85,8 @@ iommu_dom0_strict = 1; else if ( !strcmp(s, "sharept") ) iommu_hap_pt_share = 1; + else if ( !strcmp(s, "no-perdev-vector-map") ) + iommu_amd_perdev_vector_map = 0; s = ss + 1; } while ( ss );