Mon Jun 6 02:49:39 2011 UTC ()
convert dcache_flush_page() into a function pointer.  introduce a
sp_dcache_flush_page() to help the smp version.

XXX: probably best to have usI/II and usIII (and nop) of this and
XXX: avoid the need for sp_dcache_flush_page at all.


(mrg)
diff -r1.7 -r1.8 src/sys/arch/sparc64/sparc64/cache.c
diff -r1.21 -r1.22 src/sys/arch/sparc64/sparc64/cache.h
diff -r1.41 -r1.42 src/sys/arch/sparc64/sparc64/ipifuncs.c

cvs diff -r1.7 -r1.8 src/sys/arch/sparc64/sparc64/cache.c (expand / switch to context diff)
--- src/sys/arch/sparc64/sparc64/cache.c 2011/06/06 01:16:48 1.7
+++ src/sys/arch/sparc64/sparc64/cache.c 2011/06/06 02:49:39 1.8
@@ -1,4 +1,4 @@
-/*	$NetBSD: cache.c,v 1.7 2011/06/06 01:16:48 mrg Exp $	*/
+/*	$NetBSD: cache.c,v 1.8 2011/06/06 02:49:39 mrg Exp $	*/
 
 /*
  * Copyright (c) 2011 Matthew R. Green
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cache.c,v 1.7 2011/06/06 01:16:48 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cache.c,v 1.8 2011/06/06 02:49:39 mrg Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -58,7 +58,6 @@
 	sp_blast_dcache(dcache_size, dcache_line_size);
 }
 
-#if 0
 static void
 sp_dcache_flush_page_cpuset(paddr_t pa, sparc64_cpuset_t cs)
 {
@@ -69,35 +68,37 @@
 void    (*dcache_flush_page)(paddr_t) =	dcache_flush_page_us;
 void	(*dcache_flush_page_cpuset)(paddr_t, sparc64_cpuset_t) =
 					sp_dcache_flush_page_cpuset;
-#endif
 void	(*blast_dcache)(void) =		blast_dcache_real;
 void	(*blast_icache)(void) =		blast_icache_us;
 
+#ifdef MULTIPROCESSOR
+void    (*sp_dcache_flush_page)(paddr_t) = dcache_flush_page_us;
+#endif
+
 void
 cache_setup_funcs(void)
 {
 
 	if (CPU_ISSUN4US || CPU_ISSUN4V) {
-#if 0
 		dcache_flush_page = (void (*)(paddr_t)) cache_nop;
+#ifdef MULTIPROCESSOR
+		/* XXXMRG shouldn't be necessary -- only caller is nop'ed out */
+		sp_dcache_flush_page = (void (*)(paddr_t)) cache_nop;
 #endif
 		blast_dcache = cache_nop;
 		blast_icache = cache_nop;
 	} else {
 		if (CPU_IS_USIII_UP()) {
-#if 0
 			dcache_flush_page = dcache_flush_page_usiii;
+#ifdef MULTIPROCESSOR
+			sp_dcache_flush_page = dcache_flush_page_usiii;
 #endif
 			blast_icache = blast_icache_usiii;
-printf("set usIII dcache/icache funcs\n");
 		}
 #ifdef MULTIPROCESSOR
 		if (sparc_ncpus > 1 && (boothowto & RB_MD1) == 0) {
-printf("set MP dcache funcs\n");
-#if 0
 			dcache_flush_page = smp_dcache_flush_page_allcpu;
 			dcache_flush_page_cpuset = smp_dcache_flush_page_cpuset;
-#endif
 			blast_dcache = smp_blast_dcache;
 		}
 #endif

cvs diff -r1.21 -r1.22 src/sys/arch/sparc64/sparc64/cache.h (expand / switch to context diff)
--- src/sys/arch/sparc64/sparc64/cache.h 2011/06/06 01:16:48 1.21
+++ src/sys/arch/sparc64/sparc64/cache.h 2011/06/06 02:49:39 1.22
@@ -1,4 +1,4 @@
-/*	$NetBSD: cache.h,v 1.21 2011/06/06 01:16:48 mrg Exp $ */
+/*	$NetBSD: cache.h,v 1.22 2011/06/06 02:49:39 mrg Exp $ */
 
 /*
  * Copyright (c) 2011 Matthew R. Green
@@ -102,17 +102,6 @@
 void	cache_flush_phys_usiii(paddr_t, psize_t, int);
 
 static __inline__ void
-dcache_flush_page(paddr_t pa)
-{
-	if (CPU_ISSUN4US || CPU_ISSUN4V)
-		return;
-	if (CPU_IS_USIII_UP())
-		dcache_flush_page_usiii(pa);
-	else
-		dcache_flush_page_us(pa);
-}
-
-static __inline__ void
 cache_flush_phys(paddr_t pa, psize_t size, int ecache)
 {
 	if (CPU_IS_USIII_UP() || CPU_IS_SPARC64_V_UP())
@@ -146,25 +135,25 @@
 		sp_tlb_flush_all_us();
 }
 
-#if 0
 extern	void	(*dcache_flush_page)(paddr_t);
 extern	void	(*dcache_flush_page_cpuset)(paddr_t, sparc64_cpuset_t);
-#endif
 extern	void	(*blast_dcache)(void);
 extern	void	(*blast_icache)(void);
 
 void cache_setup_funcs(void);
 
 #ifdef MULTIPROCESSOR
+extern	void	(*sp_dcache_flush_page)(paddr_t);
+
 void smp_tlb_flush_pte(vaddr_t, struct pmap *);
 void smp_dcache_flush_page_cpuset(paddr_t pa, sparc64_cpuset_t);
+void smp_dcache_flush_page_allcpu(paddr_t pa);
 void smp_blast_dcache(void);
-#define	tlb_flush_pte(va,pm	)	smp_tlb_flush_pte(va, pm)
+#define	tlb_flush_pte(va,pm)		smp_tlb_flush_pte(va, pm)
 #define	dcache_flush_page_all(pa)	smp_dcache_flush_page_cpuset(pa, cpus_active)
 #define	dcache_flush_page_cpuset(pa,cs)	smp_dcache_flush_page_cpuset(pa, cs)
 #else
 #define	tlb_flush_pte(va,pm)		sp_tlb_flush_pte(va, (pm)->pm_ctx[0])
 #define	dcache_flush_page_all(pa)	dcache_flush_page(pa)
 #define	dcache_flush_page_cpuset(pa,cs)	dcache_flush_page(pa)
-
 #endif

cvs diff -r1.41 -r1.42 src/sys/arch/sparc64/sparc64/ipifuncs.c (expand / switch to context diff)
--- src/sys/arch/sparc64/sparc64/ipifuncs.c 2011/06/06 01:16:48 1.41
+++ src/sys/arch/sparc64/sparc64/ipifuncs.c 2011/06/06 02:49:39 1.42
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipifuncs.c,v 1.41 2011/06/06 01:16:48 mrg Exp $ */
+/*	$NetBSD: ipifuncs.c,v 1.42 2011/06/06 02:49:39 mrg Exp $ */
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.41 2011/06/06 01:16:48 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.42 2011/06/06 02:49:39 mrg Exp $");
 
 #include "opt_ddb.h"
 
@@ -422,26 +422,21 @@
 {
 	ipifunc_t func;
 
-	if (CPU_ISSUN4US || CPU_ISSUN4V)
-		return;
-
 	if (CPU_IS_USIII_UP())
 		func = sparc64_ipi_dcache_flush_page_usiii;
 	else
 		func = sparc64_ipi_dcache_flush_page_us;
 
 	sparc64_multicast_ipi(activecpus, func, pa, dcache_line_size);
-	dcache_flush_page(pa);
+	sp_dcache_flush_page(pa);
 }
 
-#if 0
 void
 smp_dcache_flush_page_allcpu(paddr_t pa)
 {
 
 	smp_dcache_flush_page_cpuset(pa, cpus_active);
 }
-#endif
 
 /*
  * Flush the D$ on all CPUs.
@@ -449,9 +444,6 @@
 void
 smp_blast_dcache(void)
 {
-
-	if (CPU_ISSUN4US || CPU_ISSUN4V)
-		return;
 
 	sparc64_multicast_ipi(cpus_active, sparc64_ipi_blast_dcache,
 			      dcache_size, dcache_line_size);