Home | History | Annotate | Line # | Download | only in next68k
autoconf.c revision 1.16
      1 /*	$NetBSD: autoconf.c,v 1.16 2005/01/19 01:58:21 chs Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1982, 1986, 1990, 1993
      5  * 	The Regents of the University of California. All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * the Systems Programming Group of the University of Utah Computer
      9  * Science Department.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  * 3. Neither the name of the University nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software
     21  *    without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  *
     35  * from: Utah $Hdr: autoconf.c 1.36 92/12/20$
     36  *
     37  *	@(#)autoconf.c  8.2 (Berkeley) 1/12/94
     38  */
     39 /*
     40  * Copyright (c) 1988 University of Utah.
     41  *
     42  * This code is derived from software contributed to Berkeley by
     43  * the Systems Programming Group of the University of Utah Computer
     44  * Science Department.
     45  *
     46  * Redistribution and use in source and binary forms, with or without
     47  * modification, are permitted provided that the following conditions
     48  * are met:
     49  * 1. Redistributions of source code must retain the above copyright
     50  *    notice, this list of conditions and the following disclaimer.
     51  * 2. Redistributions in binary form must reproduce the above copyright
     52  *    notice, this list of conditions and the following disclaimer in the
     53  *    documentation and/or other materials provided with the distribution.
     54  * 3. All advertising materials mentioning features or use of this software
     55  *    must display the following acknowledgement:
     56  *	This product includes software developed by the University of
     57  *	California, Berkeley and its contributors.
     58  * 4. Neither the name of the University nor the names of its contributors
     59  *    may be used to endorse or promote products derived from this software
     60  *    without specific prior written permission.
     61  *
     62  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     63  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     64  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     65  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     66  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     67  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     68  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     69  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     70  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     71  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     72  * SUCH DAMAGE.
     73  *
     74  * from: Utah $Hdr: autoconf.c 1.36 92/12/20$
     75  *
     76  *	@(#)autoconf.c  8.2 (Berkeley) 1/12/94
     77  */
     78 
     79 /*
     80  * Setup the system to run on the current machine.
     81  *
     82  * Configure() is called at boot time.  Available
     83  * devices are determined (from possibilities mentioned in ioconf.c),
     84  * and the drivers are initialized.
     85  */
     86 
     87 #include <sys/cdefs.h>
     88 __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.16 2005/01/19 01:58:21 chs Exp $");
     89 
     90 #include <sys/param.h>
     91 #include <sys/systm.h>
     92 #include <sys/buf.h>
     93 #include <sys/conf.h>
     94 #include <sys/reboot.h>
     95 #include <sys/device.h>
     96 
     97 #include <machine/vmparam.h>
     98 #include <machine/autoconf.h>
     99 #include <machine/disklabel.h>
    100 #include <machine/cpu.h>
    101 #include <machine/pte.h>
    102 
    103 #include <next68k/next68k/isr.h>
    104 #include <next68k/next68k/nextrom.h>
    105 
    106 #include <next68k/dev/intiovar.h>
    107 
    108 volatile u_long *intrstat;
    109 volatile u_long *intrmask;
    110 
    111 static struct device *getdevunit(char *, int);
    112 static int devidentparse(const char *, int *, int *, int *);
    113 static int atoi(const char *);
    114 
    115 struct device_equiv {
    116 	char *alias;
    117 	char *real;
    118 };
    119 static struct device_equiv device_equiv[] = {
    120 	{ "en", "xe" },
    121 	{ "tp", "xe" },
    122 };
    123 static int ndevice_equivs = (sizeof(device_equiv)/sizeof(device_equiv[0]));
    124 
    125 /*
    126  * Determine mass storage and memory configuration for a machine.
    127  */
    128 void
    129 cpu_configure(void)
    130 {
    131 /* 	int dma_rev; */
    132 	extern u_int rom_intrmask;
    133 	extern u_int rom_intrstat;
    134 
    135 	booted_device = NULL;	/* set by device drivers (if found) */
    136 
    137 #if 0
    138 	dma_rev = ((volatile u_char *)IIOV(NEXT_P_SCR1))[1];
    139 	switch (dma_rev) {
    140 	case 0:
    141 		intrmask = (volatile u_long *)IIOV(NEXT_P_INTRMASK_0);
    142 		intrstat = (volatile u_long *)IIOV(NEXT_P_INTRSTAT_0);
    143 		/* dspreg = (volatile u_long *)IIOV(0x2007000); */
    144 		break;
    145 	case 1:
    146 		intrmask = (volatile u_long *)IIOV(NEXT_P_INTRMASK);
    147 		intrstat = (volatile u_long *)IIOV(NEXT_P_INTRSTAT);
    148 		/* dspreg = (volatile u_long *)IIOV(0x2108000); */
    149 		break;
    150 	default:
    151 		panic("unknown DMA chip revision");
    152 	}
    153 #else
    154 	intrmask = (volatile u_long *)IIOV(rom_intrmask);
    155 	intrstat = (volatile u_long *)IIOV(rom_intrstat);
    156 	printf ("intrmask: %p\n", intrmask);
    157 	printf ("intrstat: %p\n", intrstat);
    158 #endif
    159 
    160 	INTR_SETMASK(0);
    161 
    162 	init_sir();
    163 
    164 	if (config_rootfound("mainbus", NULL) == NULL)
    165 		panic("autoconfig failed, no root");
    166 
    167 	/* Turn on interrupts */
    168 	spl0();
    169 }
    170 
    171 void
    172 cpu_rootconf(void)
    173 {
    174 	int count, lun, part;
    175 
    176 	count = lun = part = 0;
    177 
    178 	devidentparse (rom_boot_info, &count, &lun, &part);
    179 	booted_device = getdevunit (rom_boot_dev, count);
    180 
    181 	printf("boot device: %s\n",
    182 		(booted_device) ? booted_device->dv_xname : "<unknown>");
    183 
    184 	setroot(booted_device, part);
    185 }
    186 
    187 /*
    188  * find a device matching "name" and unit number
    189  */
    190 static struct device *
    191 getdevunit(char *name, int unit)
    192 {
    193 	struct device *dev = alldevs.tqh_first;
    194 	char num[10], fullname[16];
    195 	int lunit;
    196 	int i;
    197 
    198 	for (i = 0; i < ndevice_equivs; i++)
    199 		if (device_equiv->alias && strcmp (name, device_equiv->alias) == 0)
    200 			name = device_equiv->real;
    201 
    202 	/* compute length of name and decimal expansion of unit number */
    203 	sprintf(num, "%d", unit);
    204 	lunit = strlen(num);
    205 	if (strlen(name) + lunit >= sizeof(fullname) - 1)
    206 		panic("config_attach: device name too long");
    207 
    208 	strcpy(fullname, name);
    209 	strcat(fullname, num);
    210 
    211 	while (strcmp(dev->dv_xname, fullname) != 0) {
    212 		if ((dev = dev->dv_list.tqe_next) == NULL)
    213 			return NULL;
    214 	}
    215 	return dev;
    216 }
    217 
    218 /*
    219  * Parse a device ident.
    220  *
    221  * Format:
    222  *   (count, lun, part)
    223  */
    224 static int
    225 devidentparse(const char *spec, int *count, int *lun, int *part)
    226 {
    227 	int i;
    228 	const char *args[3];
    229 
    230 	if (*spec == '(') {
    231 		/* tokenize device ident */
    232 		args[0] = ++spec;
    233 		for (i = 1; *spec && *spec != ')' && i<3; spec++) {
    234 			if (*spec == ',')
    235 				args[i++] = ++spec;
    236 		}
    237 		if (*spec != ')')
    238 			goto baddev;
    239 
    240 		switch(i) {
    241 		case 3:
    242 			*count  = atoi(args[0]);
    243 			*lun  = atoi(args[1]);
    244 			*part  = atoi(args[2]);
    245 			break;
    246 		case 2:
    247 			*lun  = atoi(args[0]);
    248 			*part  = atoi(args[1]);
    249 			break;
    250 		case 1:
    251 			*part  = atoi(args[0]);
    252 			break;
    253 		case 0:
    254 			break;
    255 		}
    256 	}
    257 	else
    258 		goto baddev;
    259 
    260 	return 0;
    261 
    262  baddev:
    263 	return ENXIO;
    264 }
    265 
    266 static int
    267 atoi(const char *s)
    268 {
    269 	int val = 0;
    270 
    271 	while(isdigit(*s))
    272 		val = val * 10 + (*s++ - '0');
    273 	return val;
    274 }
    275