Annotation of sys/arch/alpha/alpha/autoconf.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: autoconf.c,v 1.31 2007/06/01 19:25:09 deraadt Exp $ */
2: /* $NetBSD: autoconf.c,v 1.16 1996/11/13 21:13:04 cgd Exp $ */
3:
4: /*
5: * Copyright (c) 1992, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This software was developed by the Computer Systems Engineering group
9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
10: * contributed to Berkeley.
11: *
12: * All advertising materials mentioning features or use of this software
13: * must display the following acknowledgement:
14: * This product includes software developed by the University of
15: * California, Lawrence Berkeley Laboratory.
16: *
17: * Redistribution and use in source and binary forms, with or without
18: * modification, are permitted provided that the following conditions
19: * are met:
20: * 1. Redistributions of source code must retain the above copyright
21: * notice, this list of conditions and the following disclaimer.
22: * 2. Redistributions in binary form must reproduce the above copyright
23: * notice, this list of conditions and the following disclaimer in the
24: * documentation and/or other materials provided with the distribution.
25: * 3. Neither the name of the University nor the names of its contributors
26: * may be used to endorse or promote products derived from this software
27: * without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39: * SUCH DAMAGE.
40: *
41: * @(#)autoconf.c 8.4 (Berkeley) 10/1/93
42: */
43:
44: #include <sys/param.h>
45: #include <sys/systm.h>
46: #include <sys/buf.h>
47: #include <sys/disklabel.h>
48: #include <sys/conf.h>
49: #include <sys/reboot.h>
50: #include <sys/device.h>
51:
52: #include <uvm/uvm_extern.h>
53:
54: #include <machine/autoconf.h>
55: #include <machine/rpb.h>
56: #include <machine/prom.h>
57: #include <machine/cpuconf.h>
58: #include <machine/intr.h>
59:
60: #include <dev/cons.h>
61:
62: extern char root_device[17]; /* XXX */
63:
64: struct device *booted_device;
65: int booted_partition;
66: struct bootdev_data *bootdev_data;
67: char boot_dev[128];
68:
69: void parse_prom_bootdev(void);
70: int atoi(char *);
71:
72: /*
73: * cpu_configure:
74: * called at boot time, configure all devices on system
75: */
76: void
77: cpu_configure()
78: {
79: parse_prom_bootdev();
80: softintr_init();
81:
82: /*
83: * Disable interrupts during autoconfiguration. splhigh() won't
84: * work, because it simply _raises_ the IPL, so if machine checks
85: * are disabled, they'll stay disabled. Machine checks are needed
86: * during autoconfig.
87: */
88: (void)alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH);
89: if (config_rootfound("mainbus", "mainbus") == NULL)
90: panic("no mainbus found");
91: (void)spl0();
92:
93: hwrpb_restart_setup();
94: cold = 0;
95: }
96:
97: void
98: diskconf(void)
99: {
100: struct device *bootdv;
101: int bootpartition;
102:
103: if (booted_device == NULL)
104: printf("WARNING: can't figure what device matches \"%s\"\n",
105: boot_dev);
106: bootdv = booted_device;
107: bootpartition = booted_partition;
108:
109: setroot(bootdv, bootpartition, RB_USERREQ);
110: dumpconf();
111: }
112:
113: void
114: parse_prom_bootdev()
115: {
116: static char hacked_boot_dev[128];
117: static struct bootdev_data bd;
118: char *cp, *scp, *boot_fields[8];
119: int i, done;
120:
121: booted_device = NULL;
122: booted_partition = 0;
123: bootdev_data = NULL;
124:
125: bcopy(bootinfo.booted_dev, hacked_boot_dev, sizeof hacked_boot_dev);
126: #if 0
127: printf("parse_prom_bootdev: boot dev = \"%s\"\n", boot_dev);
128: #endif
129:
130: i = 0;
131: scp = cp = hacked_boot_dev;
132: for (done = 0; !done; cp++) {
133: if (*cp != ' ' && *cp != '\0')
134: continue;
135: if (*cp == '\0')
136: done = 1;
137:
138: *cp = '\0';
139: boot_fields[i++] = scp;
140: scp = cp + 1;
141: if (i == 8)
142: done = 1;
143: }
144: if (i != 8)
145: return; /* doesn't look like anything we know! */
146:
147: #if 0
148: printf("i = %d, done = %d\n", i, done);
149: for (i--; i >= 0; i--)
150: printf("%d = %s\n", i, boot_fields[i]);
151: #endif
152:
153: bd.protocol = boot_fields[0];
154: bd.bus = atoi(boot_fields[1]);
155: bd.slot = atoi(boot_fields[2]);
156: bd.channel = atoi(boot_fields[3]);
157: bd.remote_address = boot_fields[4];
158: bd.unit = atoi(boot_fields[5]);
159: bd.boot_dev_type = atoi(boot_fields[6]);
160: bd.ctrl_dev_type = boot_fields[7];
161:
162: #if 0
163: printf("parsed: proto = %s, bus = %d, slot = %d, channel = %d,\n",
164: bd.protocol, bd.bus, bd.slot, bd.channel);
165: printf("\tremote = %s, unit = %d, dev_type = %d, ctrl_type = %s\n",
166: bd.remote_address, bd.unit, bd.boot_dev_type, bd.ctrl_dev_type);
167: #endif
168:
169: bootdev_data = &bd;
170: }
171:
172: int
173: atoi(s)
174: char *s;
175: {
176: int n, neg;
177:
178: n = 0;
179: neg = 0;
180:
181: while (*s == '-') {
182: s++;
183: neg = !neg;
184: }
185:
186: while (*s != '\0') {
187: if (*s < '0' || *s > '9')
188: break;
189:
190: n = (10 * n) + (*s - '0');
191: s++;
192: }
193:
194: return (neg ? -n : n);
195: }
196:
197: void
198: device_register(dev, aux)
199: struct device *dev;
200: void *aux;
201: {
202: if (bootdev_data == NULL) {
203: /*
204: * There is no hope.
205: */
206: return;
207: }
208:
209: if (platform.device_register)
210: (*platform.device_register)(dev, aux);
211: }
212:
213: struct nam2blk nam2blk[] = {
214: { "st", 2 },
215: { "cd", 3 },
216: { "fd", 4 },
217: { "rd", 6 },
218: { "sd", 8 },
219: { "wd", 0 },
220: { "raid", 16 },
221: { NULL, -1 }
222: };
CVSweb