Module Name: src Committed By: matt Date: Mon Jul 11 23:06:54 UTC 2016
Modified Files: src/sys/arch/mips/conf: files.mips src/sys/arch/mips/include: cache_r4k.h src/sys/arch/mips/mips: cache.c cache_r4k.c Log Message: Use sdcache routines. Remove old cache support. Switch to new cache routines. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/arch/mips/conf/files.mips cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mips/include/cache_r4k.h cvs rdiff -u -r1.51 -r1.52 src/sys/arch/mips/mips/cache.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mips/mips/cache_r4k.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/conf/files.mips diff -u src/sys/arch/mips/conf/files.mips:1.74 src/sys/arch/mips/conf/files.mips:1.75 --- src/sys/arch/mips/conf/files.mips:1.74 Mon Jul 11 16:15:35 2016 +++ src/sys/arch/mips/conf/files.mips Mon Jul 11 23:06:53 2016 @@ -1,4 +1,4 @@ -# $NetBSD: files.mips,v 1.74 2016/07/11 16:15:35 matt Exp $ +# $NetBSD: files.mips,v 1.75 2016/07/11 23:06:53 matt Exp $ # defflag opt_cputype.h NOFPU FPEMUL @@ -77,12 +77,12 @@ file arch/mips/mips/cache_octeon.c mips file arch/mips/mips/cache_mipsNN.c mips32|mips32r2|mips64|mips64r2 file arch/mips/mips/cache_r4k_pcache16.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 file arch/mips/mips/cache_r4k_pcache32.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 -file arch/mips/mips/cache_r4k_pcache64.S mips32|mips32r2|mips64|mips64r2 -file arch/mips/mips/cache_r4k_pcache128.S mips32|mips32r2|mips64|mips64r2 -#file arch/mips/mips/cache_r4k_scache16.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 -#file arch/mips/mips/cache_r4k_scache32.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 -#file arch/mips/mips/cache_r4k_scache64.S mips32|mips32r2|mips64|mips64r2 -#file arch/mips/mips/cache_r4k_scache128.S mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_pcache64.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_pcache128.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_scache16.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_scache32.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_scache64.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 +file arch/mips/mips/cache_r4k_scache128.S mips3|mips4|mips32|mips32r2|mips64|mips64r2 file arch/mips/mips/mips_fputrap.c !nofpu | fpemul file arch/mips/mips/mips_emul.c Index: src/sys/arch/mips/include/cache_r4k.h diff -u src/sys/arch/mips/include/cache_r4k.h:1.13 src/sys/arch/mips/include/cache_r4k.h:1.14 --- src/sys/arch/mips/include/cache_r4k.h:1.13 Mon Jul 11 19:06:33 2016 +++ src/sys/arch/mips/include/cache_r4k.h Mon Jul 11 23:06:54 2016 @@ -57,6 +57,7 @@ #if !defined(_LOCORE) +#if 1 /* * cache_r4k_op_line: * @@ -306,49 +307,15 @@ cache_r4k_op_8lines_NN_4way(size_t n, re cache_r4k_op_8lines_NN_4way(64, (va1), (va2), (va3), (va4), (op)) #define cache_r4k_op_8lines_128_4way(va1, va2, va3, va4, op) \ cache_r4k_op_8lines_NN_4way(128, (va1), (va2), (va3), (va4), (op)) +#endif -void r4k_icache_sync_all_16(void); -void r4k_icache_sync_range_16(register_t, vsize_t); -void r4k_icache_sync_range_index_16(vaddr_t, vsize_t); - -void r4k_icache_sync_all_32(void); -void r4k_icache_sync_range_32(register_t, vsize_t); -void r4k_icache_sync_range_index_32(vaddr_t, vsize_t); - -void r4k_pdcache_wbinv_all_16(void); -void r4k_pdcache_wbinv_range_16(register_t, vsize_t); -void r4k_pdcache_wbinv_range_index_16(vaddr_t, vsize_t); - -void r4k_pdcache_inv_range_16(register_t, vsize_t); -void r4k_pdcache_wb_range_16(register_t, vsize_t); - -void r4k_pdcache_wbinv_all_32(void); -void r4k_pdcache_wbinv_range_32(register_t, vsize_t); -void r4k_pdcache_wbinv_range_index_32(vaddr_t, vsize_t); - -void r4k_pdcache_inv_range_32(register_t, vsize_t); -void r4k_pdcache_wb_range_32(register_t, vsize_t); - -void r4k_sdcache_wbinv_all_32(void); -void r4k_sdcache_wbinv_range_32(register_t, vsize_t); -void r4k_sdcache_wbinv_range_index_32(vaddr_t, vsize_t); - -void r4k_sdcache_inv_range_32(register_t, vsize_t); -void r4k_sdcache_wb_range_32(register_t, vsize_t); - -void r4k_sdcache_wbinv_all_128(void); -void r4k_sdcache_wbinv_range_128(register_t, vsize_t); -void r4k_sdcache_wbinv_range_index_128(vaddr_t, vsize_t); - -void r4k_sdcache_inv_range_128(register_t, vsize_t); -void r4k_sdcache_wb_range_128(register_t, vsize_t); +/* cache_r4k.c */ +void r4k_icache_sync_all_generic(void); +void r4k_icache_sync_range_generic(register_t, vsize_t); +void r4k_icache_sync_range_index_generic(vaddr_t, vsize_t); +void r4k_pdcache_wbinv_all_generic(void); void r4k_sdcache_wbinv_all_generic(void); -void r4k_sdcache_wbinv_range_generic(register_t, vsize_t); -void r4k_sdcache_wbinv_range_index_generic(vaddr_t, vsize_t); - -void r4k_sdcache_inv_range_generic(register_t, vsize_t); -void r4k_sdcache_wb_range_generic(register_t, vsize_t); /* cache_r4k_pcache16.S */ @@ -359,6 +326,13 @@ void cache_r4k_pdcache_hit_inv_16(regist void cache_r4k_pdcache_hit_wb_inv_16(register_t, vsize_t); void cache_r4k_pdcache_hit_wb_16(register_t, vsize_t); +/* cache_r4k_scache16.S */ + +void cache_r4k_sdcache_index_wb_inv_16(vaddr_t, vsize_t); +void cache_r4k_sdcache_hit_inv_16(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_inv_16(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_16(register_t, vsize_t); + /* cache_r4k_pcache32.S */ void cache_r4k_icache_index_inv_32(vaddr_t, vsize_t); @@ -368,6 +342,13 @@ void cache_r4k_pdcache_hit_inv_32(regist void cache_r4k_pdcache_hit_wb_inv_32(register_t, vsize_t); void cache_r4k_pdcache_hit_wb_32(register_t, vsize_t); +/* cache_r4k_scache32.S */ + +void cache_r4k_sdcache_index_wb_inv_32(vaddr_t, vsize_t); +void cache_r4k_sdcache_hit_inv_32(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_inv_32(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_32(register_t, vsize_t); + /* cache_r4k_pcache64.S */ void cache_r4k_icache_index_inv_64(vaddr_t, vsize_t); @@ -377,6 +358,13 @@ void cache_r4k_pdcache_hit_inv_64(regist void cache_r4k_pdcache_hit_wb_inv_64(register_t, vsize_t); void cache_r4k_pdcache_hit_wb_64(register_t, vsize_t); +/* cache_r4k_scache64.S */ + +void cache_r4k_sdcache_index_wb_inv_64(vaddr_t, vsize_t); +void cache_r4k_sdcache_hit_inv_64(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_inv_64(register_t, vsize_t); +void cache_r4k_sdcache_hit_wb_64(register_t, vsize_t); + /* cache_r4k_pcache128.S */ void cache_r4k_icache_index_inv_128(vaddr_t, vsize_t); @@ -385,6 +373,9 @@ void cache_r4k_pdcache_index_wb_inv_128( void cache_r4k_pdcache_hit_inv_128(register_t, vsize_t); void cache_r4k_pdcache_hit_wb_inv_128(register_t, vsize_t); void cache_r4k_pdcache_hit_wb_128(register_t, vsize_t); + +/* cache_r4k_scache128.S */ + void cache_r4k_sdcache_index_wb_inv_128(vaddr_t, vsize_t); void cache_r4k_sdcache_hit_inv_128(register_t, vsize_t); void cache_r4k_sdcache_hit_wb_inv_128(register_t, vsize_t); Index: src/sys/arch/mips/mips/cache.c diff -u src/sys/arch/mips/mips/cache.c:1.51 src/sys/arch/mips/mips/cache.c:1.52 --- src/sys/arch/mips/mips/cache.c:1.51 Mon Jul 11 16:15:36 2016 +++ src/sys/arch/mips/mips/cache.c Mon Jul 11 23:06:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: cache.c,v 1.51 2016/07/11 16:15:36 matt Exp $ */ +/* $NetBSD: cache.c,v 1.52 2016/07/11 23:06:54 matt Exp $ */ /* * Copyright 2001, 2002 Wasabi Systems, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cache.c,v 1.51 2016/07/11 16:15:36 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cache.c,v 1.52 2016/07/11 23:06:54 matt Exp $"); #include "opt_cputype.h" #include "opt_mips_cache.h" @@ -416,23 +416,20 @@ mips_config_cache_prehistoric(void) if (mci->mci_pdcache_size > PAGE_SIZE) mci->mci_cache_virtual_alias = true; + mco->mco_icache_sync_all = r4k_icache_sync_all_generic; switch (mci->mci_picache_line_size) { case 16: - mco->mco_icache_sync_all = - r4k_icache_sync_all_16; mco->mco_icache_sync_range = - r4k_icache_sync_range_16; + cache_r4k_icache_hit_inv_16; mco->mco_icache_sync_range_index = - r4k_icache_sync_range_index_16; + cache_r4k_icache_index_inv_16; break; case 32: - mco->mco_icache_sync_all = - r4k_icache_sync_all_32; mco->mco_icache_sync_range = - r4k_icache_sync_range_32; + cache_r4k_icache_hit_inv_32; mco->mco_icache_sync_range_index = - r4k_icache_sync_range_index_32; + cache_r4k_icache_index_inv_32; break; default: @@ -440,31 +437,28 @@ mips_config_cache_prehistoric(void) mci->mci_picache_line_size); } + mco->mco_pdcache_wbinv_all = r4k_pdcache_wbinv_all_generic; switch (mci->mci_pdcache_line_size) { case 16: - mco->mco_pdcache_wbinv_all = - r4k_pdcache_wbinv_all_16; mco->mco_pdcache_wbinv_range = - r4k_pdcache_wbinv_range_16; + cache_r4k_pdcache_hit_wb_inv_16; mco->mco_pdcache_wbinv_range_index = - r4k_pdcache_wbinv_range_index_16; + cache_r4k_pdcache_index_wb_inv_16; mco->mco_pdcache_inv_range = - r4k_pdcache_inv_range_16; + cache_r4k_pdcache_hit_inv_16; mco->mco_pdcache_wb_range = - r4k_pdcache_wb_range_16; + cache_r4k_pdcache_hit_wb_16; break; case 32: - mco->mco_pdcache_wbinv_all = - r4k_pdcache_wbinv_all_32; mco->mco_pdcache_wbinv_range = - r4k_pdcache_wbinv_range_32; + cache_r4k_pdcache_hit_wb_inv_32; mco->mco_pdcache_wbinv_range_index = - r4k_pdcache_wbinv_range_index_32; + cache_r4k_pdcache_index_wb_inv_32; mco->mco_pdcache_inv_range = - r4k_pdcache_inv_range_32; + cache_r4k_pdcache_hit_inv_32; mco->mco_pdcache_wb_range = - r4k_pdcache_wb_range_32; + cache_r4k_pdcache_hit_wb_32; break; default: @@ -730,45 +724,51 @@ primary_cache_is_2way: #endif switch (mci->mci_sdcache_ways) { case 1: + mco->mco_sdcache_wbinv_all = + r4k_sdcache_wbinv_all_generic; switch (mci->mci_sdcache_line_size) { + case 16: + mco->mco_sdcache_wbinv_range = + cache_r4k_sdcache_hit_wb_inv_16; + mco->mco_sdcache_wbinv_range_index = + cache_r4k_sdcache_index_wb_inv_16; + mco->mco_sdcache_inv_range = + cache_r4k_sdcache_hit_inv_16; + mco->mco_sdcache_wb_range = + cache_r4k_sdcache_hit_wb_16; + break; + case 32: - mco->mco_sdcache_wbinv_all = - r4k_sdcache_wbinv_all_32; mco->mco_sdcache_wbinv_range = - r4k_sdcache_wbinv_range_32; + cache_r4k_sdcache_hit_wb_inv_32; mco->mco_sdcache_wbinv_range_index = - r4k_sdcache_wbinv_range_index_32; + cache_r4k_sdcache_index_wb_inv_32; mco->mco_sdcache_inv_range = - r4k_sdcache_inv_range_32; + cache_r4k_sdcache_hit_inv_32; mco->mco_sdcache_wb_range = - r4k_sdcache_wb_range_32; + cache_r4k_sdcache_hit_wb_32; break; - case 16: case 64: - mco->mco_sdcache_wbinv_all = - r4k_sdcache_wbinv_all_generic; mco->mco_sdcache_wbinv_range = - r4k_sdcache_wbinv_range_generic; + cache_r4k_sdcache_hit_wb_inv_64; mco->mco_sdcache_wbinv_range_index = - r4k_sdcache_wbinv_range_index_generic; + cache_r4k_sdcache_index_wb_inv_64; mco->mco_sdcache_inv_range = - r4k_sdcache_inv_range_generic; + cache_r4k_sdcache_hit_inv_64; mco->mco_sdcache_wb_range = - r4k_sdcache_wb_range_generic; + cache_r4k_sdcache_hit_wb_64; break; case 128: - mco->mco_sdcache_wbinv_all = - r4k_sdcache_wbinv_all_128; mco->mco_sdcache_wbinv_range = - r4k_sdcache_wbinv_range_128; + cache_r4k_sdcache_hit_wb_inv_128; mco->mco_sdcache_wbinv_range_index = - r4k_sdcache_wbinv_range_index_128; + cache_r4k_sdcache_index_wb_inv_128; mco->mco_sdcache_inv_range = - r4k_sdcache_inv_range_128; + cache_r4k_sdcache_hit_inv_128; mco->mco_sdcache_wb_range = - r4k_sdcache_wb_range_128; + cache_r4k_sdcache_hit_wb_128; break; default: Index: src/sys/arch/mips/mips/cache_r4k.c diff -u src/sys/arch/mips/mips/cache_r4k.c:1.13 src/sys/arch/mips/mips/cache_r4k.c:1.14 --- src/sys/arch/mips/mips/cache_r4k.c:1.13 Mon Jul 11 16:15:36 2016 +++ src/sys/arch/mips/mips/cache_r4k.c Mon Jul 11 23:06:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: cache_r4k.c,v 1.13 2016/07/11 16:15:36 matt Exp $ */ +/* $NetBSD: cache_r4k.c,v 1.14 2016/07/11 23:06:54 matt Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cache_r4k.c,v 1.13 2016/07/11 16:15:36 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cache_r4k.c,v 1.14 2016/07/11 23:06:54 matt Exp $"); #include <sys/param.h> @@ -54,236 +54,27 @@ __KERNEL_RCSID(0, "$NetBSD: cache_r4k.c, * XXX Does not handle split secondary caches. */ -#define round_line(x) (((x) + 15) & ~15) -#define trunc_line(x) ((x) & ~15) - -__asm(".set mips3"); - -void -r4k_icache_sync_all_16(void) -{ - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_picache_size; - - mips_dcache_wbinv_all(); - - __asm volatile("sync"); - - while (va < eva) { - cache_r4k_op_32lines_16(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += (32 * 16); - } -} - -void -r4k_icache_sync_range_16(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - mips_dcache_wb_range(va, (eva - va)); - - __asm volatile("sync"); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV); - va += 16; - } -} - -void -r4k_icache_sync_range_index_16(vaddr_t va, vsize_t size) -{ - vaddr_t eva, orig_va; - - orig_va = va; - - eva = round_line(va + size); - va = trunc_line(va); - - mips_dcache_wbinv_range_index(va, (eva - va)); - - __asm volatile("sync"); - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(orig_va & mips_cache_info.mci_picache_way_mask); - - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += 16; - } -} - -void -r4k_pdcache_wbinv_all_16(void) -{ - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_pdcache_size; - - while (va < eva) { - cache_r4k_op_32lines_16(va, - CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 16); - } -} - -void -r4k_pdcache_wbinv_range_16(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, - CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV); - va += 16; - } -} - -void -r4k_pdcache_wbinv_range_index_16(vaddr_t va, vsize_t size) -{ - vaddr_t eva; - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(va & (mips_cache_info.mci_pdcache_size - 1)); - - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, - CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += 16; - } -} - -void -r4k_pdcache_inv_range_16(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV); - va += 16; - } -} - -void -r4k_pdcache_wb_range_16(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 16)) { - cache_r4k_op_32lines_16(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB); - va += (32 * 16); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB); - va += 16; - } -} - -#undef round_line -#undef trunc_line - -#define round_line(x) (((x) + 31) & ~31) -#define trunc_line(x) ((x) & ~31) - void -r4k_icache_sync_all_32(void) +r4k_icache_sync_all_generic(void) { - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_picache_size; - mips_dcache_wbinv_all(); - __asm volatile("sync"); - - while (va < eva) { - cache_r4k_op_32lines_32(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += (32 * 32); - } + mips_intern_icache_sync_range_index(MIPS_PHYS_TO_KSEG0(0), + mips_cache_info.mci_picache_size); } void -r4k_icache_sync_range_32(register_t va, vsize_t size) +r4k_icache_sync_range_generic(register_t va, vsize_t size) { - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); + mips_dcache_wb_range(va, size); - mips_dcache_wb_range(va, (eva - va)); - - __asm volatile("sync"); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV); - va += 32; - } + mips_intern_icache_sync_range_index(va, size); } void -r4k_icache_sync_range_index_32(vaddr_t va, vsize_t size) +r4k_icache_sync_range_index_generic(vaddr_t va, vsize_t size) { - vaddr_t eva; - - eva = round_line(va + size); - va = trunc_line(va); - - mips_dcache_wbinv_range_index(va, (eva - va)); - - __asm volatile("sync"); + mips_dcache_wbinv_range_index(va, size); /* * Since we're doing Index ops, we expect to not be able @@ -292,398 +83,21 @@ r4k_icache_sync_range_index_32(vaddr_t v * address out of them. */ va = MIPS_PHYS_TO_KSEG0(va & mips_cache_info.mci_picache_way_mask); + size &= mips_cache_info.mci_picache_way_mask; - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV); - va += 32; - } -} - -void -r4k_pdcache_wbinv_all_32(void) -{ - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_pdcache_size; - - while (va < eva) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 32); - } -} - -void -r4k_pdcache_wbinv_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV); - va += 32; - } -} - -void -r4k_pdcache_wbinv_range_index_32(vaddr_t va, vsize_t size) -{ - vaddr_t eva; - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(va & (mips_cache_info.mci_pdcache_size - 1)); - - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV); - va += 32; - } -} - -void -r4k_pdcache_inv_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV); - va += 32; - } -} - -void -r4k_pdcache_wb_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_WB); - va += 32; - } -} - -void -r4k_sdcache_wbinv_all_32(void) -{ - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_sdcache_size; - - while (va < eva) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 32); - } -} - -void -r4k_sdcache_wbinv_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_SD|CACHEOP_R4K_HIT_WB_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB_INV); - va += 32; - } -} - -void -r4k_sdcache_wbinv_range_index_32(vaddr_t va, vsize_t size) -{ - vaddr_t eva; - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(va & (mips_cache_info.mci_sdcache_size - 1)); - - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, - CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += 32; - } -} - -void -r4k_sdcache_inv_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_INV); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_INV); - va += 32; - } -} - -void -r4k_sdcache_wb_range_32(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 32)) { - cache_r4k_op_32lines_32(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB); - va += (32 * 32); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB); - va += 32; - } -} - -#undef round_line -#undef trunc_line - -#define round_line(x) (((x) + 127) & ~127) -#define trunc_line(x) ((x) & ~127) - -void -r4k_sdcache_wbinv_all_128(void) -{ - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_sdcache_size; - - while (va < eva) { - cache_r4k_op_32lines_128(va, - CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 128); - } -} - -void -r4k_sdcache_wbinv_range_128(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 128)) { - cache_r4k_op_32lines_128(va, - CACHE_R4K_SD|CACHEOP_R4K_HIT_WB_INV); - va += (32 * 128); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB_INV); - va += 128; - } -} - -void -r4k_sdcache_wbinv_range_index_128(vaddr_t va, vsize_t size) -{ - vaddr_t eva; - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(va & (mips_cache_info.mci_sdcache_size - 1)); - - eva = round_line(va + size); - va = trunc_line(va); - - while ((eva - va) >= (32 * 128)) { - cache_r4k_op_32lines_128(va, - CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += (32 * 128); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += 128; - } + mips_intern_icache_sync_range_index(va, size); } void -r4k_sdcache_inv_range_128(register_t va, vsize_t size) +r4k_pdcache_wbinv_all_generic(void) { - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 128)) { - cache_r4k_op_32lines_128(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_INV); - va += (32 * 128); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_INV); - va += 128; - } -} - -void -r4k_sdcache_wb_range_128(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - - va = trunc_line(va); - - while ((eva - va) >= (32 * 128)) { - cache_r4k_op_32lines_128(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB); - va += (32 * 128); - } - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB); - va += 128; - } + mips_intern_pdcache_wbinv_range_index(MIPS_PHYS_TO_KSEG0(0), + mips_cache_info.mci_pdcache_size); } -#undef round_line -#undef trunc_line - -#define round_line(x) (((x) + mips_cache_info.mci_sdcache_line_size - 1) & ~(mips_cache_info.mci_sdcache_line_size - 1)) -#define trunc_line(x) ((x) & ~(mips_cache_info.mci_sdcache_line_size - 1)) - void r4k_sdcache_wbinv_all_generic(void) { - vaddr_t va = MIPS_PHYS_TO_KSEG0(0); - vaddr_t eva = va + mips_cache_info.mci_sdcache_size; - int line_size = mips_cache_info.mci_sdcache_line_size; - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += line_size; - } -} - -void -r4k_sdcache_wbinv_range_generic(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - int line_size = mips_cache_info.mci_sdcache_line_size; - - va = trunc_line(va); - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB_INV); - va += line_size; - } -} - -void -r4k_sdcache_wbinv_range_index_generic(vaddr_t va, vsize_t size) -{ - vaddr_t eva; - int line_size = mips_cache_info.mci_sdcache_line_size; - - /* - * Since we're doing Index ops, we expect to not be able - * to access the address we've been given. So, get the - * bits that determine the cache index, and make a KSEG0 - * address out of them. - */ - va = MIPS_PHYS_TO_KSEG0(va & (mips_cache_info.mci_sdcache_size - 1)); - - eva = round_line(va + size); - va = trunc_line(va); - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_INDEX_WB_INV); - va += line_size; - } -} - -void -r4k_sdcache_inv_range_generic(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - int line_size = mips_cache_info.mci_sdcache_line_size; - - va = trunc_line(va); - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_INV); - va += line_size; - } + mips_intern_sdcache_wbinv_range_index(MIPS_PHYS_TO_KSEG0(0), + mips_cache_info.mci_sdcache_size); } - -void -r4k_sdcache_wb_range_generic(register_t va, vsize_t size) -{ - vaddr_t eva = round_line(va + size); - int line_size = mips_cache_info.mci_sdcache_line_size; - - va = trunc_line(va); - - while (va < eva) { - cache_op_r4k_line(va, CACHE_R4K_SD|CACHEOP_R4K_HIT_WB); - va += line_size; - } -} - -#undef round_line -#undef trunc_line