Support Cache Protocol 'MEI' with MULTIPROCESSOR.

This commit is contained in:
kiyohara 2012-10-20 14:42:15 +00:00
parent 62d7fcf09f
commit 515e584834
6 changed files with 111 additions and 29 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 *ci)
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 *sme, envsys_data_t *edata)
#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_info *ci)
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_info *ci)
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);

View File

@ -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_translations *, int);
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)

View File

@ -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_idlezeroed_pages;
/* 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_t pa, vm_prot_t prot, u_int flags)
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, vm_prot_t prot, u_int flags)
break;
}
}
#ifdef MULTIPROCESSOR
if (((mfpvr() >> 16) & 0xffff) == MPC603e)
pte_lo = PTE_M;
#endif
}
if (prot & VM_PROT_WRITE)

View File

@ -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 *l2, void *stack, size_t stacksize,
#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