From a2199259fb9aa9e6fbcd136a5c8f48db1a78bd1a Mon Sep 17 00:00:00 2001 From: Varun Sethi Date: Fri, 29 Mar 2013 01:23:58 +0530 Subject: [PATCH] --- yaml --- r: 373570 b: refs/heads/master c: bb5547acfcd842950b8a22aa83f84af93388b9f2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/Documentation/kernel-parameters.txt | 14 -- trunk/drivers/iommu/amd_iommu.c | 138 ++++++++++--------- trunk/drivers/iommu/amd_iommu_init.c | 154 +++------------------- trunk/drivers/iommu/amd_iommu_types.h | 2 - trunk/drivers/iommu/exynos-iommu.c | 2 +- trunk/drivers/iommu/intel-iommu.c | 2 +- trunk/drivers/iommu/iommu.c | 3 +- trunk/drivers/iommu/msm_iommu.c | 2 +- trunk/drivers/iommu/omap-iommu.c | 2 +- trunk/drivers/iommu/shmobile-iommu.c | 2 +- trunk/drivers/iommu/tegra-gart.c | 2 +- trunk/drivers/iommu/tegra-smmu.c | 2 +- trunk/include/linux/iommu.h | 9 +- 14 files changed, 103 insertions(+), 233 deletions(-) diff --git a/[refs] b/[refs] index 1c9aac1175eb..25c3cfce8dd2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 83ed9c13e37e352b5a16caca01798c2766d91c29 +refs/heads/master: bb5547acfcd842950b8a22aa83f84af93388b9f2 diff --git a/trunk/Documentation/kernel-parameters.txt b/trunk/Documentation/kernel-parameters.txt index 2848b1b4e058..4609e81dbc37 100644 --- a/trunk/Documentation/kernel-parameters.txt +++ b/trunk/Documentation/kernel-parameters.txt @@ -1226,20 +1226,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. iucv= [HW,NET] - ivrs_ioapic [HW,X86_64] - Provide an override to the IOAPIC-ID<->DEVICE-ID - mapping provided in the IVRS ACPI table. For - example, to map IOAPIC-ID decimal 10 to - PCI device 00:14.0 write the parameter as: - ivrs_ioapic[10]=00:14.0 - - ivrs_hpet [HW,X86_64] - Provide an override to the HPET-ID<->DEVICE-ID - mapping provided in the IVRS ACPI table. For - example, to map HPET-ID decimal 0 to - PCI device 00:14.0 write the parameter as: - ivrs_hpet[0]=00:14.0 - js= [HW,JOY] Analog joystick See Documentation/input/joystick.txt. diff --git a/trunk/drivers/iommu/amd_iommu.c b/trunk/drivers/iommu/amd_iommu.c index c6f3c7e04684..a7f6b04eaa5e 100644 --- a/trunk/drivers/iommu/amd_iommu.c +++ b/trunk/drivers/iommu/amd_iommu.c @@ -701,6 +701,9 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt) static void iommu_poll_events(struct amd_iommu *iommu) { u32 head, tail; + unsigned long flags; + + spin_lock_irqsave(&iommu->lock, flags); head = readl(iommu->mmio_base + MMIO_EVT_HEAD_OFFSET); tail = readl(iommu->mmio_base + MMIO_EVT_TAIL_OFFSET); @@ -711,6 +714,8 @@ static void iommu_poll_events(struct amd_iommu *iommu) } writel(head, iommu->mmio_base + MMIO_EVT_HEAD_OFFSET); + + spin_unlock_irqrestore(&iommu->lock, flags); } static void iommu_handle_ppr_entry(struct amd_iommu *iommu, u64 *raw) @@ -735,11 +740,17 @@ static void iommu_handle_ppr_entry(struct amd_iommu *iommu, u64 *raw) static void iommu_poll_ppr_log(struct amd_iommu *iommu) { + unsigned long flags; u32 head, tail; if (iommu->ppr_log == NULL) return; + /* enable ppr interrupts again */ + writel(MMIO_STATUS_PPR_INT_MASK, iommu->mmio_base + MMIO_STATUS_OFFSET); + + spin_lock_irqsave(&iommu->lock, flags); + head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET); @@ -775,50 +786,34 @@ static void iommu_poll_ppr_log(struct amd_iommu *iommu) head = (head + PPR_ENTRY_SIZE) % PPR_LOG_SIZE; writel(head, iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); + /* + * Release iommu->lock because ppr-handling might need to + * re-acquire it + */ + spin_unlock_irqrestore(&iommu->lock, flags); + /* Handle PPR entry */ iommu_handle_ppr_entry(iommu, entry); + spin_lock_irqsave(&iommu->lock, flags); + /* Refresh ring-buffer information */ head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET); } + + spin_unlock_irqrestore(&iommu->lock, flags); } irqreturn_t amd_iommu_int_thread(int irq, void *data) { - struct amd_iommu *iommu = (struct amd_iommu *) data; - u32 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); - - while (status & (MMIO_STATUS_EVT_INT_MASK | MMIO_STATUS_PPR_INT_MASK)) { - /* Enable EVT and PPR interrupts again */ - writel((MMIO_STATUS_EVT_INT_MASK | MMIO_STATUS_PPR_INT_MASK), - iommu->mmio_base + MMIO_STATUS_OFFSET); - - if (status & MMIO_STATUS_EVT_INT_MASK) { - pr_devel("AMD-Vi: Processing IOMMU Event Log\n"); - iommu_poll_events(iommu); - } - - if (status & MMIO_STATUS_PPR_INT_MASK) { - pr_devel("AMD-Vi: Processing IOMMU PPR Log\n"); - iommu_poll_ppr_log(iommu); - } + struct amd_iommu *iommu; - /* - * Hardware bug: ERBT1312 - * When re-enabling interrupt (by writing 1 - * to clear the bit), the hardware might also try to set - * the interrupt bit in the event status register. - * In this scenario, the bit will be set, and disable - * subsequent interrupts. - * - * Workaround: The IOMMU driver should read back the - * status register and check if the interrupt bits are cleared. - * If not, driver will need to go through the interrupt handler - * again and re-clear the bits - */ - status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); + for_each_iommu(iommu) { + iommu_poll_events(iommu); + iommu_poll_ppr_log(iommu); } + return IRQ_HANDLED; } @@ -2843,6 +2838,24 @@ static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, spin_unlock_irqrestore(&domain->lock, flags); } +/* + * This is a special map_sg function which is used if we should map a + * device which is not handled by an AMD IOMMU in the system. + */ +static int map_sg_no_iommu(struct device *dev, struct scatterlist *sglist, + int nelems, int dir) +{ + struct scatterlist *s; + int i; + + for_each_sg(sglist, s, nelems, i) { + s->dma_address = (dma_addr_t)sg_phys(s); + s->dma_length = s->length; + } + + return nelems; +} + /* * The exported map_sg function for dma_ops (handles scatter-gather * lists). @@ -2862,7 +2875,9 @@ static int map_sg(struct device *dev, struct scatterlist *sglist, INC_STATS_COUNTER(cnt_map_sg); domain = get_domain(dev); - if (IS_ERR(domain)) + if (PTR_ERR(domain) == -EINVAL) + return map_sg_no_iommu(dev, sglist, nelems, dir); + else if (IS_ERR(domain)) return 0; dma_mask = *dev->dma_mask; @@ -3395,7 +3410,7 @@ static size_t amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova, } static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, - unsigned long iova) + dma_addr_t iova) { struct protection_domain *domain = dom->priv; unsigned long offset_mask; @@ -3932,9 +3947,6 @@ static struct irq_remap_table *get_irq_table(u16 devid, bool ioapic) if (!table) goto out; - /* Initialize table spin-lock */ - spin_lock_init(&table->lock); - if (ioapic) /* Keep the first 32 indexes free for IOAPIC interrupts */ table->min_index = 32; @@ -3995,7 +4007,7 @@ static int alloc_irq_index(struct irq_cfg *cfg, u16 devid, int count) c = 0; if (c == count) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; for (; c != 0; --c) table->table[index - c + 1] = IRTE_ALLOCATED; @@ -4003,9 +4015,9 @@ static int alloc_irq_index(struct irq_cfg *cfg, u16 devid, int count) index -= count - 1; cfg->remapped = 1; - irte_info = &cfg->irq_2_irte; - irte_info->devid = devid; - irte_info->index = index; + irte_info = &cfg->irq_2_iommu; + irte_info->sub_handle = devid; + irte_info->irte_index = index; goto out; } @@ -4086,7 +4098,7 @@ static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, struct io_apic_irq_attr *attr) { struct irq_remap_table *table; - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; struct irq_cfg *cfg; union irte irte; int ioapic_id; @@ -4098,7 +4110,7 @@ static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, if (!cfg) return -EINVAL; - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; ioapic_id = mpc_ioapic_id(attr->ioapic); devid = get_ioapic_devid(ioapic_id); @@ -4113,8 +4125,8 @@ static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, /* Setup IRQ remapping info */ cfg->remapped = 1; - irte_info->devid = devid; - irte_info->index = index; + irte_info->sub_handle = devid; + irte_info->irte_index = index; /* Setup IRTE for IOMMU */ irte.val = 0; @@ -4148,7 +4160,7 @@ static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, static int set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; unsigned int dest, irq; struct irq_cfg *cfg; union irte irte; @@ -4159,12 +4171,12 @@ static int set_affinity(struct irq_data *data, const struct cpumask *mask, cfg = data->chip_data; irq = data->irq; - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; if (!cpumask_intersects(mask, cpu_online_mask)) return -EINVAL; - if (get_irte(irte_info->devid, irte_info->index, &irte)) + if (get_irte(irte_info->sub_handle, irte_info->irte_index, &irte)) return -EBUSY; if (assign_irq_vector(irq, cfg, mask)) @@ -4180,7 +4192,7 @@ static int set_affinity(struct irq_data *data, const struct cpumask *mask, irte.fields.vector = cfg->vector; irte.fields.destination = dest; - modify_irte(irte_info->devid, irte_info->index, irte); + modify_irte(irte_info->sub_handle, irte_info->irte_index, irte); if (cfg->move_in_progress) send_cleanup_vector(cfg); @@ -4192,16 +4204,16 @@ static int set_affinity(struct irq_data *data, const struct cpumask *mask, static int free_irq(int irq) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; struct irq_cfg *cfg; cfg = irq_get_chip_data(irq); if (!cfg) return -EINVAL; - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; - free_irte(irte_info->devid, irte_info->index); + free_irte(irte_info->sub_handle, irte_info->irte_index); return 0; } @@ -4210,7 +4222,7 @@ static void compose_msi_msg(struct pci_dev *pdev, unsigned int irq, unsigned int dest, struct msi_msg *msg, u8 hpet_id) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; struct irq_cfg *cfg; union irte irte; @@ -4218,7 +4230,7 @@ static void compose_msi_msg(struct pci_dev *pdev, if (!cfg) return; - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; irte.val = 0; irte.fields.vector = cfg->vector; @@ -4227,11 +4239,11 @@ static void compose_msi_msg(struct pci_dev *pdev, irte.fields.dm = apic->irq_dest_mode; irte.fields.valid = 1; - modify_irte(irte_info->devid, irte_info->index, irte); + modify_irte(irte_info->sub_handle, irte_info->irte_index, irte); msg->address_hi = MSI_ADDR_BASE_HI; msg->address_lo = MSI_ADDR_BASE_LO; - msg->data = irte_info->index; + msg->data = irte_info->irte_index; } static int msi_alloc_irq(struct pci_dev *pdev, int irq, int nvec) @@ -4256,7 +4268,7 @@ static int msi_alloc_irq(struct pci_dev *pdev, int irq, int nvec) static int msi_setup_irq(struct pci_dev *pdev, unsigned int irq, int index, int offset) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; struct irq_cfg *cfg; u16 devid; @@ -4271,18 +4283,18 @@ static int msi_setup_irq(struct pci_dev *pdev, unsigned int irq, return 0; devid = get_device_id(&pdev->dev); - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; cfg->remapped = 1; - irte_info->devid = devid; - irte_info->index = index + offset; + irte_info->sub_handle = devid; + irte_info->irte_index = index + offset; return 0; } static int setup_hpet_msi(unsigned int irq, unsigned int id) { - struct irq_2_irte *irte_info; + struct irq_2_iommu *irte_info; struct irq_cfg *cfg; int index, devid; @@ -4290,7 +4302,7 @@ static int setup_hpet_msi(unsigned int irq, unsigned int id) if (!cfg) return -EINVAL; - irte_info = &cfg->irq_2_irte; + irte_info = &cfg->irq_2_iommu; devid = get_hpet_devid(id); if (devid < 0) return devid; @@ -4300,8 +4312,8 @@ static int setup_hpet_msi(unsigned int irq, unsigned int id) return index; cfg->remapped = 1; - irte_info->devid = devid; - irte_info->index = index; + irte_info->sub_handle = devid; + irte_info->irte_index = index; return 0; } diff --git a/trunk/drivers/iommu/amd_iommu_init.c b/trunk/drivers/iommu/amd_iommu_init.c index 9d23552a9619..e3c2d74b7684 100644 --- a/trunk/drivers/iommu/amd_iommu_init.c +++ b/trunk/drivers/iommu/amd_iommu_init.c @@ -213,14 +213,6 @@ enum iommu_init_state { IOMMU_INIT_ERROR, }; -/* Early ioapic and hpet maps from kernel command line */ -#define EARLY_MAP_SIZE 4 -static struct devid_map __initdata early_ioapic_map[EARLY_MAP_SIZE]; -static struct devid_map __initdata early_hpet_map[EARLY_MAP_SIZE]; -static int __initdata early_ioapic_map_size; -static int __initdata early_hpet_map_size; -static bool __initdata cmdline_maps; - static enum iommu_init_state init_state = IOMMU_START_STATE; static int amd_iommu_enable_interrupts(void); @@ -711,62 +703,27 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, set_iommu_for_device(iommu, devid); } -static int __init add_special_device(u8 type, u8 id, u16 devid, bool cmd_line) +static int add_special_device(u8 type, u8 id, u16 devid) { struct devid_map *entry; struct list_head *list; - if (type == IVHD_SPECIAL_IOAPIC) - list = &ioapic_map; - else if (type == IVHD_SPECIAL_HPET) - list = &hpet_map; - else + if (type != IVHD_SPECIAL_IOAPIC && type != IVHD_SPECIAL_HPET) return -EINVAL; - list_for_each_entry(entry, list, list) { - if (!(entry->id == id && entry->cmd_line)) - continue; - - pr_info("AMD-Vi: Command-line override present for %s id %d - ignoring\n", - type == IVHD_SPECIAL_IOAPIC ? "IOAPIC" : "HPET", id); - - return 0; - } - entry = kzalloc(sizeof(*entry), GFP_KERNEL); if (!entry) return -ENOMEM; - entry->id = id; - entry->devid = devid; - entry->cmd_line = cmd_line; - - list_add_tail(&entry->list, list); - - return 0; -} - -static int __init add_early_maps(void) -{ - int i, ret; + entry->id = id; + entry->devid = devid; - for (i = 0; i < early_ioapic_map_size; ++i) { - ret = add_special_device(IVHD_SPECIAL_IOAPIC, - early_ioapic_map[i].id, - early_ioapic_map[i].devid, - early_ioapic_map[i].cmd_line); - if (ret) - return ret; - } + if (type == IVHD_SPECIAL_IOAPIC) + list = &ioapic_map; + else + list = &hpet_map; - for (i = 0; i < early_hpet_map_size; ++i) { - ret = add_special_device(IVHD_SPECIAL_HPET, - early_hpet_map[i].id, - early_hpet_map[i].devid, - early_hpet_map[i].cmd_line); - if (ret) - return ret; - } + list_add_tail(&entry->list, list); return 0; } @@ -807,12 +764,6 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, u32 dev_i, ext_flags = 0; bool alias = false; struct ivhd_entry *e; - int ret; - - - ret = add_early_maps(); - if (ret) - return ret; /* * First save the recommended feature enable bits from ACPI @@ -978,7 +929,7 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, PCI_FUNC(devid)); set_dev_entry_from_acpi(iommu, devid, e->flags, 0); - ret = add_special_device(type, handle, devid, false); + ret = add_special_device(type, handle, devid); if (ret) return ret; break; @@ -1324,7 +1275,7 @@ static int iommu_setup_msi(struct amd_iommu *iommu) amd_iommu_int_handler, amd_iommu_int_thread, 0, "AMD-Vi", - iommu); + iommu->dev); if (r) { pci_disable_msi(iommu->dev); @@ -1687,28 +1638,18 @@ static void __init free_on_init_error(void) static bool __init check_ioapic_information(void) { - const char *fw_bug = FW_BUG; bool ret, has_sb_ioapic; int idx; has_sb_ioapic = false; ret = false; - /* - * If we have map overrides on the kernel command line the - * messages in this function might not describe firmware bugs - * anymore - so be careful - */ - if (cmdline_maps) - fw_bug = ""; - for (idx = 0; idx < nr_ioapics; idx++) { int devid, id = mpc_ioapic_id(idx); devid = get_ioapic_devid(id); if (devid < 0) { - pr_err("%sAMD-Vi: IOAPIC[%d] not in IVRS table\n", - fw_bug, id); + pr_err(FW_BUG "AMD-Vi: IOAPIC[%d] not in IVRS table\n", id); ret = false; } else if (devid == IOAPIC_SB_DEVID) { has_sb_ioapic = true; @@ -1725,11 +1666,11 @@ static bool __init check_ioapic_information(void) * when the BIOS is buggy and provides us the wrong * device id for the IOAPIC in the system. */ - pr_err("%sAMD-Vi: No southbridge IOAPIC found\n", fw_bug); + pr_err(FW_BUG "AMD-Vi: No southbridge IOAPIC found in IVRS table\n"); } if (!ret) - pr_err("AMD-Vi: Disabling interrupt remapping\n"); + pr_err("AMD-Vi: Disabling interrupt remapping due to BIOS Bug(s)\n"); return ret; } @@ -1860,7 +1801,6 @@ static int __init early_amd_iommu_init(void) * Interrupt remapping enabled, create kmem_cache for the * remapping tables. */ - ret = -ENOMEM; amd_iommu_irq_cache = kmem_cache_create("irq_remap_cache", MAX_IRQS_PER_TABLE * sizeof(u32), IRQ_TABLE_ALIGNMENT, @@ -2157,70 +2097,8 @@ static int __init parse_amd_iommu_options(char *str) return 1; } -static int __init parse_ivrs_ioapic(char *str) -{ - unsigned int bus, dev, fn; - int ret, id, i; - u16 devid; - - ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn); - - if (ret != 4) { - pr_err("AMD-Vi: Invalid command line: ivrs_ioapic%s\n", str); - return 1; - } - - if (early_ioapic_map_size == EARLY_MAP_SIZE) { - pr_err("AMD-Vi: Early IOAPIC map overflow - ignoring ivrs_ioapic%s\n", - str); - return 1; - } - - devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7); - - cmdline_maps = true; - i = early_ioapic_map_size++; - early_ioapic_map[i].id = id; - early_ioapic_map[i].devid = devid; - early_ioapic_map[i].cmd_line = true; - - return 1; -} - -static int __init parse_ivrs_hpet(char *str) -{ - unsigned int bus, dev, fn; - int ret, id, i; - u16 devid; - - ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn); - - if (ret != 4) { - pr_err("AMD-Vi: Invalid command line: ivrs_hpet%s\n", str); - return 1; - } - - if (early_hpet_map_size == EARLY_MAP_SIZE) { - pr_err("AMD-Vi: Early HPET map overflow - ignoring ivrs_hpet%s\n", - str); - return 1; - } - - devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7); - - cmdline_maps = true; - i = early_hpet_map_size++; - early_hpet_map[i].id = id; - early_hpet_map[i].devid = devid; - early_hpet_map[i].cmd_line = true; - - return 1; -} - -__setup("amd_iommu_dump", parse_amd_iommu_dump); -__setup("amd_iommu=", parse_amd_iommu_options); -__setup("ivrs_ioapic", parse_ivrs_ioapic); -__setup("ivrs_hpet", parse_ivrs_hpet); +__setup("amd_iommu_dump", parse_amd_iommu_dump); +__setup("amd_iommu=", parse_amd_iommu_options); IOMMU_INIT_FINISH(amd_iommu_detect, gart_iommu_hole_init, diff --git a/trunk/drivers/iommu/amd_iommu_types.h b/trunk/drivers/iommu/amd_iommu_types.h index b81153fb9e60..e38ab438bb34 100644 --- a/trunk/drivers/iommu/amd_iommu_types.h +++ b/trunk/drivers/iommu/amd_iommu_types.h @@ -99,7 +99,6 @@ #define PASID_MASK 0x000fffff /* MMIO status bits */ -#define MMIO_STATUS_EVT_INT_MASK (1 << 1) #define MMIO_STATUS_COM_WAIT_INT_MASK (1 << 2) #define MMIO_STATUS_PPR_INT_MASK (1 << 6) @@ -592,7 +591,6 @@ struct devid_map { struct list_head list; u8 id; u16 devid; - bool cmd_line; }; /* Map HPET and IOAPIC ids to the devid used by the IOMMU */ diff --git a/trunk/drivers/iommu/exynos-iommu.c b/trunk/drivers/iommu/exynos-iommu.c index 238a3caa949a..3f32d64ab87a 100644 --- a/trunk/drivers/iommu/exynos-iommu.c +++ b/trunk/drivers/iommu/exynos-iommu.c @@ -1027,7 +1027,7 @@ static size_t exynos_iommu_unmap(struct iommu_domain *domain, } static phys_addr_t exynos_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) + dma_addr_t iova) { struct exynos_iommu_domain *priv = domain->priv; unsigned long *entry; diff --git a/trunk/drivers/iommu/intel-iommu.c b/trunk/drivers/iommu/intel-iommu.c index 0099667a397e..6e0b9ffc79b5 100644 --- a/trunk/drivers/iommu/intel-iommu.c +++ b/trunk/drivers/iommu/intel-iommu.c @@ -4111,7 +4111,7 @@ static size_t intel_iommu_unmap(struct iommu_domain *domain, } static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) + dma_addr_t iova) { struct dmar_domain *dmar_domain = domain->priv; struct dma_pte *pte; diff --git a/trunk/drivers/iommu/iommu.c b/trunk/drivers/iommu/iommu.c index b972d430d92b..f730ed9d8af9 100644 --- a/trunk/drivers/iommu/iommu.c +++ b/trunk/drivers/iommu/iommu.c @@ -706,8 +706,7 @@ void iommu_detach_group(struct iommu_domain *domain, struct iommu_group *group) } EXPORT_SYMBOL_GPL(iommu_detach_group); -phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) +phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova) { if (unlikely(domain->ops->iova_to_phys == NULL)) return 0; diff --git a/trunk/drivers/iommu/msm_iommu.c b/trunk/drivers/iommu/msm_iommu.c index 6a8870a31668..8ab4f41090af 100644 --- a/trunk/drivers/iommu/msm_iommu.c +++ b/trunk/drivers/iommu/msm_iommu.c @@ -554,7 +554,7 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, } static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long va) + dma_addr_t va) { struct msm_priv *priv; struct msm_iommu_drvdata *iommu_drvdata; diff --git a/trunk/drivers/iommu/omap-iommu.c b/trunk/drivers/iommu/omap-iommu.c index 6ac02fa5910f..e02e5d71745b 100644 --- a/trunk/drivers/iommu/omap-iommu.c +++ b/trunk/drivers/iommu/omap-iommu.c @@ -1219,7 +1219,7 @@ static void omap_iommu_domain_destroy(struct iommu_domain *domain) } static phys_addr_t omap_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long da) + dma_addr_t da) { struct omap_iommu_domain *omap_domain = domain->priv; struct omap_iommu *oiommu = omap_domain->iommu_dev; diff --git a/trunk/drivers/iommu/shmobile-iommu.c b/trunk/drivers/iommu/shmobile-iommu.c index b6e8b57cf0a8..d572863dfccd 100644 --- a/trunk/drivers/iommu/shmobile-iommu.c +++ b/trunk/drivers/iommu/shmobile-iommu.c @@ -296,7 +296,7 @@ static size_t shmobile_iommu_unmap(struct iommu_domain *domain, } static phys_addr_t shmobile_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) + dma_addr_t iova) { struct shmobile_iommu_domain *sh_domain = domain->priv; uint32_t l1entry = 0, l2entry = 0; diff --git a/trunk/drivers/iommu/tegra-gart.c b/trunk/drivers/iommu/tegra-gart.c index 86437575f94d..4aec8be38054 100644 --- a/trunk/drivers/iommu/tegra-gart.c +++ b/trunk/drivers/iommu/tegra-gart.c @@ -279,7 +279,7 @@ static size_t gart_iommu_unmap(struct iommu_domain *domain, unsigned long iova, } static phys_addr_t gart_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) + dma_addr_t iova) { struct gart_device *gart = domain->priv; unsigned long pte; diff --git a/trunk/drivers/iommu/tegra-smmu.c b/trunk/drivers/iommu/tegra-smmu.c index b34e5fd7fd9e..bc9b59949d09 100644 --- a/trunk/drivers/iommu/tegra-smmu.c +++ b/trunk/drivers/iommu/tegra-smmu.c @@ -757,7 +757,7 @@ static size_t smmu_iommu_unmap(struct iommu_domain *domain, unsigned long iova, } static phys_addr_t smmu_iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) + dma_addr_t iova) { struct smmu_as *as = domain->priv; unsigned long *pte; diff --git a/trunk/include/linux/iommu.h b/trunk/include/linux/iommu.h index ba3b8a98a049..bb0a0fc26729 100644 --- a/trunk/include/linux/iommu.h +++ b/trunk/include/linux/iommu.h @@ -91,8 +91,7 @@ struct iommu_ops { phys_addr_t paddr, size_t size, int prot); size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, size_t size); - phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, - unsigned long iova); + phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova); int (*domain_has_cap)(struct iommu_domain *domain, unsigned long cap); int (*add_device)(struct device *dev); @@ -134,8 +133,7 @@ extern int iommu_map(struct iommu_domain *domain, unsigned long iova, phys_addr_t paddr, size_t size, int prot); extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size); -extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova); +extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); extern int iommu_domain_has_cap(struct iommu_domain *domain, unsigned long cap); extern void iommu_set_fault_handler(struct iommu_domain *domain, @@ -267,8 +265,7 @@ static inline void iommu_domain_window_disable(struct iommu_domain *domain, { } -static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, - unsigned long iova) +static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova) { return 0; }