On Mon, Jun 22, 2009 at 12:02:53PM +0200, konrad@xxxxxxxxxxx wrote: > From: Konrad Eisele <konrad@xxxxxxxxxxx> > > The sparc-leon caches are virtually tagged so a flush is needed on ctx > switch. > > Signed-off-by: Konrad Eisele <konrad@xxxxxxxxxxx> > --- > arch/sparc/mm/srmmu.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 54 insertions(+), 1 deletions(-) > > diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c > index ade4eb3..8d0316d 100644 > --- a/arch/sparc/mm/srmmu.c > +++ b/arch/sparc/mm/srmmu.c > @@ -46,6 +46,7 @@ > #include <asm/tsunami.h> > #include <asm/swift.h> > #include <asm/turbosparc.h> > +#include <asm/leon.h> > > #include <asm/btfixup.h> > > @@ -569,6 +570,10 @@ static void srmmu_switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, > srmmu_ctxd_set(&srmmu_context_table[mm->context], mm->pgd); > } > > + if (sparc_cpu_model == sparc_leon) { > + leon_switch_mm(); > + } > + > if (is_hypersparc) > hyper_flush_whole_icache(); > > @@ -1977,6 +1982,47 @@ static void __init init_viking(void) > poke_srmmu = poke_viking; > } > > +#ifdef CONFIG_SPARC_LEON > + > +void __init poke_leonsparc(void) > +{ > +} > + > +void __init init_leon(void) > +{ > + > + srmmu_name = "Leon"; > + > + BTFIXUPSET_CALL(flush_cache_all, leon_flush_cache_all, > + BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_cache_mm, leon_flush_cache_all, > + BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_cache_page, leon_flush_pcache_all, > + BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_cache_range, leon_flush_cache_all, > + BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_page_for_dma, leon_flush_dcache_all, > + BTFIXUPCALL_NORM); > + > + BTFIXUPSET_CALL(flush_tlb_all, leon_flush_tlb_all, BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_tlb_mm, leon_flush_tlb_all, BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_tlb_page, leon_flush_tlb_all, BTFIXUPCALL_NORM); > + BTFIXUPSET_CALL(flush_tlb_range, leon_flush_tlb_all, BTFIXUPCALL_NORM); > + > + BTFIXUPSET_CALL(__flush_page_to_ram, leon_flush_cache_all, > + BTFIXUPCALL_NOP); > + BTFIXUPSET_CALL(flush_sig_insns, leon_flush_cache_all, BTFIXUPCALL_NOP); > + > + poke_srmmu = poke_leonsparc; > + > + srmmu_cache_pagetables = 0; > + > + leon_flush_during_switch = leon_flush_needed(); > +} > +#else > +#define init_leon() > +#endif You already did this dummy definition in the header file. > + if (sparc_cpu_model == sparc_leon) { > + psr_typ = 0xf; /* hardcoded ids for older models/simulators */ > + psr_vers = 2; > + init_leon(); /* macro if !CONFIG_SPARC_LEON */ drop comment. We do not do so in similar places. > + return; > + } > + > /* First, check for HyperSparc or Cypress. */ > if(mod_typ == 1) { > switch(mod_rev) { Sam -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html