Module Name:    src
Committed By:   matt
Date:           Sat Dec 24 09:52:45 UTC 2011

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: cache_mipsNN.c

Log Message:
Rototill.  Commonize code when possible.


To generate a diff of this commit:
cvs rdiff -u -r1.11.78.5 -r1.11.78.6 src/sys/arch/mips/mips/cache_mipsNN.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/mips/cache_mipsNN.c
diff -u src/sys/arch/mips/mips/cache_mipsNN.c:1.11.78.5 src/sys/arch/mips/mips/cache_mipsNN.c:1.11.78.6
--- src/sys/arch/mips/mips/cache_mipsNN.c:1.11.78.5	Fri Apr 29 08:26:23 2011
+++ src/sys/arch/mips/mips/cache_mipsNN.c	Sat Dec 24 09:52:44 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cache_mipsNN.c,v 1.11.78.5 2011/04/29 08:26:23 matt Exp $	*/
+/*	$NetBSD: cache_mipsNN.c,v 1.11.78.6 2011/12/24 09:52:44 matt Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cache_mipsNN.c,v 1.11.78.5 2011/04/29 08:26:23 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cache_mipsNN.c,v 1.11.78.6 2011/12/24 09:52:44 matt Exp $");
 
 #include <sys/param.h>
 
@@ -47,12 +47,8 @@ __KERNEL_RCSID(0, "$NetBSD: cache_mipsNN
 
 #include <uvm/uvm_extern.h>
 
-#define	round_line16(x)		(((x) + 15L) & -16L)
-#define	trunc_line16(x)		((x) & -16L)
-
-#define	round_line32(x)		(((x) + 31L) & -32L)
-#define	trunc_line32(x)		((x) & -32L)
-
+#define	round_line(x,n)		(((x) + (n) - 1) & -(n))
+#define	trunc_line(x,n)		((x) & -(n))
 
 #ifdef SB1250_PASS1
 #define	SYNC	__asm volatile("sync; sync")
@@ -66,143 +62,124 @@ __asm(".set mips32");
 __asm(".set mips64");
 #endif
 
-static int picache_stride;
-static int picache_loopcount;
+static inline void
+mipsNN_cache_op_intern(size_t line_size, u_int op, vaddr_t va, vsize_t size)
+{
+	vaddr_t eva;
+
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
+
+	for (; va + 32 * line_size <= eva; va += 32 * line_size) {
+		cache_r4k_op_32lines_NN(line_size, va, op);
+	}
+
+	for (; va + 8 * line_size <= eva; va += 8 * line_size) {
+		cache_r4k_op_8lines_NN(line_size, va, op);
+	}
+
+	for (;va < eva; va += line_size) {
+		cache_op_r4k_line(va, op);
+	}
+
+	SYNC;
+}
+
+static void
+mipsNN_intern_icache_index_inv_16(vaddr_t va, vaddr_t eva)
+{
+	const u_int op = CACHE_R4K_I|CACHEOP_R4K_INDEX_INV;
+	const size_t line_size = 16;
+
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
+}
+
+static void
+mipsNN_intern_icache_index_inv_32(vaddr_t va, vaddr_t eva)
+{
+	const u_int op = CACHE_R4K_I|CACHEOP_R4K_INDEX_INV;
+	const size_t line_size = 32;
+
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
+}
 
 void
 mipsNN_cache_init(uint32_t config, uint32_t config1)
 {
-	struct mips_cache_info * const mci = &mips_cache_info;
-	bool flush_multiple_lines_per_way;
-
-	flush_multiple_lines_per_way = mci->mci_picache_way_size > PAGE_SIZE;
-	if (config & MIPSNN_CFG_VI) {
-		/*
-		 * With a virtual Icache we don't need to flush
-		 * multiples of the page size with index ops; we just
-		 * need to flush one pages' worth.
-		 */
-		flush_multiple_lines_per_way = false;
-	}
-
-	if (flush_multiple_lines_per_way) {
-		picache_stride = PAGE_SIZE;
-		picache_loopcount = (mci->mci_picache_way_size / PAGE_SIZE) *
-		    mci->mci_picache_ways;
-	} else {
-		picache_stride = mci->mci_picache_way_size;
-		picache_loopcount = mci->mci_picache_ways;
-	}
-
-#define CACHE_DEBUG
-#ifdef CACHE_DEBUG
-	if (config & MIPSNN_CFG_VI)
-		printf("  icache is virtual\n");
-	printf("  picache_stride    = %d\n", picache_stride);
-	printf("  picache_loopcount = %d\n", picache_loopcount);
-#endif
+	/* nothing to do */
 }
 
 void
 mipsNN_icache_sync_all_16(void)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t va, eva;
-
-	va = MIPS_PHYS_TO_KSEG0(0);
-	eva = va + mci->mci_picache_size;
+	vaddr_t va = MIPS_KSEG0_START;
+	const vaddr_t eva = va + mci->mci_picache_size;
 
 	/*
 	 * Since we're hitting the whole thing, we don't have to
 	 * worry about the N different "ways".
 	 */
-
 	mips_intern_dcache_wbinv_all();
 
-	while (va < eva) {
-		cache_r4k_op_32lines_16(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		va += (32 * 16);
-	}
-
-	SYNC;
+	mipsNN_intern_icache_index_inv_16(va, eva);
 }
 
 void
 mipsNN_icache_sync_all_32(void)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t va, eva;
-
-	va = MIPS_PHYS_TO_KSEG0(0);
-	eva = va + mci->mci_picache_size;
+	vaddr_t va = MIPS_KSEG0_START;
+	const vaddr_t eva = va + mci->mci_picache_size;
 
 	/*
 	 * Since we're hitting the whole thing, we don't have to
 	 * worry about the N different "ways".
 	 */
-
 	mips_intern_dcache_wbinv_all();
 
-	while (va < eva) {
-		cache_r4k_op_32lines_32(va, CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		va += (32 * 32);
-	}
-
-	SYNC;
+	mipsNN_intern_icache_index_inv_32(va, eva);
 }
 
 void
 mipsNN_icache_sync_range_16(vaddr_t va, vsize_t size)
 {
+	const u_int op = CACHE_R4K_I|CACHEOP_R4K_HIT_INV;
+	const size_t line_size = 16;
 	vaddr_t eva;
 
-	eva = round_line16(va + size);
-	va = trunc_line16(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
-	mips_intern_dcache_wb_range(va, (eva - va));
-
-	while ((eva - va) >= (32 * 16)) {
-		cache_r4k_op_32lines_16(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV);
-		va += (32 * 16);
-	}
+	mips_intern_dcache_wb_range(va, eva - va);
 
-	while (va < eva) {
-		cache_op_r4k_line(va, CACHE_R4K_I|CACHEOP_R4K_HIT_INV);
-		va += 16;
-	}
-
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
 }
 
 void
 mipsNN_icache_sync_range_32(vaddr_t va, vsize_t size)
 {
+	const u_int op = CACHE_R4K_I|CACHEOP_R4K_HIT_INV;
+	const size_t line_size = 32;
 	vaddr_t eva;
 
-	eva = round_line32(va + size);
-	va = trunc_line32(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
-	mips_intern_dcache_wb_range(va, (eva - va));
+	mips_intern_dcache_wb_range(va, eva - va);
 
-	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;
-	}
-
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
 }
 
 void
 mipsNN_icache_sync_range_index_16(vaddr_t va, vsize_t size)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t eva, tmpva;
-	int i, stride, loopcount;
+	const size_t way_size = mci->mci_picache_way_size;
+	const size_t way_mask = way_size - 1;
+	const size_t ways = mci->mci_picache_ways;
+	const size_t line_size = 16;
+	vaddr_t eva;
 
 	/*
 	 * Since we're doing Index ops, we expect to not be able
@@ -210,45 +187,26 @@ mipsNN_icache_sync_range_index_16(vaddr_
 	 * bits that determine the cache index, and make a KSEG0
 	 * address out of them.
 	 */
-	va = MIPS_PHYS_TO_KSEG0(va & mci->mci_picache_way_mask);
+	va = MIPS_PHYS_TO_KSEG0(va & way_mask);
 
-	eva = round_line16(va + size);
-	va = trunc_line16(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
 	/*
-	 * If we are going to flush more than is in a way, we are flushing
-	 * everything.
+	 * If we are going to flush more than is in a way (or the stride
+	 * need for that way), we are flushing everything.
 	 */
-	if (eva - va >= mci->mci_picache_way_size) {
+	if (va + way_size >= eva) {
 		mipsNN_icache_sync_all_16();
 		return;
 	}
 
-	/*
-	 * GCC generates better code in the loops if we reference local
-	 * copies of these global variables.
-	 */
-	stride = picache_stride;
-	loopcount = picache_loopcount;
-
-	mips_intern_dcache_wbinv_range_index(va, (eva - va));
+	mips_intern_dcache_wbinv_range_index(va, eva - va);
 
-	while ((eva - va) >= (8 * 16)) {
-		tmpva = va;
-		for (i = 0; i < loopcount; i++, tmpva += stride) {
-			cache_r4k_op_8lines_16(tmpva,
-			    CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		}
-		va += 8 * 16;
-	}
-
-	while (va < eva) {
-		tmpva = va;
-		for (i = 0; i < loopcount; i++, tmpva += stride) {
-			cache_op_r4k_line(tmpva,
-			    CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		}
-		va += 16;
+	for (size_t way = 0; way < ways; way++) {
+		mipsNN_intern_icache_index_inv_16(va, eva);
+		va += way_size;
+		eva += way_size;
 	}
 }
 
@@ -256,8 +214,11 @@ void
 mipsNN_icache_sync_range_index_32(vaddr_t va, vsize_t size)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t eva, tmpva;
-	int i, stride, loopcount;
+	const size_t way_size = mci->mci_picache_way_size;
+	const size_t way_mask = way_size - 1;
+	const size_t ways = mci->mci_picache_ways;
+	const size_t line_size = 32;
+	vaddr_t eva;
 
 	/*
 	 * Since we're doing Index ops, we expect to not be able
@@ -265,45 +226,26 @@ mipsNN_icache_sync_range_index_32(vaddr_
 	 * bits that determine the cache index, and make a KSEG0
 	 * address out of them.
 	 */
-	va = MIPS_PHYS_TO_KSEG0(va & mci->mci_picache_way_mask);
+	va = MIPS_PHYS_TO_KSEG0(va & way_mask);
 
-	eva = round_line32(va + size);
-	va = trunc_line32(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
 	/*
-	 * If we are going to flush more than is in a way, we are flushing
-	 * everything.
+	 * If we are going to flush more than is in a way (or the stride
+	 * need for that way), we are flushing everything.
 	 */
-	if (eva - va >= mci->mci_picache_way_size) {
+	if (va + way_size >= eva) {
 		mipsNN_icache_sync_all_32();
 		return;
 	}
 
-	/*
-	 * GCC generates better code in the loops if we reference local
-	 * copies of these global variables.
-	 */
-	stride = picache_stride;
-	loopcount = picache_loopcount;
+	mips_intern_dcache_wbinv_range_index(va, eva - va);
 
-	mips_intern_dcache_wbinv_range_index(va, (eva - va));
-
-	while ((eva - va) >= (8 * 32)) {
-		tmpva = va;
-		for (i = 0; i < loopcount; i++, tmpva += stride) {
-			cache_r4k_op_8lines_32(tmpva,
-			    CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		}
-		va += 8 * 32;
-	}
-
-	while (va < eva) {
-		tmpva = va;
-		for (i = 0; i < loopcount; i++, tmpva += stride) {
-			cache_op_r4k_line(tmpva,
-			    CACHE_R4K_I|CACHEOP_R4K_INDEX_INV);
-		}
-		va += 32;
+	for (size_t way = 0; way < ways; way++) {
+		mipsNN_intern_icache_index_inv_32(va, eva);
+		va += way_size;
+		eva += way_size;
 	}
 }
 
@@ -311,20 +253,18 @@ void
 mipsNN_pdcache_wbinv_all_16(void)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t va, eva;
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV;
+	const size_t line_size = 16;
 
-	va = MIPS_PHYS_TO_KSEG0(0);
-	eva = va + mci->mci_pdcache_size;
+	vaddr_t va = MIPS_KSEG0_START;
+	const vaddr_t eva = va + mci->mci_pdcache_size;
 
 	/*
 	 * Since we're hitting the whole thing, we don't have to
 	 * worry about the N different "ways".
 	 */
-
-	while (va < eva) {
-		cache_r4k_op_32lines_16(va,
-		    CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-		va += (32 * 16);
+	for (; va < eva; va += 32 * line_size) {
+		cache_r4k_op_32lines_NN(line_size, va, op);
 	}
 
 	SYNC;
@@ -334,64 +274,18 @@ void
 mipsNN_pdcache_wbinv_all_32(void)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
-	vaddr_t va, eva;
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV;
+	const size_t line_size = 32;
 
-	va = MIPS_PHYS_TO_KSEG0(0);
-	eva = va + mci->mci_pdcache_size;
+	vaddr_t va = MIPS_KSEG0_START;
+	const vaddr_t eva = va + mci->mci_pdcache_size;
 
 	/*
 	 * Since we're hitting the whole thing, we don't have to
 	 * worry about the N different "ways".
 	 */
-
-	while (va < eva) {
-		cache_r4k_op_32lines_32(va,
-		    CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-		va += (32 * 32);
-	}
-
-	SYNC;
-}
-
-void
-mipsNN_pdcache_wbinv_range_16(vaddr_t va, vsize_t size)
-{
-	vaddr_t eva;
-
-	eva = round_line16(va + size);
-	va = trunc_line16(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;
-	}
-
-	SYNC;
-}
-
-void
-mipsNN_pdcache_wbinv_range_32(vaddr_t va, vsize_t size)
-{
-	vaddr_t eva;
-
-	eva = round_line32(va + size);
-	va = trunc_line32(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;
+	for (; va < eva; va += 32 * line_size) {
+		cache_r4k_op_32lines_NN(line_size, va, op);
 	}
 
 	SYNC;
@@ -400,6 +294,9 @@ mipsNN_pdcache_wbinv_range_32(vaddr_t va
 static void
 mipsNN_pdcache_wbinv_range_index_16_intern(vaddr_t va, vaddr_t eva)
 {
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV;
+	const size_t line_size = 16;
+
 	/*
 	 * Since we're doing Index ops, we expect to not be able
 	 * to access the address we've been given.  So, get the
@@ -409,19 +306,15 @@ mipsNN_pdcache_wbinv_range_index_16_inte
 	va = MIPS_PHYS_TO_KSEG0(va);
 	eva = MIPS_PHYS_TO_KSEG0(eva);
 
-	for (; (eva - va) >= (8 * 16); va += 8 * 16) {
-		cache_r4k_op_8lines_16(va,
-		    CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-	}
-
-	for (; va < eva; va += 16) {
-		cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-	}
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
 }
 
 static void
 mipsNN_pdcache_wbinv_range_index_32_intern(vaddr_t va, vaddr_t eva)
 {
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV;
+	const size_t line_size = 32;
+
 	/*
 	 * Since we're doing Index ops, we expect to not be able
 	 * to access the address we've been given.  So, get the
@@ -431,34 +324,28 @@ mipsNN_pdcache_wbinv_range_index_32_inte
 	va = MIPS_PHYS_TO_KSEG0(va);
 	eva = MIPS_PHYS_TO_KSEG0(eva);
 
-	for (; (eva - va) >= (8 * 32); va += 8 * 32) {
-		cache_r4k_op_8lines_32(va,
-		    CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-	}
-
-	for (; va < eva; va += 32) {
-		cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_INDEX_WB_INV);
-	}
+	mipsNN_cache_op_intern(line_size, op, va, eva - va);
 }
 
 void
 mipsNN_pdcache_wbinv_range_index_16(vaddr_t va, vsize_t size)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
+	const size_t ways = mci->mci_pdcache_ways;
 	const vaddr_t way_size = mci->mci_pdcache_way_size;
 	const vaddr_t way_mask = way_size - 1;
-	const u_int ways = mci->mci_pdcache_ways;
+	const size_t line_size = 16;
 	vaddr_t eva;
 
 	va &= way_mask;
-	eva = round_line16(va + size);
-	va = trunc_line16(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
 	/*
 	 * If we are going to flush more than is in a way, we are flushing
 	 * everything.
 	 */
-	if (eva - va >= way_size) {
+	if (va + way_size >= eva) {
 		mipsNN_pdcache_wbinv_all_16();
 		return;
 	}
@@ -468,7 +355,7 @@ mipsNN_pdcache_wbinv_range_index_16(vadd
 	 * the way, we will be invalidating in two ways but eventually things
 	 * work out since the last way will wrap into the first way.
 	 */
-	for (u_int way = 0; way < ways; way++) {
+	for (size_t way = 0; way < ways; way++) {
 		mipsNN_pdcache_wbinv_range_index_16_intern(va, eva);
 		va += way_size;
 		eva += way_size;
@@ -479,20 +366,21 @@ void
 mipsNN_pdcache_wbinv_range_index_32(vaddr_t va, vsize_t size)
 {
 	struct mips_cache_info * const mci = &mips_cache_info;
+	const size_t ways = mci->mci_pdcache_ways;
 	const vaddr_t way_size = mci->mci_pdcache_way_size;
 	const vaddr_t way_mask = way_size - 1;
-	const u_int ways = mci->mci_pdcache_ways;
+	const size_t line_size = 32;
 	vaddr_t eva;
 
 	va &= way_mask;
-	eva = round_line32(va + size);
-	va = trunc_line32(va);
+	eva = round_line(va + size, line_size);
+	va = trunc_line(va, line_size);
 
 	/*
 	 * If we are going to flush more than is in a way, we are flushing
 	 * everything.
 	 */
-	if (eva - va >= way_size) {
+	if (va + way_size >= eva) {
 		mipsNN_pdcache_wbinv_all_32();
 		return;
 	}
@@ -502,7 +390,7 @@ mipsNN_pdcache_wbinv_range_index_32(vadd
 	 * the way, we will be invalidating in two ways but eventually things
 	 * work out since the last way will wrap into the first way.
 	 */
-	for (u_int way = 0; way < ways; way++) {
+	for (size_t way = 0; way < ways; way++) {
 		mipsNN_pdcache_wbinv_range_index_32_intern(va, eva);
 		va += way_size;
 		eva += way_size;
@@ -510,85 +398,55 @@ mipsNN_pdcache_wbinv_range_index_32(vadd
 }
  
 void
-mipsNN_pdcache_inv_range_16(vaddr_t va, vsize_t size)
+mipsNN_pdcache_wbinv_range_16(vaddr_t va, vsize_t size)
 {
-	vaddr_t eva;
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV;
+	const size_t line_size = 16;
 
-	eva = round_line16(va + size);
-	va = trunc_line16(va);
-
-	while ((eva - va) >= (32 * 16)) {
-		cache_r4k_op_32lines_16(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV);
-		va += (32 * 16);
-	}
+	mipsNN_cache_op_intern(line_size, op, va, size);
+}
 
-	while (va < eva) {
-		cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV);
-		va += 16;
-	}
+void
+mipsNN_pdcache_wbinv_range_32(vaddr_t va, vsize_t size)
+{
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_WB_INV;
+	const size_t line_size = 32;
 
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, size);
 }
 
 void
-mipsNN_pdcache_inv_range_32(vaddr_t va, vsize_t size)
+mipsNN_pdcache_inv_range_16(vaddr_t va, vsize_t size)
 {
-	vaddr_t eva;
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_INV;
+	const size_t line_size = 16;
 
-	eva = round_line32(va + size);
-	va = trunc_line32(va);
-
-	while ((eva - va) >= (32 * 32)) {
-		cache_r4k_op_32lines_32(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV);
-		va += (32 * 32);
-	}
+	mipsNN_cache_op_intern(line_size, op, va, size);
+}
 
-	while (va < eva) {
-		cache_op_r4k_line(va, CACHE_R4K_D|CACHEOP_R4K_HIT_INV);
-		va += 32;
-	}
+void
+mipsNN_pdcache_inv_range_32(vaddr_t va, vsize_t size)
+{
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_INV;
+	const size_t line_size = 32;
 
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, size);
 }
 
 void
 mipsNN_pdcache_wb_range_16(vaddr_t va, vsize_t size)
 {
-	vaddr_t eva;
-
-	eva = round_line16(va + size);
-	va = trunc_line16(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;
-	}
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_WB;
+	const size_t line_size = 16;
 
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, size);
 }
 
 void
 mipsNN_pdcache_wb_range_32(vaddr_t va, vsize_t size)
 {
-	vaddr_t eva;
-
-	eva = round_line32(va + size);
-	va = trunc_line32(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;
-	}
+	const u_int op = CACHE_R4K_D|CACHEOP_R4K_HIT_WB;
+	const size_t line_size = 32;
 
-	SYNC;
+	mipsNN_cache_op_intern(line_size, op, va, size);
 }

Reply via email to