Annotation of sys/arch/macppc/macppc/autoconf.c, Revision 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