/* * cpu.c * * CPU common routines * * Copyright (c) 2005-2008 Ingenic Semiconductor Inc. * Author: Peter Wei * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. */ #include /* * Cache Operations */ #define Index_Invalidate_I 0x00 #define Index_Writeback_Inv_D 0x01 #define Index_Invalidate_SI 0x02 #define Index_Writeback_Inv_SD 0x03 #define Index_Load_Tag_I 0x04 #define Index_Load_Tag_D 0x05 #define Index_Load_Tag_SI 0x06 #define Index_Load_Tag_SD 0x07 #define Index_Store_Tag_I 0x08 #define Index_Store_Tag_D 0x09 #define Index_Store_Tag_SI 0x0A #define Index_Store_Tag_SD 0x0B #define Create_Dirty_Excl_D 0x0d #define Create_Dirty_Excl_SD 0x0f #define Hit_Invalidate_I 0x10 #define Hit_Invalidate_D 0x11 #define Hit_Invalidate_SI 0x12 #define Hit_Invalidate_SD 0x13 #define Fill 0x14 #define Hit_Writeback_Inv_D 0x15 /* 0x16 is unused */ #define Hit_Writeback_Inv_SD 0x17 #define Hit_Writeback_I 0x18 #define Hit_Writeback_D 0x19 /* 0x1a is unused */ #define Hit_Writeback_SD 0x1b /* 0x1c is unused */ /* 0x1e is unused */ #define Hit_Set_Virtual_SI 0x1e #define Hit_Set_Virtual_SD 0x1f #define CFG_DCACHE_SIZE 16384 #define CFG_ICACHE_SIZE 16384 #define CFG_CACHELINE_SIZE 32 #define K0BASE 0x80000000 void flush_icache_all(void) { unsigned int addr, t = 0; asm volatile ("mtc0 $0, $28"); /* Clear Taglo */ asm volatile ("mtc0 $0, $29"); /* Clear TagHi */ for (addr = K0BASE; addr < K0BASE + CFG_ICACHE_SIZE; addr += CFG_CACHELINE_SIZE) { asm volatile ( ".set mips3\n\t" " cache %0, 0(%1)\n\t" ".set mips2\n\t" : : "I" (Index_Store_Tag_I), "r"(addr)); } /* invalicate btb */ asm volatile ( ".set mips32\n\t" "mfc0 %0, $16, 7\n\t" "nop\n\t" "ori %0,2\n\t" "mtc0 %0, $16, 7\n\t" ".set mips2\n\t" : : "r" (t)); } void flush_dcache_all(void) { unsigned int addr; for (addr = K0BASE; addr < K0BASE + CFG_DCACHE_SIZE; addr += CFG_CACHELINE_SIZE) { asm volatile ( ".set mips3\n\t" " cache %0, 0(%1)\n\t" ".set mips2\n\t" : : "I" (Index_Writeback_Inv_D), "r"(addr)); } asm volatile ("sync"); } void flush_cache_all(void) { flush_dcache_all(); flush_icache_all(); }