Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / arch / sh / mm / tlb-sh5.c
index fdb64e4..f27dbe1 100644 (file)
@@ -143,3 +143,42 @@ void sh64_setup_tlb_slot(unsigned long long config_addr, unsigned long eaddr,
  */
 void sh64_teardown_tlb_slot(unsigned long long config_addr)
        __attribute__ ((alias("__flush_tlb_slot")));
+
+static int dtlb_entry;
+static unsigned long long dtlb_entries[64];
+
+void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
+{
+       unsigned long long entry;
+       unsigned long paddr, flags;
+
+       BUG_ON(dtlb_entry == ARRAY_SIZE(dtlb_entries));
+
+       local_irq_save(flags);
+
+       entry = sh64_get_wired_dtlb_entry();
+       dtlb_entries[dtlb_entry++] = entry;
+
+       paddr = pte_val(pte) & _PAGE_FLAGS_HARDWARE_MASK;
+       paddr &= ~PAGE_MASK;
+
+       sh64_setup_tlb_slot(entry, addr, get_asid(), paddr);
+
+       local_irq_restore(flags);
+}
+
+void tlb_unwire_entry(void)
+{
+       unsigned long long entry;
+       unsigned long flags;
+
+       BUG_ON(!dtlb_entry);
+
+       local_irq_save(flags);
+       entry = dtlb_entries[dtlb_entry--];
+
+       sh64_teardown_tlb_slot(entry);
+       sh64_put_wired_dtlb_entry(entry);
+
+       local_irq_restore(flags);
+}