[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] AMD IOMMU: remove global interrupt remapping table
# HG changeset patch # User Wei Wang <wei.wang2@xxxxxxx> # Date 1311255467 -3600 # Node ID fbf3768e5934cf4ae6b0f3b4e6d9b49921271d95 # Parent 3795d79c740b2aa50aacb7bf7e3503862a7b436c AMD IOMMU: remove global interrupt remapping table ...use per-device table instead. This should work with per-cpu IDTs. We are safe to remove global table since SATA device id issue doee not appear in recent production BIOS. Signed-off-by: Wei Wang <wei.wang2@xxxxxxx> --- diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/amd/iommu_acpi.c --- a/xen/drivers/passthrough/amd/iommu_acpi.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/amd/iommu_acpi.c Thu Jul 21 14:37:47 2011 +0100 @@ -66,15 +66,8 @@ if (ivrs_mappings[alias_id].intremap_table == NULL ) { /* allocate per-device interrupt remapping table */ - if ( amd_iommu_perdev_intremap ) - ivrs_mappings[alias_id].intremap_table = + ivrs_mappings[alias_id].intremap_table = amd_iommu_alloc_intremap_table(); - else - { - if ( shared_intremap_table == NULL ) - shared_intremap_table = amd_iommu_alloc_intremap_table(); - ivrs_mappings[alias_id].intremap_table = shared_intremap_table; - } } /* assgin iommu hardware */ ivrs_mappings[bdf].iommu = iommu; diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/amd/iommu_init.c --- a/xen/drivers/passthrough/amd/iommu_init.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/amd/iommu_init.c Thu Jul 21 14:37:47 2011 +0100 @@ -760,8 +760,7 @@ ivrs_mappings[bdf].dte_ext_int_pass = IOMMU_CONTROL_DISABLED; ivrs_mappings[bdf].dte_init_pass = IOMMU_CONTROL_DISABLED; - if ( amd_iommu_perdev_intremap ) - spin_lock_init(&ivrs_mappings[bdf].intremap_lock); + spin_lock_init(&ivrs_mappings[bdf].intremap_lock); } return 0; } diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/amd/iommu_intr.c --- a/xen/drivers/passthrough/amd/iommu_intr.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/amd/iommu_intr.c Thu Jul 21 14:37:47 2011 +0100 @@ -28,20 +28,10 @@ #define INTREMAP_ENTRIES (1 << INTREMAP_LENGTH) int ioapic_bdf[MAX_IO_APICS]; -void *shared_intremap_table; -static DEFINE_SPINLOCK(shared_intremap_lock); static spinlock_t* get_intremap_lock(int req_id) { - return (amd_iommu_perdev_intremap ? - &ivrs_mappings[req_id].intremap_lock: - &shared_intremap_lock); -} - -static int get_intremap_requestor_id(int bdf) -{ - ASSERT( bdf < ivrs_bdf_entries ); - return ivrs_mappings[bdf].dte_requestor_id; + return &ivrs_mappings[req_id].intremap_lock; } static int get_intremap_offset(u8 vector, u8 dm) @@ -125,7 +115,7 @@ spinlock_t *lock; int offset; - req_id = get_intremap_requestor_id(bdf); + req_id = get_requestor_id(bdf); lock = get_intremap_lock(req_id); delivery_mode = rte->delivery_mode; @@ -183,7 +173,7 @@ continue; } - req_id = get_intremap_requestor_id(bdf); + req_id = get_requestor_id(bdf); lock = get_intremap_lock(req_id); delivery_mode = rte.delivery_mode; @@ -283,14 +273,13 @@ { unsigned long flags; u32* entry; - u16 bdf, req_id, alias_id; + u16 bdf, req_id; u8 delivery_mode, dest, vector, dest_mode; spinlock_t *lock; int offset; bdf = (pdev->bus << 8) | pdev->devfn; - req_id = get_dma_requestor_id(bdf); - alias_id = get_intremap_requestor_id(bdf); + req_id = get_requestor_id(bdf); if ( msg == NULL ) { @@ -299,14 +288,6 @@ free_intremap_entry(req_id, msi_desc->remap_index); spin_unlock_irqrestore(lock, flags); - if ( ( req_id != alias_id ) && - ivrs_mappings[alias_id].intremap_table != NULL ) - { - lock = get_intremap_lock(alias_id); - spin_lock_irqsave(lock, flags); - free_intremap_entry(alias_id, msi_desc->remap_index); - spin_unlock_irqrestore(lock, flags); - } goto done; } @@ -324,30 +305,11 @@ update_intremap_entry(entry, vector, delivery_mode, dest_mode, dest); spin_unlock_irqrestore(lock, flags); - /* - * In some special cases, a pci-e device(e.g SATA controller in IDE mode) - * will use alias id to index interrupt remapping table. - * We have to setup a secondary interrupt remapping entry to satisfy those - * devices. - */ - - lock = get_intremap_lock(alias_id); - if ( ( req_id != alias_id ) && - ivrs_mappings[alias_id].intremap_table != NULL ) - { - spin_lock_irqsave(lock, flags); - entry = (u32*)get_intremap_entry(alias_id, offset); - update_intremap_entry(entry, vector, delivery_mode, dest_mode, dest); - spin_unlock_irqrestore(lock, flags); - } - done: if ( iommu->enabled ) { spin_lock_irqsave(&iommu->lock, flags); invalidate_interrupt_table(iommu, req_id); - if ( alias_id != req_id ) - invalidate_interrupt_table(iommu, alias_id); flush_command_buffer(iommu); spin_unlock_irqrestore(&iommu->lock, flags); } diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/amd/iommu_map.c --- a/xen/drivers/passthrough/amd/iommu_map.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/amd/iommu_map.c Thu Jul 21 14:37:47 2011 +0100 @@ -543,7 +543,7 @@ for_each_pdev( d, pdev ) { bdf = (pdev->bus << 8) | pdev->devfn; - req_id = get_dma_requestor_id(bdf); + req_id = get_requestor_id(bdf); iommu = find_iommu_for_device(bdf); if ( !iommu ) { diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Thu Jul 21 14:37:47 2011 +0100 @@ -31,25 +31,10 @@ return ivrs_mappings[bdf].iommu; } -/* - * Some devices will use alias id and original device id to index interrupt - * table and I/O page table respectively. Such devices will have - * both alias entry and select entry in IVRS structure. - * - * Return original device id, if device has valid interrupt remapping - * table setup for both select entry and alias entry. - */ -int get_dma_requestor_id(u16 bdf) +int get_requestor_id(u16 bdf) { - int req_id; - BUG_ON ( bdf >= ivrs_bdf_entries ); - req_id = ivrs_mappings[bdf].dte_requestor_id; - if ( (ivrs_mappings[bdf].intremap_table != NULL) && - (ivrs_mappings[req_id].intremap_table != NULL) ) - req_id = bdf; - - return req_id; + return ivrs_mappings[bdf].dte_requestor_id; } static int is_translation_valid(u32 *entry) @@ -91,7 +76,7 @@ valid = 0; /* get device-table entry */ - req_id = get_dma_requestor_id(bdf); + req_id = get_requestor_id(bdf); dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE); spin_lock_irqsave(&iommu->lock, flags); @@ -252,7 +237,7 @@ int req_id; BUG_ON ( iommu->dev_table.buffer == NULL ); - req_id = get_dma_requestor_id(bdf); + req_id = get_requestor_id(bdf); dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE); spin_lock_irqsave(&iommu->lock, flags); @@ -314,7 +299,7 @@ static int amd_iommu_assign_device(struct domain *d, u8 bus, u8 devfn) { int bdf = (bus << 8) | devfn; - int req_id = get_dma_requestor_id(bdf); + int req_id = get_requestor_id(bdf); if ( ivrs_mappings[req_id].unity_map_enable ) { @@ -433,7 +418,7 @@ int rt; int bdf = (bus << 8) | devfn; rt = ( bdf < ivrs_bdf_entries ) ? - get_dma_requestor_id(bdf) : + get_requestor_id(bdf) : bdf; return rt; } diff -r 3795d79c740b -r fbf3768e5934 xen/drivers/passthrough/iommu.c --- a/xen/drivers/passthrough/iommu.c Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/drivers/passthrough/iommu.c Thu Jul 21 14:37:47 2011 +0100 @@ -49,7 +49,6 @@ bool_t __read_mostly iommu_intremap = 1; bool_t __read_mostly iommu_hap_pt_share; bool_t __read_mostly iommu_debug; -bool_t __read_mostly amd_iommu_perdev_intremap; static void __init parse_iommu_param(char *s) { @@ -76,8 +75,6 @@ iommu_intremap = 0; else if ( !strcmp(s, "debug") ) iommu_debug = 1; - else if ( !strcmp(s, "amd-iommu-perdev-intremap") ) - amd_iommu_perdev_intremap = 1; else if ( !strcmp(s, "dom0-passthrough") ) iommu_passthrough = 1; else if ( !strcmp(s, "dom0-strict") ) diff -r 3795d79c740b -r fbf3768e5934 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Thu Jul 21 14:37:47 2011 +0100 @@ -65,7 +65,7 @@ void amd_iommu_share_p2m(struct domain *d); /* device table functions */ -int get_dma_requestor_id(u16 bdf); +int get_requestor_id(u16 bdf); void amd_iommu_add_dev_table_entry( u32 *dte, u8 sys_mgt, u8 dev_ex, u8 lint1_pass, u8 lint0_pass, u8 nmi_pass, u8 ext_int_pass, u8 init_pass); @@ -97,7 +97,6 @@ unsigned int apic, unsigned int reg); extern int ioapic_bdf[MAX_IO_APICS]; -extern void *shared_intremap_table; /* power management support */ void amd_iommu_resume(void); diff -r 3795d79c740b -r fbf3768e5934 xen/include/xen/iommu.h --- a/xen/include/xen/iommu.h Thu Jul 21 14:35:31 2011 +0100 +++ b/xen/include/xen/iommu.h Thu Jul 21 14:37:47 2011 +0100 @@ -32,7 +32,6 @@ extern bool_t iommu_snoop, iommu_qinval, iommu_intremap; extern bool_t iommu_hap_pt_share; extern bool_t iommu_debug; -extern bool_t amd_iommu_perdev_intremap; extern struct rangeset *mmio_ro_ranges; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |