[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |