Merge branch 'wip-mips-pm' of https://github.com/paulburton/linux into mips-for-linux...
[pandora-kernel.git] / arch / mips / mm / tlb-r4k.c
index 89e3fab..3914e27 100644 (file)
 
 extern void build_tlb_refill_handler(void);
 
-/* Atomicity and interruptability */
-#ifdef CONFIG_MIPS_MT_SMTC
-
-#include <asm/smtc.h>
-#include <asm/mipsmtregs.h>
-
-#define ENTER_CRITICAL(flags) \
-       { \
-       unsigned int mvpflags; \
-       local_irq_save(flags);\
-       mvpflags = dvpe()
-#define EXIT_CRITICAL(flags) \
-       evpe(mvpflags); \
-       local_irq_restore(flags); \
-       }
-#else
-
-#define ENTER_CRITICAL(flags) local_irq_save(flags)
-#define EXIT_CRITICAL(flags) local_irq_restore(flags)
-
-#endif /* CONFIG_MIPS_MT_SMTC */
-
 /*
  * LOONGSON2/3 has a 4 entry itlb which is a subset of dtlb,
  * unfortunately, itlb is not totally transparent to software.
@@ -76,7 +54,7 @@ void local_flush_tlb_all(void)
        unsigned long old_ctx;
        int entry, ftlbhighset;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
        /* Save old context and create impossible VPN2 value */
        old_ctx = read_c0_entryhi();
        write_c0_entrylo0(0);
@@ -113,7 +91,7 @@ void local_flush_tlb_all(void)
        tlbw_use_hazard();
        write_c0_entryhi(old_ctx);
        flush_itlb();
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 }
 EXPORT_SYMBOL(local_flush_tlb_all);
 
@@ -143,7 +121,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
        if (cpu_context(cpu, mm) != 0) {
                unsigned long size, flags;
 
-               ENTER_CRITICAL(flags);
+               local_irq_save(flags);
                start = round_down(start, PAGE_SIZE << 1);
                end = round_up(end, PAGE_SIZE << 1);
                size = (end - start) >> (PAGE_SHIFT + 1);
@@ -177,7 +155,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
                        drop_mmu_context(mm, cpu);
                }
                flush_itlb();
-               EXIT_CRITICAL(flags);
+               local_irq_restore(flags);
        }
 }
 
@@ -185,7 +163,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
 {
        unsigned long size, flags;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
        size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
        size = (size + 1) >> 1;
        if (size <= (current_cpu_data.tlbsizeftlbsets ?
@@ -221,7 +199,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
                local_flush_tlb_all();
        }
        flush_itlb();
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 }
 
 void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
@@ -234,7 +212,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
 
                newpid = cpu_asid(cpu, vma->vm_mm);
                page &= (PAGE_MASK << 1);
-               ENTER_CRITICAL(flags);
+               local_irq_save(flags);
                oldpid = read_c0_entryhi();
                write_c0_entryhi(page | newpid);
                mtc0_tlbw_hazard();
@@ -254,7 +232,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
        finish:
                write_c0_entryhi(oldpid);
                flush_itlb_vm(vma);
-               EXIT_CRITICAL(flags);
+               local_irq_restore(flags);
        }
 }
 
@@ -267,7 +245,7 @@ void local_flush_tlb_one(unsigned long page)
        unsigned long flags;
        int oldpid, idx;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
        oldpid = read_c0_entryhi();
        page &= (PAGE_MASK << 1);
        write_c0_entryhi(page);
@@ -286,7 +264,7 @@ void local_flush_tlb_one(unsigned long page)
        }
        write_c0_entryhi(oldpid);
        flush_itlb();
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 }
 
 /*
@@ -309,7 +287,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
        if (current->active_mm != vma->vm_mm)
                return;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
 
        pid = read_c0_entryhi() & ASID_MASK;
        address &= (PAGE_MASK << 1);
@@ -359,7 +337,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
        }
        tlbw_use_hazard();
        flush_itlb_vm(vma);
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 }
 
 void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
@@ -370,7 +348,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
        unsigned long old_pagemask;
        unsigned long old_ctx;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
        /* Save old context and create impossible VPN2 value */
        old_ctx = read_c0_entryhi();
        old_pagemask = read_c0_pagemask();
@@ -390,7 +368,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
        tlbw_use_hazard();      /* What is the hazard here? */
        write_c0_pagemask(old_pagemask);
        local_flush_tlb_all();
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 }
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
@@ -400,13 +378,13 @@ int __init has_transparent_hugepage(void)
        unsigned int mask;
        unsigned long flags;
 
-       ENTER_CRITICAL(flags);
+       local_irq_save(flags);
        write_c0_pagemask(PM_HUGE_MASK);
        back_to_back_c0_hazard();
        mask = read_c0_pagemask();
        write_c0_pagemask(PM_DEFAULT_MASK);
 
-       EXIT_CRITICAL(flags);
+       local_irq_restore(flags);
 
        return mask == PM_HUGE_MASK;
 }