Loading arch/arm/mach-omap2/iommu2.c +3 −1 Original line number Diff line number Diff line Loading @@ -147,6 +147,7 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra) printk("\n"); iommu_write_reg(obj, stat, MMU_IRQSTATUS); omap2_iommu_disable(obj); return stat; } Loading Loading @@ -212,7 +213,8 @@ static ssize_t omap2_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf) char *p = buf; /* FIXME: Need more detail analysis of cam/ram */ p += sprintf(p, "%08x %08x\n", cr->cam, cr->ram); p += sprintf(p, "%08x %08x %01x\n", cr->cam, cr->ram, (cr->cam & MMU_CAM_P) ? 1 : 0); return p - buf; } Loading arch/arm/plat-omap/iommu.c +26 −17 Original line number Diff line number Diff line Loading @@ -172,15 +172,12 @@ static void iotlb_lock_get(struct iommu *obj, struct iotlb_lock *l) l->base = MMU_LOCK_BASE(val); l->vict = MMU_LOCK_VICT(val); BUG_ON(l->base != 0); /* Currently no preservation is used */ } static void iotlb_lock_set(struct iommu *obj, struct iotlb_lock *l) { u32 val; BUG_ON(l->base != 0); /* Currently no preservation is used */ val = (l->base << MMU_LOCK_BASE_SHIFT); val |= (l->vict << MMU_LOCK_VICT_SHIFT); Loading Loading @@ -231,7 +228,14 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) clk_enable(obj->clk); for (i = 0; i < obj->nr_tlb_entries; i++) { iotlb_lock_get(obj, &l); if (l.base == obj->nr_tlb_entries) { dev_warn(obj->dev, "%s: preserve entries full\n", __func__); err = -EBUSY; goto out; } if (!e->prsvd) { for (i = l.base; i < obj->nr_tlb_entries; i++) { struct cr_regs tmp; iotlb_lock_get(obj, &l); Loading @@ -241,12 +245,15 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) if (!iotlb_cr_valid(&tmp)) break; } if (i == obj->nr_tlb_entries) { dev_dbg(obj->dev, "%s: full: no entry\n", __func__); err = -EBUSY; goto out; } } else { l.vict = l.base; iotlb_lock_set(obj, &l); } cr = iotlb_alloc_cr(obj, e); if (IS_ERR(cr)) { Loading @@ -257,9 +264,11 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) iotlb_load_cr(obj, cr); kfree(cr); if (e->prsvd) l.base++; /* increment victim for next tlb load */ if (++l.vict == obj->nr_tlb_entries) l.vict = 0; l.vict = l.base; iotlb_lock_set(obj, &l); out: clk_disable(obj->clk); Loading Loading
arch/arm/mach-omap2/iommu2.c +3 −1 Original line number Diff line number Diff line Loading @@ -147,6 +147,7 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra) printk("\n"); iommu_write_reg(obj, stat, MMU_IRQSTATUS); omap2_iommu_disable(obj); return stat; } Loading Loading @@ -212,7 +213,8 @@ static ssize_t omap2_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf) char *p = buf; /* FIXME: Need more detail analysis of cam/ram */ p += sprintf(p, "%08x %08x\n", cr->cam, cr->ram); p += sprintf(p, "%08x %08x %01x\n", cr->cam, cr->ram, (cr->cam & MMU_CAM_P) ? 1 : 0); return p - buf; } Loading
arch/arm/plat-omap/iommu.c +26 −17 Original line number Diff line number Diff line Loading @@ -172,15 +172,12 @@ static void iotlb_lock_get(struct iommu *obj, struct iotlb_lock *l) l->base = MMU_LOCK_BASE(val); l->vict = MMU_LOCK_VICT(val); BUG_ON(l->base != 0); /* Currently no preservation is used */ } static void iotlb_lock_set(struct iommu *obj, struct iotlb_lock *l) { u32 val; BUG_ON(l->base != 0); /* Currently no preservation is used */ val = (l->base << MMU_LOCK_BASE_SHIFT); val |= (l->vict << MMU_LOCK_VICT_SHIFT); Loading Loading @@ -231,7 +228,14 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) clk_enable(obj->clk); for (i = 0; i < obj->nr_tlb_entries; i++) { iotlb_lock_get(obj, &l); if (l.base == obj->nr_tlb_entries) { dev_warn(obj->dev, "%s: preserve entries full\n", __func__); err = -EBUSY; goto out; } if (!e->prsvd) { for (i = l.base; i < obj->nr_tlb_entries; i++) { struct cr_regs tmp; iotlb_lock_get(obj, &l); Loading @@ -241,12 +245,15 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) if (!iotlb_cr_valid(&tmp)) break; } if (i == obj->nr_tlb_entries) { dev_dbg(obj->dev, "%s: full: no entry\n", __func__); err = -EBUSY; goto out; } } else { l.vict = l.base; iotlb_lock_set(obj, &l); } cr = iotlb_alloc_cr(obj, e); if (IS_ERR(cr)) { Loading @@ -257,9 +264,11 @@ int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) iotlb_load_cr(obj, cr); kfree(cr); if (e->prsvd) l.base++; /* increment victim for next tlb load */ if (++l.vict == obj->nr_tlb_entries) l.vict = 0; l.vict = l.base; iotlb_lock_set(obj, &l); out: clk_disable(obj->clk); Loading