[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] iommu: Consolidate iommu enablement logic. Now there is only one



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1208770420 -3600
# Node ID 658f031557f60230071dc5de06e91707677d380d
# Parent  e823b22c6017224bb53b46b96caf39e76dfc285e
iommu: Consolidate iommu enablement logic. Now there is only one
command-line parameter for disabling IOV/VTD: "iommu"/"no-iommu".

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/intr.c                   |    2 
 xen/arch/x86/hvm/vmx/intr.c                   |    2 
 xen/drivers/passthrough/amd/pci_amd_iommu.c   |  117 ++++++++++----------------
 xen/drivers/passthrough/iommu.c               |   20 +++-
 xen/drivers/passthrough/vtd/dmar.c            |   23 ++---
 xen/drivers/passthrough/vtd/iommu.c           |   11 --
 xen/drivers/passthrough/vtd/utils.c           |    2 
 xen/include/asm-x86/amd-iommu.h               |    1 
 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h |    5 -
 xen/include/xen/iommu.h                       |    3 
 10 files changed, 82 insertions(+), 104 deletions(-)

diff -r e823b22c6017 -r 658f031557f6 xen/arch/x86/hvm/svm/intr.c
--- a/xen/arch/x86/hvm/svm/intr.c       Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/arch/x86/hvm/svm/intr.c       Mon Apr 21 10:33:40 2008 +0100
@@ -102,7 +102,7 @@ static void svm_dirq_assist(struct vcpu 
     struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
     struct dev_intx_gsi_link *digl;
 
-    if ( !amd_iommu_enabled || (v->vcpu_id != 0) || (hvm_irq_dpci == NULL) )
+    if ( !iommu_enabled || (v->vcpu_id != 0) || (hvm_irq_dpci == NULL) )
         return;
 
     for ( irq = find_first_bit(hvm_irq_dpci->dirq_mask, NR_IRQS);
diff -r e823b22c6017 -r 658f031557f6 xen/arch/x86/hvm/vmx/intr.c
--- a/xen/arch/x86/hvm/vmx/intr.c       Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/arch/x86/hvm/vmx/intr.c       Mon Apr 21 10:33:40 2008 +0100
@@ -111,7 +111,7 @@ static void vmx_dirq_assist(struct vcpu 
     struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
     struct dev_intx_gsi_link *digl;
 
-    if ( !vtd_enabled || (v->vcpu_id != 0) || (hvm_irq_dpci == NULL) )
+    if ( !iommu_enabled || (v->vcpu_id != 0) || (hvm_irq_dpci == NULL) )
         return;
 
     for ( irq = find_first_bit(hvm_irq_dpci->dirq_mask, NR_IRQS);
diff -r e823b22c6017 -r 658f031557f6 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c       Mon Apr 21 10:01:46 
2008 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c       Mon Apr 21 10:33:40 
2008 +0100
@@ -30,16 +30,10 @@ long amd_iommu_poll_comp_wait = COMPLETI
 long amd_iommu_poll_comp_wait = COMPLETION_WAIT_DEFAULT_POLLING_COUNT;
 static long amd_iommu_cmd_buffer_entries = IOMMU_CMD_BUFFER_DEFAULT_ENTRIES;
 static long amd_iommu_event_log_entries = IOMMU_EVENT_LOG_DEFAULT_ENTRIES;
-int nr_amd_iommus = 0;
-
-unsigned short ivrs_bdf_entries = 0;
-struct ivrs_mappings *ivrs_mappings = NULL;
-
-/* will set if amd-iommu HW is found */
-int amd_iommu_enabled = 0;
-
-static int enable_amd_iommu = 0;
-boolean_param("enable_amd_iov", enable_amd_iommu);
+int nr_amd_iommus;
+
+unsigned short ivrs_bdf_entries;
+struct ivrs_mappings *ivrs_mappings;
 
 static void deallocate_domain_page_tables(struct hvm_iommu *hd)
 {
@@ -76,24 +70,6 @@ static void __init deallocate_iommu_reso
     deallocate_iommu_table_struct(&iommu->dev_table);
     deallocate_iommu_table_struct(&iommu->cmd_buffer);
     deallocate_iommu_table_struct(&iommu->event_log);
-}
-
-static void __init detect_cleanup(void)
-{
-    struct amd_iommu *iommu, *next;
-
-    list_for_each_entry_safe ( iommu, next, &amd_iommu_head, list )
-    {
-        list_del(&iommu->list);
-        deallocate_iommu_resources(iommu);
-        xfree(iommu);
-    }
-
-    if ( ivrs_mappings )
-    {
-        xfree(ivrs_mappings);
-        ivrs_mappings = NULL;
-    }
 }
 
 static int __init allocate_iommu_table_struct(struct table_struct *table,
@@ -245,8 +221,6 @@ static int __init amd_iommu_init(void)
         enable_iommu(iommu);
         nr_amd_iommus++;
     }
-
-    amd_iommu_enabled = 1;
 
     return 0;
 
@@ -277,7 +251,7 @@ struct amd_iommu *find_iommu_for_device(
     return NULL;
 }
 
-void amd_iommu_setup_domain_device(
+static void amd_iommu_setup_domain_device(
     struct domain *domain, struct amd_iommu *iommu, int bdf)
 {
     void *dte;
@@ -316,7 +290,7 @@ void amd_iommu_setup_domain_device(
     }
 }
 
-void __init amd_iommu_setup_dom0_devices(void)
+static void __init amd_iommu_setup_dom0_devices(void)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(dom0);
     struct amd_iommu *iommu;
@@ -358,13 +332,7 @@ int amd_iov_detect(void)
 {
     unsigned long i;
     int last_bus;
-    struct amd_iommu *iommu;
-
-    if ( !enable_amd_iommu )
-    {
-        printk("AMD_IOV: Disabled.\n");
-        return 0;
-    }
+    struct amd_iommu *iommu, *next;
 
     INIT_LIST_HEAD(&amd_iommu_head);
 
@@ -377,29 +345,26 @@ int amd_iov_detect(void)
     if ( !iommu_found() )
     {
         printk("AMD_IOV: IOMMU not found!\n");
-        return 0;
-    }
-    else
-    {
-        /* allocate 'ivrs mappings' table */
-        /* note: the table has entries to accomodate all IOMMUs */
-        last_bus = 0;
-        for_each_amd_iommu ( iommu )
-            if ( iommu->last_downstream_bus > last_bus )
-                last_bus = iommu->last_downstream_bus;
-
-        ivrs_bdf_entries = (last_bus + 1) *
-            IOMMU_DEV_TABLE_ENTRIES_PER_BUS;
-        ivrs_mappings = xmalloc_array( struct ivrs_mappings, ivrs_bdf_entries);
-
-        if ( !ivrs_mappings )
-        {
-            amd_iov_error("Error allocating IVRS DevMappings table\n");
-            goto error_out;
-        }
-        memset(ivrs_mappings, 0,
-               ivrs_bdf_entries * sizeof(struct ivrs_mappings));
-    }
+        goto error_out;
+    }
+
+    /* allocate 'ivrs mappings' table */
+    /* note: the table has entries to accomodate all IOMMUs */
+    last_bus = 0;
+    for_each_amd_iommu ( iommu )
+        if ( iommu->last_downstream_bus > last_bus )
+            last_bus = iommu->last_downstream_bus;
+
+    ivrs_bdf_entries = (last_bus + 1) *
+        IOMMU_DEV_TABLE_ENTRIES_PER_BUS;
+    ivrs_mappings = xmalloc_array( struct ivrs_mappings, ivrs_bdf_entries);
+    if ( ivrs_mappings == NULL )
+    {
+        amd_iov_error("Error allocating IVRS DevMappings table\n");
+        goto error_out;
+    }
+    memset(ivrs_mappings, 0,
+           ivrs_bdf_entries * sizeof(struct ivrs_mappings));
 
     if ( amd_iommu_init() != 0 )
     {
@@ -418,9 +383,20 @@ int amd_iov_detect(void)
     return 0;
 
  error_out:
-    detect_cleanup();
+    list_for_each_entry_safe ( iommu, next, &amd_iommu_head, list )
+    {
+        list_del(&iommu->list);
+        deallocate_iommu_resources(iommu);
+        xfree(iommu);
+    }
+
+    if ( ivrs_mappings )
+    {
+        xfree(ivrs_mappings);
+        ivrs_mappings = NULL;
+    }
+
     return -ENODEV;
-
 }
 
 static int allocate_domain_resources(struct hvm_iommu *hd)
@@ -464,7 +440,7 @@ static int get_paging_mode(unsigned long
     return level;
 }
 
-int amd_iommu_domain_init(struct domain *domain)
+static int amd_iommu_domain_init(struct domain *domain)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
 
@@ -561,7 +537,7 @@ static int reassign_device( struct domai
     return 0;
 }
 
-int amd_iommu_assign_device(struct domain *d, u8 bus, u8 devfn)
+static int amd_iommu_assign_device(struct domain *d, u8 bus, u8 devfn)
 {
     int bdf = (bus << 8) | devfn;
     int req_id = ivrs_mappings[bdf].dte_requestor_id;
@@ -647,16 +623,13 @@ static void deallocate_iommu_page_tables
     hd ->root_table = NULL;
 }
 
-void amd_iommu_domain_destroy(struct domain *d)
-{
-    if ( !amd_iommu_enabled )
-        return;
-
+static void amd_iommu_domain_destroy(struct domain *d)
+{
     deallocate_iommu_page_tables(d);
     release_domain_devices(d);
 }
 
-void amd_iommu_return_device(
+static void amd_iommu_return_device(
     struct domain *s, struct domain *t, u8 bus, u8 devfn)
 {
     pdev_flr(bus, devfn);
diff -r e823b22c6017 -r 658f031557f6 xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c   Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/drivers/passthrough/iommu.c   Mon Apr 21 10:33:40 2008 +0100
@@ -20,6 +20,9 @@ extern struct iommu_ops amd_iommu_ops;
 extern struct iommu_ops amd_iommu_ops;
 int intel_vtd_setup(void);
 int amd_iov_detect(void);
+
+int iommu_enabled = 1;
+boolean_param("iommu", iommu_enabled);
 
 int iommu_domain_init(struct domain *domain)
 {
@@ -139,13 +142,24 @@ void deassign_device(struct domain *d, u
 
 int iommu_setup(void)
 {
+    int rc = -ENODEV;
+
+    if ( !iommu_enabled )
+        goto out;
+
     switch ( boot_cpu_data.x86_vendor )
     {
     case X86_VENDOR_INTEL:
-        return intel_vtd_setup();
+        rc = intel_vtd_setup();
+        break;
     case X86_VENDOR_AMD:
-        return amd_iov_detect();
+        rc = amd_iov_detect();
+        break;
     }
 
-    return 0;
+    iommu_enabled = (rc == 0);
+
+ out:
+    printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis");
+    return rc;
 }
diff -r e823b22c6017 -r 658f031557f6 xen/drivers/passthrough/vtd/dmar.c
--- a/xen/drivers/passthrough/vtd/dmar.c        Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/drivers/passthrough/vtd/dmar.c        Mon Apr 21 10:33:40 2008 +0100
@@ -30,8 +30,7 @@
 #include "dmar.h"
 #include "../pci_regs.h"
 
-int vtd_enabled;
-boolean_param("vtd", vtd_enabled);
+int vtd_enabled = 1;
 
 #undef PREFIX
 #define PREFIX VTDPREFIX "ACPI DMAR:"
@@ -604,22 +603,24 @@ int acpi_dmar_init(void)
 {
     int rc;
 
-    if ( !vtd_enabled )
-        return -ENODEV;
+    rc = -ENODEV;
+    if ( !iommu_enabled )
+        goto fail;
 
     if ( (rc = vtd_hw_check()) != 0 )
-        return rc;
+        goto fail;
 
     acpi_table_parse(ACPI_DMAR, acpi_parse_dmar);
 
+    rc = -ENODEV;
     if ( list_empty(&acpi_drhd_units) )
-    {
-        dprintk(XENLOG_ERR VTDPREFIX, "No DMAR devices found\n");
-        vtd_enabled = 0;
-        return -ENODEV;
-    }
+        goto fail;
 
     printk("Intel VT-d has been enabled\n");
 
     return 0;
-}
+
+ fail:
+    vtd_enabled = 0;
+    return -ENODEV;
+}
diff -r e823b22c6017 -r 658f031557f6 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c       Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c       Mon Apr 21 10:33:40 2008 +0100
@@ -1111,7 +1111,7 @@ static void free_iommu(struct iommu *iom
         agaw = 64;                              \
     agaw; })
 
-int intel_iommu_domain_init(struct domain *domain)
+static int intel_iommu_domain_init(struct domain *domain)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
     struct iommu *iommu = NULL;
@@ -1119,9 +1119,6 @@ int intel_iommu_domain_init(struct domai
     int adjust_width, agaw;
     unsigned long sagaw;
     struct acpi_drhd_unit *drhd;
-
-    if ( !vtd_enabled || list_empty(&acpi_drhd_units) )
-        return 0;
 
     for_each_drhd_unit ( drhd )
         iommu = drhd->iommu ? : iommu_alloc(drhd);
@@ -1911,7 +1908,7 @@ int intel_vtd_setup(void)
     unsigned long i;
 
     if ( !vtd_enabled )
-        return 0;
+        return -ENODEV;
 
     spin_lock_init(&domid_bitmap_lock);
     INIT_LIST_HEAD(&hd->pdev_list);
@@ -1946,13 +1943,13 @@ int intel_vtd_setup(void)
     return 0;
 
  error:
-    printk("iommu_setup() failed\n");
     for_each_drhd_unit ( drhd )
     {
         iommu = drhd->iommu;
         free_iommu(iommu);
     }
-    return -EIO;
+    vtd_enabled = 0;
+    return -ENOMEM;
 }
 
 /*
diff -r e823b22c6017 -r 658f031557f6 xen/drivers/passthrough/vtd/utils.c
--- a/xen/drivers/passthrough/vtd/utils.c       Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/drivers/passthrough/vtd/utils.c       Mon Apr 21 10:33:40 2008 +0100
@@ -60,10 +60,10 @@ int vtd_hw_check(void)
             dprintk(XENLOG_WARNING VTDPREFIX,
                     "***  vendor = %x device = %x revision = %x\n",
                     vendor, device, revision);
-            vtd_enabled = 0;
             return -ENODEV;
         }
     }
+
     return 0;
 }
 
diff -r e823b22c6017 -r 658f031557f6 xen/include/asm-x86/amd-iommu.h
--- a/xen/include/asm-x86/amd-iommu.h   Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/include/asm-x86/amd-iommu.h   Mon Apr 21 10:33:40 2008 +0100
@@ -28,7 +28,6 @@
 
 #define iommu_found()           (!list_empty(&amd_iommu_head))
 
-extern int amd_iommu_enabled;
 extern struct list_head amd_iommu_head;
 
 extern int __init amd_iov_detect(void);
diff -r e823b22c6017 -r 658f031557f6 
xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h     Mon Apr 21 10:01:46 
2008 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h     Mon Apr 21 10:33:40 
2008 +0100
@@ -84,11 +84,6 @@ int send_iommu_command(struct amd_iommu 
 int send_iommu_command(struct amd_iommu *iommu, u32 cmd[]);
 void flush_command_buffer(struct amd_iommu *iommu);
 
-/* iommu domain funtions */
-int amd_iommu_domain_init(struct domain *domain);
-void amd_iommu_setup_domain_device(struct domain *domain,
-    struct amd_iommu *iommu, int bdf);
-
 /* find iommu for bdf */
 struct amd_iommu *find_iommu_for_device(int bus, int devfn);
 
diff -r e823b22c6017 -r 658f031557f6 xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h   Mon Apr 21 10:01:46 2008 +0100
+++ b/xen/include/xen/iommu.h   Mon Apr 21 10:33:40 2008 +0100
@@ -27,9 +27,8 @@
 #include <public/domctl.h>
 
 extern int vtd_enabled;
-extern int amd_iommu_enabled;
+extern int iommu_enabled;
 
-#define iommu_enabled ( amd_iommu_enabled || vtd_enabled )
 #define domain_hvm_iommu(d)     (&d->arch.hvm_domain.hvm_iommu)
 #define domain_vmx_iommu(d)     (&d->arch.hvm_domain.hvm_iommu.vmx_iommu)
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.