1 /* $NetBSD: autoconf.c,v 1.23 2008/02/14 00:04:51 joerg Exp $ */ 2 3 /* 4 * Copyright (c) 1982, 1986, 1990, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * the Systems Programming Group of the University of Utah Computer 9 * Science Department. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * from: Utah $Hdr: autoconf.c 1.36 92/12/20$ 36 * 37 * @(#)autoconf.c 8.2 (Berkeley) 1/12/94 38 */ 39 /* 40 * Copyright (c) 1988 University of Utah. 41 * 42 * This code is derived from software contributed to Berkeley by 43 * the Systems Programming Group of the University of Utah Computer 44 * Science Department. 45 * 46 * Redistribution and use in source and binary forms, with or without 47 * modification, are permitted provided that the following conditions 48 * are met: 49 * 1. Redistributions of source code must retain the above copyright 50 * notice, this list of conditions and the following disclaimer. 51 * 2. Redistributions in binary form must reproduce the above copyright 52 * notice, this list of conditions and the following disclaimer in the 53 * documentation and/or other materials provided with the distribution. 54 * 3. All advertising materials mentioning features or use of this software 55 * must display the following acknowledgement: 56 * This product includes software developed by the University of 57 * California, Berkeley and its contributors. 58 * 4. Neither the name of the University nor the names of its contributors 59 * may be used to endorse or promote products derived from this software 60 * without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 63 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 64 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 65 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 66 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 67 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 68 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 69 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 70 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 71 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 72 * SUCH DAMAGE. 73 * 74 * from: Utah $Hdr: autoconf.c 1.36 92/12/20$ 75 * 76 * @(#)autoconf.c 8.2 (Berkeley) 1/12/94 77 */ 78 79 /* 80 * Setup the system to run on the current machine. 81 * 82 * Configure() is called at boot time. Available 83 * devices are determined (from possibilities mentioned in ioconf.c), 84 * and the drivers are initialized. 85 */ 86 87 #include <sys/cdefs.h> 88 __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.23 2008/02/14 00:04:51 joerg Exp $"); 89 90 #include <sys/param.h> 91 #include <sys/systm.h> 92 #include <sys/buf.h> 93 #include <sys/conf.h> 94 #include <sys/reboot.h> 95 #include <sys/device.h> 96 97 #include <machine/vmparam.h> 98 #include <machine/autoconf.h> 99 #include <machine/disklabel.h> 100 #include <machine/cpu.h> 101 #include <machine/pte.h> 102 103 #include <next68k/next68k/isr.h> 104 #include <next68k/next68k/nextrom.h> 105 106 #include <next68k/dev/intiovar.h> 107 108 volatile u_long *intrstat; 109 volatile u_long *intrmask; 110 111 static struct device *getdevunit(const char *, int); 112 static int devidentparse(const char *, int *, int *, int *); 113 static int atoi(const char *); 114 115 struct device_equiv { 116 const char *alias; 117 const char *real; 118 }; 119 static struct device_equiv device_equiv[] = { 120 { "en", "xe" }, 121 { "tp", "xe" }, 122 }; 123 static int ndevice_equivs = (sizeof(device_equiv)/sizeof(device_equiv[0])); 124 125 /* 126 * Determine mass storage and memory configuration for a machine. 127 */ 128 void 129 cpu_configure(void) 130 { 131 /* int dma_rev; */ 132 extern u_int rom_intrmask; 133 extern u_int rom_intrstat; 134 135 booted_device = NULL; /* set by device drivers (if found) */ 136 137 #if 0 138 dma_rev = ((volatile u_char *)IIOV(NEXT_P_SCR1))[1]; 139 switch (dma_rev) { 140 case 0: 141 intrmask = (volatile u_long *)IIOV(NEXT_P_INTRMASK_0); 142 intrstat = (volatile u_long *)IIOV(NEXT_P_INTRSTAT_0); 143 /* dspreg = (volatile u_long *)IIOV(0x2007000); */ 144 break; 145 case 1: 146 intrmask = (volatile u_long *)IIOV(NEXT_P_INTRMASK); 147 intrstat = (volatile u_long *)IIOV(NEXT_P_INTRSTAT); 148 /* dspreg = (volatile u_long *)IIOV(0x2108000); */ 149 break; 150 default: 151 panic("unknown DMA chip revision"); 152 } 153 #else 154 intrmask = (volatile u_long *)IIOV(rom_intrmask); 155 intrstat = (volatile u_long *)IIOV(rom_intrstat); 156 printf ("intrmask: %p\n", intrmask); 157 printf ("intrstat: %p\n", intrstat); 158 #endif 159 160 INTR_SETMASK(0); 161 162 if (config_rootfound("mainbus", NULL) == NULL) 163 panic("autoconfig failed, no root"); 164 165 /* Turn on interrupts */ 166 spl0(); 167 } 168 169 void 170 cpu_rootconf(void) 171 { 172 int count, lun, part; 173 174 count = lun = part = 0; 175 176 devidentparse (rom_boot_info, &count, &lun, &part); 177 booted_device = getdevunit (rom_boot_dev, count); 178 179 printf("boot device: %s\n", 180 (booted_device) ? booted_device->dv_xname : "<unknown>"); 181 182 setroot(booted_device, part); 183 } 184 185 /* 186 * find a device matching "name" and unit number 187 */ 188 static struct device * 189 getdevunit(const char *name, int unit) 190 { 191 int i; 192 193 for (i = 0; i < ndevice_equivs; i++) 194 if (device_equiv->alias && strcmp (name, device_equiv->alias) == 0) 195 name = device_equiv->real; 196 197 return device_find_by_driver_unit(name, unit); 198 } 199 200 /* 201 * Parse a device ident. 202 * 203 * Format: 204 * (count, lun, part) 205 */ 206 static int 207 devidentparse(const char *spec, int *count, int *lun, int *part) 208 { 209 int i; 210 const char *args[3]; 211 212 if (*spec == '(') { 213 /* tokenize device ident */ 214 args[0] = ++spec; 215 for (i = 1; *spec && *spec != ')' && i<3; spec++) { 216 if (*spec == ',') 217 args[i++] = ++spec; 218 } 219 if (*spec != ')') 220 goto baddev; 221 222 switch(i) { 223 case 3: 224 *count = atoi(args[0]); 225 *lun = atoi(args[1]); 226 *part = atoi(args[2]); 227 break; 228 case 2: 229 *lun = atoi(args[0]); 230 *part = atoi(args[1]); 231 break; 232 case 1: 233 *part = atoi(args[0]); 234 break; 235 case 0: 236 break; 237 } 238 } 239 else 240 goto baddev; 241 242 return 0; 243 244 baddev: 245 return ENXIO; 246 } 247 248 static int 249 atoi(const char *s) 250 { 251 int val = 0; 252 253 while(isdigit(*s)) 254 val = val * 10 + (*s++ - '0'); 255 return val; 256 } 257