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