Module Name:    src
Committed By:   matt
Date:           Tue Jun 21 04:21:17 UTC 2011

Modified Files:
        src/sys/arch/powerpc/booke: booke_machdep.c
        src/sys/arch/powerpc/ibm4xx: cpu.c
        src/sys/arch/powerpc/include: cpu.h
        src/sys/arch/powerpc/oea: cpu_subr.c

Log Message:
Reap the ci_ev_soft* evcnts since every variant implements __HAVE_FAST_SOFTINTS


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/powerpc/booke/booke_machdep.c
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/powerpc/ibm4xx/cpu.c
cvs rdiff -u -r1.84 -r1.85 src/sys/arch/powerpc/include/cpu.h
cvs rdiff -u -r1.68 -r1.69 src/sys/arch/powerpc/oea/cpu_subr.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/powerpc/booke/booke_machdep.c
diff -u src/sys/arch/powerpc/booke/booke_machdep.c:1.9 src/sys/arch/powerpc/booke/booke_machdep.c:1.10
--- src/sys/arch/powerpc/booke/booke_machdep.c:1.9	Mon Jun 20 07:23:36 2011
+++ src/sys/arch/powerpc/booke/booke_machdep.c	Tue Jun 21 04:21:16 2011
@@ -341,14 +341,6 @@
 		NULL, xname, "late clock");
 	evcnt_attach_dynamic_nozero(&cpu->cpu_ev_exec_trap_sync, EVCNT_TYPE_TRAP,
 		NULL, xname, "exec pages synced (trap)");
-#ifndef __HAVE_FAST_SOFTINTS
-	evcnt_attach_dynamic_nozero(&ci->ci_ev_softclock, EVCNT_TYPE_INTR,
-		NULL, xname, "soft clock");
-	evcnt_attach_dynamic_nozero(&ci->ci_ev_softnet, EVCNT_TYPE_INTR,
-		NULL, xname, "soft net");
-	evcnt_attach_dynamic_nozero(&ci->ci_ev_softserial, EVCNT_TYPE_INTR,
-		NULL, xname, "soft serial");
-#endif
 	evcnt_attach_dynamic_nozero(&ci->ci_ev_traps, EVCNT_TYPE_TRAP,
 		NULL, xname, "traps");
 	evcnt_attach_dynamic_nozero(&ci->ci_ev_kdsi, EVCNT_TYPE_TRAP,

Index: src/sys/arch/powerpc/ibm4xx/cpu.c
diff -u src/sys/arch/powerpc/ibm4xx/cpu.c:1.31 src/sys/arch/powerpc/ibm4xx/cpu.c:1.32
--- src/sys/arch/powerpc/ibm4xx/cpu.c:1.31	Sat Jun 18 08:21:20 2011
+++ src/sys/arch/powerpc/ibm4xx/cpu.c	Tue Jun 21 04:21:16 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.31 2011/06/18 08:21:20 matt Exp $	*/
+/*	$NetBSD: cpu.c,v 1.32 2011/06/21 04:21:16 matt Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.31 2011/06/18 08:21:20 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.32 2011/06/21 04:21:16 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -55,29 +55,160 @@
 	u_int version;
 	u_int mask;
 	const char *name;
+	struct cache_info ci;
 };
+
 static const struct cputab models[] = {
-	{ PVR_401A1, 	0xffff0000,	"401A1" 	},
-	{ PVR_401B2, 	0xffff0000,	"401B21" 	},
-	{ PVR_401C2, 	0xffff0000,	"401C2" 	},
-	{ PVR_401D2, 	0xffff0000,	"401D2" 	},
-	{ PVR_401E2, 	0xffff0000,	"401E2" 	},
-	{ PVR_401F2, 	0xffff0000,	"401F2" 	},
-	{ PVR_401G2, 	0xffff0000,	"401G2" 	},
-	{ PVR_403, 	0xffff0000,	"403" 		},
-	{ PVR_405GP, 	0xffff0000,	"405GP" 	},
-	{ PVR_405GPR, 	0xffff0000,	"405GPr" 	},
-	{ PVR_405D5X1, 	0xfffff000, 	"Xilinx Virtex II Pro" 	},
-	{ PVR_405D5X2, 	0xfffff000, 	"Xilinx Virtex 4 FX" 	},
-	{ PVR_405EX, 	0xffff0000, 	"405EX" 	},
-	{ 0, 		0,		NULL 		}
+	{
+		.version = PVR_401A1, 
+		.mask = 0xffff0000,
+		.name = "401A1",
+		.ci = {
+			.dcache_size = 1024,
+			.dcache_line_size = 16,
+			.icache_size = 2848,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401B2, 
+		.mask = 0xffff0000,
+		.name = "401B21",
+		.ci = {
+			.dcache_size = 8192,
+			.dcache_line_size = 16,
+			.icache_size = 16384,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401C2, 
+		.mask = 0xffff0000,
+		.name = "401C2",
+		.ci = {
+			.dcache_size = 8192,
+			.dcache_line_size = 16,
+			.icache_size = 0,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401D2, 
+		.mask = 0xffff0000,
+		.name = "401D2",
+		.ci = {
+			.dcache_size = 2848,
+			.dcache_line_size = 16,
+			.icache_size = 4096,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401E2, 
+		.mask = 0xffff0000,
+		.name = "401E2",
+		.ci = {
+			.dcache_size = 0,
+			.dcache_line_size = 16,
+			.icache_size = 0,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401F2, 
+		.mask = 0xffff0000,
+		.name = "401F2",
+		.ci = {
+			.dcache_size = 2048,
+			.dcache_line_size = 16,
+			.icache_size = 2848,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_401G2, 
+		.mask = 0xffff0000,
+		.name = "401G2",
+		.ci = {
+			.dcache_size = 2848,
+			.dcache_line_size = 16,
+			.icache_size = 8192,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_403, 
+		.mask = 0xffff0000,
+		.name = "403",
+		.ci = {
+			.dcache_size = 8192,
+			.dcache_line_size = 16,
+			.icache_size = 16384,
+			.icache_line_size = 16,
+		}
+	}, {
+		.version = PVR_405GP, 
+		.mask = 0xffff0000,
+		.name = "405GP",
+		.ci = {
+			.dcache_size = 8192,
+			.dcache_line_size = 32,
+			.icache_size = 8192,
+			.icache_line_size = 32,
+		}
+	}, {
+		.version = PVR_405GPR, 
+		.mask = 0xffff0000,
+		.name = "405GPr",
+		.ci = {
+			.dcache_size = 16384,
+			.dcache_line_size = 32,
+			.icache_size = 16384,
+			.icache_line_size = 32,
+		}
+	}, {
+		.version = PVR_405D5X1, 
+		.mask = 0xfffff000, 
+		.name = "Xilinx Virtex II Pro",
+		.ci = {
+			.dcache_size = 16384,
+			.dcache_line_size = 32,
+			.icache_size = 16384,
+			.icache_line_size = 32,
+		}
+	}, {
+		.version = PVR_405D5X2, 
+		.mask = 0xfffff000, 
+		.name = "Xilinx Virtex 4 FX",
+		.ci = {
+			.dcache_size = 16384,
+			.dcache_line_size = 32,
+			.icache_size = 16384,
+			.icache_line_size = 32,
+		}
+	}, {
+		.version = PVR_405EX, 
+		.mask = 0xffff0000, 
+		.name = "405EX",
+		.ci = {
+			.dcache_size = 16384,
+			.dcache_line_size = 32,
+			.icache_size = 16384,
+			.icache_line_size = 32,
+		}
+	}, {
+		.version = 0,
+		.mask = 0,
+		.name = NULL,
+		.ci = {
+			/*
+			 * Unknown CPU type.  For safety we'll specify a
+			 * cache with a 4-byte line size.  That way cache
+			 * flush routines won't miss any lines.
+			 */
+			.dcache_line_size = 4,
+			.icache_line_size = 4,
+		},
+	},
 };
 
 static int	cpumatch(device_t, cfdata_t, void *);
 static void	cpuattach(device_t, device_t, void *);
 
-CFATTACH_DECL_NEW(cpu, 0,
-    cpumatch, cpuattach, NULL, NULL);
+CFATTACH_DECL_NEW(cpu, 0, cpumatch, cpuattach, NULL, NULL);
 
 int ncpus;
 
@@ -88,19 +219,13 @@
 		    NULL, "cpu0", "clock"),
 		.ci_ev_statclock = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,
 		    NULL, "cpu0", "stat clock"),
-		.ci_ev_softclock = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,
-		    NULL, "cpu0", "soft clock"),
-		.ci_ev_softnet = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,
-		    NULL, "cpu0", "soft net"),
-		.ci_ev_softserial = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,
-		    NULL, "cpu0", "soft serial"),
 		.ci_curlwp = &lwp0,
 	}
 };
 
 char cpu_model[80];
 
-int cpufound = 0;
+bool cpufound;
 
 static int
 cpumatch(device_t parent, cfdata_t cf, void *aux)
@@ -117,8 +242,8 @@
 static void
 cpuattach(device_t parent, device_t self, void *aux)
 {
-	const struct cputab *cp = models;
-	u_int pvr;
+	struct cpu_info * const ci = curcpu();
+	const struct cputab *cp;
 	u_int processor_freq;
 	prop_number_t freq;
 
@@ -126,36 +251,35 @@
 	KASSERT(freq != NULL);
 	processor_freq = (unsigned int) prop_number_integer_value(freq);
 
-	cpufound++;
+	cpufound = true;
 	ncpus++;
 
-	pvr = mfpvr();
-	while (cp->name) {
-		if ((pvr & cp->mask) == cp->version)
+	const u_int pvr = mfpvr();
+	for (cp = models; cp->name != NULL; cp++) {
+		if ((pvr & cp->mask) == cp->version) {
+			strcpy(cpu_model, cp->name);
 			break;
-		cp++;
+		}
 	}
-	if (cp->name)
-		strcpy(cpu_model, cp->name);
-	else
+	if (__predict_false(cp->name == NULL))
 		sprintf(cpu_model, "Version 0x%x", pvr);
 
-	printf(": %dMHz %s (PVR 0x%x)\n", processor_freq / 1000 / 1000,
-	    cp->name ? cp->name : "unknown model", pvr);
+	aprint_normal(": %uMHz %s (PVR 0x%x)\n",
+	    (processor_freq + 500000) / 1000000,
+	    (cp->name != NULL ? cpu_model : "unknown model"),
+	    pvr);
 
 	cpu_probe_cache();
 
 	/* We would crash later on anyway so just make the reason obvious */
-	if (curcpu()->ci_ci.icache_size == 0 &&
-	    curcpu()->ci_ci.dcache_size == 0)
-		panic("%s could not detect cache size", device_xname(self));
-
-	printf("%s: Instruction cache size %d line size %d\n",
-	    device_xname(self),
-	    curcpu()->ci_ci.icache_size, curcpu()->ci_ci.icache_line_size);
-	printf("%s: Data cache size %d line size %d\n",
-	    device_xname(self),
-	    curcpu()->ci_ci.dcache_size, curcpu()->ci_ci.dcache_line_size);
+	if (ci->ci_ci.icache_size == 0 && ci->ci_ci.dcache_size == 0)
+		panic("%s: %s: could not detect cache size",
+		    __func__, device_xname(self));
+
+	aprint_normal_dev(self, "%uKB/%uB L1 instruction cache\n",
+	    ci->ci_ci.icache_size / 1024, ci->ci_ci.icache_line_size);
+	aprint_normal_dev(self, "%uKB/%uB L1 data cache\n",
+	    ci->ci_ci.dcache_size / 1024, ci->ci_ci.dcache_line_size);
 }
 
 /*
@@ -166,95 +290,19 @@
 void
 cpu_probe_cache(void)
 {
+	struct cpu_info * const ci = curcpu();
 	const struct cputab *cp = models;
-	u_int pvr;
 
-	pvr = mfpvr();
-	while (cp->name) {
+	const u_int pvr = mfpvr();
+	for (cp = models; cp->name != NULL; cp++) {
 		if ((pvr & cp->mask) == cp->version)
 			break;
-		cp++;
 	}
 
 	/*
-	 * First we need to identify the CPU and determine the
-	 * cache line size, or things like memset/memcpy may lose
-	 * badly.
+	 * Copy the cache from the cputab into cpu_info.
 	 */
-	switch (cp->version) {
-	case PVR_401A1:
-		curcpu()->ci_ci.dcache_size = 1024;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 2848;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401B2:
-		curcpu()->ci_ci.dcache_size = 8192;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 16384;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401C2:
-		curcpu()->ci_ci.dcache_size = 8192;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 0;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401D2:
-		curcpu()->ci_ci.dcache_size = 2848;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 4096;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401E2:
-		curcpu()->ci_ci.dcache_size = 0;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 0;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401F2:
-		curcpu()->ci_ci.dcache_size = 2048;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 2848;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_401G2:
-		curcpu()->ci_ci.dcache_size = 2848;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 8192;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_403:
-		curcpu()->ci_ci.dcache_size = 8192;
-		curcpu()->ci_ci.dcache_line_size = 16;
-		curcpu()->ci_ci.icache_size = 16384;
-		curcpu()->ci_ci.icache_line_size = 16;
-		break;
-	case PVR_405GP:
-		curcpu()->ci_ci.dcache_size = 8192;
-		curcpu()->ci_ci.dcache_line_size = 32;
-		curcpu()->ci_ci.icache_size = 8192;
-		curcpu()->ci_ci.icache_line_size = 32;
-		break;
-	case PVR_405GPR:
-	case PVR_405D5X1:
-	case PVR_405D5X2:
-	case PVR_405EX:
-		curcpu()->ci_ci.dcache_size = 16384;
-		curcpu()->ci_ci.dcache_line_size = 32;
-		curcpu()->ci_ci.icache_size = 16384;
-		curcpu()->ci_ci.icache_line_size = 32;
-		break;
-	default:
-		/*
-		 * Unknown CPU type.  For safety we'll specify a
-		 * cache with a 4-byte line size.  That way cache
-		 * flush routines won't miss any lines.
-		 */
-		curcpu()->ci_ci.dcache_line_size = 4;
-		curcpu()->ci_ci.icache_line_size = 4;
-		break;
-	}
+	ci->ci_ci = cp->ci;
 }
 
 /*
@@ -263,57 +311,14 @@
  */
 
 void
-dcache_flush_page(vaddr_t va)
-{
-	int i;
-
-	if (curcpu()->ci_ci.dcache_line_size)
-		for (i = 0; i < PAGE_SIZE;
-		     i += curcpu()->ci_ci.dcache_line_size)
-			__asm volatile("dcbf %0,%1" : : "r" (va), "r" (i));
-	__asm volatile("sync;isync" : : );
-}
-
-void
-icache_flush_page(vaddr_t va)
+dcache_wbinv_page(vaddr_t va)
 {
-	int i;
-
-	if (curcpu()->ci_ci.icache_line_size)
-		for (i = 0; i < PAGE_SIZE;
-		     i += curcpu()->ci_ci.icache_line_size)
-			__asm volatile("icbi %0,%1" : : "r" (va), "r" (i));
-	__asm volatile("sync;isync" : : );
-}
+	const size_t dcache_line_size = curcpu()->ci_ci.dcache_line_size;
 
-void
-dcache_flush(vaddr_t va, vsize_t len)
-{
-	int i;
-
-	if (len == 0)
-		return;
-
-	/* Make sure we flush all cache lines */
-	len += va & (curcpu()->ci_ci.dcache_line_size-1);
-	if (curcpu()->ci_ci.dcache_line_size)
-		for (i = 0; i < len; i += curcpu()->ci_ci.dcache_line_size)
-			__asm volatile("dcbf %0,%1" : : "r" (va), "r" (i));
-	__asm volatile("sync;isync" : : );
-}
-
-void
-icache_flush(vaddr_t va, vsize_t len)
-{
-	int i;
-
-	if (len == 0)
-		return;
-
-	/* Make sure we flush all cache lines */
-	len += va & (curcpu()->ci_ci.icache_line_size-1);
-	if (curcpu()->ci_ci.icache_line_size)
-		for (i = 0; i < len; i += curcpu()->ci_ci.icache_line_size)
-			__asm volatile("icbi %0,%1" : : "r" (va), "r" (i));
-	__asm volatile("sync;isync" : : );
+	if (dcache_line_size) {
+		for (size_t i = 0; i < PAGE_SIZE; i += dcache_line_size) {
+			__asm volatile("dcbf %0,%1" : : "b" (va), "r" (i));
+		}
+		__asm volatile("sync;isync" : : );
+	}
 }

Index: src/sys/arch/powerpc/include/cpu.h
diff -u src/sys/arch/powerpc/include/cpu.h:1.84 src/sys/arch/powerpc/include/cpu.h:1.85
--- src/sys/arch/powerpc/include/cpu.h:1.84	Mon Jun 20 17:15:38 2011
+++ src/sys/arch/powerpc/include/cpu.h	Tue Jun 21 04:21:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.84 2011/06/20 17:15:38 matt Exp $	*/
+/*	$NetBSD: cpu.h,v 1.85 2011/06/21 04:21:17 matt Exp $	*/
 
 /*
  * Copyright (C) 1999 Wolfgang Solfrank.
@@ -124,9 +124,6 @@
 	uint32_t ci_khz;
 	struct evcnt ci_ev_clock;	/* clock intrs */
 	struct evcnt ci_ev_statclock; 	/* stat clock */
-	struct evcnt ci_ev_softclock;	/* softclock intrs */
-	struct evcnt ci_ev_softnet;	/* softnet intrs */
-	struct evcnt ci_ev_softserial;	/* softserial intrs */
 	struct evcnt ci_ev_traps;	/* calls to trap() */
 	struct evcnt ci_ev_kdsi;	/* kernel DSI traps */
 	struct evcnt ci_ev_udsi;	/* user DSI traps */
@@ -326,15 +323,8 @@
 	cpu_attach_common(device_t, int);
 void	cpu_setup(device_t, struct cpu_info *);
 void	cpu_identify(char *, size_t);
-int	cpu_get_dfs(void);
-void	cpu_set_dfs(int);
 void	cpu_probe_cache(void);
-#ifndef PPC_BOOKE
-void	dcache_flush_page(vaddr_t);
-void	icache_flush_page(vaddr_t);
-void	dcache_flush(vaddr_t, vsize_t);
-void	icache_flush(vaddr_t, vsize_t);
-#else
+
 void	dcache_wb_page(vaddr_t);
 void	dcache_wbinv_page(vaddr_t);
 void	dcache_inv_page(vaddr_t);
@@ -344,7 +334,7 @@
 void	dcache_wbinv(vaddr_t, vsize_t);
 void	dcache_inv(vaddr_t, vsize_t);
 void	icache_inv(vaddr_t, vsize_t);
-#endif
+
 void *	mapiodev(paddr_t, psize_t);
 void	unmapiodev(vaddr_t, vsize_t);
 
@@ -390,6 +380,9 @@
 void	cpu_fixup_stubs(void);
 
 #if !defined(PPC_IBM4XX) && !defined(PPC_BOOKE) && !defined(_MODULE)
+int	cpu_get_dfs(void);
+void	cpu_set_dfs(int);
+
 void	oea_init(void (*)(void));
 void	oea_startup(const char *);
 void	oea_dumpsys(void);

Index: src/sys/arch/powerpc/oea/cpu_subr.c
diff -u src/sys/arch/powerpc/oea/cpu_subr.c:1.68 src/sys/arch/powerpc/oea/cpu_subr.c:1.69
--- src/sys/arch/powerpc/oea/cpu_subr.c:1.68	Mon Jun 20 16:31:28 2011
+++ src/sys/arch/powerpc/oea/cpu_subr.c	Tue Jun 21 04:21:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.68 2011/06/20 16:31:28 pgoyette Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.69 2011/06/21 04:21:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 2001 Matt Thomas.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.68 2011/06/20 16:31:28 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.69 2011/06/21 04:21:17 matt Exp $");
 
 #include "opt_ppcparam.h"
 #include "opt_multiprocessor.h"
@@ -658,12 +658,6 @@
 
 	evcnt_attach_dynamic(&ci->ci_ev_clock, EVCNT_TYPE_INTR,
 		NULL, xname, "clock");
-	evcnt_attach_dynamic(&ci->ci_ev_softclock, EVCNT_TYPE_INTR,
-		NULL, xname, "soft clock");
-	evcnt_attach_dynamic(&ci->ci_ev_softnet, EVCNT_TYPE_INTR,
-		NULL, xname, "soft net");
-	evcnt_attach_dynamic(&ci->ci_ev_softserial, EVCNT_TYPE_INTR,
-		NULL, xname, "soft serial");
 	evcnt_attach_dynamic(&ci->ci_ev_traps, EVCNT_TYPE_TRAP,
 		NULL, xname, "traps");
 	evcnt_attach_dynamic(&ci->ci_ev_kdsi, EVCNT_TYPE_TRAP,

Reply via email to