1 /* $NetBSD: autoconf.c,v 1.17 2005/06/05 11:35:09 he 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.17 2005/06/05 11:35:09 he 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 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(void) 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(const char *name, int unit) 192 { 193 struct device *dev = alldevs.tqh_first; 194 char num[10], fullname[16]; 195 int lunit; 196 int i; 197 198 for (i = 0; i < ndevice_equivs; i++) 199 if (device_equiv->alias && strcmp (name, device_equiv->alias) == 0) 200 name = device_equiv->real; 201 202 /* compute length of name and decimal expansion of unit number */ 203 sprintf(num, "%d", unit); 204 lunit = strlen(num); 205 if (strlen(name) + lunit >= sizeof(fullname) - 1) 206 panic("config_attach: device name too long"); 207 208 strcpy(fullname, name); 209 strcat(fullname, num); 210 211 while (strcmp(dev->dv_xname, fullname) != 0) { 212 if ((dev = dev->dv_list.tqe_next) == NULL) 213 return NULL; 214 } 215 return dev; 216 } 217 218 /* 219 * Parse a device ident. 220 * 221 * Format: 222 * (count, lun, part) 223 */ 224 static int 225 devidentparse(const char *spec, int *count, int *lun, int *part) 226 { 227 int i; 228 const char *args[3]; 229 230 if (*spec == '(') { 231 /* tokenize device ident */ 232 args[0] = ++spec; 233 for (i = 1; *spec && *spec != ')' && i<3; spec++) { 234 if (*spec == ',') 235 args[i++] = ++spec; 236 } 237 if (*spec != ')') 238 goto baddev; 239 240 switch(i) { 241 case 3: 242 *count = atoi(args[0]); 243 *lun = atoi(args[1]); 244 *part = atoi(args[2]); 245 break; 246 case 2: 247 *lun = atoi(args[0]); 248 *part = atoi(args[1]); 249 break; 250 case 1: 251 *part = atoi(args[0]); 252 break; 253 case 0: 254 break; 255 } 256 } 257 else 258 goto baddev; 259 260 return 0; 261 262 baddev: 263 return ENXIO; 264 } 265 266 static int 267 atoi(const char *s) 268 { 269 int val = 0; 270 271 while(isdigit(*s)) 272 val = val * 10 + (*s++ - '0'); 273 return val; 274 } 275