Module Name:    src
Committed By:   kiyohara
Date:           Sat Oct 20 14:42:15 UTC 2012

Modified Files:
        src/sys/arch/powerpc/conf: files.powerpc
        src/sys/arch/powerpc/include: cpu.h
        src/sys/arch/powerpc/oea: cpu_subr.c ofwoea_machdep.c pmap.c
        src/sys/arch/powerpc/powerpc: vm_machdep.c

Log Message:
Support Cache Protocol 'MEI' with MULTIPROCESSOR.


To generate a diff of this commit:
cvs rdiff -u -r1.84 -r1.85 src/sys/arch/powerpc/conf/files.powerpc
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/powerpc/include/cpu.h
cvs rdiff -u -r1.75 -r1.76 src/sys/arch/powerpc/oea/cpu_subr.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/powerpc/oea/ofwoea_machdep.c
cvs rdiff -u -r1.86 -r1.87 src/sys/arch/powerpc/oea/pmap.c
cvs rdiff -u -r1.97 -r1.98 src/sys/arch/powerpc/powerpc/vm_machdep.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/conf/files.powerpc
diff -u src/sys/arch/powerpc/conf/files.powerpc:1.84 src/sys/arch/powerpc/conf/files.powerpc:1.85
--- src/sys/arch/powerpc/conf/files.powerpc:1.84	Tue Oct  2 23:51:39 2012
+++ src/sys/arch/powerpc/conf/files.powerpc	Sat Oct 20 14:42:15 2012
@@ -1,9 +1,10 @@
-#	$NetBSD: files.powerpc,v 1.84 2012/10/02 23:51:39 christos Exp $
+#	$NetBSD: files.powerpc,v 1.85 2012/10/20 14:42:15 kiyohara Exp $
 
 defflag	opt_altivec.h	ALTIVEC K_ALTIVEC PPC_HAVE_SPE
 defflag	opt_openpic.h	OPENPIC OPENPIC_SERIAL_MODE OPENPIC_DISTRIBUTE
 defparam opt_ppcparam.h	L2CR_CONFIG L3CR_CONFIG INTSTK CLOCKBASE VERBOSE_INITPPC
 defflag	opt_ppcarch.h	PPC_OEA PPC_OEA601 PPC_OEA64 PPC_OEA64_BRIDGE PPC_MPC8XX PPC_IBM4XX PPC_IBM403 PPC_BOOKE
+defflag opt_ppccache.h	CACHE_PROTO_MEI
 defflag opt_pmap.h	PMAPDEBUG PMAPCHECK PMAPCOUNTERS PMAP_MINIMALTLB
 defparam opt_pmap.h	PTEGCOUNT PMAP_MEMLIMIT
 

Index: src/sys/arch/powerpc/include/cpu.h
diff -u src/sys/arch/powerpc/include/cpu.h:1.93 src/sys/arch/powerpc/include/cpu.h:1.94
--- src/sys/arch/powerpc/include/cpu.h:1.93	Sat Jul 28 23:11:00 2012
+++ src/sys/arch/powerpc/include/cpu.h	Sat Oct 20 14:42:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.93 2012/07/28 23:11:00 matt Exp $	*/
+/*	$NetBSD: cpu.h,v 1.94 2012/10/20 14:42:15 kiyohara Exp $	*/
 
 /*
  * Copyright (C) 1999 Wolfgang Solfrank.
@@ -165,7 +165,8 @@ struct cpu_hatch_data {
 	uintptr_t hatch_asr;
 	uintptr_t hatch_sdr1;
 	uint32_t hatch_sr[16];
-	uintptr_t hatch_batu[8], hatch_batl[8];
+	uintptr_t hatch_ibatu[8], hatch_ibatl[8];
+	uintptr_t hatch_dbatu[8], hatch_dbatl[8];
 #endif
 #if defined(PPC_BOOKE)
 	vaddr_t hatch_sp;

Index: src/sys/arch/powerpc/oea/cpu_subr.c
diff -u src/sys/arch/powerpc/oea/cpu_subr.c:1.75 src/sys/arch/powerpc/oea/cpu_subr.c:1.76
--- src/sys/arch/powerpc/oea/cpu_subr.c:1.75	Sat Oct 20 13:18:45 2012
+++ src/sys/arch/powerpc/oea/cpu_subr.c	Sat Oct 20 14:42:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.75 2012/10/20 13:18:45 kiyohara Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.76 2012/10/20 14:42:15 kiyohara Exp $	*/
 
 /*-
  * Copyright (c) 2001 Matt Thomas.
@@ -34,9 +34,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.75 2012/10/20 13:18:45 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.76 2012/10/20 14:42:15 kiyohara Exp $");
 
 #include "opt_ppcparam.h"
+#include "opt_ppccache.h"
 #include "opt_multiprocessor.h"
 #include "opt_altivec.h"
 #include "sysmon_envsys.h"
@@ -581,6 +582,13 @@ cpu_setup(device_t self, struct cpu_info
 		break;
 	}
 
+#ifdef MULTIPROCESSOR
+	switch (vers) {
+	case MPC603e:
+		hid0 |= HID0_ABE;
+	}
+#endif
+
 	if (hid0 != hid0_save) {
 		mtspr(SPR_HID0, hid0);
 		__asm volatile("sync;isync");
@@ -1189,7 +1197,7 @@ cpu_tau_refresh(struct sysmon_envsys *sm
 #endif /* NSYSMON_ENVSYS > 0 */
 
 #ifdef MULTIPROCESSOR
-extern volatile u_int cpu_spinstart_ack;
+volatile u_int cpu_spinstart_ack, cpu_spinstart_cpunum;
 
 int
 cpu_spinup(device_t self, struct cpu_info *ci)
@@ -1243,14 +1251,22 @@ cpu_spinup(device_t self, struct cpu_inf
 		h->hatch_asr = 0;
 
 	/* copy the bat regs */
-	__asm volatile ("mfibatu %0,0" : "=r"(h->hatch_batu[0]));
-	__asm volatile ("mfibatl %0,0" : "=r"(h->hatch_batl[0]));
-	__asm volatile ("mfibatu %0,1" : "=r"(h->hatch_batu[1]));
-	__asm volatile ("mfibatl %0,1" : "=r"(h->hatch_batl[1]));
-	__asm volatile ("mfibatu %0,2" : "=r"(h->hatch_batu[2]));
-	__asm volatile ("mfibatl %0,2" : "=r"(h->hatch_batl[2]));
-	__asm volatile ("mfibatu %0,3" : "=r"(h->hatch_batu[3]));
-	__asm volatile ("mfibatl %0,3" : "=r"(h->hatch_batl[3]));
+	__asm volatile ("mfibatu %0,0" : "=r"(h->hatch_ibatu[0]));
+	__asm volatile ("mfibatl %0,0" : "=r"(h->hatch_ibatl[0]));
+	__asm volatile ("mfibatu %0,1" : "=r"(h->hatch_ibatu[1]));
+	__asm volatile ("mfibatl %0,1" : "=r"(h->hatch_ibatl[1]));
+	__asm volatile ("mfibatu %0,2" : "=r"(h->hatch_ibatu[2]));
+	__asm volatile ("mfibatl %0,2" : "=r"(h->hatch_ibatl[2]));
+	__asm volatile ("mfibatu %0,3" : "=r"(h->hatch_ibatu[3]));
+	__asm volatile ("mfibatl %0,3" : "=r"(h->hatch_ibatl[3]));
+	__asm volatile ("mfdbatu %0,0" : "=r"(h->hatch_dbatu[0]));
+	__asm volatile ("mfdbatl %0,0" : "=r"(h->hatch_dbatl[0]));
+	__asm volatile ("mfdbatu %0,1" : "=r"(h->hatch_dbatu[1]));
+	__asm volatile ("mfdbatl %0,1" : "=r"(h->hatch_dbatl[1]));
+	__asm volatile ("mfdbatu %0,2" : "=r"(h->hatch_dbatu[2]));
+	__asm volatile ("mfdbatl %0,2" : "=r"(h->hatch_dbatl[2]));
+	__asm volatile ("mfdbatu %0,3" : "=r"(h->hatch_dbatu[3]));
+	__asm volatile ("mfdbatl %0,3" : "=r"(h->hatch_dbatl[3]));
 	__asm volatile ("sync; isync");
 
 	if (md_setup_trampoline(h, ci) == -1)
@@ -1262,7 +1278,19 @@ cpu_spinup(device_t self, struct cpu_inf
 
 	delay(200000);
 
+#ifdef CACHE_PROTO_MEI
+	__asm volatile ("dcbi 0,%0"::"r"(&h->hatch_running):"memory");
+	__asm volatile ("sync; isync");
+	__asm volatile ("dcbst 0,%0"::"r"(&h->hatch_running):"memory");
+	__asm volatile ("sync; isync");
+#endif
 	if (h->hatch_running < 1) {
+#ifdef CACHE_PROTO_MEI
+		__asm volatile ("dcbi 0,%0"::"r"(&cpu_spinstart_ack):"memory");
+		__asm volatile ("sync; isync");
+		__asm volatile ("dcbst 0,%0"::"r"(&cpu_spinstart_ack):"memory");
+		__asm volatile ("sync; isync");
+#endif
 		aprint_error("%d:CPU %d didn't start %d\n", cpu_spinstart_ack,
 		    ci->ci_cpuid, cpu_spinstart_ack);
 		Debugger();
@@ -1305,14 +1333,22 @@ cpu_hatch(void)
 	cpu_spinstart_ack = 0;
 
 	/* Initialize MMU. */
-	__asm ("mtibatu 0,%0" :: "r"(h->hatch_batu[0]));
-	__asm ("mtibatl 0,%0" :: "r"(h->hatch_batl[0]));
-	__asm ("mtibatu 1,%0" :: "r"(h->hatch_batu[1]));
-	__asm ("mtibatl 1,%0" :: "r"(h->hatch_batl[1]));
-	__asm ("mtibatu 2,%0" :: "r"(h->hatch_batu[2]));
-	__asm ("mtibatl 2,%0" :: "r"(h->hatch_batl[2]));
-	__asm ("mtibatu 3,%0" :: "r"(h->hatch_batu[3]));
-	__asm ("mtibatl 3,%0" :: "r"(h->hatch_batl[3]));
+	__asm ("mtibatu 0,%0" :: "r"(h->hatch_ibatu[0]));
+	__asm ("mtibatl 0,%0" :: "r"(h->hatch_ibatl[0]));
+	__asm ("mtibatu 1,%0" :: "r"(h->hatch_ibatu[1]));
+	__asm ("mtibatl 1,%0" :: "r"(h->hatch_ibatl[1]));
+	__asm ("mtibatu 2,%0" :: "r"(h->hatch_ibatu[2]));
+	__asm ("mtibatl 2,%0" :: "r"(h->hatch_ibatl[2]));
+	__asm ("mtibatu 3,%0" :: "r"(h->hatch_ibatu[3]));
+	__asm ("mtibatl 3,%0" :: "r"(h->hatch_ibatl[3]));
+	__asm ("mtdbatu 0,%0" :: "r"(h->hatch_dbatu[0]));
+	__asm ("mtdbatl 0,%0" :: "r"(h->hatch_dbatl[0]));
+	__asm ("mtdbatu 1,%0" :: "r"(h->hatch_dbatu[1]));
+	__asm ("mtdbatl 1,%0" :: "r"(h->hatch_dbatl[1]));
+	__asm ("mtdbatu 2,%0" :: "r"(h->hatch_dbatu[2]));
+	__asm ("mtdbatl 2,%0" :: "r"(h->hatch_dbatl[2]));
+	__asm ("mtdbatu 3,%0" :: "r"(h->hatch_dbatu[3]));
+	__asm ("mtdbatl 3,%0" :: "r"(h->hatch_dbatl[3]));
 
 	mtspr(SPR_HID0, h->hatch_hid0);
 

Index: src/sys/arch/powerpc/oea/ofwoea_machdep.c
diff -u src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.30 src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.31
--- src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.30	Tue Jul 17 03:13:31 2012
+++ src/sys/arch/powerpc/oea/ofwoea_machdep.c	Sat Oct 20 14:42:15 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ofwoea_machdep.c,v 1.30 2012/07/17 03:13:31 jmmv Exp $ */
+/* $NetBSD: ofwoea_machdep.c,v 1.31 2012/10/20 14:42:15 kiyohara Exp $ */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.30 2012/07/17 03:13:31 jmmv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.31 2012/10/20 14:42:15 kiyohara Exp $");
 
 #include "opt_ppcarch.h"
 #include "opt_compat_netbsd.h"
@@ -130,7 +130,7 @@ static void restore_ofmap(struct ofw_tra
 static void set_timebase(void);
 
 extern void cpu_spinstart(u_int);
-volatile u_int cpu_spinstart_ack, cpu_spinstart_cpunum;
+extern volatile u_int cpu_spinstart_ack;
 
 void
 ofwoea_initppc(u_int startkernel, u_int endkernel, char *args)

Index: src/sys/arch/powerpc/oea/pmap.c
diff -u src/sys/arch/powerpc/oea/pmap.c:1.86 src/sys/arch/powerpc/oea/pmap.c:1.87
--- src/sys/arch/powerpc/oea/pmap.c:1.86	Sat Jul 28 23:11:00 2012
+++ src/sys/arch/powerpc/oea/pmap.c	Sat Oct 20 14:42:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.86 2012/07/28 23:11:00 matt Exp $	*/
+/*	$NetBSD: pmap.c,v 1.87 2012/10/20 14:42:15 kiyohara Exp $	*/
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.86 2012/07/28 23:11:00 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.87 2012/10/20 14:42:15 kiyohara Exp $");
 
 #define	PMAP_NOOPNAMES
 
@@ -490,7 +490,11 @@ extern struct evcnt pmap_evcnt_idlezeroe
 /* XXXSL: this needs to be moved to assembler */
 #define	TLBIEL(va)	__asm __volatile("tlbie %0" :: "r"(va))
 
+#ifdef MD_TLBSYNC
+#define TLBSYNC()	MD_TLBSYNC()
+#else
 #define	TLBSYNC()	__asm volatile("tlbsync")
+#endif
 #define	SYNC()		__asm volatile("sync")
 #define	EIEIO()		__asm volatile("eieio")
 #define	DCBST(va)	__asm __volatile("dcbst 0,%0" :: "r"(va))
@@ -1939,6 +1943,10 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 				break;
 			}
 		}
+#ifdef MULTIPROCESSOR
+		if (((mfpvr() >> 16) & 0xffff) == MPC603e)
+			pte_lo = PTE_M;
+#endif
 	} else {
 		pte_lo |= PTE_I;
 	}
@@ -2032,6 +2040,10 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 				break;
 			}
 		}
+#ifdef MULTIPROCESSOR
+		if (((mfpvr() >> 16) & 0xffff) == MPC603e)
+			pte_lo = PTE_M;
+#endif
 	}
 
 	if (prot & VM_PROT_WRITE)

Index: src/sys/arch/powerpc/powerpc/vm_machdep.c
diff -u src/sys/arch/powerpc/powerpc/vm_machdep.c:1.97 src/sys/arch/powerpc/powerpc/vm_machdep.c:1.98
--- src/sys/arch/powerpc/powerpc/vm_machdep.c:1.97	Thu Jun 28 15:28:44 2012
+++ src/sys/arch/powerpc/powerpc/vm_machdep.c	Sat Oct 20 14:42:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.97 2012/06/28 15:28:44 matt Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.98 2012/10/20 14:42:15 kiyohara Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,11 +32,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.97 2012/06/28 15:28:44 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.98 2012/10/20 14:42:15 kiyohara Exp $");
 
 #include "opt_altivec.h"
 #include "opt_multiprocessor.h"
 #include "opt_ppcarch.h"
+#include "opt_ppccache.h"
 
 #include <sys/param.h>
 #include <sys/core.h>
@@ -151,6 +152,37 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 #ifdef PPC_HAVE_FPU
 	pcb2->pcb_flags = PSL_FE_DFLT;
 #endif
+#ifdef CACHE_PROTO_MEI
+	{
+		paddr_t pa;
+		int dcache_line_size, i;
+
+		/* Flush on cache values for other cpu. */
+
+		dcache_line_size = curcpu()->ci_ci.dcache_line_size;
+		pa = vtophys((vaddr_t)sf);
+		for (i = 0; i < SFRAMELEN + CALLFRAMELEN + FRAMELEN;
+		    i += dcache_line_size) {
+			__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+			pa += dcache_line_size;
+		}
+		__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+		pa = vtophys((vaddr_t)pcb2->pcb_pm);
+		for (i = 0; i < sizeof(*pcb2->pcb_pm); i += dcache_line_size) {
+			__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+			pa += dcache_line_size;
+		}
+		__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+		pa = vtophys((vaddr_t)pcb2);
+		for (i = 0; i < sizeof(*pcb2); i += dcache_line_size) {
+			__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+			pa += dcache_line_size;
+		}
+		__asm volatile ("dcbf 0,%0"::"r"(pa):"memory");
+
+		/* Need more flush? */
+	}
+#endif
 }
 
 void

Reply via email to