1 /* $NetBSD: autoconf.c,v 1.15 2004/10/23 17:12:22 thorpej 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.15 2004/10/23 17:12:22 thorpej 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 __P((char *, int)); 112 static int devidentparse __P((const char *, int *, int *, int *)); 113 static int atoi __P((const char *)); 114 115 struct device_equiv { 116 char *alias; 117 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() 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 init_sir(); 163 164 if (config_rootfound("mainbus", NULL) == NULL) 165 panic("autoconfig failed, no root"); 166 167 /* Turn on interrupts */ 168 spl0(); 169 } 170 171 void 172 cpu_rootconf() 173 { 174 int count, lun, part; 175 176 count = lun = part = 0; 177 178 devidentparse (rom_boot_info, &count, &lun, &part); 179 booted_device = getdevunit (rom_boot_dev, count); 180 181 printf("boot device: %s\n", 182 (booted_device) ? booted_device->dv_xname : "<unknown>"); 183 184 setroot(booted_device, part); 185 } 186 187 /* 188 * find a device matching "name" and unit number 189 */ 190 static struct device * 191 getdevunit(name, unit) 192 char *name; 193 int unit; 194 { 195 struct device *dev = alldevs.tqh_first; 196 char num[10], fullname[16]; 197 int lunit; 198 int i; 199 200 for (i = 0; i < ndevice_equivs; i++) 201 if (device_equiv->alias && strcmp (name, device_equiv->alias) == 0) 202 name = device_equiv->real; 203 204 /* compute length of name and decimal expansion of unit number */ 205 sprintf(num, "%d", unit); 206 lunit = strlen(num); 207 if (strlen(name) + lunit >= sizeof(fullname) - 1) 208 panic("config_attach: device name too long"); 209 210 strcpy(fullname, name); 211 strcat(fullname, num); 212 213 while (strcmp(dev->dv_xname, fullname) != 0) { 214 if ((dev = dev->dv_list.tqe_next) == NULL) 215 return NULL; 216 } 217 return dev; 218 } 219 220 /* 221 * Parse a device ident. 222 * 223 * Format: 224 * (count, lun, part) 225 */ 226 static int 227 devidentparse(spec, count, lun, part) 228 const char *spec; 229 int *count; 230 int *lun; 231 int *part; 232 { 233 int i; 234 const char *args[3]; 235 236 if (*spec == '(') { 237 /* tokenize device ident */ 238 args[0] = ++spec; 239 for (i = 1; *spec && *spec != ')' && i<3; spec++) { 240 if (*spec == ',') 241 args[i++] = ++spec; 242 } 243 if (*spec != ')') 244 goto baddev; 245 246 switch(i) { 247 case 3: 248 *count = atoi(args[0]); 249 *lun = atoi(args[1]); 250 *part = atoi(args[2]); 251 break; 252 case 2: 253 *lun = atoi(args[0]); 254 *part = atoi(args[1]); 255 break; 256 case 1: 257 *part = atoi(args[0]); 258 break; 259 case 0: 260 break; 261 } 262 } 263 else 264 goto baddev; 265 266 return 0; 267 268 baddev: 269 return ENXIO; 270 } 271 272 static int 273 atoi(s) 274 const char *s; 275 { 276 int val = 0; 277 278 while(isdigit(*s)) 279 val = val * 10 + (*s++ - '0'); 280 return val; 281 } 282