]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
ARM: OMAP: Add MMU TWL support for omap1
authorHiroshi DOYU <Hiroshi.DOYU@nokia.com>
Mon, 30 Jul 2007 11:04:05 +0000 (14:04 +0300)
committerTony Lindgren <tony@atomide.com>
Fri, 10 Aug 2007 09:18:56 +0000 (02:18 -0700)
Table Walking Logic(TWL) is supported in omap1.

Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/mmu.c
arch/arm/plat-omap/mmu.c

index 876952ef734b305a044cb8193ad3430f021a5ddd..66aa0d49b980f221b94fc58b790911a4ce1c9936 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/arch/arm/mach-omap2/mmu.c
+ * linux/arch/arm/mach-omap1/mmu.c
  *
  * Support for non-MPU OMAP1 MMUs.
  *
@@ -329,6 +329,14 @@ static void omap1_mmu_interrupt(struct omap_mmu *mmu)
        schedule_work(&mmu->irq_work);
 }
 
+static pgprot_t omap1_mmu_pte_get_attr(struct omap_mmu_tlb_entry *entry)
+{
+       /* 4KB AP position as default */
+       u32 attr = entry->ap >> 4;
+       attr <<= ((entry->pgsz == OMAP_MMU_CAM_PAGESIZE_1MB) ? 6:0);
+       return attr;
+}
+
 struct omap_mmu_ops omap1_mmu_ops = {
        .startup        = omap1_mmu_startup,
        .shutdown       = omap1_mmu_shutdown,
@@ -341,5 +349,6 @@ struct omap_mmu_ops omap1_mmu_ops = {
        .cam_ram_alloc  = omap1_mmu_cam_ram_alloc,
        .cam_ram_valid  = omap1_mmu_cam_ram_valid,
        .interrupt      = omap1_mmu_interrupt,
+       .pte_get_attr   = omap1_mmu_pte_get_attr,
 };
 EXPORT_SYMBOL_GPL(omap1_mmu_ops);
index 1029724ef10446feafecf8527a30fb1568909cec..5da83fc231fd2eae2156b9bf07b689d5ea4b5fab 100644 (file)
@@ -685,12 +685,10 @@ int omap_mmu_load_pte_entry(struct omap_mmu *mmu,
                            struct omap_mmu_tlb_entry *entry)
 {
        int ret = -1;
-       if ((!entry->prsvd) && (mmu->ops->pte_get_attr)) {
-               /*XXX use PG_flag for prsvd */
-               ret = omap_mmu_load_pte(mmu, entry);
-               if (ret)
-                       return ret;
-       }
+       /*XXX use PG_flag for prsvd */
+       ret = omap_mmu_load_pte(mmu, entry);
+       if (ret)
+               return ret;
        if (entry->tlb)
                ret = omap_mmu_load_tlb_entry(mmu, entry);
        return ret;
@@ -702,8 +700,7 @@ int omap_mmu_clear_pte_entry(struct omap_mmu *mmu, unsigned long vadr)
        int ret = omap_mmu_clear_tlb_entry(mmu, vadr);
        if (ret)
                return ret;
-       if (mmu->ops->pte_get_attr)
-               omap_mmu_clear_pte(mmu, vadr);
+       omap_mmu_clear_pte(mmu, vadr);
        return ret;
 }
 EXPORT_SYMBOL_GPL(omap_mmu_clear_pte_entry);
@@ -1036,17 +1033,18 @@ EXPORT_SYMBOL_GPL(omap_mmu_disable);
 
 void omap_mmu_enable(struct omap_mmu *mmu, int reset)
 {
-       u32 val = OMAP_MMU_CNTL_MMU_EN;
+       u32 val = OMAP_MMU_CNTL_MMU_EN | MMU_CNTL_TWLENABLE;
 
        if (likely(reset))
                omap_mmu_reset(mmu);
 #if defined(CONFIG_ARCH_OMAP2) /* FIXME */
-       if (mmu->ops->pte_get_attr) {
-               omap_mmu_write_reg(mmu, (u32)virt_to_phys(mmu->twl_mm->pgd),
-                                  OMAP_MMU_TTB);
-               val |= MMU_CNTL_TWLENABLE;
-       }
+       omap_mmu_write_reg(mmu, (u32)virt_to_phys(mmu->twl_mm->pgd),
+                          OMAP_MMU_TTB);
 #else
+       omap_mmu_write_reg(mmu, (u32)virt_to_phys(mmu->twl_mm->pgd) & 0xffff,
+                          OMAP_MMU_TTB_L);
+       omap_mmu_write_reg(mmu, (u32)virt_to_phys(mmu->twl_mm->pgd) >> 16,
+                          OMAP_MMU_TTB_H);
        val |= OMAP_MMU_CNTL_RESET_SW;
 #endif
        omap_mmu_write_reg(mmu, val, OMAP_MMU_CNTL);
@@ -1463,13 +1461,10 @@ int omap_mmu_register(struct omap_mmu *mmu)
        if (!mmu->exmap_tbl)
                return -ENOMEM;
 
-       if (mmu->ops->pte_get_attr) {
-               struct mm_struct *mm =  mm_alloc();
-               if (!mm) {
-                       ret = -ENOMEM;
-                       goto err_mm_alloc;
-               }
-               mmu->twl_mm = mm;
+       mmu->twl_mm = mm_alloc();
+       if (!mmu->twl_mm) {
+               ret = -ENOMEM;
+               goto err_mm_alloc;
        }
 
        ret = device_register(&mmu->dev);
@@ -1532,11 +1527,9 @@ void omap_mmu_unregister(struct omap_mmu *mmu)
        kfree(mmu->exmap_tbl);
        mmu->exmap_tbl = NULL;
 
-       if (mmu->ops->pte_get_attr) {
-               if (mmu->twl_mm) {
-                       __mmdrop(mmu->twl_mm);
-                       mmu->twl_mm = NULL;
-               }
+       if (mmu->twl_mm) {
+               __mmdrop(mmu->twl_mm);
+               mmu->twl_mm = NULL;
        }
 
        device_unregister(&mmu->dev);