1 /* $OpenBSD: autoconf.c,v 1.39 2022/09/02 20:06:55 miod 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 struct device *booted_device;
63 int booted_partition;
64 struct bootdev_data *bootdev_data;
65 char boot_dev[128];
66
67 void parse_prom_bootdev(void);
68 int atoi(char *);
69
70 void
unmap_startup(void)71 unmap_startup(void)
72 {
73 extern uint32_t kernel_text[], endboot[];
74 uint32_t *word = kernel_text;
75
76 /* Cannot unmap KSEG0; smash with 0x00000000 (call_pall PAL_halt) */
77 while (word < endboot)
78 *word++ = 0x00000000;
79 }
80
81 /*
82 * cpu_configure:
83 * called at boot time, configure all devices on system
84 */
85 void
cpu_configure()86 cpu_configure()
87 {
88 parse_prom_bootdev();
89 softintr_init();
90
91 unmap_startup();
92
93 /*
94 * Disable interrupts during autoconfiguration. splhigh() won't
95 * work, because it simply _raises_ the IPL, so if machine checks
96 * are disabled, they'll stay disabled. Machine checks are needed
97 * during autoconfig.
98 */
99 (void)alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH);
100 if (config_rootfound("mainbus", "mainbus") == NULL)
101 panic("no mainbus found");
102 (void)spl0();
103
104 hwrpb_restart_setup();
105 cold = 0;
106 }
107
108 void
diskconf(void)109 diskconf(void)
110 {
111 struct device *bootdv;
112 int bootpartition;
113
114 if (booted_device == NULL)
115 printf("WARNING: can't figure what device matches \"%s\"\n",
116 boot_dev);
117 bootdv = booted_device;
118 bootpartition = booted_partition;
119
120 setroot(bootdv, bootpartition, RB_USERREQ);
121 dumpconf();
122 }
123
124 void
parse_prom_bootdev()125 parse_prom_bootdev()
126 {
127 static struct bootdev_data bd;
128 char *cp, *scp, *boot_fields[8];
129 int i, done;
130
131 booted_device = NULL;
132 booted_partition = 0;
133 bootdev_data = NULL;
134
135 bcopy(bootinfo.booted_dev, boot_dev, sizeof bootinfo.booted_dev);
136 #if 0
137 printf("parse_prom_bootdev: boot dev = \"%s\"\n", boot_dev);
138 #endif
139
140 i = 0;
141 scp = cp = boot_dev;
142 for (done = 0; !done; cp++) {
143 if (*cp != ' ' && *cp != '\0')
144 continue;
145 if (*cp == '\0')
146 done = 1;
147
148 *cp = '\0';
149 boot_fields[i++] = scp;
150 scp = cp + 1;
151 if (i == 8)
152 done = 1;
153 }
154 if (i != 8)
155 return; /* doesn't look like anything we know! */
156
157 #if 0
158 printf("i = %d, done = %d\n", i, done);
159 for (i--; i >= 0; i--)
160 printf("%d = %s\n", i, boot_fields[i]);
161 #endif
162
163 bd.protocol = boot_fields[0];
164 bd.bus = atoi(boot_fields[1]);
165 bd.slot = atoi(boot_fields[2]);
166 bd.channel = atoi(boot_fields[3]);
167 bd.remote_address = boot_fields[4];
168 bd.unit = atoi(boot_fields[5]);
169 bd.boot_dev_type = atoi(boot_fields[6]);
170 bd.ctrl_dev_type = boot_fields[7];
171
172 #if 0
173 printf("parsed: proto = %s, bus = %d, slot = %d, channel = %d,\n",
174 bd.protocol, bd.bus, bd.slot, bd.channel);
175 printf("\tremote = %s, unit = %d, dev_type = %d, ctrl_type = %s\n",
176 bd.remote_address, bd.unit, bd.boot_dev_type, bd.ctrl_dev_type);
177 #endif
178
179 bootdev_data = &bd;
180 }
181
182 int
atoi(s)183 atoi(s)
184 char *s;
185 {
186 int n, neg;
187
188 n = 0;
189 neg = 0;
190
191 while (*s == '-') {
192 s++;
193 neg = !neg;
194 }
195
196 while (*s != '\0') {
197 if (*s < '0' || *s > '9')
198 break;
199
200 n = (10 * n) + (*s - '0');
201 s++;
202 }
203
204 return (neg ? -n : n);
205 }
206
207 void
device_register(dev,aux)208 device_register(dev, aux)
209 struct device *dev;
210 void *aux;
211 {
212 if (bootdev_data == NULL) {
213 /*
214 * There is no hope.
215 */
216 return;
217 }
218
219 if (platform.device_register)
220 (*platform.device_register)(dev, aux);
221 }
222
223 const struct nam2blk nam2blk[] = {
224 { "wd", 0 },
225 { "cd", 3 },
226 { "fd", 4 },
227 { "rd", 6 },
228 { "sd", 8 },
229 { "vnd", 9 },
230 { NULL, -1 }
231 };
232