]> git.sur5r.net Git - u-boot/blobdiff - cpu/mips/cache.S
mpc83xx: clean up cache operations and unlock_ram_in_cache() functions
[u-boot] / cpu / mips / cache.S
index 6d39ba9aac9ef2b23ea694b3dc103fdc435db463..ee5d411e4b6291f0b91b55f3af189208a7eb5dab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Cache-handling routined for MIPS 4K CPUs
+ *  Cache-handling routined for MIPS CPUs
  *
  *  Copyright (c) 2003 Wolfgang Denk <wd@denx.de>
  *
  */
 
 #include <config.h>
-#include <version.h>
 #include <asm/asm.h>
 #include <asm/regdef.h>
 #include <asm/mipsregs.h>
 #include <asm/addrspace.h>
 #include <asm/cacheops.h>
 
-       /* 16KB is the maximum size of instruction and data caches on
-        * MIPS 4K.
-        */
-#define MIPS_MAX_CACHE_SIZE    0x4000
+#define RA             t8
+
+/*
+ * 16kB is the maximum size of instruction and data caches on MIPS 4K,
+ * 64kB is on 4KE, 24K, 5K, etc. Set bigger size for convenience.
+ *
+ * Note that the above size is the maximum size of primary cache. U-Boot
+ * doesn't have L2 cache support for now.
+ */
+#define MIPS_MAX_CACHE_SIZE    0x10000
+
+#define INDEX_BASE     CKSEG0
+
+       .macro  cache_op op addr
+       .set    push
+       .set    noreorder
+       .set    mips3
+       cache   \op, 0(\addr)
+       .set    pop
+       .endm
 
 /*
  * cacheop macro to automate cache operations
 #endif
        .endm
 
+/*
+ * mips_init_icache(uint PRId, ulong icache_size, unchar icache_linesz)
+ */
+LEAF(mips_init_icache)
+       blez    a1, 9f
+       mtc0    zero, CP0_TAGLO
+       /* clear tag to invalidate */
+       PTR_LI          t0, INDEX_BASE
+       PTR_ADDU        t1, t0, a1
+1:     cache_op        Index_Store_Tag_I t0
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 1b
+       /* fill once, so data field parity is correct */
+       PTR_LI          t0, INDEX_BASE
+2:     cache_op        Fill t0
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 2b
+       /* invalidate again - prudent but not strictly neccessary */
+       PTR_LI          t0, INDEX_BASE
+1:     cache_op        Index_Store_Tag_I t0
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 1b
+9:     jr      ra
+       END(mips_init_icache)
+
+/*
+ * mips_init_dcache(uint PRId, ulong dcache_size, unchar dcache_linesz)
+ */
+LEAF(mips_init_dcache)
+       blez    a1, 9f
+       mtc0    zero, CP0_TAGLO
+       /* clear all tags */
+       PTR_LI          t0, INDEX_BASE
+       PTR_ADDU        t1, t0, a1
+1:     cache_op        Index_Store_Tag_D t0
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 1b
+       /* load from each line (in cached space) */
+       PTR_LI          t0, INDEX_BASE
+2:     LONG_L          zero, 0(t0)
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 2b
+       /* clear all tags */
+       PTR_LI          t0, INDEX_BASE
+1:     cache_op        Index_Store_Tag_D t0
+       PTR_ADDU        t0, a2
+       bne             t0, t1, 1b
+9:     jr      ra
+       END(mips_init_dcache)
+
 /*******************************************************************************
 *
 * mips_cache_reset - low level initialisation of the primary caches
 *
 */
 NESTED(mips_cache_reset, 0, ra)
+       move    RA, ra
        li      t2, CFG_ICACHE_SIZE
        li      t3, CFG_DCACHE_SIZE
        li      t4, CFG_CACHELINE_SIZE
@@ -152,63 +218,39 @@ NESTED(mips_cache_reset, 0, ra)
        /*
         * Now clear that much memory starting from zero.
         */
-       PTR_LI          a0, KSEG1
+       PTR_LI          a0, CKSEG1
        PTR_ADDU        a1, a0, v0
 2:     PTR_ADDIU       a0, 64
        f_fill64        a0, -64, zero
        bne             a0, a1, 2b
 
-       /* Set invalid tag.
-        */
-
-       mtc0    zero, CP0_TAGLO
-
        /*
         * The caches are probably in an indeterminate state,
         * so we force good parity into them by doing an
         * invalidate, load/fill, invalidate for each line.
         */
 
-       /* Assume bottom of RAM will generate good parity for the cache.
-        */
-
-       li      a0, K0BASE
-       move    a2, t2          # icacheSize
-       move    a3, t4          # icacheLineSize
-       move    a1, a2
-       icacheopn(a0,a1,a2,a3,121,(Index_Store_Tag_I,Fill))
-
-       /* To support Orion/R4600, we initialise the data cache in 3 passes.
-        */
-
-       /* 1: initialise dcache tags.
+       /*
+        * Assume bottom of RAM will generate good parity for the cache.
         */
 
-       li      a0, K0BASE
-       move    a2, t3          # dcacheSize
-       move    a3, t5          # dcacheLineSize
-       move    a1, a2
-       icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
-
-       /* 2: fill dcache.
+       /*
+        * Initialize the I-cache first,
         */
+       move    a1, t2
+       move    a2, t4
+       PTR_LA  t7, mips_init_icache
+       jalr    t7
 
-       li      a0, K0BASE
-       move    a2, t3          # dcacheSize
-       move    a3, t5          # dcacheLineSize
-       move    a1, a2
-       icacheopn(a0,a1,a2,a3,1lw,(dummy))
-
-       /* 3: clear dcache tags.
+       /*
+        * then initialize D-cache.
         */
+       move    a1, t3
+       move    a2, t5
+       PTR_LA  t7, mips_init_dcache
+       jalr    t7
 
-       li      a0, K0BASE
-       move    a2, t3          # dcacheSize
-       move    a3, t5          # dcacheLineSize
-       move    a1, a2
-       icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
-
-       j       ra
+       jr      RA
        END(mips_cache_reset)
 
 /*******************************************************************************
@@ -219,9 +261,13 @@ NESTED(mips_cache_reset, 0, ra)
 *
 */
 LEAF(dcache_status)
-       mfc0    v0, CP0_CONFIG
-       andi    v0, v0, 1
-       j       ra
+       mfc0    t0, CP0_CONFIG
+       li      t1, CONF_CM_UNCACHED
+       andi    t0, t0, CONF_CM_CMASK
+       move    v0, zero
+       beq     t0, t1, 2f
+       li      v0, 1
+2:     jr      ra
        END(dcache_status)
 
 /*******************************************************************************
@@ -237,9 +283,25 @@ LEAF(dcache_disable)
        and     t0, t0, t1
        ori     t0, t0, CONF_CM_UNCACHED
        mtc0    t0, CP0_CONFIG
-       j       ra
+       jr      ra
        END(dcache_disable)
 
+/*******************************************************************************
+*
+* dcache_enable - enable cache
+*
+* RETURNS: N/A
+*
+*/
+LEAF(dcache_enable)
+       mfc0    t0, CP0_CONFIG
+       ori     t0, CONF_CM_CMASK
+       xori    t0, CONF_CM_CMASK
+       ori     t0, CONF_CM_CACHABLE_NONCOHERENT
+       mtc0    t0, CP0_CONFIG
+       jr      ra
+       END(dcache_enable)
+
 #ifdef CFG_INIT_RAM_LOCK_MIPS
 /*******************************************************************************
 *
@@ -256,14 +318,14 @@ LEAF(dcache_disable)
        .globl  mips_cache_lock
        .ent    mips_cache_lock
 mips_cache_lock:
-       li      a1, K0BASE - CACHE_LOCK_SIZE
+       li      a1, CKSEG0 - CACHE_LOCK_SIZE
        addu    a0, a1
        li      a2, CACHE_LOCK_SIZE
        li      a3, CFG_CACHELINE_SIZE
        move    a1, a2
        icacheop(a0,a1,a2,a3,0x1d)
 
-       j       ra
+       jr      ra
 
        .end    mips_cache_lock
 #endif /* CFG_INIT_RAM_LOCK_MIPS */