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