Merge branch 'agp-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[pandora-kernel.git] / arch / sparc / mm / srmmu.c
index ade4eb3..509b1ff 100644 (file)
@@ -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,9 @@ 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 +1981,45 @@ 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();
+}
+#endif
+
 /* Probe for the srmmu chip version. */
 static void __init get_srmmu_type(void)
 {
@@ -1992,7 +2035,15 @@ static void __init get_srmmu_type(void)
        psr_typ = (psr >> 28) & 0xf;
        psr_vers = (psr >> 24) & 0xf;
 
-       /* First, check for HyperSparc or Cypress. */
+       /* First, check for sparc-leon. */
+       if (sparc_cpu_model == sparc_leon) {
+               psr_typ = 0xf;  /* hardcoded ids for older models/simulators */
+               psr_vers = 2;
+               init_leon();
+               return;
+       }
+
+       /* Second, check for HyperSparc or Cypress. */
        if(mod_typ == 1) {
                switch(mod_rev) {
                case 7: