include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / arch / arm / plat-omap / iommu.c
index 4cf449f..0e13766 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * omap iommu: tlb and pagetable primitives
  *
- * Copyright (C) 2008-2009 Nokia Corporation
+ * Copyright (C) 2008-2010 Nokia Corporation
  *
  * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>,
  *             Paul Mundt and Toshihiro Kobayashi
@@ -13,6 +13,7 @@
 
 #include <linux/err.h>
 #include <linux/module.h>
+#include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/clk.h>
@@ -20,7 +21,7 @@
 
 #include <asm/cacheflush.h>
 
-#include <mach/iommu.h>
+#include <plat/iommu.h>
 
 #include "iopgtable.h"
 
@@ -298,7 +299,7 @@ void flush_iotlb_page(struct iommu *obj, u32 da)
                if ((start <= da) && (da < start + bytes)) {
                        dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
                                __func__, start, da, bytes);
-
+                       iotlb_load_cr(obj, &cr);
                        iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
                }
        }
@@ -351,16 +352,14 @@ EXPORT_SYMBOL_GPL(flush_iotlb_all);
 
 #if defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE)
 
-ssize_t iommu_dump_ctx(struct iommu *obj, char *buf)
+ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t bytes)
 {
-       ssize_t bytes;
-
        if (!obj || !buf)
                return -EINVAL;
 
        clk_enable(obj->clk);
 
-       bytes = arch_iommu->dump_ctx(obj, buf);
+       bytes = arch_iommu->dump_ctx(obj, buf, bytes);
 
        clk_disable(obj->clk);
 
@@ -368,7 +367,7 @@ ssize_t iommu_dump_ctx(struct iommu *obj, char *buf)
 }
 EXPORT_SYMBOL_GPL(iommu_dump_ctx);
 
-static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
+static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs, int num)
 {
        int i;
        struct iotlb_lock saved, l;
@@ -379,7 +378,7 @@ static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
        iotlb_lock_get(obj, &saved);
        memcpy(&l, &saved, sizeof(saved));
 
-       for (i = 0; i < obj->nr_tlb_entries; i++) {
+       for (i = 0; i < num; i++) {
                struct cr_regs tmp;
 
                iotlb_lock_get(obj, &l);
@@ -402,18 +401,21 @@ static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
  * @obj:       target iommu
  * @buf:       output buffer
  **/
-size_t dump_tlb_entries(struct iommu *obj, char *buf)
+size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t bytes)
 {
-       int i, n;
+       int i, num;
        struct cr_regs *cr;
        char *p = buf;
 
-       cr = kcalloc(obj->nr_tlb_entries, sizeof(*cr), GFP_KERNEL);
+       num = bytes / sizeof(*cr);
+       num = min(obj->nr_tlb_entries, num);
+
+       cr = kcalloc(num, sizeof(*cr), GFP_KERNEL);
        if (!cr)
                return 0;
 
-       n = __dump_tlb_entries(obj, cr);
-       for (i = 0; i < n; i++)
+       num = __dump_tlb_entries(obj, cr, num);
+       for (i = 0; i < num; i++)
                p += iotlb_dump_cr(obj, cr + i, p);
        kfree(cr);
 
@@ -645,7 +647,7 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da)
                if (*iopte & IOPTE_LARGE) {
                        nent *= 16;
                        /* rewind to the 1st entry */
-                       iopte = (u32 *)((u32)iopte & IOLARGE_MASK);
+                       iopte = iopte_offset(iopgd, (da & IOLARGE_MASK));
                }
                bytes *= nent;
                memset(iopte, 0, nent * sizeof(*iopte));
@@ -663,10 +665,10 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da)
                nent = 1; /* for the next L1 entry */
        } else {
                bytes = IOPGD_SIZE;
-               if (*iopgd & IOPGD_SUPER) {
+               if ((*iopgd & IOPGD_SUPER) == IOPGD_SUPER) {
                        nent *= 16;
                        /* rewind to the 1st entry */
-                       iopgd = (u32 *)((u32)iopgd & IOSUPER_MASK);
+                       iopgd = iopgd_offset(obj, (da & IOSUPER_MASK));
                }
                bytes *= nent;
        }
@@ -826,7 +828,7 @@ EXPORT_SYMBOL_GPL(iommu_get);
  **/
 void iommu_put(struct iommu *obj)
 {
-       if (!obj && IS_ERR(obj))
+       if (!obj || IS_ERR(obj))
                return;
 
        mutex_lock(&obj->iommu_lock);