From 4893db76f50c49c2931b6507be375f60467d2aea Mon Sep 17 00:00:00 2001 From: jklos Date: Tue, 16 Jul 2013 07:31:40 +0000 Subject: [PATCH] Added DJMEMCMAX option for recognizing 128 meg SIMMs in Centris and Quadra 610, 650 and 800 systems. From Rob Braun, http://synack.net/~bbraun/netbsdmac2.html --- sys/arch/mac68k/conf/GENERIC | 8 +- sys/arch/mac68k/mac68k/genassym.cf | 9 +- sys/arch/mac68k/mac68k/locore.s | 113 +++++++++++++++++++++++- sys/arch/mac68k/mac68k/machdep.c | 7 +- sys/arch/mac68k/mac68k/pmap_bootstrap.c | 20 ++++- 5 files changed, 146 insertions(+), 11 deletions(-) diff --git a/sys/arch/mac68k/conf/GENERIC b/sys/arch/mac68k/conf/GENERIC index b60f3bd39293..8de5ba8e5e60 100644 --- a/sys/arch/mac68k/conf/GENERIC +++ b/sys/arch/mac68k/conf/GENERIC @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.214 2013/06/30 21:38:57 rmind Exp $ +# $NetBSD: GENERIC,v 1.215 2013/07/16 07:31:40 jklos Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/mac68k/conf/std.mac68k" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.214 $" +#ident "GENERIC-$Revision: 1.215 $" maxusers 16 # estimated number of users @@ -35,6 +35,10 @@ options M68020 # Note: must have 68851 PMMU options FPSP options FPU_EMULATE +# Support for 128 meg SIMMs in Centris / Quadra 610, 650 and 800 machines. +# You need to set the total memory in the MacOS Booter. +#options DJMEMCMAX + # Standard system options options INSECURE # disable kernel security levels diff --git a/sys/arch/mac68k/mac68k/genassym.cf b/sys/arch/mac68k/mac68k/genassym.cf index 4e138ed15803..e4ef58e38972 100644 --- a/sys/arch/mac68k/mac68k/genassym.cf +++ b/sys/arch/mac68k/mac68k/genassym.cf @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.36 2011/01/14 02:06:28 rmind Exp $ +# $NetBSD: genassym.cf,v 1.37 2013/07/16 07:31:40 jklos Exp $ # # Copyright (c) 1990 The Regents of the University of California. @@ -169,6 +169,13 @@ define ENOENT ENOENT define EFAULT EFAULT define ENAMETOOLONG ENAMETOOLONG +# machine ids +define MACH_MACC610 MACH_MACC610 +define MACH_MACQ610 MACH_MACQ610 +define MACH_MACC650 MACH_MACC650 +define MACH_MACQ650 MACH_MACQ650 +define MACH_MACQ800 MACH_MACQ800 + # SVR4 binary compatibility ifdef COMPAT_SVR4 define SVR4_SIGF_HANDLER offsetof(struct svr4_sigframe, sf_handler) diff --git a/sys/arch/mac68k/mac68k/locore.s b/sys/arch/mac68k/mac68k/locore.s index 703204c2b795..7b6f2b641c2e 100644 --- a/sys/arch/mac68k/mac68k/locore.s +++ b/sys/arch/mac68k/mac68k/locore.s @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.166 2011/12/22 15:33:29 tsutsui Exp $ */ +/* $NetBSD: locore.s,v 1.167 2013/07/16 07:31:40 jklos Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -273,6 +273,117 @@ Lstart3: movl %a1,%d1 .word 0xf518 | pflusha .long 0x4e7b1807 | movc %d1,%srp + +#if defined(DJMEMCMAX) + movl %a3,%sp@- + cmp #MACH_MACC610,_C_LABEL(machineid) + jra Ldjmemc610 + cmp #MACH_MACQ610,_C_LABEL(machineid) + jra Ldjmemc610 + cmp #MACH_MACC650,_C_LABEL(machineid) + jra Ldjmemccfg + cmp #MACH_MACQ650,_C_LABEL(machineid) + jra Ldjmemccfg + cmp #MACH_MACQ800,_C_LABEL(machineid) + jra Ldjmemccfg + + jra Lnodjmemc + +Ldjmemccfg: + movl #0x50f0e00c,%a0 + movl %a0@,%d0 | determine where RAM SIMMs start + andl #0x000000FF,%d0 + addl #0x10,%d0 | bank 3 start + addl #0x10,%d0 | bank 4 start + + movl #0x50f0e014,%a0 + movl %d0,%a0@+ | bank 4 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 5 + addl #0x10,%d0 + + movl %d0,%a0@+ | bank 6 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 7 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 8 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 9 + addl #0x10,%d0 + jra Ldjmemctop + +Ldjmemc610: + movl #0x50f0e00c,%a0 + movl %a0@,%d0 | determine where RAM SIMMs start + andl #0x000000FF,%d0 + addl #0x10,%d0 | bank 3 start + + movl #0x50f0e014,%a0 + movl %d0,%a0@+ | bank 4 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 5 + movl %d0,%a0@+ | bank 6 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 7 + movl %d0,%a0@+ | bank 8 + addl #0x10,%d0 + movl %d0,%a0@+ | bank 9 + +Ldjmemctop: + movl #0x50F0E02C,%a0 + movl %d0,%a0@ | memtop + + | preserve ~512KB beyond 4MB just in case + movl #0x400000,%a0 + movl #0x9000000,%a2 + movl #0xFFFF,%d0 +L1stbankcopy1: + movl %a0@+,%a2@+ + dbra %d0,L1stbankcopy1 + movl #0xFFFF,%d0 +L1stbankcopy2: + movl %a0@+,%a2@+ + dbra %d0,L1stbankcopy2 + + lea _ASM_LABEL(Lsetup1stbank),%a0 + movl #0x8800000,%a2 | Pick a location that should be in bank 4 + movl #0x64,%d0 +Ldjcopy: + movl %a0@+,%a2@+ + dbra %d0,Ldjcopy + + movl #0x8800000,%a0 + lea _ASM_LABEL(Ldjmemcdone),%a2 + jmp %a0@ + +Lsetup1stbank: + | now configure banks 2 & 3 + movl #0x50f0e00c,%a0 + movl %a0@,%d0 | determine where RAM SIMMs start + andl #0x000000FF,%d0 + movl %d0,%a0@+ + addl #0x10,%d0 | bank 3 start + movl %d0,%a0@ + + | and return to where we came from. + jmp %a2@ + +Ldjmemcdone: + movl #0x400000,%a2 + movl #0x9000000,%a0 + movl #0xFFFF,%d0 +Lcopyback1: + movl %a0@+,%a2@+ + dbra %d0,Lcopyback1 + movl #0xFFFF,%d0 +Lcopyback2: + movl %a0@+,%a2@+ + dbra %d0,Lcopyback2 + +Lnodjmemc: + movl %sp@+,%a3 +#endif + #if PGSHIFT == 13 movl #0xc000,%d0 #else diff --git a/sys/arch/mac68k/mac68k/machdep.c b/sys/arch/mac68k/mac68k/machdep.c index 2c9573233b0e..a37e844d50ab 100644 --- a/sys/arch/mac68k/mac68k/machdep.c +++ b/sys/arch/mac68k/mac68k/machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.345 2012/08/04 17:18:38 martin Exp $ */ +/* $NetBSD: machdep.c,v 1.346 2013/07/16 07:31:40 jklos Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -74,7 +74,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.345 2012/08/04 17:18:38 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.346 2013/07/16 07:31:40 jklos Exp $"); #include "opt_adb.h" #include "opt_ddb.h" @@ -172,6 +172,7 @@ vaddr_t SCSIBase; extern int numranges; extern u_long low[8]; extern u_long high[8]; +extern int machineid; /* These are used to map NuBus space: */ #define NBMAXRANGES 16 @@ -899,7 +900,7 @@ getenvvars(u_long flag, char *buf) /* * More misc stuff from booter. */ - mac68k_machine.machineid = getenv("MACHINEID"); + mac68k_machine.machineid = machineid = getenv("MACHINEID"); mac68k_machine.mach_processor = getenv("PROCESSOR"); mac68k_machine.mach_memsize = getenv("MEMSIZE"); mac68k_machine.do_graybars = getenv("GRAYBARS"); diff --git a/sys/arch/mac68k/mac68k/pmap_bootstrap.c b/sys/arch/mac68k/mac68k/pmap_bootstrap.c index 2ecbd144d9ac..14002b4d6849 100644 --- a/sys/arch/mac68k/mac68k/pmap_bootstrap.c +++ b/sys/arch/mac68k/mac68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.93 2012/02/10 04:49:45 mhitch Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.94 2013/07/16 07:31:40 jklos Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.93 2012/02/10 04:49:45 mhitch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.94 2013/07/16 07:31:40 jklos Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -166,6 +166,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) for (i = 0; i < numranges; i++) mem_size += high[i] - low[i]; nptpages += howmany(m68k_btop(mem_size), NPTEPG); + nptpages++; nextpa += nptpages * PAGE_SIZE; for (i = 0; i < numranges; i++) @@ -534,6 +535,17 @@ bootstrap_mac68k(int tc) extern int *esym; paddr_t nextpa; void *oldROMBase; + char use_bootmem = 0; + +#ifdef DJMEMCMAX + if(mac68k_machine.machineid == MACH_MACC650 || + mac68k_machine.machineid == MACH_MACQ650 || + mac68k_machine.machineid == MACH_MACQ610 || + mac68k_machine.machineid == MACH_MACC610 || + mac68k_machine.machineid == MACH_MACQ800) { + use_bootmem = 1; + } +#endif if (mac68k_machine.do_graybars) printf("Bootstrapping NetBSD/mac68k.\n"); @@ -541,8 +553,8 @@ bootstrap_mac68k(int tc) oldROMBase = ROMBase; mac68k_video.mv_phys = mac68k_video.mv_kvaddr; - if (((tc & 0x80000000) && (mmutype == MMU_68030)) || - ((tc & 0x8000) && (mmutype == MMU_68040))) { + if ((!use_bootmem) && (((tc & 0x80000000) && (mmutype == MMU_68030)) || + ((tc & 0x8000) && (mmutype == MMU_68040)))) { if (mac68k_machine.do_graybars) printf("Getting mapping from MMU.\n"); (void) get_mapping();