Annotation of sys/arch/macppc/macppc/autoconf.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: autoconf.c,v 1.33 2007/06/01 23:14:06 deraadt Exp $ */
2: /*
3: * Copyright (c) 1996, 1997 Per Fogelstrom
4: * Copyright (c) 1995 Theo de Raadt
5: * Copyright (c) 1988 University of Utah.
6: * Copyright (c) 1992, 1993
7: * The Regents of the University of California. All rights reserved.
8: *
9: * This code is derived from software contributed to Berkeley by
10: * the Systems Programming Group of the University of Utah Computer
11: * Science Department and Ralph Campbell.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. Neither the name of the University nor the names of its contributors
22: * may be used to endorse or promote products derived from this software
23: * without specific prior written permission.
24: *
25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35: * SUCH DAMAGE.
36: *
37: * from: Utah Hdr: autoconf.c 1.31 91/01/21
38: *
39: * from: @(#)autoconf.c 8.1 (Berkeley) 6/10/93
40: * $Id: autoconf.c,v 1.33 2007/06/01 23:14:06 deraadt Exp $
41: */
42:
43: /*
44: * Setup the system to run on the current machine.
45: *
46: * cpu_configure() is called at boot time. Available
47: * devices are determined (from possibilities mentioned in ioconf.c),
48: * and the drivers are initialized.
49: */
50:
51: #include <sys/param.h>
52: #include <sys/systm.h>
53: #include <sys/buf.h>
54: #include <sys/disklabel.h>
55: #include <sys/conf.h>
56: #include <sys/reboot.h>
57: #include <sys/device.h>
58: #include <dev/cons.h>
59: #include <uvm/uvm_extern.h>
60: #include <machine/autoconf.h>
61: #include <machine/powerpc.h>
62:
63: #include <sys/disk.h>
64: #include <scsi/scsi_all.h>
65: #include <scsi/scsi_disk.h>
66: #include <scsi/scsiconf.h>
67: #include <scsi/sdvar.h>
68:
69: void dumpconf(void);
70: struct device *getdevunit(char *, int);
71: static struct devmap *findtype(char **);
72: void makebootdev(char *cp);
73: int getpno(char **);
74:
75: /*
76: * The following several variables are related to
77: * the configuration process, and are used in initializing
78: * the machine.
79: */
80: int cold = 1; /* if 1, still working on cold-start */
81: char bootdev[16]; /* to hold boot dev name */
82: struct device *bootdv = NULL;
83:
84: struct dumpmem dumpmem[VM_PHYSSEG_MAX];
85: u_int ndumpmem;
86:
87: /*
88: * Configure all devices found that we know about.
89: * This is done at boot time.
90: */
91: void
92: cpu_configure()
93: {
94: (void)splhigh(); /* To be really sure.. */
95: calc_delayconst();
96:
97: if (config_rootfound("mainbus", "mainbus") == 0)
98: panic("no mainbus found");
99: (void)spl0();
100: cold = 0;
101: }
102:
103: struct devmap {
104: char *att;
105: char *dev;
106: int type;
107: };
108: #define T_IFACE 0x10
109:
110: #define T_BUS 0x00
111: #define T_SCSI 0x11
112: #define T_IDE 0x12
113: #define T_DISK 0x21
114:
115: static struct devmap *
116: findtype(char **s)
117: {
118: static struct devmap devmap[] = {
119: { "/ht", NULL, T_BUS },
120: { "/ht@", NULL, T_BUS },
121: { "/pci@", NULL, T_BUS },
122: { "/pci", NULL, T_BUS },
123: { "/AppleKiwi@", NULL, T_BUS },
124: { "/AppleKiwi", NULL, T_BUS },
125: { "/mac-io@", NULL, T_BUS },
126: { "/mac-io", NULL, T_BUS },
127: { "/@", NULL, T_BUS },
128: { "/LSILogic,sas@", "sd", T_SCSI },
129: { "/scsi@", "sd", T_SCSI },
130: { "/ide", "wd", T_IDE },
131: { "/ata", "wd", T_IDE },
132: { "/k2-sata-root", NULL, T_BUS },
133: { "/k2-sata", "wd", T_IDE },
134: { "/disk@", "sd", T_DISK },
135: { "/disk", "wd", T_DISK },
136: { "/usb@", "sd", T_SCSI },
137: { "/ADPT,2940U2B@", "sd", T_SCSI },
138: { "/bcom5704@4", "bge0", T_IFACE },
139: { "/bcom5704@4,1", "bge1", T_IFACE },
140: { "/ethernet", "gem0", T_IFACE },
141: { NULL, NULL }
142: };
143: struct devmap *dp = &devmap[0];
144:
145: while (dp->att) {
146: if (strncmp(*s, dp->att, strlen(dp->att)) == 0) {
147: *s += strlen(dp->att);
148: break;
149: }
150: dp++;
151: }
152: if (dp->att == NULL)
153: printf("string [%s] not found\n", *s);
154:
155: return(dp);
156: }
157:
158: /*
159: * Look at the string 'bp' and decode the boot device.
160: * Boot names look like: '/pci/scsi@c/disk@0,0/bsd'
161: * '/pci/mac-io/ide@20000/disk@0,0/bsd
162: * '/pci/mac-io/ide/disk/bsd
163: * '/ht@0,f2000000/pci@2/bcom5704@4/bsd'
164: */
165: void
166: makebootdev(char *bp)
167: {
168: int unit, ptype;
169: char *dev, *cp;
170: struct devmap *dp;
171:
172: cp = bp;
173: do {
174: while(*cp && *cp != '/')
175: cp++;
176:
177: dp = findtype(&cp);
178: if (!dp->att) {
179: printf("Warning: bootpath unrecognized: %s\n", bp);
180: return;
181: }
182: } while((dp->type & T_IFACE) == 0);
183:
184: if (dp->att && dp->type == T_IFACE) {
185: snprintf(bootdev, sizeof bootdev, "%s", dp->dev);
186: return;
187: }
188: dev = dp->dev;
189: while(*cp && *cp != '/')
190: cp++;
191: ptype = dp->type;
192: dp = findtype(&cp);
193: if (dp->att && dp->type == T_DISK) {
194: unit = getpno(&cp);
195: if (ptype == T_SCSI) {
196: struct device *dv;
197: struct sd_softc *sd;
198:
199: TAILQ_FOREACH(dv, &alldevs, dv_list) {
200: if (dv->dv_class != DV_DISK ||
201: strcmp(dv->dv_cfdata->cf_driver->cd_name, "sd"))
202: continue;
203: sd = (struct sd_softc *)dv;
204: if (sd->sc_link->target != unit)
205: continue;
206: snprintf(bootdev, sizeof bootdev,
207: "%s%c", dv->dv_xname, 'a');
208: return;
209: }
210: }
211: snprintf(bootdev, sizeof bootdev, "%s%d%c", dev, unit, 'a');
212: return;
213: }
214: printf("Warning: boot device unrecognized: %s\n", bp);
215: }
216:
217: int
218: getpno(char **cp)
219: {
220: int val = 0, digit;
221: char *cx = *cp;
222:
223: while (*cx) {
224: if (*cx >= '0' && *cx <= '9')
225: digit = *cx - '0';
226: else if (*cx >= 'a' && *cx <= 'f')
227: digit = *cx - 'a' + 0x0a;
228: else
229: break;
230: val = val * 16 + digit;
231: cx++;
232: }
233: *cp = cx;
234: return (val);
235: }
236:
237: void
238: device_register(struct device *dev, void *aux)
239: {
240: }
241:
242: /*
243: * find a device matching "name" and unit number
244: */
245: struct device *
246: getdevunit(char *name, int unit)
247: {
248: struct device *dev = TAILQ_FIRST(&alldevs);
249: char num[10], fullname[16];
250: int lunit;
251:
252: /* compute length of name and decimal expansion of unit number */
253: snprintf(num, sizeof num, "%d", unit);
254: lunit = strlen(num);
255: if (strlen(name) + lunit >= sizeof(fullname) - 1)
256: panic("config_attach: device name too long");
257:
258: strlcpy(fullname, name, sizeof fullname);
259: strlcat(fullname, num, sizeof fullname);
260:
261: while (strcmp(dev->dv_xname, fullname) != 0)
262: if ((dev = TAILQ_NEXT(dev, dv_list)) == NULL)
263: return NULL;
264:
265: return dev;
266: }
267:
268: /*
269: * Now that we are fully operational, we can checksum the
270: * disks, and using some heuristics, hopefully are able to
271: * always determine the correct root disk.
272: */
273: void
274: diskconf(void)
275: {
276: dev_t temp;
277: int part = 0;
278:
279: printf("bootpath: %s\n", bootpath);
280: makebootdev(bootpath);
281:
282: /* Lookup boot device from boot if not set by configuration */
283: bootdv = parsedisk(bootdev, strlen(bootdev), 0, &temp);
284: setroot(bootdv, part, RB_USERREQ);
285: dumpconf();
286: }
287:
288: struct nam2blk nam2blk[] = {
289: { "wd", 0 },
290: { "sd", 2 },
291: { "raid", 19 },
292: { NULL, -1 }
293: };
CVSweb