autoconf.c revision 1.16 1 /* $NetBSD: autoconf.c,v 1.16 2005/01/19 01:58:21 chs 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.16 2005/01/19 01:58:21 chs 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(char *, int);
112 static int devidentparse(const char *, int *, int *, int *);
113 static int atoi(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(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(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