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

Reply via email to