Annotation of sys/arch/mvme88k/mvme88k/autoconf.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: autoconf.c,v 1.39 2007/06/15 01:19:08 deraadt Exp $ */
! 2: /*
! 3: * Copyright (c) 1998 Steve Murphree, Jr.
! 4: * Copyright (c) 1996 Nivas Madhur
! 5: * Copyright (c) 1994 Christian E. Hopps
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * must display the following acknowledgement:
! 18: * This product includes software developed by Christian E. Hopps.
! 19: * 4. The name of the author may not be used to endorse or promote products
! 20: * derived from this software without specific prior written permission
! 21: *
! 22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 32: *
! 33: */
! 34: #include <sys/param.h>
! 35: #include <sys/systm.h>
! 36: #include <sys/buf.h>
! 37: #include <sys/dkstat.h>
! 38: #include <sys/reboot.h>
! 39: #include <sys/conf.h>
! 40: #include <sys/device.h>
! 41: #include <sys/disklabel.h>
! 42: #include <sys/kernel.h>
! 43:
! 44: #include <machine/asm_macro.h> /* enable/disable interrupts */
! 45: #include <machine/autoconf.h>
! 46: #include <machine/cpu.h>
! 47: #include <machine/vmparam.h>
! 48:
! 49: #include <scsi/scsi_all.h>
! 50: #include <scsi/scsiconf.h>
! 51:
! 52: #include <dev/cons.h>
! 53:
! 54: /*
! 55: * The following several variables are related to
! 56: * the configuration process, and are used in initializing
! 57: * the machine.
! 58: */
! 59:
! 60: void dumpconf(void);
! 61: int get_target(int *, int *, int *);
! 62:
! 63: int cold = 1; /* 1 if still booting */
! 64:
! 65: paddr_t bootaddr;
! 66: int bootpart, bootbus;
! 67: struct device *bootdv; /* set by device drivers (if found) */
! 68:
! 69: /*
! 70: * called at boot time, configure all devices on the system.
! 71: */
! 72: void
! 73: cpu_configure()
! 74: {
! 75: if (config_rootfound("mainbus", "mainbus") == 0)
! 76: panic("no mainbus found");
! 77:
! 78: /*
! 79: * Turn external interrupts on.
! 80: *
! 81: * XXX We have a race here. If we enable interrupts after setroot(),
! 82: * the kernel dies.
! 83: */
! 84: set_psr(get_psr() & ~PSR_IND);
! 85: spl0();
! 86:
! 87: /*
! 88: * Finally switch to the real console driver,
! 89: * and say goodbye to the BUG!
! 90: */
! 91: cn_tab = NULL;
! 92: cninit();
! 93: cold = 0;
! 94: }
! 95:
! 96: void
! 97: diskconf(void)
! 98: {
! 99: printf("boot device: %s\n",
! 100: (bootdv) ? bootdv->dv_xname : "<unknown>");
! 101:
! 102: setroot(bootdv, bootpart, RB_USERREQ);
! 103: dumpconf();
! 104: }
! 105:
! 106: void
! 107: device_register(struct device *dev, void *aux)
! 108: {
! 109: if (bootpart == -1) /* ignore flag from controller driver? */
! 110: return;
! 111:
! 112: /*
! 113: * scsi: sd,cd
! 114: */
! 115: if (strncmp("cd", dev->dv_xname, 2) == 0 ||
! 116: strncmp("sd", dev->dv_xname, 2) == 0) {
! 117: struct scsi_attach_args *sa = aux;
! 118: int target, bus, lun;
! 119:
! 120: if (get_target(&target, &bus, &lun) != 0)
! 121: return;
! 122:
! 123: /* make sure we are on the expected scsibus */
! 124: if (bootbus != bus)
! 125: return;
! 126:
! 127: if (sa->sa_sc_link->target == target &&
! 128: sa->sa_sc_link->lun == lun) {
! 129: bootdv = dev;
! 130: return;
! 131: }
! 132: }
! 133:
! 134: /*
! 135: * ethernet: ie,le
! 136: */
! 137: else if (strncmp("ie", dev->dv_xname, 2) == 0 ||
! 138: strncmp("le", dev->dv_xname, 2) == 0) {
! 139: struct confargs *ca = aux;
! 140:
! 141: if (ca->ca_paddr == bootaddr) {
! 142: bootdv = dev;
! 143: return;
! 144: }
! 145: }
! 146: }
! 147:
! 148: /*
! 149: * Returns the ID of the SCSI disk based on Motorola's CLUN/DLUN stuff
! 150: * bootdev == CLUN << 8 | DLUN.
! 151: * This handles SBC SCSI and MVME32[78].
! 152: */
! 153: int
! 154: get_target(int *target, int *bus, int *lun)
! 155: {
! 156: extern int bootdev;
! 157:
! 158: switch (bootdev >> 8) {
! 159: /* built-in controller */
! 160: case 0x00:
! 161: /* MVME327 */
! 162: case 0x02:
! 163: case 0x03:
! 164: *bus = 0;
! 165: *target = (bootdev & 0x70) >> 4;
! 166: *lun = (bootdev & 0x07);
! 167: return (0);
! 168: /* MVME328 */
! 169: case 0x06:
! 170: case 0x07:
! 171: case 0x16:
! 172: case 0x17:
! 173: case 0x18:
! 174: case 0x19:
! 175: *bus = (bootdev & 0x40) >> 6;
! 176: *target = (bootdev & 0x38) >> 3;
! 177: *lun = (bootdev & 0x07);
! 178: return (0);
! 179: default:
! 180: return (ENODEV);
! 181: }
! 182: }
! 183:
! 184: struct nam2blk nam2blk[] = {
! 185: { "sd", 4 },
! 186: { "cd", 6 },
! 187: { "rd", 7 },
! 188: { NULL, -1 }
! 189: };
CVSweb