tlb handling support for Loongson2 processor
PATCH 14/16 tlb handling support for Loongson2 processor
Signed-off-by Fuxin Zhang <[email protected]>
--- arch/mips/mm/tlb-r4k.c | 21 ++++++++++++++++++++- arch/mips/mm/tlbex.c | 8 +++++--- 2 files changed, 25 insertions(+), 4 deletions(-)
arch/mips/mm/tlb-r4k.c +20 -1
@@ -48,6 +48,20 @@ extern void build_tlb_refill_handler(void);#endif /* CONFIG_MIPS_MT_SMTC */ +#if defined(CONFIG_CPU_LOONGSON2 ) +/* LOONGSON2 has a 4 entry itlb which is a subset of dtlb, unfortrunately, itlb is not totally transparent to software. +*/ +#define FLUSH_ITLB write_c0_diag(4); + +#define FLUSH_ITLB_VM (vma) { if ((vma)->vm_flags & VM_EXEC) write_c0_diag(4); } + +#else + +#define FLUSH_ITLB +#define FLUSH_ITLB_VM (vma) + +#endif +void local_flush_tlb_all (void ) {unsigned long flags;
@@ -73,6 +87,7 @@ void local_flush_tlb_all(void) }tlbw_use_hazard ();write_c0_entryhi (old_ctx); +FLUSH_ITLB ;EXIT_CRITICAL (flags); }
@@ -136,6 +151,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, }else {drop_mmu_context (mm, cpu); } +FLUSH_ITLB ;EXIT_CRITICAL (flags); } }
@@ -178,6 +194,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end) }else {local_flush_tlb_all (); } +FLUSH_ITLB ;EXIT_CRITICAL (flags); }
@@ -210,6 +227,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); } }
@@ -241,7 +259,7 @@ void local_flush_tlb_one(unsigned long page)tlbw_use_hazard (); }write_c0_entryhi (oldpid); - +FLUSH_ITLB ;EXIT_CRITICAL (flags); }
@@ -293,6 +311,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)else tlb_write_indexed ();tlbw_use_hazard (); +FLUSH_ITLB_VM (vma);EXIT_CRITICAL (flags); }
arch/mips/mm/tlbex.c +5 -3
@@ -893,6 +893,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,case CPU_4KSC :case CPU_20KC :case CPU_25KF : +case CPU_LOONGSON2 :tlbw (p);break ;
@@ -1276,7 +1277,8 @@ static void __init build_r4000_tlb_refill_handler(void)* need three, with the second nop'ed and the third being * unused. */ -#ifdef CONFIG_32BIT +/* Loongson2 ebase is different than r4k, we have more space */ +#if defined(CONFIG_32BIT ) || defined(CONFIG_CPU_LOONGSON2 )if ((p - tlb_handler) >64 )panic ("TLB refill handler space exceeded" );#else
@@ -1289,7 +1291,7 @@ static void __init build_r4000_tlb_refill_handler(void)/* * Now fold the handler in the TLB refill handler space. */ -#ifdef CONFIG_32BIT +#if defined(CONFIG_32BIT ) || defined(CONFIG_CPU_LOONGSON2 ) f = final_handler;/* Simplest case, just copy the handler. */ copy_handler (relocs, labels, tlb_handler, p, f);
@@ -1336,7 +1338,7 @@ static void __init build_r4000_tlb_refill_handler(void) final_len); f = final_handler; -#ifdef CONFIG_64BIT +#if defined(CONFIG_64BIT ) && !defined(CONFIG_CPU_LOONGSON2 )if (final_len >32 ) final_len =64 ;else
Signature · 1 line
1.4.4.4